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系列之新版本导入httplib模块报ImportError解决方案
May 23 Python
Python实现字符串与数组相互转换功能示例
Sep 22 Python
pycharm运行程序时在Python console窗口中运行的方法
Dec 03 Python
Pandas统计重复的列里面的值方法
Jan 30 Python
python装饰器简介---这一篇也许就够了(推荐)
Apr 01 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 Python
Python类中的魔法方法之 __slots__原理解析
Aug 26 Python
详解使用django-mama-cas快速搭建CAS服务的实现
Oct 30 Python
python Jupyter运行时间实例过程解析
Dec 13 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 Python
Python smtp邮件发送模块用法教程
Jun 15 Python
Python读写csv文件流程及异常解决
Oct 20 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中Ctype函数用法详解
2014/12/09 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
基于jquery的图片懒加载js
2010/06/30 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
js弹出的对话窗口永远保持居中显示
2012/12/15 Javascript
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
2015/02/27 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
jQuery实现模拟marquee标签效果
2015/07/14 Javascript
javascript实现3D切换焦点图
2015/10/16 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
AngularJS中的JSONP实例解析
2016/12/01 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
javascript字体颜色控件的开发 JS实现字体控制
2017/11/27 Javascript
浅谈Vue.set实际上是什么
2019/10/17 Javascript
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
python 调试冷知识(小结)
2019/11/11 Python
python pycharm最新版本激活码(永久有效)附python安装教程
2020/09/18 Python
在vscode中启动conda虚拟环境的思路详解
2020/12/25 Python
python中添加模块导入路径的方法
2021/02/03 Python
animation和transition的区别
2020/10/12 HTML / CSS
AmazeUI 平滑滚动效果的示例代码
2020/08/20 HTML / CSS
澳大利亚冲浪和时尚服装网上购物:SurfStitch
2017/07/29 全球购物
KIKO MILANO俄罗斯官网:意大利领先的化妆品和护肤品品牌
2021/01/09 全球购物
党校培训思想汇报
2014/01/03 职场文书
八年级物理教学反思
2014/01/19 职场文书
大学生开西餐厅创业计划书
2014/02/01 职场文书
建筑安全标语
2014/06/07 职场文书
Mysql中常用的join连接方式
2022/05/11 MySQL
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS