检查String听起来像Java中的另一个

时间:2010-03-17 09:38:16

标签: java string

我想知道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)

9 个答案:

答案 0 :(得分:14)

我看到两个主要候选人:

  • Soundex实施的Apache Commons编码。但请注意,它主要用于单个相对较短的单词。在第三个例子中找不到相似之处。此外,它真的只适用于英语单词。
  • Levenshtein distance(再次在Apache Commons处实施)。这与语言无关,但与第三个示例中的切换部分的相似性相对较低(更像是40%)。像Damerau–Levenshtein distance这样的修改可能会产生更好的结果。

答案 1 :(得分:7)

您必须使用“软”字符串指标:

还有很多其他内容,请参阅String Metrics了解概述。

最佳算法在很大程度上取决于问题领域。例如,如果你想比较“真实世界”单词的相似性,SoundEx会降低东欧名字的性能,汉明距离对你没那么大。

答案 2 :(得分:6)

通常,有levenshtein算法,它只输出你需要执行多少次插入/更新/删除操作(字符)才能将一个字符串转换为另一个字符串。 Apache的StringUtils类有一个实现。

答案 3 :(得分:2)

您可以使用:Class Soundex

答案 4 :(得分:2)

对于多个实现,这称为SoundEx,查找java soundex

其中一个是apache soundex看起来不错(虽然我自己没有用过它)。

答案 5 :(得分:2)

听起来像SoundExApache Commons中有一个实现。

答案 6 :(得分:2)

您可以尝试SoundEx算法。

答案 7 :(得分:0)

字符串匹配非常特定于问题,因为大多数情况下,您要匹配的字符串中具有相同的噪声特性,无论是额外的标点符号,拼写错误还是拼写错误。如果您正在大规模地进行此操作,则需要找到适合输入数据中问题的算法。

Soundex会给你一定程度的信心,两个字符串听起来相同,但你可能必须先做一些前期清理(比如删除标点符号并将字符串标记为单独的单词)。

你可以做的最好的事情是进行测试,你可以使用大量不同的算法,levenshtein是一个很好的算法,soundex(尽管你的里程会因你的问题区域而异)。这两种算法也有变化,BTW。

我建议看一下simmetricssecond string库,这些库有很多字符串匹配实现(我更喜欢第二个字符串库)。

听起来你有一个有趣的问题要解决,祝你好运!

答案 8 :(得分:0)

尝试SimMetrics - 包括SoundEx和ChapmanMatchingSoundex在内的开源库,它可以为给出的示例提供更好的分数。即Will Shake vs Shake,这种方法是否会在SoundEx上使用匹配方法。您可能想要尝试的另一个指标,尽管不是非常好的语音分数(如果在不同的名称匹配任务中不是更好),则是同一个库中的q-Grams指标。