2011-12-15 11 views
12

यह कुछ है जो मैं काम कर रहा हूं और मैं यहां बुद्धिमान लोगों से स्टैक ओवरव्लो पर इनपुट चाहता हूं।PHP मरम्मत खराब पाठ

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

मैं 600,000 अंग्रेजी शब्दों के शब्दकोश के साथ शुरू करता हूं, यह कानूनी और चिकित्सा शर्तों और आम नामों सहित काफी कुछ है। मेरे पास यह पहले से ही है।

तब मेरे पास पाठ नमूने के 4 संस्करण हैं।

कुछ इस तरह:

$text[0] = 'Fir5t text sample is thisline'; 
$text[1] = 'Fir5t text Smplee is this line.'; 
$text[2] = 'First te*t sample i this l1ne.'; 
$text[3] = 'F i r st text s ample is this line.'; 

मैं एक आउटपुट जो की तरह लग रहा प्राप्त करने के लिए ऊपर गठबंधन करने के लिए प्रयास कर रहा:

$text = 'First text sample is this line.'; 

मुझे बताओ यह असंभव है, क्योंकि यह निश्चित रूप से नहीं है, बस बहुत मुश्किल है।

मैं किसी भी विचार के प्रति किसी भी विचार की सराहना करता हूं।

धन्यवाद!

मेरे वर्तमान विचार:

बस शब्दकोश के खिलाफ शब्दों जाँच से काम नहीं चलेगा, रिक्त स्थान से कुछ के बाद से गलत जगह में हैं और कभी-कभी शब्द शब्दकोश में नहीं होगा।

प्रमुख चिंता टूटी हुई स्पैक्सिंग की मरम्मत कर रही है, एक बार यह तय हो जाने के बाद सबसे आम तौर पर होने वाले शब्दकोष शब्द को चुना जा सकता है, या फिर सबसे आम गैर-शब्दकोष शब्द। खुद के द्वारा इस तरह

+2

तुम सच में से एक के लिए 4 संस्करणों संयोजित करना चाहते हैं चाहते हैं, या अपने लक्ष्य है एक लाइन लेने के लिए और मदद से इसे ठीक कर के आप शब्दकोश के लिए? – Flo

+0

मैं आसानी से एक लाइन ले सकता हूं और शब्दकोश के साथ "वर्तनी जांच" कर सकता हूं। लेकिन यह मदद नहीं करेगा क्योंकि कई शब्द टूटे हुए हैं, रिक्त स्थान गलत जगहों पर हैं। यही कारण है कि मुझे अलग-अलग लाइनों की तुलना करने की ज़रूरत है, हां उन्हें एक साथ जोड़ दें। – Alasdair

+0

आप यहां जो बात कर रहे हैं वह आर्टिफिशियल इंटेलिजेंस समस्या की तरह बहुत भयानक लगता है। यह PHP में संभव हो सकता है लेकिन यह निश्चित रूप से बहुत ही कुशल नहीं होगा। मैं एक कमांडलाइन उपकरण की तलाश करने की अनुशंसा करता हूं जो यह एक मौजूद है और इसे PHP से निष्पादित करता है। यदि ऐसा कोई उपकरण मौजूद नहीं है, तो एल्गोरिदम का काम करना नौकरी का एक बिल्ली होगा। आप अपने सभी प्रकारों की जांच कर वर्तनी से शुरू कर सकते हैं और यह मानते हुए कि सभी संस्करणों में सभी शब्द समान हैं। फिर उन रेखाओं के लिए जहां वे अलग हैं, वह शब्द चुनें जो अक्सर दिखाई देता है। उसके बाद, कौन जानता है? – GordonM

उत्तर

1

निपटना जटिल एल्गोरिदम शायद अधिक समय लगेगा और हो और त्रुटि एक तीसरी पार्टी उपकरण का उपयोग कर से होने का खतरा - जब तक आप वास्तव में इस खुद के कार्यक्रम की जरूरत है, तो आप Yahoo Spelling Suggestion API देख सकते हैं। वे प्रति दिन प्रति आईपी अनुरोध 5000 की अनुमति देते हैं, मुझे विश्वास है।

