【问题标题】:Identifying closest match to given string识别与给定字符串最接近的匹配
【发布时间】:2014-07-14 18:55:34
【问题描述】:

我的要求是能够匹配两个相似但不完全匹配的字符串。 例如,给定以下字符串

  • 名字
  • 姓氏
  • LName
  • FName

输出应该是 FirstName、FName 和 Last Name、LName,因为它们是逻辑匹配。有没有我可以用来执行此操作的库?我正在使用 JAVA 来实现此功能。

谢谢 拉姆

【问题讨论】:

  • 关键字是模糊字符串匹配。虽然我不熟悉 Java 中的通用功能或内置功能,但我确实找到了这个:stackoverflow.com/questions/327513/fuzzy-string-search-in-java
  • 也称为“编辑距离”。
  • 值得注意的是,Levenshtein Distance 并不是这里的答案。如果您正在寻找具有最小 Levenshtein 距离的对,您会将“LName”与“FName”匹配,将“First Name”与“Last Name”匹配。所以无论你采用什么方法,为了得到你想要的匹配,它必须是不同于 Levenshtein Distance。
  • @DavidWallace 我的想法。对我来说听起来像是旧的 soundex 函数,但它对于英语以外的其他语言来说很糟糕。
  • 好电话@DavidWallace 我误读了这个问题,并假设 First Name、Last Name、LName 和 FName 是标识符而不是实际值。

标签: java algorithm


【解决方案1】:

您可以使用 Apache Commons StringUtils...

http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#getLevenshteinDistance(java.lang.CharSequence,%20java.lang.CharSequence)

但值得注意的是,这可能不是问题中特定用例的最佳算法 - 我建议在此处阅读其他一些答案以获得更多想法。

【讨论】:

    【解决方案2】:

    根据您给出的示例,您应该使用修改后的 Levenshtein 距离,其中添加空格的惩罚较小,而不匹配字符的惩罚较大。这将处理与缩写很好的字符串匹配的缩写。但是,这是假设您主要处理将缩写与相应的较长版本的字符串对齐。如果您想更详细和明确地回答您可以/应该使用哪些方法,您应该更准确地详细说明您想要执行的匹配类型(例如更多示例或某种高级描述)。

    【讨论】:

      【解决方案3】:

      StringUtils 最适合这个 - 这是我在 stackOverflow 上找到的示例之一 - 正如@CupawnTae 已经说过的那样

      以下是我遇到的一个简单示例

      public static Object getTheClosestMatch(Collection<?> collection, Object target) {
          int distance = Integer.MAX_VALUE;
          Object closest = null;
          for (Object compareObject : collection) {
              int currentDistance = StringUtils.getLevenshteinDistance(compareObject.toString(), target.toString());
              if(currentDistance < distance) {
                  distance = currentDistance;
                  closest = compareObject;
              }
          }
          return closest;
      }
      

      【讨论】:

        【解决方案4】:

        可以在here 找到与您的问题非常相似的答案。

        此外,维基百科有一篇关于近似字符串匹配的文章,可以在 here 找到。如果第一个链接不是您想要的,我建议您阅读维基百科文章并挖掘资源以找到您需要的内容。

        很抱歉,我个人无法为您提供更多帮助,但我真的希望这些资源可以帮助您找到所需的内容!

        【讨论】:

          【解决方案5】:

          拼写检查算法使用此算法的变体。 http://en.wikipedia.org/wiki/Levenshtein_distance。我在课堂上为一个项目实现了它,这样做相当简单。如果您不想自己实现它,您可以使用该名称来搜索其他库。

          【讨论】:

          • 谢谢@wckd,会检查一下。
          猜你喜欢
          • 2017-03-29
          • 1970-01-01
          • 1970-01-01
          • 2013-01-19
          • 2011-08-17
          • 2016-08-06
          • 1970-01-01
          • 2023-03-29
          • 2017-07-13
          相关资源
          最近更新 更多