4

SOUNDEX と (double) Metaphone は知っていますが、これらでは単語全体の類似性をテストできません。たとえば、「こんにちは」は「さようなら」と非常によく似ていますが、これらの方法はどちらもそれらをマークします。まるで違う。

Ruby に、2 つの単語の類似性を判断できるライブラリ、またはあなたが知っているメソッドはありますか? (ブール値が似ている/似ていない、または数値が 40% 似ている)

編集:別の方言や言語に「立ち寄る」簡単な方法があれば、追加のボーナス ポイント!

4

3 に答える 3

9

レーベンシュタイン距離について説明していると思います。そして、はい、そのための宝石があります。純粋な Ruby に興味がある場合は、text gem を使用してください。

$ gem install text

詳細はドキュメントに記載されていますが、要点は次のとおりです。

Text::Levenshtein.distance('test', 'test')    # => 0
Text::Levenshtein.distance('test', 'tent')    # => 1

ネイティブ拡張でよければ...

$ gem install levenshtein

使い方は似ています。その性能は非常に優れています。(私のシステムでは、毎分最大 1000 のスペル修正を処理します。)

2 つの単語がどの程度似ているかを知る必要がある場合は、単語の長さよりも距離を使用します。

単純な類似性テストが必要な場合は、次のようなものを検討してください。

テストされていませんが、簡単です:

String.module_eval do
   def similar?(other, threshold=2)
    distance = Text::Levenshtein.distance(self, other)
    distance <= threshold
  end
end
于 2010-03-28T13:24:18.530 に答える
-1

最初にシソーラス データベースを使用して単語を前処理すると、類似した意味を持つ単語が同じ単語に変換されます。そこにはさまざまなシソーラス データベースがありますが、残念ながら英語用の適切な無料のデータベースは見つかりませんでした ( http://www.gutenberg.org/etext/3202は私が見つけたものですが、これは特定のシソーラスがどのような関係にあるかを示していません)。単語には (似ている、反対の、別の意味など) があるため、同じ行にあるすべての単語にはなんらかの関係がありますが、その関係が何であるかはわかりません)

しかし、たとえばハンガリー語には優れた無料のシソーラス データベースがありますが、ハンガリー語のテキストには soundex/metaphone がありません...

テキストを前処理するプログラムを作成するデータベースがある場合は、それほど難しくありません (最終的には単純な検索置換ですが、シンプレックスまたはメタフォンを使用してシソーラス データベースを前処理することもできます)。

于 2010-03-28T09:40:05.783 に答える