【问题标题】:Finding if two strings are almost similar查找两个字符串是否几乎相似
【发布时间】:2015-10-17 00:56:42
【问题描述】:

我想知道你的字符串是否几乎相似。例如,像“Mohan Mehta”这样的字符串应该匹配“Mohan Mehte”,反之亦然。另一个例子,像“Umesh Gupta”这样的字符串应该匹配“Umash Gupte”。

基本上一个字符串是正确的,另一个是拼写错误。我所有的字符串都是人名。

关于如何实现这一点的任何建议。

解决方案不必 100% 有效。

【问题讨论】:

  • 这似乎是编辑距离的问题。最少的编辑意味着更好的匹配。
  • 看看正则表达式模块和模糊匹配:pypi.python.org/pypi/regex
  • 你可以看看“Levenshtein distance”算法。

标签: python regex string


【解决方案1】:

您可以拆分字符串并检查它是否包含至少一个正确的名字/姓氏。

【讨论】:

    【解决方案2】:
    // calculate the similarity between 2 strings
    
      public static double similarity(String s1, String s2) {
        String longer = s1, shorter = s2;
        if (s1.length() < s2.length()) { // longer should always have greater length
          longer = s2; shorter = s1;
        }
        int longerLength = longer.length();
        if (longerLength == 0) { return 1.0; /* both strings are zero length */ }
        /* // If you have StringUtils, you can use it to calculate the edit distance:
        return (longerLength - StringUtils.getLevenshteinDistance(longer, shorter)) /
                                   (double) longerLength; */
        return (longerLength - editDistance(longer, shorter)) / (double) longerLength;
    
      }
    
      // Example implementation of the Levenshtein Edit Distance
      // See http://rosettacode.org/wiki/Levenshtein_distance#Java
      public static int editDistance(String s1, String s2) {
        s1 = s1.toLowerCase();
        s2 = s2.toLowerCase();
    
        int[] costs = new int[s2.length() + 1];
        for (int i = 0; i <= s1.length(); i++) {
          int lastValue = i;
          for (int j = 0; j <= s2.length(); j++) {
            if (i == 0)
              costs[j] = j;
            else {
              if (j > 0) {
                int newValue = costs[j - 1];
                if (s1.charAt(i - 1) != s2.charAt(j - 1))
                  newValue = Math.min(Math.min(newValue, lastValue),
                      costs[j]) + 1;
                costs[j - 1] = lastValue;
                lastValue = newValue;
              }
            }
          }
          if (i > 0)
            costs[s2.length()] = lastValue;
        }
        return costs[s2.length()];
      }
    

    【讨论】:

      【解决方案3】:

      您可能想查看NLTK(自然语言工具包),特别是nltk.metrics 包,它实现了各种字符串距离算法,包括已经提到的Levenshtein 距离。

      【讨论】:

        【解决方案4】:

        如果你想从 stdlib 中获取一些东西,你可以使用difflib.sequencematcher

        from difflib import SequenceMatcher
        s_1 = 'Mohan Mehta'
        s_2 = 'Mohan Mehte'
        print(SequenceMatcher(a=s_1,b=s_2).ratio())
        0.909090909091
        

        fuzzywuzzy 是您可以安装的众多库之一,它使用带有python-Levenshtein 的 difflib 模块。您还应该查看Approximate_string_matching上的维基页面

        【讨论】:

          【解决方案5】:

          另一种方法是使用“phonetic algorithm”:

          语音算法是一种通过发音对单词进行索引的算法。

          例如使用soundex算法:

          >>> import soundex
          >>> s = soundex.getInstance()
          >>> s.soundex("Umesh Gupta")
          'U5213'
          >>> s.soundex("Umash Gupte")
          'U5213'
          >>> s.soundex("Umesh Gupta") == s.soundex("Umash Gupte")
          True
          

          【讨论】:

          • 荒谬...它匹配'camera'和'canera'..试试看..听起来一样..我们可以定制吗?
          【解决方案6】:

          你想要的是string distance。有很多口味,但我建议从Levenshtein distance 开始。

          【讨论】:

          • 这是评论,不是答案。要使其成为答案,您应该指出哪些模块提供了必要的功能,并包含一个代码示例。
          • 这是对所提出问题的回答,
          • 虽然这在技术上是一个答案,但它并不理想,因为实际的答案数据是场外的。请考虑将来源中的详细信息添加到您的答案中。
          猜你喜欢
          • 2018-06-07
          • 1970-01-01
          • 2021-01-12
          • 1970-01-01
          • 2017-02-25
          • 2020-09-16
          • 2021-03-30
          • 2020-10-05
          • 1970-01-01
          相关资源
          最近更新 更多