अन्य कुछ समान पेशकश कर सकते हैं (मुझे लगता है कि एक बिंग एपीआई भी है)।

अद्यतन: क्षमा करें, मैंने अभी पढ़ा है कि उन्होंने अप्रैल 2011 में इस सेवा को रोक दिया है। वे अब "वर्तनी सुझाव YQL तालिका" नामक एक समान सेवा प्रदान करने का दावा करते हैं।

1

यह वास्तव में एक जटिल समस्या है।

जब मुझे आश्चर्य होता है कि किसी शब्द को कैसे वर्तनी करें, तो सीधे तरीका एक शब्दकोश खोलना है। लेकिन क्या होगा यदि यह एक छोटी जटिल वाक्य है कि मैं सही ढंग से वर्तनी करने की कोशिश कर रहा हूं? मेरी व्यक्तिगत चाल में से एक, जो ज्यादातर समय काम करता है, Google को कॉल करना है। मैं Google पर उद्धरण के बीच अपनी वाक्य डालता हूं और परिणामों की गिनती करता हूं। यहां एक उदाहरण दिया गया है: Google पर "आपका बहुत स्मार्ट" दर्ज करना 13'600k पृष्ठ देता है। "आप बहुत स्मार्ट हैं" दर्ज करना 20'000k पेज देता है। फिर, संभवतः, सही वर्तनी है "आप बहुत स्मार्ट हैं"। और ... वास्तव में यह है;)

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

टुकड़ों में वाक्यों को विभाजित करना और सही "टुकड़ा आकार" ढूंढना भी मुश्किल है।

मुझे थोड़ा क्या चिंता है: आप नमूनों को कैसे निकालें और सही ढंग से वर्तनी वाक्य एक ही (या बहुत करीब?) जानने के लिए उन्हें एक साथ मिलते हैं। आपका प्रश्न यह मानता है कि आपके पास यह है, जो मेरे लिए कुछ जटिल भी लगता है।

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

1

आप इसे प्राप्त करने के लिए Google एन-ग्राम का उपयोग करने का प्रयास कर सकते हैं।

+1

बहुत अच्छा लगता है, लेकिन मुझे नहीं लगता कि इससे कैसे मदद मिलेगी? – Alasdair

1

यदि आपको अन्य की तुलना करके केवल सही स्ट्रिंग प्राप्त करने की आवश्यकता है। तो ऐसा कुछ शायद मदद करेगा।

यह अभी तक समाप्त नहीं हुआ है, लेकिन पहले ही कुछ परिणाम देता है।

$text[0] = 'Fir5t text sample is thisline'; 
$text[1] = 'Fir5t text Smplee is this line.'; 
$text[2] = 'First te*t sample i this l1ne.'; 
$text[3] = 'F i r st text s ample is this line.'; 

function getRight($arr){ 
    $_final=''; 
    $count=count($arr); 

    // Remove multi spaces AND get string lengths 
    for($i=0;$i<$count;$i++){ 
     $arr[$i]=preg_replace('/\s\s+/', ' ',$arr[$i]); 
     $len[$i]=strlen($arr[$i]); 
    } 

    // Max length 
    $_max=max($len); 

    for($i=0;$i<$_max;$i++){ 
     $_el=array(); 
     for($j=0;$j<$count;$j++){ 
      // Cheking letter counts 
      $_letter=$arr[$j][$i]; 
      if(isset($_el[$_letter]))$_el[$_letter]++; 
      else$_el[$_letter]=1; 
     } 
     //Most probably count 
     list($mostProbably) = array_keys($_el, max($_el)); 

     $_final.=$mostProbably; 

     // If probbaly example is not space 
     if($_el!=' '){ 
      // THERE NEED TO BE CODE FOR REMOVING SPACE FROM LINES WHERE $text[$i] is space 
     } 
    } 

    return $_final; 
} 


echo getRight($text); 
+1

मैं आपके मामले में लेवेनशेटिन दूरी ('levenshtein()' PHP में) का उपयोग करूंगा :) – Minras

