質問
私はSOUNDEXおよび(ダブル)Metaphoneのを認識してんだけど、これらは私が全体としての言葉の類似性をテストさせてはいけない - 「さようなら」と非常に似て例えば「こんにちは」の音が、これらの方法の両方完全に異なるとしてマークされます。
二つの単語間の類似性を決定することができるRubyで任意のライブラリ、またはあなたが知っている任意の方法は、ありますか? (ブール/類似していない、または数値の40%類似しているいずれか)
の編集:!の異なる方言や言語「の低下」への簡単な方法がある場合は、追加のボーナスポイント
解決
私はあなたのレーベンシュタイン距離を記述していると思います。はい、そのための宝石があります。あなたは純粋なルビーに興味があれば、テキスト宝石のために行く。
$ gem install text
詳細を持っているが、ここでの核心だのドキュメント:
Text::Levenshtein.distance('test', 'test') # => 0
Text::Levenshtein.distance('test', 'tent') # => 1
もしあなたネイティブ拡張としているOK ...
$ gem install levenshtein
これの使い方は似てのです。それのパフォーマンスは非常に良いです。 (それは私のシステムでは、毎分〜1000のスペルの修正を行います。)
あなたは二つの単語がどの程度似ているかを知る必要がある場合は、、ワード長さにわたって使用距離。
あなたは、単純な類似性テストをしたい場合は、このようなものを考えてみます:
テストされていないが、まっすぐます:
String.module_eval do
def similar?(other, threshold=2)
distance = Text::Levenshtein.distance(self, other)
distance <= threshold
end
end
他のヒント
あなたはまず、同じ単語に似た意味を持つ単語を変換しますシソーラスデータベースを使用して、単語を前処理することがあります。様々なシソーラスデータベースは、残念ながら、私は英語のためのまともな無料1( HTTPを見つけることができなかった、そこにあります/ /www.gutenberg.org/etext/3202 のは、私が見つけたが、これは特定の単語が(;反対、別の意味で、似たようなど)がどのような関係を示していないものですので、上のすべての単語同じライン)のいくつかのの関係を持っていますが、その関係が何であるかを知ることができません。
しかし、ハンガリーのために例えばそこに良い無料シソーラスデータベースがあるが、あなたはハンガリー語のテキスト...
のためのsoundex / metaphoneのを持っていません あなたがテキストを前処理プログラムを書くのデータベースを持っている場合は、はあまりにもハード(最終的には、それは単純な検索・置換するのですが、あなたはあまりにも単純またはmethaphoneを使用して、シソーラスデータベースを前処理する場合があります)。
ではありません