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实现数通设备端口监控示例
Apr 02 Python
python字典多条件排序方法实例
Jun 30 Python
Python监控主机是否存活并以邮件报警
Sep 22 Python
Python django使用多进程连接mysql错误的解决方法
Oct 08 Python
梅尔频率倒谱系数(mfcc)及Python实现
Jun 18 Python
Python多线程爬取豆瓣影评API接口
Oct 22 Python
通过 Django Pagination 实现简单分页功能
Nov 11 Python
PyTorch和Keras计算模型参数的例子
Jan 02 Python
python requests.get带header
May 05 Python
Python requests模块安装及使用教程图解
Jun 30 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 Python
Python实现Hash算法
Mar 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
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
dedecms系统的广告设置代码 基础版本
2010/04/09 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
使用PHP获取汉字的拼音(全部与首字母)
2013/06/27 PHP
浅析Mysql 数据回滚错误的解决方法
2013/08/05 PHP
让PHP显示Facebook的粉丝数量方法
2014/01/08 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
2019/09/23 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
[54:02]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 IG vs VGJ.T
2018/04/03 DOTA
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
Django1.9 加载通过ImageField上传的图片方法
2018/05/25 Python
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
2013/07/15 HTML / CSS
甲方资料员岗位职责
2013/12/13 职场文书
八项规定整改方案
2014/02/21 职场文书
秋天的怀念教学反思
2014/04/28 职场文书
教师求职自荐书
2014/06/14 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
2014年统计工作总结
2014/11/21 职场文书
Spring Cache和EhCache实现缓存管理方式
2021/06/15 Java/Android
解决MySQL报“too many connections“错误
2022/04/19 MySQL