2011-03-22 14 views
8

मैं सी ++ में एक वर्तनी परीक्षक पर काम कर रहा हूं और मैं कार्यान्वयन में एक निश्चित चरण पर फंस गया हूं।एक वर्तनी परीक्षक में लेवेनशेटिन दूरी का उपयोग

मान लें कि हमारे पास सही वर्तनी वाले शब्दों और एक इनपुट स्ट्रिंग के साथ एक टेक्स्ट फ़ाइल है जिसे हम वर्तनी की गलतियों की जांच करना चाहते हैं। यदि वह स्ट्रिंग एक गलत वर्तनी वाला शब्द है, तो मैं पाठ फ़ाइल में सभी शब्दों को चेक करके और न्यूनतम अक्षरों से अलग होने वाले व्यक्ति को चुनकर आसानी से अपना सही रूप ढूंढ सकता हूं। उस प्रकार के इनपुट के लिए, मैंने एक फ़ंक्शन लागू किया है जो 2 स्ट्रिंग्स के बीच लेवेनशेटिन संपादन दूरी की गणना करता है। अब तक सब ठीक है।

अब, कठिन हिस्सा: क्या होगा यदि इनपुट स्ट्रिंग गलत वर्तनी वाले शब्दों का संयोजन है? उदाहरण के लिए, "iloevcokies"। इस बात को ध्यान में रखते हुए कि "मैं", "प्यार" और "कुकीज़" शब्द हैं जो टेक्स्ट फ़ाइल में पाए जा सकते हैं, मैं यह निर्धारित करने के लिए पहले से लागू किए गए लेवेनशेटिन फ़ंक्शन का उपयोग कैसे कर सकता हूं कि फ़ाइल के कौन से शब्द सुधार के लिए उपयुक्त हैं? साथ ही, मैं सही स्थिति में रिक्त स्थान कैसे सम्मिलित करूं?

किसी भी विचार का स्वागत है :) वाक्यांशों के लिए

उत्तर

5

वर्तनी सुधार में कुछ तरीकों से किया जा सकता है। एक तरीके से शब्द द्वि-ग्राम और त्रि-ग्राम की अनुक्रमणिका होना आवश्यक है। ये निश्चित रूप से विशाल हो सकता है। एक और विकल्प शब्द के क्रम में रिक्त स्थान के साथ क्रमिक क्रम का प्रयास करना होगा, फिर परिणामी वाक्यांश में प्रत्येक शब्द पर एक लुकअप करना होगा। Google से Peter Norvig द्वारा वर्तनी जांचकर्ता के सरल कार्यान्वयन पर नज़र डालें। किसी भी तरह से, बेहतर प्रदर्शन के लिए एन-ग्राम इंडेक्स का उपयोग करने पर विचार करें, संदर्भ के लिए सी ++ में पुस्तकालय उपलब्ध हैं।

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

आप aspell जैसे वर्तनी लाइब्रेरी का उपयोग और मौजूदा पर भी विचार कर सकते हैं।

0

किसी विचार के लिए एक प्रारंभिक बिंदु: "iloevcokies" के लिए आपकी एल-दूरी की शीर्ष हिट्स में से एक "कुकीज़" होना चाहिए। यदि आप अपने एल-दूरी फ़ंक्शन को एक मिनी-इंडेक्स और अधिकतम-इंडेक्स को ट्रैक करने और वापस करने के लिए बदल सकते हैं (यानी, यह मैच वर्ण 5 से सबसे अच्छा है और चरित्र 10 पर जा रहा है) तो आप उस सबस्ट्रिंग को हटा सकते हैं और एल को दोबारा जांच सकते हैं। यह पहले स्ट्रिंग के लिए -distance और यह के बाद, तो एक सुझाव के लिए उन को श्रेणीबद्ध ....

बस एक विचार, अच्छी किस्मत ....

+1

दुर्भाग्यवश यह संभव नहीं है कि आप पूरी तरह से असंबंधित शब्द पर भी ठोकर खा सकते हैं (यानी यहां संपादित दूरी 6 की तरह कुछ होगी, यह बहुत बड़ी है)। –

+0

निश्चित रूप से, लेकिन बहुत कम शब्द संपादन दूरी में बंद हो जाएंगे, इसलिए कुकीज़ अभी भी शीर्ष हिट के रूप में दिखाई दे सकती है। हालांकि अभी तक एक पूर्ण समाधान से! – usul

0

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

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

इस तरह आप एक ही सूचकांक प्राप्त करते हैं, लगभग उसी मार्ग, लगभग समान ट्रैवर्सल, और इससे आपके चलने वाले समय को भी प्रभावित नहीं करना चाहिए।

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