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函数学习笔记
Oct 07 Python
python复制与引用用法分析
Apr 08 Python
关于Python数据结构中字典的心得
Dec 04 Python
Python 修改列表中的元素方法
Jun 26 Python
Python开发的十个小贴士和技巧及长常犯错误
Sep 27 Python
用Python实现数据的透视表的方法
Nov 16 Python
总结Python图形用户界面和游戏开发知识点
May 22 Python
详解python解压压缩包的五种方法
Jul 05 Python
Django集成celery发送异步邮件实例
Dec 17 Python
python通过移动端访问查看电脑界面
Jan 06 Python
keras model.fit 解决validation_spilt=num 的问题
Jun 19 Python
使用django自带的user做外键的方法
Nov 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
BBS(php & mysql)完整版(七)
2006/10/09 PHP
分享PHP入门的学习方法
2007/01/02 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
2016/03/22 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
js利用Array.splice实现Array的insert/remove
2009/01/13 Javascript
Javascript中的变量使用说明
2010/05/18 Javascript
jquery实现metro效果示例代码
2013/09/06 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
jQuery实现带延迟效果的滑动菜单代码
2015/09/02 Javascript
原生JS实现匀速图片轮播动画
2016/10/18 Javascript
H5移动端适配 Flexible方案
2016/10/24 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决
2016/12/14 Javascript
Bootstrap源码解读网格系统(3)
2016/12/22 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
Python SQLite3数据库日期与时间常见函数用法分析
2017/08/14 Python
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
Python字符串的修改方法实例
2019/12/19 Python
浅谈在django中使用redirect重定向数据传输的问题
2020/03/13 Python
Python如何转换字符串大小写
2020/06/04 Python
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
2016/03/14 HTML / CSS
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
工程师自我评价怎么写
2013/09/19 职场文书
房产转让协议书
2014/04/11 职场文书
4s店销售经理岗位职责
2014/07/19 职场文书
关于保护环境的建议书
2014/08/26 职场文书
银行给客户的感谢信
2015/01/23 职场文书
付款证明模板
2015/06/19 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS