Python 查找两个字符串是否几乎相似

Python 查找两个字符串是否几乎相似,python,regex,string,Python,Regex,String,我想知道你们的字符串是否几乎相似。例如,类似“Mohan Mehta”的字符串应与“Mohan Mehte”匹配,反之亦然。另一个例子是,像“Umesh Gupta”这样的字符串应该与“Umash Gupte”匹配 基本上一个字符串是正确的,另一个是拼写错误。我所有的字符串都是人名 关于如何实现这一目标的任何建议 解决方案不一定要100%有效。您需要的是。有很多种口味,但我建议先来点 如果您想从stdlib中获取某些内容,可以使用: from difflib import SequenceMat

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

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

关于如何实现这一目标的任何建议

解决方案不一定要100%有效。

您需要的是。有很多种口味,但我建议先来点

如果您想从stdlib中获取某些内容,可以使用:

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

是可以安装的众多lib之一,它使用difflib模块。您还应该查看

上的wikipage另一种方法是使用“”:

语音算法是一种根据单词的发音建立索引的算法

例如,使用算法:

>>> import soundex
>>> s = soundex.getInstance()
>>> s.soundex("Umesh Gupta")
'U5213'
>>> s.soundex("Umash Gupte")
'U5213'
>>> s.soundex("Umesh Gupta") == s.soundex("Umash Gupte")
True
您可能需要查看(自然语言工具包),特别是实现各种字符串距离算法的软件包,包括前面提到的Levenshtein距离。

//计算两个字符串之间的相似性
// 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()];
  }
公共静态双重相似性(字符串s1、字符串s2){ 字符串长=s1,短=s2; 如果(s1.length()
您可以拆分字符串并检查它是否包含至少一个正确的名/姓。

这似乎是编辑距离的问题。最少的编辑意味着更好的匹配。看看正则表达式模块和模糊匹配:你可以看看“Levenshtein距离”算法。这是一个注释,不是答案。要回答这个问题,您应该指出哪些模块提供了必要的功能,并包括一个代码示例。这是对所提出问题的回答,虽然这在技术上是一个回答,但并不理想,因为实际的回答数据是非现场的。请考虑从你的来源添加细节到你的答案。它与“照相机”和“卡内拉”匹配。。试试看。。它们听起来如何相同。。我们可以定制吗?