2009-12-17 13 views
14

मैं वर्तमान में एक परियोजना पर काम कर रहा हूं जिसके लिए मुझे कई बाहरी सेवाओं के साथ बैंड और स्थानों के हमारे डेटाबेस से मिलान करने की आवश्यकता है।मैं कैसे निर्धारित करूं कि दो समान बैंड नाम एक ही बैंड का प्रतिनिधित्व करते हैं या नहीं?

असल में मैं यह निर्धारित करने के लिए सबसे अच्छी विधि पर कुछ दिशा ढूंढ रहा हूं कि दो नाम समान हैं या नहीं। उदाहरण के लिए:

  • हमारे डेटाबेस स्थान का नाम - "सुअर और सीटी"
  • सेवा 1 - "सुअर और सीटी"
  • सेवा 2 - "सुअर & सीटी"
  • आदि आदि

मुझे लगता है कि मुख्य मतभेद "" या "0" के बजाय "&" का उपयोग कर रहे हैं, लेकिन अलग-अलग शब्दों में थोड़ा अलग वर्तनी और शब्दों की तरह चीजें भी हो सकती हैं रु।

इस स्थिति में आमतौर पर कौन से एल्गोरिदम/तकनीकों का उपयोग किया जाता है, क्या मुझे शोर शब्दों को फ़िल्टर करने या किसी प्रकार का वर्तनी जांच प्रकार मिलान करने की आवश्यकता है?

क्या आपने सी # में कुछ सिमलर के कुछ उदाहरण देखे हैं?

अद्यतन: मामले में किसी को भी एसी # उदाहरण में रुचि एक ढेर आप एक google code search for Levenshtein distance

उत्तर

14

विहित (और शायद सबसे आसान) तरीका यह है ऐसा करके उपयोग कर सकते हैं वहाँ है Levenshtein distance के बीच मापने के लिए है दो तार यदि दूरी स्ट्रिंग के आकार के सापेक्ष छोटी है, तो शायद यह वही स्ट्रिंग है। ध्यान दें कि यदि आपको बहुत सारे छोटे तारों की तुलना करना है तो यह बताना मुश्किल होगा कि वे समान हैं या नहीं। यह लंबे तारों के साथ बेहतर काम करता है।

दो स्ट्रिंग्स के बीच लेवेनशेटिन दूरी की तुलना करने के लिए एक बेहतर दृष्टिकोण हो सकता है, लेकिन "और"/"&", "स्नूप डॉगी डॉग"/"स्नूप" जैसे अधिक स्पष्ट परिवर्तनों के लिए शून्य की दूरी असाइन करने के लिए, आदि

+0

बहुत बढ़िया, क्या आपको लगता है कि यह अभी भी प्रभावी होगा अगर मैंने "द", "और" और "&" जैसे शब्दों को हटा दिया? –

+1

शून्य की दूरी असाइन करना स्ट्रिंग से उन्हें हटाने के बराबर है, हां। अतिरिक्त स्थानों को प्रभावित करने से रोकने के लिए आप सफेद जगह/विराम चिह्न भी पट्टी कर सकते हैं। लेकिन बस सावधान रहें कि बैंड नाम के लिए वे महत्वपूर्ण नहीं हैं। उदाहरण के लिए, "!!!" एक बैंड का नाम है (http: //en.wikipedia.org/wiki/ !!!)। –

+1

आप टेक्स्ट स्ट्रिंग्स से स्टॉप शब्द को हटाने पर विचार करना चाहेंगे - (जैसे "द" "ए" "और" इत्यादि) अंग्रेजी भाषा स्टॉप शब्दों के डेटाबेस आने के लिए बहुत आसान हैं। –

0

soundex भी उपयोगी

+2

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। –

+1

@ ब्रायनक्रॉस्बी: आम तौर पर सहमत हैं, लेकिन यहां मौलिक साउंडएक्स एल्गोरिदम दोहराना अंतरिक्ष की बर्बादी है। यहां तक ​​कि अगर अंतर्निहित लिंक गायब हो जाता है, तो एल्गोरिदम का नाम पर्याप्त होना चाहिए। जब तक कि Google भी गायब न हो;) –

0

जैव सूचना विज्ञान हम इस का उपयोग डीएनए या प्रोटीन दृश्यों हर समय की तुलना करने में हो सकता है।

बहुत सारे एल्गोरिदम हैं, शायद आप वैश्विक संरेखण पर देखना चाहते हैं।

इस संबंध में Needleman-Wunsch algorithm शायद आप जो चाहते हैं वह है।

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

1

मैंने कुछ समय पहले ऐसा कुछ किया था, मैंने डिस्कोग्स डेटाबेस (जो सार्वजनिक डोमेन है) का उपयोग किया, जो कलाकार उपनामों को भी ट्रैक करता है;

आप या तो:

  • एक API call (namevariations क्षेत्र) का प्रयोग करें।
  • monthly data dumps (*_artists.xml.gz) & इसे अपने डेटाबेस में आयात करें। इसमें एक ही डेटा है, लेकिन स्पष्ट रूप से बहुत तेज़ है।

Levenshtein distance) समाधान पर इसका एक लाभ यह है कि आपको बहुत कम झूठे मैच मिलेंगे।
उदाहरण के लिए, Ryan Adams और Bryan Adams2 के स्कोर है, जो काफी अच्छा है (कम बेहतर मैचों है, Pig and Whistle और Pig & Whistle3 के स्कोर है), फिर भी वे स्पष्ट रूप से अलग अलग लोगों को कर रहे हैं।

जबकि आप एक बेहतर एल्गोरिदम बना सकते हैं (उदाहरण के लिए स्ट्रिंग लम्बाई भी दिखता है), उपनाम डीबी का उपयोग करना बहुत आसान है & कम त्रुटि-फ़ोन; इसे कार्यान्वित करने के बाद, मैं दूसरे उत्तर & में सुझाए गए समाधान को पूरी तरह से हटा सकता था।

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