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深入学习之对象的属性
Aug 31 Python
用Python程序抓取网页的HTML信息的一个小实例
May 02 Python
Java分治归并排序算法实例详解
Dec 12 Python
python+tkinter编写电脑桌面放大镜程序实例代码
Jan 16 Python
python2.7读取文件夹下所有文件名称及内容的方法
Feb 24 Python
python得到qq句柄,并显示在前台的方法
Oct 14 Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 Python
python tkinter实现屏保程序
Jul 30 Python
python二维键值数组生成转json的例子
Dec 06 Python
使用Django清空数据库并重新生成
Apr 03 Python
Django静态资源部署404问题解决方案
May 11 Python
python分布式爬虫中消息队列知识点详解
Nov 26 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中实现方案
2012/11/02 PHP
PHP如何使用Memcached
2016/04/05 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
Javascript开发包大全整理
2006/12/22 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
Angular和百度地图的结合实例代码
2016/10/19 Javascript
JS button按钮实现submit按钮提交效果
2016/11/01 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
2017/12/25 Javascript
vue自定义filters过滤器
2018/04/26 Javascript
js实现轮播图效果 z-index实现轮播图
2020/01/17 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
[01:14:31]Secret vs VG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
[55:11]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第一场 11.26
2020/11/30 DOTA
Python内置函数——__import__ 的使用方法
2017/11/24 Python
对numpy中向量式三目运算符详解
2018/10/31 Python
Python requests设置代理的方法步骤
2020/02/23 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
python学习笔记之多进程
2020/08/06 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
phonegap常用事件总结(必看篇)
2017/03/31 HTML / CSS
惠普美国官方商店:HP Official Store
2016/08/28 全球购物
Woolworth官网:澳洲第一大超市
2017/06/25 全球购物
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
人力资源部经理助理岗位职责
2014/03/04 职场文书
节约电力资源的建议书
2014/03/12 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
感恩老师演讲稿600字
2014/08/28 职场文书
计划生育证明格式范本
2014/09/12 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
南京导游词
2015/02/03 职场文书
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python