我有以下问题。我想在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";
我希望你们能帮助我。
答案 0 :(得分:0)
Levenshtein距离(编辑距离)就像手机中的自动校正一样。举个例子,我们有apple
vs appel
。如果您考虑添加/删除/替换单个字母,那么单词就会彼此接近,我们需要做的就是交换e
和l
(实际上用{{替换e
1}}和l
与l
)。如果您有其他字词e
或applr
- 它们更接近原始字appee
,因为您需要做的就是替换一个字母。
余弦相似性完全不同 - 它会计算单词,计算这些计数的向量并检查计数的相似程度,这里有2个完全不同的单词,因此返回0。
你想要的是:这两种技术的组合+具有语言知识的计算机+另一种用于同义词的词典,在使用这些相似性算法之前和之后以某种方式将其考虑在内。想象一下,如果你有一个句子然后你会用同义词替换每一个单词(谁记得乔伊和同义词库?)。句子可能完全不同。此外,每个单词都可以有多个同义词,其中一些同义词只能在特定的上下文中使用。到目前为止,您的任务根本不可能,也许将来也是如此。
P.S。如果您的任务可行,我认为翻译软件基本上是完美的,但我对此并不十分肯定。