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中冒号与逗号的区别
Apr 18 Python
Python用for循环实现九九乘法表
May 31 Python
mac PyCharm添加Python解释器及添加package路径的方法
Oct 29 Python
python实现整数的二进制循环移位
Mar 08 Python
Python脚本利用adb进行手机控制的方法
Jul 08 Python
django ModelForm修改显示缩略图 imagefield类型的实例
Jul 28 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
django-csrf使用和禁用方式
Mar 13 Python
Python使用graphviz画流程图过程解析
Mar 31 Python
python将音频进行变速的操作方法
Apr 08 Python
python如何查看安装了的模块
Jun 23 Python
python和C++共享内存传输图像的示例
Oct 27 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
乱谈我对耳机、音箱的感受
2021/03/02 无线电
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
php 异常处理实现代码
2009/03/10 PHP
网页上facebook分享功能具体实现
2014/01/26 PHP
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
PHP简单装饰器模式实现与用法示例
2017/06/22 PHP
用js实现的抽象CSS圆角效果!!
2007/05/03 Javascript
JS 创建对象(常见的几种方法)
2008/11/03 Javascript
childNodes.length与children.length的区别
2009/05/14 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
nodejs URL模块操作URL相关方法介绍
2015/03/03 NodeJs
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
jQuery插件EasyUI设置datagrid的checkbox为禁用状态的方法
2016/08/05 Javascript
Javascript中的 “&” 和 “|” 详解
2017/02/02 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
详解Node.js access_token的获取、存储及更新
2017/06/20 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
浅谈webpack-dev-server的配置和使用
2018/05/17 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)
2020/03/10 Javascript
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
Python基本语法经典教程
2016/03/11 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
Python 解码Base64 得到码流格式文本实例
2020/01/09 Python
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
性能测试工程师的面试题
2015/02/20 面试题
教师节促销活动方案
2014/02/14 职场文书
学习雷锋倡议书
2014/04/15 职场文书
大学生志愿者活动总结
2014/06/27 职场文书
车辆年审委托书范本
2014/09/18 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书