たとえば、レーベンシュタイン距離です。
レーベンシュタイン距離の場合は、http://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%BC%E3%83%99%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E8%B7%9D%E9%9B%A2 を見る限り、自然言語のシンタクス/セマンティクスを考慮していないように思えます。
単語や文レベルでの類似性には信頼性がありそうですが、談話レベルでも有効なのでしょうか。
また、levenshtein gem のような、プログラミング言語 Ruby でのライブラリとして実装があれば、それも知りたいです。
単純なアルゴリズムですが、辞書も不要で意外と的中率の高いものとしてN-gramがあります。
http://www.shuiren.org/chuden/teach/n-gram/index-j.html
下のブログが参考になります。
http://blog.livedoor.jp/techblog/archives/64737211.html
PHPではN-gramを改良した関数としてsimilar_textが組み込まれています。日本語もUTF-8で渡してやれば、きちんと処理できます。
ちなみに、levenshteinも組み込まれています。
Rubyでの実装は下にあります。
http://freestyle.nvo.jp/archives/919
N-gramやlevenshteinは文法や単語の意味を考慮していません。単語の順序が入れ替わってもそこそこ一致するのですが、異なる単語(同義語)が使われていると、途端に精度が落ちます。
そこで、GoogleではN-gramに加えて形態素解析を使うことで精度を高めているそうです。
形態素解析で単語を切り出して、Googleの巨大な辞書で類似語かどうか検索しています。これだと、談話レベルでもそこそこ当たります。
rubyから形態素解析ライブラリmecabを利用する
http://k-shogo.github.io/article/2013/09/04/ruby-mecab/
http://itpro.nikkeibp.co.jp/members/NBY/ITARTICLE/20030131/1/
基礎的なことから、質問へのご回答まで、ありがとうございました。とくにライブドアブログのリンク先のトライグラムの事例が興味深かったです。
2014/04/10 23:04:06