识别java中具有相同含义的字符串

时间:2017-04-26 13:31:31

标签: java string-metric

我有以下问题。我想在java中识别具有类似含义的字符串。 我试图用Stringmetrics来计算字符串之间的相似性。 这可以按预期工作,但我需要更方便的东西。

例如,当我有以下2个字符串(1个字)时:

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

那两个字符串非常相似。当我使用余弦相似度时,我得到以下结果:

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

但是当我使用damerau-levenshtein相似度时,我得到以下结果:

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

下一个问题是词语有很多同义词。使用Stringmetrics时,不会考虑这些同义词。

例如,这两个字符串应该被认为是相同的:

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

我希望你们能帮助我。

1 个答案:

答案 0 :(得分:0)

Levenshtein距离(编辑距离)就像手机中的自动校正一样。举个例子,我们有apple vs appel。如果您考虑添加/删除/替换单个字母,那么单词就会彼此接近,我们需要做的就是交换el(实际上用{{替换e 1}}和ll)。如果您有其他字词eapplr - 它们更接近原始字appee,因为您需要做的就是替换一个字母。

余弦相似性完全不同 - 它会计算单词,计算这些计数的向量并检查计数的相似程度,这里有2个完全不同的单词,因此返回0。

你想要的是:这两种技术的组合+具有语言知识的计算机+另一种用于同义词的词典,在使用这些相似性算法之前和之后以某种方式将其考虑在内。想象一下,如果你有一个句子然后你会用同义词替换每一个单词(谁记得乔伊和同义词库?)。句子可能完全不同。此外,每个单词都可以有多个同义词,其中一些同义词只能在特定的上下文中使用。到目前为止,您的任务根本不可能,也许将来也是如此。

P.S。如果您的任务可行,我认为翻译软件基本上是完美的,但我对此并不十分肯定。