Python实现计算最小编辑距离

 更新时间:2016年03月17日 11:23:15   投稿:hebedich  
这篇文章主要介绍了Python实现计算最小编辑距离的相关代码,有需要的小伙伴可以参考下

最小编辑距离或莱文斯坦距离(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设计一个代码统计工具

    使用Python设计一个代码统计工具

    这篇文章主要介绍了使用Python设计一个代码统计工具的相关资料,包括文件个数,代码行数,注释行数,空行行数。感兴趣的朋友跟随脚本之家小编一起看看吧
    2018-04-04
  • PyCharm搭建一劳永逸的开发环境

    PyCharm搭建一劳永逸的开发环境

    这篇文章主要介绍了PyCharm搭建一劳永逸的开发环境,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • pytorch 实现模型不同层设置不同的学习率方式

    pytorch 实现模型不同层设置不同的学习率方式

    今天小编就为大家分享一篇pytorch 实现模型不同层设置不同的学习率方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python批量telnet检测IP地址的端口是否开放

    python批量telnet检测IP地址的端口是否开放

    本文主要介绍了python批量telnet检测IP地址的端口是否开放,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • python matplotlib绘图,修改坐标轴刻度为文字的实例

    python matplotlib绘图,修改坐标轴刻度为文字的实例

    今天小编就为大家分享一篇python matplotlib绘图,修改坐标轴刻度为文字的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • python中如何写类

    python中如何写类

    在本篇文章里小编给大家分享的是一篇关于python中写类的方法和技巧,需要的朋友们可以学习下。
    2020-06-06
  • 爬虫代理池Python3WebSpider源代码测试过程解析

    爬虫代理池Python3WebSpider源代码测试过程解析

    这篇文章主要介绍了爬虫代理池Python3WebSpider源代码测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • python中的全局变量用法分析

    python中的全局变量用法分析

    这篇文章主要介绍了python中的全局变量用法,详细分析了Python全局变量使用中的利弊与相关技巧,需要的朋友可以参考下
    2015-06-06
  • Python模块域名dnspython解析

    Python模块域名dnspython解析

    本文主要介绍了Python模块域名dnspython解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • python argparse命令行参数解析(推荐)

    python argparse命令行参数解析(推荐)

    Python argparse模块是解析命令行参数的首选方法。解析命令行参数是一个非常常见的任务,Python脚本根据传递的值来执行和操作
    2021-06-06

最新评论