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 MD5文件生成码
Jan 12 Python
在Python的Django框架下使用django-tagging的教程
May 30 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
python os.path模块常用方法实例详解
Sep 16 Python
Python装饰器语法糖
Jan 02 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
Jul 04 Python
Python流程控制 while循环实现解析
Sep 02 Python
tensorflow自定义激活函数实例
Feb 04 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
Mar 06 Python
python 使用事件对象asyncio.Event来同步协程的操作
May 04 Python
简单了解如何封装自己的Python包
Jul 08 Python
如何理解及使用Python闭包
Jun 01 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 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
深入解析fsockopen与pfsockopen的区别
2013/07/05 PHP
jquery 学习之二 属性相关
2010/11/23 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
Wordpress ThickBox 点击图片显示下一张图的修改方法
2010/12/11 Javascript
jquery 结合C#后台的数组对文章的关键字自动添加链接的代码
2011/07/15 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
2013/12/14 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
2015/12/18 Javascript
jQuery中的Deferred和promise 的区别
2016/04/03 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
jQuery层叠选择器用法实例分析
2019/06/28 jQuery
原生JS实现无缝轮播图片
2020/06/24 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
Python向excel中写入数据的方法
2019/05/05 Python
Python实现搜索算法的实例代码
2020/01/02 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
谈谈python垃圾回收机制
2020/09/27 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
欧洲当代手工玻璃和瓷器的领先品牌:LSA International
2018/06/03 全球购物
亚马逊海外购:亚马逊美国、英国、日本、德国直邮
2021/03/18 全球购物
CSS代码检查工具stylelint的使用方法详解
2021/03/27 HTML / CSS
单位提档介绍信
2014/01/17 职场文书
普通大学毕业生自荐信范文
2014/02/23 职场文书
《春晓》教学反思
2014/04/20 职场文书
招标保密承诺书
2015/01/20 职场文书
租车协议书
2015/01/27 职场文书
2015年全国科普日活动总结
2015/03/23 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python