2013-05-14 107 views
1

我試圖檢查字符串的大致相似性。在PHP中檢查兩個字符串的近似匹配

這是我使用的標準。

1)單詞的順序很重要 2)單詞可以有80%的相似性。

實施例:

$string1 = "How much will it cost to me" //string in vocabulary (all "right" words is here) 
$string2 = "How much does costs it " //"costs" instead "cost" -is a deliberate mistake (user input); 

Algoritm: 1)檢查字的相似性,並創建清潔字符串「右」的話(根據它出現在詞彙中的順序)。 輸出:「多少錢費用」 2)創建乾淨的字符串與「正確」的話,以便它出現在用戶輸入。 輸出:「多少成本」 3)比較兩個輸出 - 如果不相同 - 返回否,否則如果相同返回是。

有什麼建議嗎?我開始編寫代碼,但我不熟悉PHP中的工具,所以我不知道如何理性和有效地做到這一點。

它看上去更像是使用Javascript/PHP的

$string1="how much will it cost for me" ; 
$string2= "how much does costs it"; 

function compareStrings($string1, $string2) { 

    if (strlen($s1)==0 || strlen($s2)==0) { 
     return 0; 
    } 

    while (strpos($s1, " ")!==false) { 
     $s1 = str_replace(" ", " ", $s1); 
    } 
    while (strpos($s2, " ")!==false) { 
     $s2 = str_replace(" ", " ", $s2); 
    } 

    $ar1 = explode(" ",$s1); 
    $ar2 = explode(" ",$s2); 
    $array1 = array_flip($ar1); 
    $array2 = array_flip($ar2); 
    $l1 = count($ar1); 
    $l2 = count($ar2); 

$meaning=""; 
    $rightorder="" 

    for ($i=0;$i<=$l1;$i++) { 


     for ($j=0;$j<=$l2;$j++) { 

     $k= similar_text($array1[i], $array2[j], $perc).PHP_EOL; 
if ($perc>=85) { 
    $meaning=$meaning." ".$array1[j]; //generating a string of the first output 
    $rightorder[i]= array1[i]; //generating the array with second output 

} 

     } 


    } 

} 

的想法泰德的$意義將得到 「多少它的成本」 美元再經過rightorder將獲得

$rightorder[0]='how' 
$rightorder[1]='much' 
$rightorder[2]='' 
$rightorder[3]='cost' 
$rightorder[4]='it' 

我會以某種方式反轉回字符串「多少成本」

並比較這兩個。

if ("how much cost it"=="how much it cost") return true; else return false. 
+0

查看[levenshtein()](http://php.net/manual/en/function.levenshtein.php)和[similar_text()](http://www.php.net/manual/en /function.similar-text。PHP)提供的功能,它們可能適合賬單。 – hexblot 2013-05-14 13:20:43

+0

不確定... – 2013-05-14 13:23:20

+1

另外[soundex](http://php.net/manual/en/function.soundex.php) – 2013-05-14 13:23:51

回答

1

您的問題屬於NLP(自然語言處理)科學。

在問題中提到的每個問題有一個提交了自己的研究:

  • 將字符串分割成單詞是tokenization。這似乎在英語中是微不足道的,但它不像其他語言,如德語。還有一個如何解析標點符號的問題。

  • 創建「正確的詞」被稱爲詞幹。有很多工具可以做到這一點。如果你的文字是英文的,你可以嘗試Porter Stemming Algorithm。其他語言可能有自己的詞幹技術,通常存在字典算法。

  • 根據單詞出現次數來計算字符串的相似度被稱爲「Cosine Similarity」。還有其他一些技巧。有ALSE問題OD synonymypolysemy

我希望這有助於爲你的問題是上面提到的問題的混合物。

+0

是的,我知道什麼是NLP,但我不想深入它。這是我的簡化解決方案(適用於拉丁語言) – 2013-05-14 15:07:02

相關問題