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设置windows桌面壁纸的实现代码
Jan 28 Python
跟老齐学Python之变量和参数
Oct 10 Python
python实现带验证码网站的自动登陆实现代码
Jan 12 Python
python实现中文分词FMM算法实例
Jul 10 Python
通过数据库对Django进行删除字段和删除模型的操作
Jul 21 Python
Python操作Word批量生成文章的方法
Jul 28 Python
一个基于flask的web应用诞生 组织结构调整(7)
Apr 11 Python
python中利用Future对象回调别的函数示例代码
Sep 07 Python
python+pyqt实现12306图片验证效果
Oct 25 Python
Python实现京东秒杀功能代码
May 16 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 Python
python如何利用cv2模块读取显示保存图片
Jun 04 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开发的8个技巧小结
2010/12/17 PHP
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
php输出指定时间以前时间格式的方法
2015/03/21 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
深入浅析php json 格式控制
2015/12/24 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
JS创建对象的写法示例
2016/11/04 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
详解webpack2异步加载套路
2018/09/14 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
python多线程threading.Lock锁用法实例
2014/11/01 Python
python定时执行指定函数的方法
2015/05/27 Python
Python数据类型详解(一)字符串
2016/05/08 Python
python 添加用户设置密码并发邮件给root用户
2016/07/25 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
Python基于dom操作xml数据的方法示例
2018/05/12 Python
Python基于xlrd模块操作Excel的方法示例
2018/06/21 Python
PyCharm搭建Spark开发环境的实现步骤
2019/09/05 Python
QT5 Designer 打不开的问题及解决方法
2020/08/20 Python
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
2013/01/31 HTML / CSS
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
马云的职业生涯规划之路
2014/01/01 职场文书
CAD制图设计师自荐信
2014/01/29 职场文书
火车的故事教学反思
2014/02/11 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android
关于Redis的主从复制及哨兵问题
2022/06/16 Redis