【问题标题】:Unexpected results from Metaphone algorithmMetaphone 算法的意外结果
【发布时间】:2021-03-26 07:13:40
【问题描述】:

我正在对 Java 中的不同单词使用语音匹配。我使用了 Soundex,但它太粗糙了。我切换到 Metaphone 并意识到它更好。但是,当我严格测试它时。我发现了奇怪的行为。我想问一下变音器是这样工作的,还是我用错了。在以下示例中,它的工作正常:-

Metaphone meta = new Metaphone();
if (meta.isMetaphoneEqual("cricket","criket")) System.out.prinlnt("Match 1");
if (meta.isMetaphoneEqual("cricket","criketgame")) System.out.prinlnt("Match 2");

这将打印

  Match 1
  Mathc 2

现在“cricket”听起来确实像“criket”,但“cricket”和“criketgame”怎么会是一样的。如果有人会解释这一点。这会有很大帮助。

【问题讨论】:

    标签: java apache-commons-codec metaphone


    【解决方案1】:

    您的用法有点不正确。对编码字符串和默认最大代码长度的快速调查表明它是 4,这会截断较长的“criketgame”的结尾:

    System.out.println(meta.getMaxCodeLen());
    System.out.println(meta.encode("cricket"));
    System.out.println(meta.encode("criket"));
    System.out.println(meta.encode("criketgame"));
    

    输出(注意“criketgame”从“KRKTKM”截断为“KRKT”,匹配“cricket”):

    4 韩国电信 韩国电信 韩国电信


    解决方案:将最大代码长度设置为适合您的应用程序和预期输入的值。 例如:
    meta.setMaxCodeLen(8);
    System.out.println(meta.encode("cricket"));
    System.out.println(meta.encode("criket"));
    System.out.println(meta.encode("criketgame"));
    

    现在输出:

    韩国电信 韩国电信 KRKTKM

    现在您的原始测试给出了预期的结果:

    Metaphone meta = new Metaphone();
    meta.setMaxCodeLen(8);
    System.out.println(meta.isMetaphoneEqual("cricket","criket"));
    System.out.println(meta.isMetaphoneEqual("cricket","criketgame"));
    

    印刷:

    真的 错误的

    顺便说一句,您可能还想尝试DoubleMetaphone,这是算法的改进版本。


    顺便说一下,请注意the documentation 关于线程安全的警告:

    实例字段maxCodeLen 是可变的但不是易失的,并且访问不同步。如果类的实例在线程之间共享,则调用者需要确保使用适当的同步来确保线程之间的值的安全发布,并且在初始设置后不得调用setMaxCodeLen(int)

    【讨论】:

    • 在 8 年级时,我们学习了谚语“外表具有欺骗性”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2014-12-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多