2012-02-24 11 views
6

मैं भागों जो कई तार से मिलते-जुलते हैं निकालने के लिए कोशिश कर रहा हूँ एकाधिक स्ट्रिंग्स से निकालें इसी प्रकार के पार्ट्स।पीएचपी

इसका उद्देश्य शीर्षक पृष्ठ के एकाधिक ओसीआरिंग से किसी पुस्तक के शीर्षक को निकालने का प्रयास है।

यह केवल स्ट्रिंग की शुरुआत पर लागू होता है, तारों के सिरों को छंटनी की आवश्यकता नहीं होती है और वे रह सकते हैं।

उदाहरण के लिए, मेरे तार हो सकता है:

$title[0]='the history of the internet, expanded and revised'; 
$title[1]='the history of the internet'; 
$title[2]='published by xyz publisher the historv of the internot, expanded and'; 
$title[3]='history of the internet'; 

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

तार करने के लिए काटा जाना चाहिए:

$title[0]='the history of the internet, expanded and revised'; 
$title[1]='the history of the internet'; 
$title[2]='the historv of the internot, expanded and'; 
$title[3]='XXX history of the internet'; 

तो मैं पहचान करने के लिए है कि (7 2 3 8) "इंटरनेट के इतिहास" रन है जो सभी तार से मेल खाता है सक्षम होना चाहिए, और है कि पूर्ववर्ती के रूप में यह में तार के> 50% होता है, और इसलिए प्रत्येक स्ट्रिंग की शुरुआत "" और एक ही लंबाई की एक प्लेसहोल्डर स्ट्रिंग नहीं "" पर जोड़ा जाता है करने के लिए छंटनी की है "" संभवत: सही देख रहा है।

अब तक मैं मिल गया है:

function CompareSimilarStrings($array) 
    { 
    $n=count($array); 

    // Get length of each word in each string > 
    for($run=0; $run<$n; $run++) 
     { 
     $temp=explode(' ',$array[$run]); 
     foreach($temp as $key => $val) 
     $len[$run][$key]=strlen($val); 
     } 

    for($run=0; $run<$n; $run++) 
     { 

     } 
    } 

आप देख सकते हैं, मैं चल मैचों खोजने पर अटक कर रहा हूँ।

कोई भी विचार?

+0

क्या यह संभव नहीं है कि ओसीआर एक छोटा शब्द याद करता है या सोचता है कि एक पत्र एक प्रतीक है? ये "चल रहे मैचों" इस संभावना के साथ लागू नहीं लगते हैं। – erisco

+0

यह शब्द याद नहीं है, यह अक्सर एक पत्र गलत होगा, लेकिन यही कारण है कि मैं प्रत्येक शब्द में पत्रों की संख्या का उपयोग करने के बारे में सोच रहा हूँ। कभी-कभी यह एक अक्षर जोड़ या निकाल देगा, लेकिन स्क्रिप्ट अभी भी उन तारों से मेल खाती है जो ठीक हैं। – Alasdair

+0

मैं भी पूछना चाहता हूँ: क्यों शीर्षक "इंटरनेट के इतिहास, विस्तार किया है और" नहीं है? यह नमूनों के 50% के साथ अच्छी तरह से मेल खाता है, और शेष मामलों के साथ एक बड़ा सबसेट मैच। क्या कुछ गारंटी है कि प्रत्येक नमूने में पूरा शीर्षक होता है? यह एकमात्र स्पष्ट नियम है जिसे मैं सोच सकता हूं कि इस उत्तर को अमान्य कर देगा। – erisco

उत्तर

4

आपको स्थानीय स्ट्रिंग संरेखण के लिए Smith-Waterman algorithm पर देखना चाहिए। यह जो स्ट्रिंग के कुछ हिस्सों जो कि में इसी तरह वे कम edit distance है पाता है एक गतिशील प्रोग्रामिंग एल्गोरिथ्म है।

तो यदि आप इसे आजमा देना चाहते हैं, तो यहां एक php implementation of the algorithm है।

+0

बहुत ही रोचक लिंक, धन्यवाद। – Benj