いくつかの方法で書くことができる名前を比較する必要があります。たとえば、St。Thomasのような名前は、St-ThomasやSantThomasのように書かれることがあります。できれば、一部のフォーラムのように、比較に「同等」のパーセンテージを与える関数を作成することを検討しています(たとえば、この投稿は5%編集されています)。
5 に答える
PHPには、このための2つの(メインの)組み込み関数があります。
levenshtein
これは、string1からstring2を生成するために必要な変更(削除/追加/置換)の数をカウントします。(低いほど良い)
と
similar_text
一致する文字の数を返します(多いほど良い)。3番目のパラメーターとして参照を渡すことができ、パーセンテージが表示されることに注意してください。
<?php
$originalPost = "Here's my question to stack overflou. Thanks /h2ooooooo";
$editedPost = "Question to stack overflow.";
$matchingCharacters = similar_text($originalPost, $editedPost, $matchingPercentage);
var_dump($matchingCharacters); //int(25)
var_dump($matchingPercentage); //float(60.975609756098) (hence edited 40%)
?>
2つの文字列間の編集距離は、通常、レーベンシュタイン距離を指します。
$v1 = 'pupil';
$v2 = 'people';
# TRUE if $v1 & $v2 have similar pronunciation
soundex($v1) == soundex($v2);
# Same but it use a more accurate comparison algorithm
metaphone($v1) == metaphone($v2);
# Calculate how many common characters between 2 strings
# Percent store the percentage of common chars
$common = similar_text($v1, $v2, $percent);
# Compute the difference of 2 text
$diff = levenshtein($v1, $v2);
したがって、levenshtein($v1, $v2)
またはそれsimilar_text($v1, $v2, $percent)
を実行しますが、それでもトレードオフがあります。levenshtein()
アルゴリズムの複雑さはですO(m*n)
。ここで、nとmはv1とv2の長さです(、と比較するとかなり良いsimilar_text()
ですがO(max(n,m)**3)
、それでも高価です)。
チェックアウトlevenshtein()
、あなたが望むことを行い、比較的効率的です(しかし非常に効率的ではありません):
http ://www.php.net/manual/en/function.levenshtein.php
さまざまなアプローチを使用できます。
このsimilar_text()
関数を使用して、類似性をチェックできます。
また
関数を使用levenshtein()
して調べることができます...
レーベンシュタイン距離は、str1をstr2に変換するために、置換、挿入、または削除する必要のある最小文字数として定義されます。
次に、チェックの妥当なしきい値を確認します。