एल्गोरिथ्म एक वर्तनी परीक्षक में क्या सुझाव देता है?


114

शब्द चेतावनियों के साथ वर्तनी जाँचक को लागू करते समय आमतौर पर किस एल्गोरिथ्म का उपयोग किया जाता है?

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

यह आम तौर पर कैसे किया जाता है?

जवाबों:


203

पीटर नॉरविग द्वारा एक वर्तनी सुधारक को लागू करने का अच्छा निबंध है । यह मूल रूप से एक क्रूर बल दृष्टिकोण है जो एक दिए गए संपादन दूरी के साथ उम्मीदवार के तारों की कोशिश कर रहा है। ( यहां कुछ सुझाव दिए गए हैं कि आप ब्लूम फ़िल्टर और तेज़ उम्मीदवार हैशिंग का उपयोग करके वर्तनी सुधारक प्रदर्शन को कैसे बेहतर बना सकते हैं ।)

एक वर्तनी परीक्षक की आवश्यकताएं कमजोर हैं। आपको केवल यह पता लगाना है कि कोई शब्द शब्दकोश में नहीं है। स्पेल चेकर बनाने के लिए आप ब्लूम फ़िल्टर का उपयोग कर सकते हैं जो कम मेमोरी का उपभोग करता है। एक अंग्रेजी संस्करण के लिए 64kb का उपयोग करके जॉन बेंटले द्वारा प्रोग्रामिंग पर्ल में एक प्राचीन संस्करण को डिक्रिप्ट किया गया है।

एक बीके-ट्री एक वैकल्पिक दृष्टिकोण है। एक अच्छा लेख यहाँ है

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


2
अपेक्षाकृत अज्ञात बीके-ट्री संदर्भ के लिए +1। Google जैसी कंपनियां रियल-वर्ल्ड [TM] डेटा के साथ काम कर रही हैं।
NoozNooz42

2
यहां बीके-पेड़ों की बहुत बेहतर व्याख्या है
इयान बॉयड

17

उन सुझावों को उत्पन्न करने के लिए एक दृष्टिकोण जो मैंने सफलतापूर्वक उपयोग किया है, लेकिन कभी भी कहीं भी वर्णित नहीं देखा गया है, "खराब" हैश कार्यों का उपयोग करके सुझावों को पूर्व-गणना (जब शब्दकोश का निर्माण करते हैं)।

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

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

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

अब, जब आपको एक गलत वर्तनी वाला शब्द मिलता है, तो आप बाल्टी के लिए टकराव सूचियों को देखते हैं जो कि असेंबलिंग मैप्स को इंडेक्स इंडेक्स में रखते हैं। ता डा: आपके पास एक सुझाव सूची है! आपको बस इस पर शब्दों को रैंक करना है।

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

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

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

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


फारस के सिम्प्सेल एल्गोरिथम को संदर्भित करने के लिए धन्यवाद। जबकि दोनों एल्गोरिदम संभावित टाइपो की पूर्व-गणना कर रहे हैं और तेजी से देखने के लिए हैश टेबल का उपयोग कर रहे हैं, मुख्य अंतर यह है कि SymSpell एक निश्चित संपादित दूरी तक सभी संभावित वर्तनी त्रुटियों का पता लगाने की गारंटी देता है (इस संबंध में SymSpell पीटर नॉरिग के एल्गोरिथ्म के बराबर है, बस 3..6 तीव्रता के आदेश), जबकि आपका एल्गोरिथ्म एक हेयुरिस्टिक दृष्टिकोण का उपयोग कर रहा है, जो केवल सैद्धांतिक रूप से संभव वर्तनी त्रुटियों के एक सीमित उपसमूह का पता लगाएगा (इसलिए आपकी पूर्व-गणना की लागत कम हो सकती है)।
वोल्फ गरबे

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

बिल्कुल, संभावना टाइपो (और उन तक सीमित) के बारे में अनुभवजन्य ज्ञान का शोषण करके आप पूर्व-गणना समय और स्थान को बचाते हैं। लेकिन सभी संभव वर्तनी त्रुटियों को कवर करने के लिए सिम्प्सेल को उनमें से केवल एक छोटे से अंश की गणना करने की आवश्यकता है। 5 अक्षर के शब्द में 3 की अधिकतम संपादित दूरी के भीतर लगभग 3 मिलियन संभव वर्तनी की त्रुटियां हैं, लेकिन SymSpell के साथ आपको केवल 25 डिलीट करने के लिए पूर्व-गणना और स्टोर करने की आवश्यकता है। यह वर्तनी सुधार से परे फ़ज़ी / समानता खोज के लिए महत्वपूर्ण है जहां कोई अनुभवजन्य ज्ञान मौजूद नहीं है।
वुल्फ गरबे

