最小编辑距离_Python

作者: 哈士奇_银桑 | 来源:发表于2016-03-17 10:35 被阅读4429次

最小编辑距离或莱文斯坦距离(Levenshtein),指由字符串A转化为字符串B的最小编辑次数。允许的编辑操作有:删除,插入,替换。具体内容可参见:维基百科—莱文斯坦距离
一般代码实现的方式都是通过动态规划算法,找出从A转化为B的每一步的最小步骤。
从Google图片借来的图(原图地址),

矩阵示意图
Python代码实现, (其中要注意矩阵的下标从1开始,而字符串的下标从0开始):
 def normal_leven(str1, str2):
      len_str1 = len(str1) + 1
      len_str2 = len(str2) + 1
      #create matrix
      matrix = [0 for n in range(len_str1 * len_str2)]
      #init x axis
      for i in range(len_str1):
          matrix[i] = i
      #init y axis
      for j in range(0, len(matrix), len_str1):
          if j % len_str1 == 0:
              matrix[j] = j // len_str1
          
      for i in range(1, len_str1):
          for j in range(1, len_str2):
              if str1[i-1] == str2[j-1]:
                  cost = 0
              else:
                  cost = 1
              matrix[j*len_str1+i] = min(matrix[(j-1)*len_str1+i]+1,
                                          matrix[j*len_str1+(i-1)]+1,
                                          matrix[(j-1)*len_str1+(i-1)] + cost)
          
      return matrix[-1]

最近看文章看到Python库提供了一个包difflib实现了从对象A转化对象B的步骤,那么计算最小编辑距离的代码也可以这样写了:

def difflib_leven(str1, str2):
   leven_cost = 0
   s = difflib.SequenceMatcher(None, str1, str2)
   for tag, i1, i2, j1, j2 in s.get_opcodes():
       #print('{:7} a[{}: {}] --> b[{}: {}] {} --> {}'.format(tag, i1, i2, j1, j2, str1[i1: i2], str2[j1: j2]))
   
       if tag == 'replace':
           leven_cost += max(i2-i1, j2-j1)
       elif tag == 'insert':
           leven_cost += (j2-j1)
       elif tag == 'delete':
           leven_cost += (i2-i1)
   return leven_cost        

代码地址

相关文章

  • 最小编辑距离_Python

    最小编辑距离或莱文斯坦距离(Levenshtein),指由字符串A转化为字符串B的最小编辑次数。允许的编辑操作有:...

  • 最小编辑距离

    编辑距离,又称为Levenshtein距离,由俄罗斯的数学家Vladimir Levenshtein在1965年提...

  • 最小编辑距离

    题目 给定一个源串S和目标串T,能够对源串进行如下操作:1.在给定位置上插入一个字符2.替换任意字符3.删除任意字...

  • 最小编辑距离

    定义:两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同。许可的编辑操作包...

  • 最小编辑距离

    1.定义 假设只有三种编辑方式:插入,删除,替换。每种编辑方式对应一次操作。按规定的编辑方式,将原始字符串变换到目...

  • 最小编辑距离

    求两个字符串最小编辑距离,word1->word2转换 word1的前i个字符串要想转换为word2的前j个字符串...

  • 最小编辑距离

    最小编辑距离 编辑距离有两种: Levenshtein距离: 允许插入,删除和替换一个字符, 最常见 Damera...

  • NLP-2012斯坦福课程第3课 基本问题

    一、最小编辑距离编辑距离(Minimum Edit Distance,MED),又称Levenshtein距离,是...

  • 360经典笔试 最小编辑距离(python)

    已知有两个字符韦str1,str2 ,现在需要把str1通过若干次操作修改成str2。可使用的操作包括插入,删除,...

  • 72、最小编辑距离

    我太小看面试难度了,本来以为这样的题目不会遇到,但是小米面试的时候遇到了,好在没做出来也过了,所以一定要搞懂啊。 ...

网友评论

    本文标题:最小编辑距离_Python

    本文链接:https://www.haomeiwen.com/subject/vecclttx.html