質問: aimai(s1, s2) とすれば、vに0.4だとか0.2だとか、「s1とs2がどのくらい似ているか」を返す関数、もしくはアルゴリズムは存在するのでしょうか。 返り値の最大値は1.0(完全一致)、最小値は0(何一つ同じ文字がなかった)となるとします。 何を以て「似ている」と評価するかですが、 ・何文字含まれるか ・並び順 という要素は、重要でしょうね。 s2を1文字ずつ分解し、正規表現でヒットするかという流れ /* 初めは、.+c.+ 次は、.+cd.+、それと.+c.*d.+ */ を考えたのですが、私には一般化できそうにありません。
回答: ★『あいまい評価関数』は標準ではないと思います。 ・特に完全一致のときが『1.0』で不一致が『0.0』で、数箇所の文字が一致すると小数で返す関数は 自分で実装するしかないでしょう。 ・アルゴリズムは、上記の仕様を元に考えれば出来そうですね。 つまり、完全一致した場合は『1.0』を返して数箇所の文字(文字列)が一致した場合は、文字列の 長さと一致した個数からパーセントを算出します。このパーセントを小数に変換して返せば良いでしょう。 ・また、一致する文字(文字列)が1つもなければ『0.0』を返すようにします。 ・簡単なアルゴリズムでは、文字列『s1』の中に文字列『s2』が何箇所、含まれるかカウントします。 ゼロの場合は、『s2』を文字単位に分解して文字列『s1』から何箇所、含まれるかカウントします。 文字単位でどれも含まれなければ『0.0』を返す。 ・上記のアルゴリズムで含まれる文字列の個数や文字単位の個数を使って、文字列『s1』の文字数との パーセントを算出します。算出方法は例えば、 s1=abcdefcd123(11バイト) s2=cd(2バイト) の場合『cd』が2箇所一致します。そこで『s2の長さ』×『2箇所一致』÷『s1の長さ』=4÷11=0.3636... を戻り値に返せばいいでしょう。 ・以上。おわり。→アルゴリズムの参考にして下さい。