PHPでは、標準でsimilar_text関数levenshtein関数という文字列の類似度を計算する関数があり、簡単に類似した文字列を探すことができる。

int similar_text ( string $first, string $second [, float &$percent] )
int levenshtein ( string $str1, string $str2 [, int $cost_ins, int $cost_rep, int $cost_del] )

どちらの関数も2つの文字列を引数に取り比較する。 similar_text関数3番目の引数は類似度をパーセントで取得するための引数、levenshtein関数の3つ目以降の引数は、挿入、置換、削除にかかるコストを定義するための引数となっている。

注意したいのは、similar_text関数は返り値が大きいほど類似しているのに対して、levenshtein関数は返り値が小さいほど類似しているという点だ。

サンプルソース表示

similar_text関数の$percentは、(返り値*2)/(2つの文字列の長さの合計)という計算で出しているようだ。 一見、あまり似ていないように見える「htmlspe」と「dbmclose」もm,l,s,eの4文字が共通しているために類似度が高くなっている。 日本語の比較は、おそらく2バイト文字として見ていないため、文字によっては変な結果が返ってくるようだが、似ていれば高い類似度が返されている。

どちらの関数も計算コストが高いという欠点はあるが、全ての文字列との類似度を計算することで、「もしかして検索」のようなものを簡単に実装できる。

(※実際の検索エンジンで表示されるものは、おそらく過去の入力から判断しているもので、類似度から判断しているものではないと思われる。)