Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

levenshtein関数


類似文字列マッチの実装例 今度はPHPのlevenshtein関数を見て「そういえばこんな関数あったっけなぁ」と思い、ちょっとテスト。levenshtein関数が計算するlevenshtein(レーベンシュタイン)距離については、以下が詳しい。

次のコードの元ネタは、PHPマニュアルに掲載されているサンプル。

<?php
$input = '';
if (isset($_POST['keyword']) && $_POST['keyword'] !== '') {
    $input = $_POST['keyword'];

    $words  = array('PHP','ソフトウェア','ほげほげ', 'あれこれ');
    $shortest = -1;
    foreach ($words as $word) {
        $lev = levenshtein($input, $word);
        if ($lev == 0) {
            $closest = $word;
            $shortest = 0;
            break;
        }
        if ($lev <= $shortest || $shortest < 0) {
            $closest  = $word;
            $shortest = $lev;
        }
    }

    echo '入力した単語: ' . htmlspecialchars($input, ENT_QUOTES) . '<br>';
    if ($shortest == 0) {
        echo '一致するものが見つかりました:' . $closest . '<br>';
    } else {
        echo 'もしかして:' . $closest . '<br>';
    }
}
?>
<form action="" method="post">
キーワード:<input type="text" name="keyword">
</form>

ほほぅ。mbstring.internal_encoding=eucjp-winだと、一応日本語も通るみたい。
辞書が大きくなったときのパフォーマンスは?ということで、利用可能な全PHP関数を辞書にしてみた。これはDo You PHP?のEXPERIENCEに用意してみたけど、1100件程度しかない。。。十万単位とかそれ以上でどんな感じか見てみたい。
辞書次第では色々使えるな。。。