2012-10-06 13 views
12

मैं एक ऐसे अनुप्रयोग पर काम कर रहा हूं जो संदर्भ सूची में इकाई नामों को "साफ" करने के लिए संभावित "गन्दा" इकाई नामों के इनपुट सेट से मेल खाने का प्रयास करता है। मैं संपादन दूरी और अन्य सामान्य अस्पष्ट मिलान एल्गोरिदम के साथ काम कर रहा हूं, लेकिन मुझे आश्चर्य है कि क्या कोई बेहतर दृष्टिकोण है जो टर्म वेटिंग की अनुमति देता है, जैसे कि सामान्य शब्दों को अस्पष्ट मैच में कम वजन दिया जाता है।शब्द वजन के साथ धुंधला स्ट्रिंग

पाइथन की difflib लाइब्रेरी का उपयोग करके इस उदाहरण पर विचार करें। मैं संगठन के नामों के साथ काम कर रहा हूं, जिसमें कई मानकीकृत घटक आम हैं और इसलिए इकाइयों के बीच अंतर करने के लिए उपयोग नहीं किया जा सकता है।

from difflib import SequenceMatcher 
e1a = SequenceMatcher(None, "ZOECON RESEARCH INSTITUTE", 
          "LONDON RESEARCH INSTITUTE") 
print e1a.ratio() 
0.88 

e1b = SequenceMatcher(None, "ZOECON", "LONDON") 
print e1b.ratio() 
0.333333333333 

e2a = SequenceMatcher(None, "WORLDWIDE SEMICONDUCTOR MANUFACTURING CORP", 
          "TAIWAN SEMICONDUCTOR MANUFACTURING CORP") 
print e2a.ratio() 
0.83950617284 

e2b = SequenceMatcher(None, "WORLDWIDE", 
          "TAIWAN") 
print e2b.ratio() 
0.133333333333 

दोनों उदाहरण संपूर्ण स्ट्रिंग पर अत्यधिक स्कोर क्योंकि RESEARCH, INSTITUTE, SEMICONDUCTOR, MANUFACTURING, और CORP उच्च आवृत्ति, कई संगठन के नाम में सामान्य पदों हैं। मैं फ़ज़ी स्ट्रिंग मिलान (आवश्यक रूप से difflib का उपयोग नहीं कर रहा) में शब्द आवृत्तियों को एकीकृत करने के तरीके के बारे में किसी भी विचार की तलाश कर रहा हूं, जैसे कि स्कोर सामान्य शब्दों से प्रभावित नहीं होते हैं, और परिणाम "e1b" और " ई 2 बी "उदाहरण।

मुझे लगता है मैं सिर्फ एक बड़ी "अक्सर शब्द" सूची बनाने के लिए और तुलना से उन बाहर कर सकते हैं, लेकिन मैं आवृत्तियों का उपयोग करने के यदि संभव हो क्योंकि भले आम शब्दों जोड़ने कुछ जानकारी, और भी के लिए कटऑफ बिंदु चाहते हैं किसी भी सूची निश्चित रूप से मनमाना होगा।

+2

