similar_text

二つの文字列の間の類似性を計算する

説明

int similar_text(string $string1, string $string2, float &$percent = null)

この関数は、Programming Classics: Implementing the World's Best Algorithms by Oliver (ISBN 0-131-00413-1) に記述されたように二つの文字列の間の類似性を計算します。 この実装は Oliver の擬似コードの様にスタックを使用せず、 プロセス全体の速度が改善されるかどうかにかかわらず再帰呼び出しを行うことに注意してください。 このアルゴリズムの計算量は、O(N**3) であることにも注意してください。 ただし、N は最も長い文字列の長さです。

パラメータ

string1

最初の文字列。

string2

次の文字列。

注意:

string1string2 を入れ替えると、 結果は異なるものになります; 例を参照ください。

percent

3 番目の引数としてリファレンスを渡すことにより、 similar_text は類似性をパーセントで計算します。 これは、similar_text の結果を、 与えられた文字列の長さの平均を 100 倍した値で割ることで出しています。

戻り値

両方の文字列でマッチした文字の数を返します。

マッチする文字数は、 最初の共通最長部分文字列を探し、 同じことをその文字列の 前後の文字列に対して再帰的に行うことで計算されます。 そうして見つかった全ての共通部分文字列の長さが追加されます。

例1 similar_text で、引数を入れ替えた場合の例

以下のコードは、 string1string2 を入れ替えると、異なる結果になる可能性を示しています。

<?php
$sim = similar_text('bafoobar', 'barfoo', $perc);
echo "類似度: $sim ($perc %)\n";
$sim = similar_text('barfoo', 'bafoobar', $perc);
echo "類似度: $sim ($perc %)\n";

上の例の出力は、 たとえば以下のようになります。

類似度: 5 (71.428571428571 %)
類似度: 3 (42.857142857143 %)

参考

  • levenshtein
  • soundex