2010-12-06 7 views
5

मेरे पास शब्दों की दो सूची है, मान लीजिए LIST1 और LIST2। मैं LIST1 को LIST2 के विरुद्ध डुप्लीकेट खोजने के लिए तुलना करना चाहता हूं, लेकिन इसे शब्द के बहुवचन के साथ-साथ आईएनजी फॉर्म भी मिलना चाहिए। उदाहरण के लिए।शब्दों की तुलना करें, plurals और ing के लिए भी देखने की जरूरत है?

मान लीजिए कि LIST1 में "खाता" शब्द है, और LIST2 में "खाते, लेखांकन" शब्द हैं, जब मैं तुलना करता हूं तो परिणाम "खाता" शब्द के लिए दो मैच दिखाना चाहिए।

मैं इसे PHP में कर रहा हूं और MySQL तालिका में सूची है।

+0

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

उत्तर

0

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

Duplicate Ending List 
s 
es 
ing 

LIST1 
Gas 
Test 

LIST2 
Gases 
Tests 
Testing 

जोड़ने के रूप में अब List2 को List1 तुलना शब्द से बाहर बहुवचन बनाने के लिए एक एल्गोरिथ्म उत्पन्न करने के लिए होगा यदि नहीं। तुलना के समान लूप के दौरान वस्तुओं की सीधी तुलना होती है और एक जहां सूची 1 से शब्द, वर्तमान शब्द से हटा दिया जाता है, जिसे आप सूची में देख रहे हैं 2. अब जांचें कि यह परिणाम डुप्लिकेट एंडिंग सूची में है।

आशा है कि यह समझ में आता है।

0

इसके साथ समस्या कम से कम अंग्रेजी में है, बहुवचन सभी मानक एक्सटेंशन नहीं हैं, न ही वर्तमान कण हैं। आप सभी शब्दों +'ing' और +'s' का उपयोग करके अनुमान लगा सकते हैं, लेकिन इससे झूठी सकारात्मक और नकारात्मकताएं मिलेंगी।

यदि आप चाहें तो इसे सीधे MySQL में संभाल सकते हैं।

SELECT DISTINCT l2.word 
    FROM LIST1 l1, LIST l2 
    WHERE l1.word = l2.word OR l1.word + 's' = l2.word OR l1.word + 'ing' = l2.word; 
5

आप एक तकनीक porter stemming कहा जाता है इसकी स्टेम करने के लिए प्रत्येक सूची प्रविष्टि मैप करने के लिए उपयोग कर सकते हैं, तो उपजी की तुलना करें। PHP में पोर्टर स्टेमिंग एल्गोरिदम का कार्यान्वयन here या here पाया जा सकता है।

+0

+1 :) – RobertPitt

+0

अच्छा। पहले उस तकनीक के बारे में कभी नहीं सुना था। – Veign

+0

यही कारण है कि यह सिर्फ मेरी शोध सूची में चला गया। एल्गोरिदम के लिए धन्यवाद – RobertPitt

0

यह फ़ंक्शन एक शब्द के बहुवचन को आउटपुट करेगा।

http://www.exorithm.com/algorithm/view/pluralize

कुछ समान gerunds और वर्तमान participles (ing रूपों)

+0

धन्यवाद माइक सी यह स्क्रिप्ट सरल और समझने में आसान थी और मुझे कुछ विचार पाने में मदद मिली – daron

0

आप इस के लिए एक stemmer साथ संयोजन के रूप में Doctrine Inflector वर्ग विचार कर सकते हैं के लिए लिखा जा सकता है।

यहाँ एक उच्च स्तर पर एल्गोरिथ्म

  1. रिक्त स्थान पर स्प्लिट खोज स्ट्रिंग, प्रक्रिया शब्द अलग-अलग
  2. छोटे खोज शब्द
  3. पट्टी विशेष वर्ण
  4. Singularize, वाइल्डकार्ड के साथ differing portion की जगह ('है % ')
  5. स्टेम, वाइल्डकार्ड ('% ')
012 के साथ अलग-अलग हिस्से को प्रतिस्थापित करें

यहाँ समारोह मैं कई परीक्षण तार

Input String: Mary's Hamburgers 
SearchString: SELECT * FROM LIST2 WHERE LOWER(some_field) LIKE 'mary% hamburger%'; 

Input String: Office Supplies 
SearchString: SELECT * FROM LIST2 WHERE LOWER(some_field) LIKE 'offic% suppl%'; 

Input String: Accounting department 
SearchString: SELECT * FROM LIST2 WHERE LOWER(some_field) LIKE 'account% depart%'; 
शायद

सही नहीं के साथ एक साथ रखा

/** 
* Use inflection and stemming to produce a good search string to match subtle 
* differences in a MySQL table. 
* 
* @string $sInputString The string you want to base the search on 
* @string $sSearchTable The table you want to search in 
* @string $sSearchField The field you want to search 
*/ 
function getMySqlSearchQuery($sInputString, $sSearchTable, $sSearchField) 
{ 
    $aInput = explode(' ', strtolower($sInputString)); 
    $aSearch = []; 
    foreach($aInput as $sInput) { 
     $sInput = str_replace("'", '', $sInput); 

     //-------------------- 
     // Inflect 
     //-------------------- 
     $sInflected = Inflector::singularize($sInput); 

     // Otherwise replace the part of the inflected string where it differs from the input string 
     // with a % (wildcard) for the MySQL query 
     $iPosition = strspn($sInput^$sInflected, "\0"); 

     if($iPosition !== null && $iPosition < strlen($sInput)) { 
      $sInput = substr($sInflected, 0, $iPosition) . '%'; 
     } else { 
      $sInput = $sInput; 
     } 

     //-------------------- 
     // Stem 
     //-------------------- 
     $sStemmed = stem_english($sInput); 

     // Otherwise replace the part of the inflected string where it differs from the input string 
     // with a % (wildcard) for the MySQL query 
     $iPosition = strspn($sInput^$sStemmed, "\0"); 

     if($iPosition !== null && $iPosition < strlen($sInput)) { 
      $aSearch[] = substr($sStemmed, 0, $iPosition) . '%'; 
     } else { 
      $aSearch[] = $sInput; 
     } 
    } 

    $sSearch = implode(' ', $aSearch); 
    return "SELECT * FROM $sSearchTable WHERE LOWER($sSearchField) LIKE '$sSearch';"; 
} 

कौन सा मैं भाग गया है, लेकिन यह एक अच्छी शुरुआत वैसे भी है! जहां यह गिरावट आती है वह तब होती है जब एकाधिक मिलान लौटाए जाते हैं। सर्वश्रेष्ठ मैच निर्धारित करने के लिए कोई तर्क नहीं है। यही वह जगह है जहां MySQL fulltext और Lucene जैसी चीजें आती हैं। इसके बारे में कुछ और सोचकर, आप इस दृष्टिकोण के साथ कई परिणामों को रैंक करने के लिए levenshtein का उपयोग करने में सक्षम हो सकते हैं!