+0

मैंने कभी इस समारोह, थक्स के बारे में ध्यान नहीं दिया! लेकिन हम नहीं जानते कि तुलना करने के लिए "अच्छा" शब्द क्या है। या मैं कुछ गलत समझ गया? – Narek

+0

हाँ, आप सही हैं। @ अलास्डेयर के कार्य के लिए पूरे शब्द के खिलाफ प्रत्येक शब्द की तुलना करना बहुत महंगा होगा। लेकिन आपके मामले में लेवेनशेटिन दूरी एक अच्छा समाधान है। विषय लेखक के रूप में, मुझे लगता है कि उसे मौजूदा वर्तनी पुस्तकालयों के साथ रहना चाहिए। – Minras

8

क्या आपने सबसे लंबे समय तक सामान्य एल्गोरिदम का उपयोग करने का प्रयास किया है? इन्हें आमतौर पर स्रोत नियंत्रण ऐप्स और कुछ टेक्स्ट संपादकों में उपयोग किए जाने वाले "diff" टेक्स्ट तुलना टूल में देखा जाता है। एक diff एल्गोरिदम दो पाठ नमूने में बदले और अपरिवर्तित वर्णों की पहचान करने में मदद करता है। http://en.wikipedia.org/wiki/Diff

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

अवसर पर आपको एक ऐसे शब्द से मिलान करने की आवश्यकता हो सकती है जिसके लिए ओसीआर परिणामों का कोई संयोजन सभी अक्षरों को उत्पन्न नहीं करेगा। उदाहरण के लिए, एक मध्य अक्षर गुम हो सकता है, जैसा कि "w rd" या "c tch" (संभवतः "शब्द" और "पकड़") में हो सकता है। इस मामले में यह आपके शब्दकोश को किसी भी तीन कुंजी के साथ एक्सेस करने में मदद कर सकता है: प्रारंभिक अक्षर, मध्य अक्षर, और अंतिम अक्षर (या अक्षर संयोजन)। प्रत्येक कुंजी भाषा में घटना की आवृत्ति द्वारा क्रमबद्ध शब्दों की एक सूची से जुड़ा हुआ है। (मैंने क्रॉसवर्ड पीढ़ी ऐप की गति में सुधार करने के लिए इस तरह के मल्टी-कुंजी लुकअप का उपयोग किया; वहां बेहतर तरीके से बेहतर तरीके हो सकते हैं, लेकिन यह लागू करना आसान है।)

स्मृति पर सहेजने के लिए, आप आवेदन कर सकते हैं भाषा में पहले कुछ हज़ार आम शब्दों के लिए बहु-कुंजी विधि, और फिर कम आम शब्दों के लिए केवल एक लुकअप तकनीक है।

शब्द आवृत्ति की कई ऑनलाइन सूचियां हैं। http://en.wiktionary.org/wiki/Wiktionary:Frequency_lists

यदि आप फैंसी प्राप्त करना चाहते हैं, तो आप पाठ में घटना की पूर्व आवृत्ति पर भी भरोसा कर सकते हैं। उदाहरण के लिए, यदि "बार्ड" कई बार प्रकट होता है, तो ओसीआर इंजन कम विश्वास स्कोर के साथ या तो "पक्षी" या "बार्ड" की रिपोर्ट करता है तो यह बेहतर विकल्प हो सकता है। यदि आप एक ही पृष्ठ पर चिकित्सा शर्तों की सांख्यिकीय रूप से असंभव घटना होने पर केवल मेडिकल डिक्शनरी को स्मृति में लोड कर सकते हैं - अन्यथा अपने कामकाजी शब्दकोश से चिकित्सा शर्तों को छोड़ दें, या कम से कम उन्हें उचित संभावनाएं असाइन करें। "प्रोस्थेटिक्स" एक आम शब्द है; "प्रोस्टेटाइटिस" कम इतना है।

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

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

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

+1

मेरी इच्छा है कि सभी नए उपयोगकर्ता आपके जैसे थे। +1 –

+0

धन्यवाद! मैं इसकी सराहना करता हूं। – Rethunk