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对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
May 08 Python
MySQL适配器PyMySQL详解
Sep 20 Python
Python实现购物车功能的方法分析
Nov 10 Python
Python常见排序操作示例【字典、列表、指定元素等】
Aug 15 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
Python队列、进程间通信、线程案例
Oct 25 Python
Python中的引用和拷贝实例解析
Nov 14 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
Jan 24 Python
如何基于Python实现数字类型转换
Feb 07 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 Python
Python3 利用face_recognition实现人脸识别的方法
Mar 13 Python
Django后端按照日期查询的方法教程
Feb 28 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中simplexml_load_file函数用法实例
2014/11/12 PHP
24条货真价实的PHP代码优化技巧
2016/07/28 PHP
JavaScript 指导方针
2007/04/05 Javascript
网页中的图片的处理方法与代码
2009/11/26 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
ExtJS下 Ext.Direct加载和提交过程排错小结
2013/04/02 Javascript
js播放wav文件(源码)
2013/04/22 Javascript
几种设置表单元素中文本输入框不可编辑的方法总结
2013/11/25 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
2014/07/17 Javascript
js实现网页随机切换背景图片的方法
2014/11/01 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
2017/03/21 jQuery
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
Vue 实用分页paging实例代码
2017/04/12 Javascript
vue组件watch属性实例讲解
2017/11/07 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
2019/02/02 Javascript
新手入门js闭包学习过程解析
2019/10/08 Javascript
Python 用户登录验证的小例子
2013/03/06 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
python进行TCP端口扫描的实现
2018/12/21 Python
使用html5制作loading图的示例
2014/04/14 HTML / CSS
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
橄榄树药房:OLIVEDA
2019/09/01 全球购物
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
酒店开业策划方案
2014/06/02 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
师范生教育见习总结
2015/06/23 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python
SQL Server内存机制浅探
2022/04/06 SQL Server