我一直在使用 [Simmetrics][1] Java 库成功地比较两个字符串,并取得了很好的成功。但似乎有两种方法,我需要将两者结合起来用于我的场景。
目前我正在使用 CosineSimilarity(我确实使用了一些简化器,但这里省略了以保持代码简单)
StringMetric metric = with(new CosineSimilarity<String>())
.tokenize(Tokenizers.whitespace()).build();
score = metric.compare(string1, string2);
这工作得很好,除非我有一个简单的拼写错误我会期望一个比我得到的更高的分数
例如比较mony honey和money honey只返回0.5(分数从0.0到1.0,1.0是完美匹配),我本来期望更高。
使用 Levenshtein 它返回更好的0.9090909
但是我在阅读文档时注意到的一件事是,这是一个MultiSet指标,并且 whitespace() 实际上需要将输入分成几部分,而像Levenshtein这样的StringMetric则不需要
StringMetric metric = with(new Levenshtein())
.build();
这意味着 Levenshtein 没有特别考虑空格,这是一个问题,因为我想匹配单词并且基本上忽略空格或顺序。
因此,例如使用 CosineSimilarity 它在比较蜂蜜陷阱和陷阱蜂蜜时返回 1.0,但 Levenshtein 返回 0.0,这对我没有好处。
我理想地想要的是词序不重要,然后如果单词中只有轻微的变化,例如money/mony,那么单个单词就可以很好地匹配
字符串可以是任何语言,但最常见的是英文,它们是歌曲标题,因此通常少于十个单词,通常大约 5 个单词长。
Simmetrics 是否提供另一种可以同时提供这两个部分的算法?
有诸如RefinedSoundex 之类的简化器可以应用于输入,但由于该语言可能不是英语,因此认为这不会很好。
你认为最好的算法是什么?