2010-07-02 10 views
9

PHP için Damerau–Levenshtein algoritmasının bir uygulamasını arıyorum, ancak arkadaşım google ile hiçbir şey bulamıyorum gibi görünüyor. Şimdiye kadar PHP'yi Levenshtein'ı kullanmalıyım (çok önemli olan Damerau aktarımı olmadan), ya da orijinal bir kaynak kodu (C, C++, C#, Perl) almalı ve PHP'ye yazmalı (çevirmeliyim).Damerau-Levenshtein php

PHP uygulaması hakkında bilgisi olan var mı?

Şirket intranetimde "Şunu mu demek istediniz" uzantısı için soundex ve çift metafon kullanıyorum ve sonuçları daha iyi sıralamak için Damerau – Levenshtein algoritmasını uygulamak istiyorum. Bu fikre benzer bir şey: http://www.briandrought.com/blog/?p=66, benim uygulama ilk 5 adımına benzer.

+2

Vikipedi sayfasından yalancı kod var; şüphesiz bu PHP'ye bağlanmak için çok zor olmaz mıydı? – Piskvor

cevap

6

Gerideyken bir stab at it özyinelemeli bir çözüm buldum.

/* 
* Naïve implementation of Damerau-Levenshtein distance 
* (Does not work when there are neighbouring transpositions)! 
*/ 
function DamerauLevenshtein($S1, $S2) 
{ 
    $L1 = strlen($S1); 
    $L2 = strlen($S2); 
    if ($L1==0 || $L2==0) { 
     // Trivial case: one string is 0-length 
     return max($L1, $L2); 
    } 
    else { 
     // The cost of substituting the last character 
     $substitutionCost = ($S1[$L1-1] != $S2[$L2-1])? 1 : 0; 
     // {H1,H2} are {L1,L2} with the last character chopped off 
     $H1 = substr($S1, 0, $L1-1); 
     $H2 = substr($S2, 0, $L2-1); 
     if ($L1>1 && $L2>1 && $S1[$L1-1]==$S2[$L2-2] && $S1[$L1-2]==$S2[$L2-1]) { 
      return min (
       DamerauLevenshtein($H1, $S2) + 1, 
       DamerauLevenshtein($S1, $H2) + 1, 
       DamerauLevenshtein($H1, $H2) + $substitutionCost, 
       DamerauLevenshtein(substr($S1, 0, $L1-2), substr($S2, 0, $L2-2)) + 1 
      ); 
     } 
     return min (
      DamerauLevenshtein($H1, $S2) + 1, 
      DamerauLevenshtein($S1, $H2) + 1, 
      DamerauLevenshtein($H1, $H2) + $substitutionCost 
     ); 
    } 
} 
1

Sadece yerleşik php işlevini kullanmaya ne dersiniz?

http://php.net/manual/en/function.levenshtein.php

int levenshtein (string $str1 , string $str2) 


int levenshtein (string $str1 , string $str2 , int $cost_ins , int $cost_rep , int $cost_del)