我想知道Java中是否有任何类能够使用自己的标准检查String与另一个相等的多少。 示例:
William Shakespeare / William Shakespeare : might be 100%
William Shakespe**a**re / William Shakespe**e**re : might have above 90%
William Shakespeare / Shakespeare, William : might have above 70% (just examples)
答案 0 :(得分:14)
我看到两个主要候选人:
答案 1 :(得分:7)
您必须使用“软”字符串指标:
还有很多其他内容,请参阅String Metrics了解概述。
最佳算法在很大程度上取决于问题领域。例如,如果你想比较“真实世界”单词的相似性,SoundEx会降低东欧名字的性能,汉明距离对你没那么大。
答案 2 :(得分:6)
通常,有levenshtein算法,它只输出你需要执行多少次插入/更新/删除操作(字符)才能将一个字符串转换为另一个字符串。 Apache的StringUtils类有一个实现。
答案 3 :(得分:2)
您可以使用:Class Soundex
答案 4 :(得分:2)
对于多个实现,这称为SoundEx,查找java soundex。
其中一个是apache soundex看起来不错(虽然我自己没有用过它)。
答案 5 :(得分:2)
听起来像SoundEx,Apache Commons中有一个实现。
答案 6 :(得分:2)
您可以尝试SoundEx算法。
答案 7 :(得分:0)
字符串匹配非常特定于问题,因为大多数情况下,您要匹配的字符串中具有相同的噪声特性,无论是额外的标点符号,拼写错误还是拼写错误。如果您正在大规模地进行此操作,则需要找到适合输入数据中问题的算法。
Soundex会给你一定程度的信心,两个字符串听起来相同,但你可能必须先做一些前期清理(比如删除标点符号并将字符串标记为单独的单词)。
你可以做的最好的事情是进行测试,你可以使用大量不同的算法,levenshtein是一个很好的算法,soundex(尽管你的里程会因你的问题区域而异)。这两种算法也有变化,BTW。
我建议看一下simmetrics和second string库,这些库有很多字符串匹配实现(我更喜欢第二个字符串库)。
听起来你有一个有趣的问题要解决,祝你好运!
答案 8 :(得分:0)
尝试SimMetrics - 包括SoundEx和ChapmanMatchingSoundex在内的开源库,它可以为给出的示例提供更好的分数。即Will Shake vs Shake,这种方法是否会在SoundEx上使用匹配方法。您可能想要尝试的另一个指标,尽管不是非常好的语音分数(如果在不同的名称匹配任务中不是更好),则是同一个库中的q-Grams指标。