2010-08-10 16 views
6

में "बड़े" पैमाने पर वर्तनी जांच आश्चर्यजनक रूप से मैं वास्तव में ऐसा करने में किसी और को खोजने में असमर्थ हूं, लेकिन निश्चित रूप से किसी के पास है। मैं वर्तमान में एक अजगर परियोजना पर काम कर रहा हूं जिसमें कुछ 16 हजार शब्द की वर्तनी शामिल है। शब्दों की संख्या दुर्भाग्यवश बढ़ने जा रही है। अभी मैं मोंगो से शब्दों को खींच रहा हूं, उनके माध्यम से फिर से चल रहा हूं, और फिर उन्हें जादूगर के साथ जांच कर जादू कर रहा हूं। मैंने पहले से अपने सभी सामानों को पकड़कर संभावित बाधा के रूप में मोंगो को हटा दिया है। यह मुझे 16k शब्दों के माध्यम से संसाधित करने के लिए लगभग 20 मिनट के साथ छोड़ देता है, जो कि मैं खर्च करना चाहता हूं उससे काफी लंबा है। यह मैं कुछ उपाय दिए गए/सवालों के साथ छोड़ देता है:पायथन

  1. जाहिर है मैं सूत्रण या समानांतरवाद के कुछ फार्म का लाभ उठाने सकता है। यहां तक ​​कि अगर मैं इसे 4 टुकड़ों में काटता हूं, तो भी मैं चरम प्रदर्शन को मानने में लगभग 5 मिनट देख रहा हूं।

  2. क्या यह बताने का एक तरीका है कि वर्तनी लाइब्रेरी एंटर प्युनेंट के नीचे क्या उपयोग कर रहा है? एन्चेंट की वेबसाइट का मतलब यह है कि वर्तनी जांचते समय यह सभी उपलब्ध वर्तनी पुस्तकालयों/शब्दकोशों का उपयोग करेगा। यदि ऐसा है, तो मैं संभावित रूप से प्रत्येक शब्द को तीन-चार वर्तनी के माध्यम से चला रहा हूं। यह मेरा मुद्दा यहां हो सकता है, लेकिन मुझे यह साबित करने में कठिनाई हो रही है कि यह मामला है। यहां तक ​​कि यदि यह है, तो क्या मेरे विकल्प वास्तव में अन्य पुस्तकालयों को अनइंस्टॉल करना है? दुर्भाग्यपूर्ण लगता है।

तो, इस बारे में कोई विचार है कि मैं कम से कम थोड़ा अधिक प्रदर्शन कैसे निचोड़ सकता हूं? मैं समानांतर कार्यों में इसे रोकने के साथ ठीक हूं, लेकिन मैं अभी भी इसके पहले का टुकड़ा थोड़ा तेज होने के लिए प्राप्त करना चाहता हूं।

संपादित करें: क्षमा करें, सुबह कॉफी से पहले पोस्ट करें ... अगर कोई शब्द गलत तरीके से लिखा गया है तो एंकर मेरे लिए सुझावों की एक सूची उत्पन्न करता है। ऐसा लगता है कि मैं इस प्रसंस्करण भाग में अपना अधिकांश समय बिताता हूं।

+2

20 मिनट एक बहुत लंबे समय की तरह लगता है। क्या आप बस अपने शब्दों को पाइथन शब्दकोश में लोड कर सकते हैं और प्रत्येक पर एक लुकअप कर सकते हैं? इसमें निश्चित रूप से 20 मिनट से भी कम समय लगेगा। (शायद 20 मिनट से भी कम लिखने के लिए।) – ggg

+1

क्या आप एंकर की पूरी शक्ति का उपयोग कर रहे हैं, या सिर्फ यह जांच रहे हैं कि कोई शब्द सही वर्तनी है (यानी पहले ज्ञात शब्दकोश में)? यदि उत्तरार्द्ध, जो 'ggg' ने कहा और अपना खुद का वर्तनी जांचें। – katrielalex

+2

समांतरता के बारे में भी मत सोचो; मैंने प्रवेश करने के लिए मेरे लिए लिया गया समय से कम समय में 60k शब्दकोश के खिलाफ 100k शब्दों की जांच की। आपको एक बेहतर एल्गोरिदम चाहिए। – msw

उत्तर

5