7

कलन विधि

  1. गलत वर्तनी शब्द को इनपुट के रूप में लें।
  2. एक पाठ फ़ाइल में उनकी आवृत्तियों के साथ अंग्रेजी शब्दों की सूची संग्रहीत करें।
  3. टर्नरी सर्च ट्री में सभी उपलब्ध अंग्रेजी शब्दों (टेक्स्ट फ़ाइल में संग्रहीत) को उनकी आवृत्तियों (अंग्रेजी भाषा में किसी शब्द का कितनी बार उपयोग किया जाता है) के साथ डालें।
  4. अब टर्नरी सर्च ट्री के साथ पार -
    • टर्नेरी सर्च ट्री में सामने आए प्रत्येक शब्द के लिए, गलत तरीके से लिखे गए शब्द से उसकी लेवेन्स्टाइन दूरी की गणना करें।
    • यदि लेवेन्स्टीन दूरी <= 3, शब्द को प्राथमिकता कतार में संग्रहीत करें।
    • अगर दो शब्दों में समान दूरी है, तो उच्च आवृत्ति वाला ग्रेटर है। प्राथमिकता कतार से शीर्ष 10 आइटम प्रिंट करें।

अनुकूलन

  1. यदि आप मौजूदा शब्द से इनपुट शब्द के प्रतिस्थापन की संपादित दूरी 3 से कम है, तो आप वर्तमान नोड के सबट्री में शब्दों को अलग कर सकते हैं।
    आप जीथब प्रोजेक्ट पर अधिक विस्तृत स्पष्टीकरण और स्रोत कोड पा सकते हैं ।

हम्म, इस मामले में 'ग्रेटर' से लेवेंसहिन की दूरी 'अधिक' तक पर्याप्त नहीं होगी, क्योंकि 'ग्रेटर' भी एक डिक्शनरी शब्द है। ;-)
टोनी ब्रासुनस

1
@TonyBrasunas, हाँ आप सही हैं। लेकिन कार्यक्रम वास्तव में इनपुट के रूप में 'ग्रेटर' के मामले में 10 शब्दों की सूची लौटाएगा और यह 0 की एडिट दूरी के साथ 'ग्रेटर' और 1. की एडिट दूरी के साथ 'अधिक' भी सुझाएगा, जो कुछ मदद का हो सकता है। ;)
अमरजीतअनंद

यदि एक उम्मीदवार की दूरी 2 है, लेकिन बहुत अक्सर है, और दूसरे उम्मीदवार की दूरी 1 है, लेकिन अत्यंत दुर्लभ है, तो आप दोनों को कैसे रैंक करेंगे? उपरोक्त दृष्टिकोण में, दुर्लभ वस्तु हमेशा जीत जाएगी, क्या यह सही परिणाम है?
स्पीडप्लेन

@speedplane Yes। दुर्लभ जीत होगी। और मुझे लगता है कि यह सही परिणाम है। इनपुट शब्द की वर्तनी के आधार पर, जो हम उम्मीद करते हैं वह निकटतम शब्द है। यदि आप अभी भी संदेह में हैं, तो इस तरह से सोचें --- मान लें कि एक दुर्लभ शब्द है जिसे उपयोगकर्ता ने सही तरीके से लिखा है। अब इसकी दूरी 0 है लेकिन आवृत्ति बहुत कम है। अब सुझावों में, हमें इस दुर्लभ शब्द (दूरी 0 के साथ) को सबसे ऊपर (क्योंकि कम से कम दूरी की जीत को संपादित करना चाहिए) और नीचे 1-2-3 के साथ अन्य शब्दों को सूचीबद्ध करना चाहिए।
अमरजीतअनंद

3

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


1

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

यूनिक्स प्रणाली मैक इलोरॉय द्वारा लिखित एक कार्यक्रम का उपयोग करती है। एक वैकल्पिक तरीका एक ट्राइ का उपयोग करना है जो बड़ी फ़ाइलों के मामले में उपयोगी हो सकता है।

क्योंकि यह तितर बितर हैश एल्गोरिथ्म का उपयोग करता है यूनिक्स दृष्टिकोण एक विशाल शब्दकोश के लिए बहुत कम जगह की जरूरत है।

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