दो तारों का मिलान करें लेकिन त्रुटि की एक डिग्री के लिए अनुमति दें


10

मैं दो तारों का मिलान कैसे कर सकता हूं, लेकिन साथ ही साथ X के वर्णों को मैच में गलत होने की अनुमति देता है। त्रुटियों की संख्या एक नियंत्रणीय चर होनी चाहिए।

जबकि स्ट्रिंग में X संख्या के अक्षर मेल नहीं खा सकते हैं, एक सीक्वेंस में कितने रन होने चाहिए। दो तारों को देखते हुए मैं 5 वर्णों को अलग करने की अनुमति दे सकता हूं, लेकिन एक पंक्ति में 2 से अधिक नहीं।

मैं इन दो तारों की तुलना करने के लिए एक अनुशंसित एल्गोरिथ्म की तलाश कर रहा हूं, या शायद इसके लिए पहले से ही एक ज्ञात समाधान है।


4
Levenshtein दूरी , कुछ को देखने के लिए हो सकता है, हालांकि '2 से अधिक नहीं एक पंक्ति में' की बारीकियों कि एल्गोरिथ्म का हिस्सा नहीं है। देखें पृष्ठ में बहुत सारे अन्य संबंधित एल्गोरिदम हैं जो हो सकता है कि आप देख रहे हों।

@ मिचेल्ट अगर मेरे पास ऐसा कुछ होता तो यह निश्चित रूप से मेरी जरूरतों के हिसाब से फिट होता। धन्यवाद।
रिएक्टगुलर

@MichaelT मुझे यह मिला> dotnetperls.com/levenshtein आपको इसका जवाब देना चाहिए क्योंकि इस कारण से मेरी समस्याओं का समाधान हो गया।
21 अक्टूबर को रिएक्टगुलर

आप साउंडटेक्स मिलान को देखना चाह सकते हैं। en.wikipedia.org/wiki/Soundex
गिल्बर्ट ले ब्लांक

जवाबों:


12

एक अनुमानित स्ट्रिंग खोज प्रारंभिक बिंदु लेवेंसहाइट दूरी है । यह एल्गोरिथम एक शब्द को दूसरे में बदलने के लिए एकल वर्ण संपादन (सम्मिलित करें, हटाएं और प्रतिस्थापन) की संख्या को गिनाता है।

इसका एक उदाहरण है kitten-> sittingजिसमें तीन की संपादित दूरी है

  1. k itten -> s itten ('k' के लिए 'विकल्प')
  2. sitt e n -> sitt i n ('ई' के लिए 'विकल्प')
  3. sittin -> sittin g (अंत में 'g' जोड़ें)

इस एल्गोरिथ्म में भिन्नताएं हैं, विशेष रूप से दमेराऊ-लेवेन्शिन दूरी जो दो आसन्न पात्रों के ट्रांसपोज़न की अनुमति देती है ('हेट' से 'के लिए' में एक डीएल की दूरी 1 है और एक लेवेनशेटिन की दूरी 2 है) और इस तरह अक्सर अधिक उपयुक्त है वर्तनी जांच। अन्य भिन्नताएं उन अनुप्रयोगों के लिए मौजूद हैं जहां अंतराल महत्वपूर्ण हैं (डीएनए स्ट्रिंग्स)।

लेवेंसहाइट दूरी अच्छी तरह से ज्ञात है और इसे खोजने के लिए बहुत मुश्किल नहीं है (मैंने एक बार इसे एक कार्यान्वयन के रूप में शिकार करने का कारण बना दिया था, जो कि अलंकरण में एक समारोह के रूप में था - यह सभी डेटा को खींचने और फिर क्वेरी कोड पक्ष को चलाने की तुलना में बहुत तेज़ था)। Rosettacode की implemntations की एक भीड़ (54) है Levenshtein दूरी (- अगर आप जावा, पर नज़र कर रहे हैं टिप्पणी कुछ भाषाओं स्ट्रिंग पुस्तकालय कहीं के हिस्से के रूप में इस है कि Apache Commons लैंग )। विकीबूक में 31 कार्यान्वयन हैं और दोनों में एक सरसरी नज़र एक ही भाषा के लिए समान कोड नहीं दिखाती है।

जिस तरह से यह काम करता है वह एक मैट्रिक्स का निर्माण करता है जो दो तारों के बीच संबंधों से मेल खाता है:

 .kitten
.0123456
s1123456
i2212345
t3321234
t4432123
i5543223
n6654332
g7765443

.पंक्ति और स्तंभ दर्शाते हैं कि आप द्वारा 'सिर्फ' एक खाली स्ट्रिंग से प्रत्येक अक्षर डालने लक्ष्य स्ट्रिंग के लिए मिल सकता है। यह आदर्श मामला नहीं है, लेकिन यह एल्गोरिथ्म को बीज करने के लिए है।

यदि मान उसी स्थान ('i' == 'i') पर है, तो मान बाईं ओर तिरछे मूल्य के समान है। यदि दो धब्बे असमान हैं ('s'! = 'K') मान न्यूनतम है:

  • विकर्ण ऊपर और बाईं ओर + 1 (एक प्रतिस्थापन)
  • सीधे + 1 से ऊपर (एक प्रविष्टि)
  • सीधे बाईं ओर + 1 (एक विलोपन)

मैट्रिक्स के निचले दाएं हिस्से में एडिट डिस्टेंस रिटर्न वैल्यू है।

यदि आप निचले दाएं से ऊपरी बाएँ से न्यूनतम के साथ अनुसरण करते हैं, तो आप किए गए संपादन देख सकते हैं:

 .kitten
.0.   .
s.1   .
i  1  .
t   1 .
t    1.
i.....2
n      2
g......3

ध्यान दें कि यह बल्कि स्मृति गहन दृष्टिकोण है। पूर्ण मैट्रिक्स का निर्माण नहीं करने से इसे मेमोरी स्कोप में कम किया जा सकता है - सभी एल्गोरिथ्म के बारे में परवाह है डेटा का एक सबसेट है और इसे पिछली पंक्ति को संग्रहीत करके अंतरिक्ष से N*Mअंतरिक्ष में कम किया जा सकता है 2*max(N,M)(और वर्तमान में क्या गणना की गई है? पंक्ति)। कोड प्रोजेक्ट दिखाता है कि यह कैसे किया जा सकता है (डाउनलोड करने के लिए C # कोड के साथ)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.