LIGデザイナー採用
LIGデザイナー採用
2010.01.05

similar_text関数の検証

まっちー

以前(この辺の記事)、similar_text関数が便利なんじゃね? みたいなことを書きました。

あれから何度か使ってはいるのですが、しかし仕方のないこととはいえ、本当にそんな高確率で類似してるのかよと言いたくなるような結果が返ってくることもあります。

例えば、以下のような比較をするとどうなるか。

$str1 = 'あああ';

$str2 = 'いいい';

$result = similar_test($str1, $str2, $percent);

$reusltには一致した文字数、$percentにはパーセンテージが入ります。

実際にやってみれば分かりますが、これを実行すると、一致する文字数は6、パーセンテージは66.666…%となります。正直、この比較で66%が返ってくるのは、あまりよろしくはない…ような気がする。

何でこんな結果が返ってくるのかなと思って、自分なりに検証してみたんですけど、やっぱりというべきか、日本語は基本的にマルチバイト文字なので、2バイトで1文字です。UTF-8の場合は3バイトになったりもする。

で、上の二つの文字列ですが、それぞれ文字コード(UTF-8)で見ると

あああ => E3 81 82 E3 81 82 E3 81 82

いいい => E3 81 83 E3 81 83 E3 81 83

16進表記でこのようになっています。見れば分かるように、非常に似ている。

今回の比較結果は、一致した文字数が6と出ましたから、これはたぶん、6バイト分の文字が一致しているという意味なのでしょう。E3と81がそれぞれ3回ずつかぶっているので、合計で6が出たと、そんな感じだと思います。

つまり、日本語で見れば違う文字であっても、文字コードが近ければ、それ相応の一致率が出てしまうってことですね。早い話、「あ」と「ぱ」を比較したって上記と同じ結果が出る。「ぱ」の文字コードは「E3 81 B1」なので、やはりE3と81が一致する。ぶっちゃけ、全角スペースだって文字コードでは「E3 80 80」なので、「あ」と比較すると33%くらいの結果が返ってくる。

このsimilar_text関数、ソース的にたったの1行で比較ができるという点では確かに便利なんですけど、しかしそれなりに場合を選んで使いこなさないと、プログラム的に期待した結果は出せないかもしれないですね。