院生エンジニアのにっき

  • Change style to Blue
  • Change style to Red
  • Change style to Green
  • Change style to Pink

レーベンシュタイン距離(編集距離)をPHPで   2008-11-11

気分転換にレーベンシュタイン距離をPHPで書いてみた(研究と全く関係ないんだけど・・・)

レーベンシュタイン距離の説明は「レーベンシュタイン距離 - Wikipedia」が詳しい。

要は「文字列Aを文字列Bに変換するためにどれだけの操作が必要か」ということ。

1. kitten
2. sitten (“k”を“s”に置換)
3. sittin (“e”を“i”に置換)
4. sitting (“g”を挿入して終了)

でレーベンシュタイン距離=3だそうです。


実装してからLevens・・・と書いてEclipseのコードインテリジェンスで関数候補を見たら「levenshtein」という関数を発見・・・

標準関数でした(PHP: levenshtein


せっかくなんでテストもしてみた。

  1. function LevenshteinDistance($str1, $str2) {
  2.   $d = array ();
  3.   $len1 = strlen($str1);
  4.   $len2 = strlen($str2);
  5.   for ($i1 = 0; $i1 <= $len1; $i1++) {
  6.     $d[$i1] = array ();
  7.     $d[$i1][0] = $i1;
  8.   }
  9.  
  10.   for ($i2 = 0; $i2 <= $len2; $i2++) {
  11.     $d[0][$i2] = $i2;
  12.   }
  13.  
  14.   for ($i1 = 1; $i1 <= $len1; $i1++) {
  15.     for ($i2 = 1; $i2 <= $len2; $i2++) {
  16.       $cost = ($str1[$i1 - 1] == $str2[$i2 - 1]) ? 0 : 1;
  17.       $d[$i1][$i2] = min(
  18.                 $d[$i1 - 1][$i2    ] + 1, //挿入
  19.                 $d[$i1    ][$i2 - 1] + 1, //削除
  20.                 $d[$i1 - 1][$i2 - 1] + $cost //置換
  21.       );
  22.     }
  23.   }
  24.   return $d[$len1][$len2];
  25. }
  26. $test = array(
  27.   array('abc', 'abc'), //0
  28.   array('kitten', 'sitting'), //3
  29.   array('aaaaa', 'bbbbb'),//5
  30.   array('abc', 'bca'),//
  31.   array('12345', '234'),
  32. );
  33. foreach($test as $row) {
  34.   echo levenshtein($row[0], $row[1]);
  35.   echo ' = ';
  36.   echo LevenshteinDistance($row[0], $row[1]);
  37.   echo '<br/>';
  38. }

PHPはこーゆーときの配列処理とかなんか気持ち悪いなと思う。


コメントを書く