Python文本相似性计算之编辑距离详解


Posted in Python onNovember 28, 2016

编辑距离

编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。

例如将kitten一字转成sitting:('kitten' 和 ‘sitting' 的编辑距离为3)

     sitten (k→s)

     sittin (e→i)

     sitting (→g)

Python中的Levenshtein包可以方便的计算编辑距离

包的安装: pip install python-Levenshtein

我们来使用下:

# -*- coding:utf-8 -*-
import Levenshtein
texta = '艾伦 图灵传'
textb = '艾伦•图灵传'
print Levenshtein.distance(texta,textb)

上面的程序执行结果为3,但是只改了一个字符,为什么会发生这样的情况?

原因是Python将这两个字符串看成string类型,而在 string 类型中,默认的 utf-8 编码下,一个中文字符是用三个字节来表示的。

解决办法是将字符串转换成unicode格式,即可返回正确的结果1。

# -*- coding:utf-8 -*-
import Levenshtein
texta = u'艾伦 图灵传'
textb = u'艾伦•图灵传'
print Levenshtein.distance(texta,textb)

接下来重点介绍下保重几个方法的作用:

Levenshtein.distance(str1, str2)

计算编辑距离(也称Levenshtein距离)。是描述由一个字串转化成另一个字串最少的操作次数,在其中的操作包括插入、删除、替换。算法实现:动态规划。

Levenshtein.hamming(str1, str2)

计算汉明距离。要求str1和str2必须长度一致。是描述两个等长字串之间对应位置上不同字符的个数。

Levenshtein.ratio(str1, str2)

计算莱文斯坦比。计算公式  r = (sum ? ldist) / sum, 其中sum是指str1 和 str2 字串的长度总和,ldist是类编辑距离。注意这里是类编辑距离,在类编辑距离中删除、插入依然+1,但是替换+2。

Levenshtein.jaro(s1, s2)

计算jaro距离,Jaro Distance据说是用来判定健康记录上两个名字是否相同,也有说是是用于人口普查,我们先来看一下Jaro Distance的定义。

两个给定字符串S1和S2的Jaro Distance为:

Python文本相似性计算之编辑距离详解

其中的m为s1, s2匹配的字符数,t是换位的数目。

两个分别来自S1和S2的字符如果相距不超过

Python文本相似性计算之编辑距离详解

时,我们就认为这两个字符串是匹配的;而这些相互匹配的字符则决定了换位的数目t,简单来说就是不同顺序的匹配字符的数目的一半即为换位的数目t。举例来说,MARTHA与MARHTA的字符都是匹配的,但是这些匹配的字符中,T和H要换位才能把MARTHA变为MARHTA,那么T和H就是不同的顺序的匹配字符,t=2/2=1

两个字符串的Jaro Distance即为:

Python文本相似性计算之编辑距离详解

Levenshtein.jaro_winkler(s1, s2)

计算Jaro?Winkler距离,而Jaro-Winkler则给予了起始部分就相同的字符串更高的分数,他定义了一个前缀p,给予两个字符串,如果前缀部分有长度为ι的部分相同,则Jaro-Winkler Distance为:

Python文本相似性计算之编辑距离详解

      dj是两个字符串的Jaro Distance

      ι是前缀的相同的长度,但是规定最大为4

      p则是调整分数的常数,规定不能超过25,不然可能出现dw大于1的情况,Winkler将这个常数定义为0.1

这样,上面提及的MARTHA和MARHTA的Jaro-Winkler Distance为:

dw = 0.944 + (3 * 0.1(1 − 0.944)) = 0.961

个人觉得算法可以完善的点:

      去除停用词(主要是标点符号的影响)

      针对中文进行分析,按照词比较是不是要比按照字比较效果更好?

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能有所帮助,如果有疑问大家可以留言交流。

其他参考资料:

https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance

http://www.coli.uni-saarland.de/courses/LT1/2011/slides/Python-Levenshtein.html#Levenshtein-inverse

Python 相关文章推荐
在Python上基于Markov链生成伪随机文本的教程
Apr 17 Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 Python
python中的文件打开与关闭操作命令介绍
Apr 26 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
Jan 07 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
Aug 27 Python
python 命令行传入参数实现解析
Aug 30 Python
python或C++读取指定文件夹下的所有图片
Aug 31 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
Jan 03 Python
TensorFLow 变量命名空间实例
Feb 11 Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 Python
Python 文字识别
May 11 Python
Python实现全角半角字符互转的方法
Nov 28 #Python
Python连接PostgreSQL数据库的方法
Nov 28 #Python
windows及linux环境下永久修改pip镜像源的方法
Nov 28 #Python
Python如何为图片添加水印
Nov 25 #Python
Python pass详细介绍及实例代码
Nov 24 #Python
Python脚本实时处理log文件的方法
Nov 21 #Python
深入理解 Python 中的多线程 新手必看
Nov 20 #Python
You might like
php mysql数据库操作分页类
2008/06/04 PHP
php curl 伪造IP来源的实例代码
2012/11/01 PHP
在Win7 中为php扩展配置Xcache
2014/10/08 PHP
Zend Framework校验器Zend_Validate用法详解
2016/12/09 PHP
Dom 学习总结以及实例的使用介绍
2013/04/24 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
再谈javascript原型继承
2014/11/10 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
2015/01/05 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
2015/09/01 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
详解Ubuntu安装angular-cli遇到的坑
2018/09/08 Javascript
vue2.0 路由模式mode="history"的作用
2018/10/18 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
2020/10/13 Javascript
python根据距离和时长计算配速示例
2014/02/16 Python
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
python迭代器实例简析
2014/09/25 Python
python开发之thread实现布朗运动的方法
2015/11/11 Python
Python多进程分块读取超大文件的方法
2016/04/13 Python
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
python分数表示方式和写法
2019/06/26 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
什么是网络协议
2016/04/07 面试题
个性大学生自我评价
2013/12/04 职场文书
高校自主招生自荐信
2013/12/09 职场文书
科级干部考察材料
2014/02/15 职场文书
导师评语大全
2014/04/26 职场文书
老干部工作先进事迹
2014/08/17 职场文书
教师节寄语2015
2015/03/23 职场文书
2015年餐厅服务员工作总结
2015/04/23 职场文书
2015年暑期社会实践报告
2015/07/13 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书
Win10开机修复磁盘错误怎么跳过?Win10关闭开机磁盘检查的方法
2022/09/23 数码科技