एक तेज वर्तनी परीक्षक के निर्माण के लिए कुशल डेटा संरचनाएं


41

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

मैं एक डेटा संरचना की तलाश कर रहा हूं, जो मुझे अंतरिक्ष जटिलता और रनटाइम जटिलता के बीच सबसे अच्छा समझौता दे।

इंटरनेट पर मुझे जो कुछ भी मिला है, उसके आधार पर, मेरे पास यह है कि किस प्रकार की डेटा संरचना का उपयोग करना है:

Trie

Trie-500px

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

पेट्रीसिया ट्राय

Trie-500px

यह नियमित ट्राई की तुलना में कम जगह की खपत करता है क्योंकि आप मूल रूप से पॉइंटर्स को संचय करने की लागत से बच रहे हैं, लेकिन मैं बहुत बड़े शब्दकोशों जैसे कि मेरे पास डेटा विखंडन के बारे में थोड़ा चिंतित हूं।

प्रत्यय वृक्ष

प्रत्यय-500px

मुझे इस बारे में निश्चित नहीं है, ऐसा लगता है कि कुछ लोग इसे टेक्स्ट माइनिंग में उपयोगी पाते हैं, लेकिन मुझे वास्तव में यकीन नहीं है कि यह स्पेल चेकर के लिए प्रदर्शन के मामले में क्या देगा।

टर्नरी सर्च ट्री

tst

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

बर्स्ट ट्री

विस्फोट

यह एक तरह का हाइब्रिड लगता है और मुझे यकीन नहीं है कि इससे ट्राई और लाइक में क्या फायदा होगा, लेकिन मैंने कई बार पढ़ा है कि यह टेक्स्ट माइनिंग के लिए बहुत कारगर है।


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


एक पेट्रीसिया ट्राई पॉइंटर्स को स्टोर करने की लागत से कैसे बचता है? क्या यह सिर्फ एक en.wikipedia.org/wiki/Radix_tree है ? अगर ऐसा है, तो मुझे लगता है कि यह अभी भी बहुत सारे पॉइंटर्स को स्टोर करता है, लेकिन आपके पास बहुत बड़ी जगह की बचत होगी क्योंकि आम उपसर्ग केवल एक बार संग्रहीत किए जाते हैं
जो

n

1
@linker: क्या आपने अपने शब्दकोश के लिए सभी प्रकारों की कोशिश की है? एक निश्चित उपयोग के मामले को देखते हुए, यह संभवतया सबसे तेज़ तरीका है जिससे यह पता लगाया जा सकता है कि किस डेटासट्रक्चर में कितनी जगह है।
राफेल

1
यह सिर्फ एक बुनियादी शब्दकोश है, सही ढंग से वर्तनी शब्दों की एक ज्ञात सूची है।
चार्ल्स मेंग्यू

जवाबों:


4

मैंने एक ही समस्या का सामना किया है, लेकिन अलग दृष्टिकोण लिया है। आप कुछ प्रकार के "हैश" फ़ंक्शन का निर्माण कर सकते हैं, जो समान शब्द के लिए समान या निकट संख्या देगा।

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

हो सकता है कि कुछ परिणाम प्राप्त किए जा सकें यदि हम शब्दों को "स्पेस" में देखते हैं। अक्षर बदलने के लिए X, जोड़ने / हटाने के लिए Y, संक्रमण के लिए Z या ऐसा कुछ।

हालाँकि यह केवल अमूर्त विचार हैं, मुझे इन्हें लागू करने के लिए पर्याप्त समय नहीं है।


यह वही है जो
साउंडटेक्स

4

O(log(n))O

मीट्रिक पेड़ में तारों को जमा न करें। बस एक इंडेक्स स्टोर करें, और स्ट्रिंग्स को पेट्रीसिया के पेड़ में स्टोर करें।

मुझे यकीन नहीं है कि आपको किस पेड़ का उपयोग करना चाहिए। यह आपके डेटा और आपकी आवश्यकताओं पर निर्भर करेगा (क्या आपको फास्ट डालने की आवश्यकता है?)। अपने प्रश्न को अपडेट करें यदि आप पाते हैं कि एक पेड़ दूसरों की तुलना में अधिक कुशल है।

आप विशेष उपकरणों को भी देख सकते हैं, जैसे ल्यूसीन।

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