2007-01-28
■[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件程度しかない。。。十万単位とかそれ以上でどんな感じか見てみたい。
辞書次第では色々使えるな。。。
トラックバック - http://d.hatena.ne.jp/shimooka/20070128/1169916684
リンク元
- 42 http://labs.uechoco.com/blog/2007/06/levenshtein.html
- 17 http://reader.livedoor.com/reader/
- 15 http://www.google.co.jp/search?q=levenshtein&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 12 http://blog.zuzara.com/2007/01/27/185/
- 12 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLG,GGLG:2005-37,GGLG:ja&q=dvdからboot
- 11 http://jamz.jp/weblog/2008/12/text-compare.html
- 10 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=3v9&q=levenshtein&btnG=検索&lr=lang_ja
- 9 http://www.google.co.jp/url?sa=t&rct=j&q=php levenshtein&source=web&cd=3&ved=0CDIQFjAC&url=http://d.hatena.ne.jp/shimooka/20070128/1169916684&ei=rMCkTprhN675mAXM7riUDw&usg=AFQjCNHByFsjm0-cOi-NF2VIZiM1y1t3lA&cad=rja
- 8 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=PHP+Eclipse&num=50
- 7 http://www.google.co.jp/search?hl=ja&source=hp&q=PHP+levenshtein&lr=&aq=f&oq=








