Python实现计算最小编辑距离


Posted in Python onMarch 17, 2016

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

Python实现计算最小编辑距离

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的Twisted框架中Deferred对象的用法
May 25 Python
python如何在终端里面显示一张图片
Aug 17 Python
Python自定义函数定义,参数,调用代码解析
Dec 27 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
Apr 26 Python
python 集合 并集、交集 Series list set 转换的实例
May 29 Python
Python 查看list中是否含有某元素的方法
Jun 27 Python
浅述python2与python3的简单区别
Sep 19 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 Python
Python字典dict常用方法函数实例
Nov 09 Python
MATLAB 如何求取离散点的曲率最大值
Apr 16 Python
Python实现日志实时监测的示例详解
Apr 06 Python
python数字图像处理之图像的批量处理
Jun 28 Python
Python引用模块和查找模块路径
Mar 17 #Python
Python使用tablib生成excel文件的简单实现方法
Mar 16 #Python
Python保存MongoDB上的文件到本地的方法
Mar 16 #Python
Python3中的真除和Floor除法用法分析
Mar 16 #Python
学习python类方法与对象方法
Mar 15 #Python
Python 的内置字符串方法小结
Mar 15 #Python
Python3使用requests包抓取并保存网页源码的方法
Mar 15 #Python
You might like
[原创]效率较高的php下读取文本文件的代码
2008/07/02 PHP
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
2010/06/03 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
2017/02/09 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
2011/03/03 Javascript
DOM 中的事件处理介绍
2012/01/18 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
js+csss实现的一个带复选框的下拉框
2014/09/29 Javascript
JavaScript手机振动API
2016/06/11 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
JQuery页面随滚动条动态加载效果的简单实现(推荐)
2017/02/08 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
node实现分片下载的示例代码
2018/10/17 Javascript
JavaScript中的this妙用实例分析
2020/05/09 Javascript
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
Python中的groupby分组功能的实例代码
2018/07/11 Python
Python3实现对列表按元组指定列进行排序的方法分析
2018/12/22 Python
python多个模块py文件的数据共享实例
2019/01/11 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
交通法规咨询中心工作职责
2013/11/27 职场文书
创新比赛获奖感言
2014/02/13 职场文书
党支部公开承诺书
2014/03/28 职场文书
报告会主持词
2014/04/02 职场文书
《秋游》教学反思
2014/04/24 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
乔丹名人堂演讲稿
2014/05/24 职场文书
计算机求职信
2014/07/02 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
大学生自我评价范文
2015/03/03 职场文书
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python