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动态网页批量爬取
Feb 14 Python
PYTHON 中使用 GLOBAL引发的一系列问题
Oct 12 Python
Python生成任意范围任意精度的随机数方法
Apr 09 Python
django2.0扩展用户字段示例
Feb 13 Python
Python实现将HTML转成PDF的方法分析
May 04 Python
OpenCV 边缘检测
Jul 10 Python
详解Python打包分发工具setuptools
Aug 05 Python
Python学习笔记之迭代器和生成器用法实例详解
Aug 08 Python
python实现两个文件夹的同步
Aug 29 Python
Python3.6 中的pyinstaller安装和使用教程
Mar 16 Python
Python爬虫之Selenium下拉框处理的实现
Dec 04 Python
python必学知识之文件操作(建议收藏)
May 30 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
PHPMyadmin 配置文件详解(配置)
2009/12/03 PHP
解析在PHP中使用全局变量的几种方法
2013/06/24 PHP
php绘图中显示不出图片的原因及解决
2014/03/05 PHP
thinkphp使用literal防止模板标签被解析的方法
2014/11/22 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
stripos函数知识点实例分享
2019/02/11 PHP
PHP实现唤起微信支付功能
2019/02/18 PHP
jQuery 添加/移除CSS类实现代码
2010/02/11 Javascript
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
js中判断用户输入的值是否为空的简单实例
2013/12/23 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
jquery中toggle函数交替使用问题
2015/06/22 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
jQuery异步提交表单的两种方式
2016/09/13 Javascript
Vue制作Todo List网页
2017/04/26 Javascript
详解利用jsx写vue组件的方法示例
2017/07/17 Javascript
使用vue-router设置每个页面的title方法
2018/02/11 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
JS面向对象的程序设计相关知识小结
2018/05/26 Javascript
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
[55:54]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python用ConfigObj读写配置文件的实现代码
2013/03/04 Python
Python中使用Boolean操作符做真值测试实例
2015/01/30 Python
Python决策树分类算法学习
2017/12/22 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
2019/08/06 Python
python爬虫 requests-html的使用
2020/11/30 Python
工伤赔偿协议书
2014/04/15 职场文书
同居协议书范本
2014/04/23 职场文书
项目经理任命书内容
2014/06/06 职场文书
人身意外保险授权委托书
2014/10/01 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
出租车拒载检讨书
2015/01/28 职场文书
java设计模式--七大原则详解
2021/07/21 Java/Android
MySQL sql模式设置引起的问题
2022/05/15 MySQL