テキストボックスから入力された2つの語句の「類似性」を判定する良いアイデアはないでしょうか。
ここでいう「類似性」とは、
・ファンとフアン、キックとキツクの例
・ルーターとルータの例
・第1と第一の例
・緑ヶ丘と緑ガ丘と緑ケ丘の例
・の、ノ、乃、之の例
のような例です。
・一文字ずつのトークンに分解して、大文字なら小文字へ、全角なら半角へ変換したもの同士を比較し一致するか
・あらかじめ定義した異体字テーブルの要素に含まれるか
といった方法しか思いつきません。
何か良い方法がありましたら、ご教授願います。
最終的な用途としては、用語辞典の編集をする際、登録しようとする語句と同一か似た語句がすでに登録されていないかどうかを判別するのに使います。
研究レベルだと思いますし、私はそういうの詳しくないですが。
私なら、スコア化します。
たとえば
同じ位置、違う文字、違う意味をもつ単語を0pt
同じ位置、違う文字、同じ意味をもつ単語を1pt
同じ位置、同じ文字を3pt
同じ位置、同じ順序を*1.2
「ガーリック」と「ガリーツク」
ガ ガ +3 *1
ー リ +0 *1
ッ ツ +1 *1.2
ク ク +3
((3+0+1+3)*1*1*1.2)/4=2.1ポイント
みたいな感じで、ルールやスコアは目的に合わせて変更させていけばかなりの精度が出そうな気がします。
あー、順序不動文字ポイントなんかもつけるといいかもしれませんね。
この場合4文字一致で1文字近似とか
なんか考えているうちに面白くなってきました。
あとで少し調べてみます。
正規表現と言う手もありますよ。
確かDelphiでもいくつかフリーのライブラリーがあったと思いますので
試してみたらどうでしょう。 (RegExpr)
検索したらいろいろと出てきますよ。
皆さん、色々とありがとうございます。
monaaさん、スコア化ってのは面白いですね。適切なスコアリング手順が見つかればよいかも知れませんが、それまではかなりの試行錯誤が必要なんでしょうか。
通りすがりさんのおっしゃる正規表現も考えては見たのですが、入力された語句からパターンを導出するのが大変そうな気がして候補から外していました。
特に日本語限定で調べてもよさそうなライブラリはなさそうですね。
面白そうなのでチャレンジしてみます。
何日かかるか見当もつきませんが。
とりあえず実装してみました。
まだまだやることはありますが、なかなかいい感じです。
参考にどぞ。
http://www.studio-fe.hiroishi.org/component/
皆さん、色々とありがとうございました。
monaaさん、早速使ってみましたが、なかなかいい感じです。
ライセンスフリーとのことで、これに更に手を加えても問題ないでしょうか?
もちろんです、
現段階では実用レベルではありませんので手直しや、切り抜きしてお使いください。私も自分用に作ってますので、時間の空きをつかって完成させるつもりです。
monaaさん、どうもありがとうございます。
謹んで、利用させて頂きます。
ツイート | ![]() |