2009-05-19 12 views
5

मुझे किसी निश्चित आवश्यकता के लिए समाधान कोड करने की आवश्यकता है, और मैं जानना चाहता था कि कोई भी ऑफ-द-शेल्फ लाइब्रेरी से परिचित है या नहीं, जो मुझे प्राप्त कर सकता है या मुझे निर्देशित कर सकता है सबसे अच्छा अभ्यास। विवरण:शब्दों की तुलना करने के लिए एल्गोरिदम (वर्णानुक्रम में नहीं)

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

उदाहरण के लिए, कहें कि सूची में "पानी", "तिमाही", "बियर", "चुकंदर", "नरक", "हैलो" और "आर्डवर्र्क" शब्द शामिल हैं।

समाधान "सामान्य" त्रुटियों के विभिन्न प्रकार के लिए होना चाहिए:

  • गति लिखने की त्रुटियों (जैसे पात्रों को दोगुना करने, वर्ण आदि छोड़ने) "पानी के लिए
  • कीबोर्ड आसन्न-चरित्र लिखने की त्रुटियों (जैसे" qater " ")
  • गैर देशी अंग्रेजी लिखने की त्रुटियों (जैसे" तिमाही "के लिए" quater ")
  • और इसी तरह ...

स्पष्ट समाधान पत्र-दर-पत्र की तुलना करना और प्रत्येक अलग-अलग पत्र, अतिरिक्त पत्र और लापता पत्र को "दंड भार" देना है। लेकिन यह समाधान हजारों "मानक" त्रुटियों को अनदेखा करता है जो मुझे यकीन है कि कहीं कहीं सूचीबद्ध हैं। मुझे यकीन है कि वहां ह्यूरिस्टिक्स हैं जो मानक और सामान्य दोनों सामान्य मामलों के साथ सौदा करते हैं, शायद मानक विसंगतियों के बड़े डेटाबेस (मैं डेटा-भारी समाधान के लिए खुला हूं) का उपयोग कर रहा हूं।

मैं पायथन में कोडिंग कर रहा हूं लेकिन मैं इस सवाल को भाषा-अज्ञेयवादी मानता हूं।

कोई सिफारिशें/विचार? http://norvig.com/spell-correct.html

संपादित करें::

उत्तर

10

आप कैसे गूगल करता पढ़ना चाहते हैं कुछ लोग एल्गोरिदम है कि एक उपयोगकर्ता दिए गए शब्द और एक उम्मीदवार शब्द (Levenshtein, soundex) के बीच एक मीट्रिक परिभाषित उल्लेख किया है। हालांकि यह समस्या का पूरा समाधान नहीं है, क्योंकि किसी को भी निकटतम पड़ोसी खोज के गैर-युक्लिडियन को कुशलता से करने के लिए एक डेटास्ट्रक्चर की आवश्यकता होगी। यह किया जा सकता है उदा। कवर ट्री के साथ: http://hunch.net/~jl/projects/cover_tree/cover_tree.html

2

क्या आपने एल्गोरिदम पर विचार किया है जो soundex जैसे ध्वन्यात्मक ध्वनियों की तुलना में है? शब्दों की अपनी सूची के साउंडएक्स प्रस्तुतियों को उत्पन्न करना, उन्हें स्टोर करना, और फिर उपयोगकर्ता इनपुट का एक साउंडएक्स प्राप्त करना और वहां के सबसे नज़दीकी मैच को ढूंढना बहुत मुश्किल नहीं होना चाहिए।

6

एक सामान्य समाधान इनपुट और आपके निश्चित ग्रंथों के बीच Levenshtein distance की गणना करना है। दो तारों की लेवेनशेटिन दूरी केवल सरल परिचालनों की संख्या है - एक वर्ण के सम्मिलन, हटाना, और प्रतिस्थापन - एक स्ट्रिंग को दूसरे में बदलने के लिए आवश्यक है।

0

हालांकि यह पूरी समस्या का समाधान नहीं कर सकता है, तो आप समाधान के हिस्से के रूप में ध्वनि एल्गोरिदम का उपयोग करने पर विचार करना चाहेंगे। "साउंडएक्स" और "पायथन" की एक त्वरित Google खोज ने एल्गोरिदम के कुछ पायथन कार्यान्वयन दिखाए।

0

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

1

बिटप एल्गोरिदम की खोज करें। यह आप जो करना चाहते हैं उसके लिए अच्छी तरह से योग्यता प्राप्त करता है, और यहां तक ​​कि विकिपीडिया में स्रोत कोड उदाहरण के साथ आता है।

1

यदि आपका डेटा सेट वास्तव में छोटा है, तो स्वतंत्र रूप से सभी वस्तुओं पर लेवेनशेटिन दूरी की तुलना करना पर्याप्त रूप से पर्याप्त होना चाहिए। यदि यह बड़ा है, तो आपको BK-Tree या इसी तरह की अनुक्रमणिका प्रणाली का उपयोग करने की आवश्यकता होगी। मैंने जो लेख लिखा है, वह बताता है कि किसी दिए गए लेवेनशेटिन दूरी के भीतर मैचों को कैसे ढूंढें, लेकिन निकटतम पड़ोसी खोजों (और पाठक को व्यायाम के रूप में छोड़ दिया गया) करने के लिए अनुकूलित करना काफी सरल है।

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