2017-04-26 11 views
0

次の問題があります。私は同様の意味を持つjavaの文字列を識別したい。 文字列間の類似度をStringmetricsで計算しようとしました。 これは期待通りに機能しますが、私はもっと便利なものが必要です。Javaで同じ意味の文字列を確認

String s1 = "apple"; 
String s2 = "appel"; 

そしてそれらの2つの文字列が非常に類似している:私は次の2列(1ワード)を有する場合、例えば

double score = cosine.compare(s1, s2); // 0.0 

しかし、私はdamerau-レーベンシュタインの類似性を使用する場合、私は次のような結果を得る:私はコサイン類似度を使用すると、私は次のような結果を得る

double score = damerauLevenshtein.compare(s1, s2); // 0.8 

を次の問題がたくさんあるということです単語の同義語のStringmetricsでは、これらの同義語は考慮されません。

例えばこれら2つの文字列が同じと考えるべきである。

String s3 = "purchase 10 bottles of water"; 
String s4 = "buy 10 waterbottles"; 

私はあなたたちが私を助けることができると思います。

+0

広範囲に及ぶ。それはKIの一種です – Jens

+0

私はあなたがこれのようなものの複雑さを把握しているとは思わない;) –

+1

ああ、それは簡単です。あなたは5兆の 'if'文しか必要としません。完成したコードをCode Reviewに投稿してください。 – Michael

答えて

0

Levenshtein distance(編集距離)は、お使いの携帯電話で自動修正と似ています。あなたの例を挙げるとappleappelです。あなたが1文字を追加/削除/置き換えることを考えれば、単語はちょっと近づいているので、スワップel(実際にはelと置き換えてleに置き換えてください)。 applrまたはappeeのような他の単語がある場合は、元の単語appleに近いものです。これは、1文字を置き換えるだけで済みます。

コサインsimiliarityは完全に異なっている - 、それが言葉をカウントし、それらのカウントとチェックのベクトルがどのようにカウント似、ここでそれはあなたが望むもの0

を返しますので、あなたは2つの全く異なる単語を持っているされます:コンボこれらの2つの技術+言語知識を有するコンピュータ+これらの類似アルゴリズムを使用する前後に何らかの形で考慮される同義語のための別の辞書。あなたが文を持っていれば、すべての単語を同義語(JoeyとThesaurusを覚えている人)に置き換えると想像してください。文は全く異なることがあります。さらに、すべての単語に複数の同義語を含めることができ、それらの同義語の一部は特定のコンテキストでのみ使用できます。あなたの仕事は今の時点では不可能であり、将来的にはおそらく不可能です。

P.S.あなたの仕事が可能だったなら、私はソフトウェアの翻訳は基本的に完璧だと思っていますが、私はそれについて本当に分かりません。

関連する問題