मुझे लगता है कि हम मानते हैं कि प्रदर्शन की बाधा यहां एंकर है; डेटासेट के इस आकार के लिए यह बूलियन isSpeltCorrectly करने के लिए लगभग तात्कालिक है। तो, क्यों नहीं:

  1. सही वर्तनी वाले शब्द की स्मृति में एक सेट का निर्माण, शब्दकोशों एंचेंट करता है कि का उपयोग कर या अपने खुद के (जैसे OpenOffice's) प्राप्त करने।

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

  2. जांचें कि प्रत्येक शब्द सेट में है या नहीं। यह तेज़ है, क्योंकि यह सिर्फ एक सेट लुकअप है। यदि ऐसा नहीं है, (शायद O(log N) जहां N शब्दों की संख्या है? हैश द्वारा set बाल्टी संभालने और एक द्विआधारी खोज करता है ... एक अजगर गुरु मुझे यहाँ सही कर सकते हैं।)

  3. तो को एंचेंट पूछना इसके लिए एक शब्द की सिफारिश करें। यह जरूरी धीमा है।

यह मानता है कि आपके अधिकांश शब्द सही वर्तनी में हैं; अगर वे नहीं हैं, तो आपको चतुर होना होगा।

+0

इस मार्ग पर जाने के लिए 6 मिनट तक। यह अभी भी लंबा है, लेकिन यह बेहतर है। वेब क्रॉल करते समय बस बहुत बुरी वर्तनी मिलती है :) – f4nt

+0

आप एन्चेंट लुकअप को समानांतर करने का भी प्रयास कर सकते हैं, शायद कैचिंग को संभालने के लिए एंटरप्राइज़ के इंटरफ़ेस के रूप में चलने वाली एक अलग प्रक्रिया के साथ भी। – katrielalex

+0

@ f4nt मैं भी इस समस्या को मार रहा हूं। शब्दकोश शब्द के लिए स्रोत के रूप में आपने क्या उपयोग किया? कोई अन्य विनिर्देश जो आप अपने समाधान के बारे में साझा कर सकते हैं? – tw1742

1

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

संपीड़ित संस्करण में अनन्य शब्दों के संदर्भ होना चाहिए, कहीं भी इसकी फ़ाइल के भीतर, आपको यह देखना होगा कि उन्हें कैसे संरचित किया गया है।

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

एक बार ऐसा करने के बाद, बस इसे असम्पीड्रेस करें और हे पस्टो यह सभी वर्तनी की जांच की गई है। यह एक काफी तेज़ समाधान होना चाहिए।

या शायद आपको पूरी ज़िप प्रक्रिया को पार करने की आवश्यकता नहीं है यदि स्पेल चेकिंग वास्तव में टिप्पणियों के सुझाव के जितनी जल्दी हो, तो गलत कार्यान्वयन का संकेत मिलेगा।

+0

एर्म, मुझे यकीन नहीं है कि मैं समझता हूं। क्या आपका मतलब है कि दस्तावेज़ को ज़िप करें और बाइनरी ज़िप फ़ाइल को पार्स करें? क्या आप वाकई काम करते हैं? – katrielalex

+0

इस काम को करने का एकमात्र उचित तरीका एक हफमानेस्क पेड़ बनाना होगा जहां लेक्सम पूरे शब्द थे। यह compatationally katrielalex के जवाब के बराबर है। उप-शब्द स्तर पर संचालित कोई भी अन्य संपीड़न बेहद जटिल होगा, फिर भी कोई उपयोगिता नहीं जोड़ें। – msw

2

मैं एक पीटर Norvig शैली वर्तनी परीक्षक का उपयोग करेंगे। मैंने इस पर एक पूर्ण पोस्ट लिखा है।

http://blog.mattalcock.com/2012/12/5/python-spell-checker/

यहाँ कोड है कि शब्द की जाँच करने के संभावित संपादन पर लग रहा है का एक टुकड़ा है।

def edits1(word): 
    s = [(word[:i], word[i:]) for i in range(len(word) + 1)] 
    deletes = [a + b[1:] for a, b in s if b] 
    transposes = [a + b[1] + b[0] + b[2:] for a, b in s if len(b)>1] 
    replaces = [a + c + b[1:] for a, b in s for c in alphabet if b] 
    inserts = [a + c + b  for a, b in s for c in alphabet] 
    return set(deletes + transposes + replaces + inserts) 

आपको यह देखना होगा इस कोड के साथ बहुत जल्दी जांच करने के लिए शब्द की अपनी बढ़ रही डेटा फ़ाइल के माध्यम से पुनरावृति किया जाना चाहिए। अधिक जानकारी के लिए पूर्ण पोस्ट देखें: केवल 16 हजार शब्दों के लिए

http://blog.mattalcock.com/2012/12/5/python-spell-checker/