[हुओश] (https://bitbucket.org/mchaput/whoosh/wiki/Home) दिलचस्प लग रहा है, खासकर इसकी ['स्कोरिंग'] (http://packages.python.org/Whoosh/api/scoring। एचटीएमएल) मॉड्यूल और [whoosh.reading.TermInfo] (http://packages.python.org/Whoosh/api/reading.html?highlight=frequency#whoosh.reading.TermInfo) 'doc_frequency() 'और' weight() ' –

+1

क्या आपके पास फ़ज़ी मैच के नामों के पूर्ण कॉर्पस तक पहुंच है? यदि ऐसा है, तो आप एक अस्पष्ट मिलान मॉडल को प्रशिक्षित करने के लिए टीएफ-आईडीएफ का उपयोग कर सकते हैं। –

+0

आप तारों को विभाजित कर सकते हैं और प्रत्येक टुकड़े पर अंतर की गणना कर सकते हैं। यह आपको _some_ स्थितियों पर मदद करेगा जहां आपके पास लगभग समान नाम हैं लेकिन केवल एक शब्द अंतर के साथ। लेकिन यह संभवतः आप जो करना चाहते हैं उसके लिए पर्याप्त मजबूत नहीं है। – Bakuriu

उत्तर

2

यहाँ आप के लिए एक अजीब विचार है: अपने इनपुट

कम्प्रेस और कहा कि diff।

आप उदाहरण का उपयोग कर सकते हैं आपके इनपुट को संपीड़ित करने के लिए Huffman या dictionary coder, जो स्वचालित रूप से सामान्य शर्तों का ख्याल रखता है। हालांकि, टाइपो के लिए यह इतना अच्छा नहीं हो सकता है, उदाहरण के लिए, लंदन शायद अपेक्षाकृत आम शब्द है, जबकि मिस्पेल्ट लंदन बिल्कुल नहीं है, और संपीड़ित शर्तों के बीच असमानता कच्चे शब्दों के बीच की तुलना में काफी अधिक है।

1

मेरी राय में, एक सामान्य समाधान कभी भी समानता के आपके विचार से मेल नहीं खाएगा। जैसे ही आपके डेटा के बारे में कुछ अंतर्निहित ज्ञान हो, आपको इसे किसी भी तरह कोड में रखना होगा। जो निश्चित रूप से एक निश्चित मौजूदा समाधान को अयोग्य घोषित करता है।

शायद आपको कुछ एनएलपी तकनीकों का विचार प्राप्त करने के लिए http://nltk.org/ पर देखना चाहिए था। आप हमें अपने डेटा के बारे में पर्याप्त नहीं बताते हैं, लेकिन एक पीओएस टैगर अधिक से कम प्रासंगिक शर्तों की पहचान करने में मदद कर सकता है। शहरों, देशों, ... के नाम से उपलब्ध डेटाबेस, इसे आगे संसाधित करने से पहले डेटा को साफ करने में मदद कर सकते हैं।

कई टूल उपलब्ध हैं, लेकिन उच्च गुणवत्ता वाले आउटपुट प्राप्त करने के लिए, आपको एक ऐसे समाधान की आवश्यकता होगी जो आपके डेटा के लिए अनुकूलित हो और केस का उपयोग करे।

+0

मैं एक एप्लिकेशन विशिष्ट समाधान से खुश हूं। मेरा डेटा केवल किसी भी संदर्भ के बिना, इकाई नाम हैं। मुझे पीओएस टैगिंग का विचार पसंद है, लेकिन मुझे डर है क्योंकि मेरे पास सिर्फ कुछ नाम हैं जो टैगर से वापस आने वाले 9 5% एनएनपी होंगे। – rjf

+0

पीओएस टैगर्स "डिफ़ॉल्ट" टैग तक ही सीमित नहीं हैं। आप अपने टैग (CITY, NAME, TYPE, ...) का उपयोग करके अपने आप को एक उदाहरण सेट कर सकते हैं और उस डेटा का उपयोग करके एक टैगर को प्रशिक्षित कर सकते हैं। यहां से अधिक विकल्प हैं जो मैं यहां लिख सकता हूं और अधिक संकेत देने के लिए मुझे आपके डेटा के साथ "खेलना" होगा। माफ़ कीजिये। – Achim

2

प्रत्येक स्ट्रिंग को शब्दों की सूची में विभाजित करने के बारे में, और प्रत्येक शब्द पर अपनी तुलना चलाने के लिए एक शब्द प्राप्त करने के लिए जिसमें शब्द मिलान के स्कोर होते हैं। तो आप स्कोर औसत कर सकते हैं, सबसे कम/उच्चतम अप्रत्यक्ष मैच या आंशिक ...

आपको अपना वजन जोड़ने की क्षमता देता है।

आपको निश्चित रूप से ऑफ़सेट को संभालने की आवश्यकता होगी ..

"चमड़े के लिए लंदन कंपनी '

और

1

मैं सिर्फ एक और अलग दृष्टिकोण का प्रस्ताव कर रहा हूँ" चमड़े के लिए लंदन कंपनी "। चूंकि आपने उल्लेख किया है कि इकाई नाम संदर्भ सूची से आ रहे हैं, तो मुझे आश्चर्य है कि क्या आपके पास अतिरिक्त संदर्भ जानकारी है, जैसे सह-लेखक नाम, उत्पाद/पेपर शीर्षक, पता w/शहर, राज्य, देश?

यदि आपके ऊपर उपरोक्त कुछ उपयोगी संदर्भ हैं, तो आप वास्तव में उनके बीच संबंधों से इकाइयों का एक ग्राफ बना सकते हैं। संबंध हो सकता है, उदाहरण के लिए:

Author-paper relation 
Co-author relation 
author-institute relation 
institute-city relation 
.... 

तो यह एक ग्राफ आधारित इकाई संकल्प विस्तार से वर्णन किया दृष्टिकोण का उपयोग करने का समय है:

दृष्टिकोण सह-लेखक-पेपर डोमेन पर बहुत अच्छा प्रदर्शन है।

संबंधित मुद्दे