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 zip文件 压缩
Dec 24 Python
Python中使用Beautiful Soup库的超详细教程
Apr 30 Python
pycharm下查看python的变量类型和变量内容的方法
Jun 26 Python
局域网内python socket实现windows与linux间的消息传送
Apr 19 Python
python微信撤回监测代码
Apr 29 Python
python的依赖管理的实现
May 14 Python
Python实现直播推流效果
Nov 26 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
May 22 Python
Python Flask框架实现简单加法工具过程解析
Jun 03 Python
python 字典和列表嵌套用法详解
Jun 29 Python
Python与C++中梯度方向直方图的实现
Mar 17 Python
Python if else条件语句形式详解
Mar 24 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 magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
PHP下常用正则表达式整理
2010/10/26 PHP
深入php处理整数函数的详解
2013/06/09 PHP
PHP 文件编程综合案例-文件上传的实现
2013/07/03 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
PDO::commit讲解
2019/01/27 PHP
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
js 多浏览器分别判断代码
2010/04/01 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
jquery基础教程之数组使用详解
2014/03/10 Javascript
node.js中的fs.writeSync方法使用说明
2014/12/15 Javascript
JavaScript获取文本框内选中文本的方法
2015/02/20 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
Nuxt.js踩坑总结分享
2018/01/18 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
python 将视频 通过视频帧转换成时间实例
2020/04/23 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
指针和引用有什么区别
2013/01/13 面试题
酒店拾金不昧表扬信
2014/01/18 职场文书
欢度春节标语
2014/07/01 职场文书
学雷锋活动倡议书
2014/08/30 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
《颐和园》教学反思
2016/02/19 职场文书
pytorch加载预训练模型与自己模型不匹配的解决方案
2021/05/13 Python
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL
MySQL新手入门进阶语句汇总
2022/09/23 MySQL