【问题标题】:Check how much a String sounds like another one in Java检查一个字符串在 Java 中听起来有多像另一个字符串
【发布时间】:2011-01-28 12:02:00
【问题描述】:

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

【问题讨论】:

  • 您应该知道 Soundex 和 Levenshtein 是两个截然不同的东西! Levenshtein 帮助您捕捉错别字。例如。用户键入“Wrich”而不是“Erich”,尽管这些词在大声说出时听起来完全不同。 Soundex 可让您找到听起来相似的单词,无论它们实际上有多少个共同字母,例如它可能会让您在查找“Eryk”时找到“Erich”。

标签: java string


【解决方案1】:

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

【讨论】:

  • AFAIK levenshtein 不考虑单词的“发音”。
【解决方案2】:

您可以使用:Class Soundex

【讨论】:

    【解决方案3】:

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

    还有很多其他的,请参阅String Metrics 了解概览。

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

    【讨论】:

      【解决方案4】:

      这称为 SoundEx,查找 java soundex 以获得多个实现。

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

      【讨论】:

        【解决方案5】:

        听起来像SoundExApache Commons 中提供了一个实现。

        【讨论】:

          【解决方案6】:

          你可以试试SoundEx算法。

          【讨论】:

            【解决方案7】:

            我看到两个主要候选人:

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

            【讨论】:

            • (+1) 根据我的经验,Commons Codec 中的 MetaphoneDoubleMetaphone 算法提供了比 SOUNDEX 更好的结果。
            【解决方案8】:

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

            Soundex 会让您确信两个字符串听起来相同,但您可能需要先进行一些前期清理(例如删除标点符号并将字符串标记为单独的单词)。

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

            我建议看看simmetricssecond string 库,它们有大量的字符串匹配实现(我更喜欢第二个字符串库)。

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-03-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-08-20
                • 2013-11-19
                • 2019-05-11
                相关资源
                最近更新 更多