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正则表达式匹配HTML页面编码
Apr 08 Python
python字典键值对的添加和遍历方法
Sep 11 Python
Python实现比较扑克牌大小程序代码示例
Dec 06 Python
python3使用SMTP发送HTML格式邮件
Jun 19 Python
Python 判断文件或目录是否存在的实例代码
Jul 19 Python
Python Cookie 读取和保存方法
Dec 28 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
Mar 11 Python
python实现植物大战僵尸游戏实例代码
Jun 10 Python
Python实现微信小程序支付功能
Jul 25 Python
详解python中各种文件打开模式
Jan 19 Python
tensorflow指定GPU与动态分配GPU memory设置
Feb 03 Python
Python使用socket模块实现简单tcp通信
Aug 18 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配置文件php.ini的路径的方法
2014/08/20 PHP
php开发中的页面跳转方法总结
2015/04/26 PHP
PHP利用二叉堆实现TopK-算法的方法详解
2017/04/24 PHP
Javascript实例教程(19) 使用HoTMetal(7)
2006/12/23 Javascript
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
js静态方法与实例方法分析
2011/07/04 Javascript
zShowBox 图片放大展示jquery版 兼容性
2011/09/24 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
jquery实现弹出层完美居中效果
2014/03/03 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
2015/08/20 Javascript
JavaScript驾驭网页-CSS与DOM
2016/03/24 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
微信小程序App生命周期详解
2018/01/31 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
Vue实现多页签组件
2021/01/14 Vue.js
Python中isnumeric()方法的使用简介
2015/05/19 Python
python Django批量导入数据
2016/03/25 Python
Python与Java间Socket通信实例代码
2017/03/06 Python
python3操作mysql数据库的方法
2017/06/23 Python
Python编写一个闹钟功能
2017/07/11 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
公积金单位接收函
2014/01/11 职场文书
晚会邀请函范文
2014/01/24 职场文书
全神贯注教学反思
2014/02/03 职场文书
建议书怎么写
2014/03/12 职场文书
药剂专业求职信
2014/06/20 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
原生JS实现分页
2022/04/19 Javascript