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之有容乃大的list(1)
Sep 14 Python
django模板语法学习之include示例详解
Dec 17 Python
python脚本实现验证码识别
Jun 07 Python
python字典改变value值方法总结
Jun 21 Python
python中的global关键字的使用方法
Aug 20 Python
Python从列表推导到zip()函数的5种技巧总结
Oct 23 Python
Python数据可视化:饼状图的实例讲解
Dec 07 Python
浅谈python量化 双均线策略(金叉死叉)
Jun 03 Python
python如何更新包
Jun 11 Python
python绘制趋势图的示例
Sep 17 Python
scrapy头部修改的方法详解
Dec 06 Python
Pygame Event事件模块的详细示例
Nov 17 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类
2006/10/09 PHP
PHP中的日期处理方法集锦
2007/01/02 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
2016/03/18 PHP
php中各种定义变量的方法小结
2017/10/18 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
一个检测表单数据的JavaScript实例
2014/10/31 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
深入理解React中es6创建组件this的方法
2016/08/29 Javascript
网络传输协议(http协议)
2016/11/18 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
详解node-ccap模块生成captcha验证码
2017/07/01 Javascript
vue头部导航动态点击处理方法
2018/11/02 Javascript
详解关于Vuex的action传入多个参数的问题
2019/02/22 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
2019/09/24 Javascript
Python中列表和元组的相关语句和方法讲解
2015/08/20 Python
使用PyCharm创建Django项目及基本配置详解
2018/10/24 Python
python写入文件自动换行问题的方法
2019/07/05 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
详解python中各种文件打开模式
2020/01/19 Python
python 伯努利分布详解
2020/02/25 Python
python os.listdir()乱码解决方案
2021/01/31 Python
新西兰最大的品牌运动鞋购物网站:Platypus NZ
2017/10/27 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
商务英语专业毕业生自荐信
2013/11/05 职场文书
初中生学习的自我评价
2013/11/14 职场文书
法律专业学生的自我评价
2014/02/07 职场文书
内乡县衙导游词
2015/02/05 职场文书
党支部培养考察意见
2015/06/02 职场文书
导游词之襄阳古城
2019/09/27 职场文书
Spring Boot 实现敏感词及特殊字符过滤处理
2021/06/29 Java/Android