0

我有以下问题。我想在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";

我希望你们能帮助我。

4

1 回答 1

0

Levenshtein 距离(编辑距离)就像手机中的自动更正。以你的例子,我们有applevs appel。如果您考虑添加/删除/替换单个字母,这些词有点接近,我们在这里需要做的就是交换el(实际上ell替换e)。如果您有其他词,例如applrappee- 这些更接近原始词apple,因为您需要做的就是替换单个字母。

余弦相似度完全不同 - 它计算单词,对这些计数进行向量并检查计数的相似程度,这里有 2 个完全不同的单词,所以它返回 0。

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

PS如果你的任务是可能的,我认为翻译软件基本上是完美的,但我不太确定。

于 2017-04-26T14:14:16.087 回答