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中操作字典之setdefault()方法的使用
May 21 Python
python检查字符串是否是正确ISBN的方法
Jul 11 Python
Python语言描述随机梯度下降法
Jan 04 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
Jan 18 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
Feb 20 Python
Python 调用有道翻译接口实现翻译
Mar 02 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
Mar 25 Python
Python接口测试结果集实现封装比较
May 01 Python
Python pandas如何向excel添加数据
May 22 Python
python属于软件吗
Jun 18 Python
六种酷炫Python运行进度条效果的实现代码
Jul 17 Python
Python request中文乱码问题解决方案
Sep 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
德生9700DX电路分析
2021/03/02 无线电
PHP系统流量分析的程序
2006/10/09 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
PHP线程的内存回收问题
2016/07/08 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
中高级PHP程序员应该掌握哪些技术?
2016/09/23 PHP
实例讲解PHP表单处理
2019/02/15 PHP
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
2011/04/27 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
javascript使用正则表达式实现去掉空格之后的字符
2015/02/15 Javascript
本人自用的global.js库源码分享
2015/02/28 Javascript
原生js三级联动的简单实现代码
2016/06/07 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
解决ele ui 表格表头太长问题的实现
2019/11/13 Javascript
Vue Router的手写实现方法实现
2020/03/02 Javascript
python学习数据结构实例代码
2015/05/11 Python
python中引用与复制用法实例分析
2015/06/04 Python
python自动翻译实现方法
2016/05/28 Python
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
Python实现手势识别
2020/10/21 Python
Python 微信公众号文章爬取的示例代码
2020/11/30 Python
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
材料物理专业个人求职信
2013/12/15 职场文书
2014优秀党员事迹材料
2014/08/14 职场文书
奖学金感谢信
2015/01/21 职场文书
2014年个人年终总结
2015/03/09 职场文书
企业文化学习心得体会
2016/01/21 职场文书
幼儿体育课教学反思
2016/02/16 职场文书