2010-03-17 45 views
12

我想知道Java中是否有任何类能够使用它自己的标准检查字符串等于另一个字符串的多少。 例子:检查字符串听起来像另一个Java中的字符数

  • 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)
+3

你应该知道,探测法和莱文斯坦是两个完全不同的事情! Levenshtein可以帮助你发现错别字。例如。用户输入“Wrich”而不是“Erich”,尽管当大声说出这些单词时听起来并不相似。 Soundex可以让你找到听起来类似的单词,不管它们有多少共同的字母,例如在寻找“Eryk”时可能会让你找到“Erich”。 – 2010-03-17 10:01:08

回答

5

一般来说,有levenshtein算法,它只是输出了多少插入/更新/删除操作,你就必须执行(面向字符)以便将一个字符串转换为另一个字符串。 Apache的StringUtils类有一个实现。

+3

AFAIK levenshtein不考虑单词的“声音”。 – 2010-03-17 09:47:25

7

你必须使用一个 “软” 字符串指标:

还有很多其他的,请参阅String Metrics的概述。

最好的算法高度依赖于问题领域。例如,如果您想比较“真实世界”单词的相似性,SoundEx会降低东欧名称,而汉明距离对您的帮助不大。

2

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

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

14

我看到两个主要候选人:

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

(+1)的共享编解码器'Metaphone'和'DoubleMetaphone'算法提供更好的结果是SOUNDEX,在我的经验。 – skaffman 2010-03-17 09:54:30

0

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

探测法会给你一个置信度两个字符串发音相同,但您可能需要首先做一些前期的清洗(如消除标点符号和令牌化串入单独的词)。

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

我建议看看simmetricssecond string库有哪些字符串匹配实现的负载(我更喜欢第二个字符串库)。

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

0

尝试SimMetrics - 开源库包括的SoundEx和ChapmanMatchingSoundex这将使对给出的例子一个更好的成绩。即Will Shake vs Shake,这种方法是否会在SoundEx上使用一种匹配方法。您可能想要尝试的另一个度量标准,尽管不是语音评分得分非常好(如果在不同的名称匹配任务中不是更好),则是同一个库中的q-Grams度量标准。