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判断字符串与大小写转换
Jun 08 Python
对Python进行数据分析_关于Package的安装问题
May 22 Python
Pycharm远程调试openstack的方法
Nov 21 Python
Python模拟登录的多种方法(四种)
Jun 01 Python
Python使用指定端口进行http请求的例子
Jul 25 Python
python生成器推导式用法简单示例
Oct 08 Python
Django多进程滚动日志问题解决方案
Dec 17 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
python:批量统计xml中各类目标的数量案例
Mar 10 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
May 25 Python
Python Pandas数据分析工具用法实例
Nov 05 Python
Python内置类型集合set和frozenset的使用详解
Apr 26 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 split汉字
2009/06/05 PHP
php获取域名的google收录示例
2014/03/24 PHP
PHP多文件上传实例
2015/07/09 PHP
PHP程序员不应该忽略的3点
2015/10/09 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
2018/05/23 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
$.format,jquery.format 使用说明
2011/07/13 Javascript
基于KMP算法JavaScript的实现方法分析
2013/05/03 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
用js动态添加html元素,以及属性的简单实例
2016/07/19 Javascript
使用nodejs中httpProxy代理时候出现404异常的解决方法
2016/08/15 NodeJs
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
Python进程通信之匿名管道实例讲解
2015/04/11 Python
opencv实现图片模糊和锐化操作
2018/11/19 Python
python pytest进阶之xunit fixture详解
2019/06/27 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
关于webview适配H5上传照片或者视频文件的方法
2020/11/04 HTML / CSS
类、抽象类、接口的差异
2016/06/13 面试题
文体活动实施方案
2014/03/27 职场文书
出生证明公证书
2014/04/09 职场文书
初一新生军训方案
2014/05/22 职场文书
数学教研活动总结
2014/07/02 职场文书
学生打架检讨书
2014/10/20 职场文书
关爱空巢老人感想
2015/08/11 职场文书
大学生安全教育主题班会
2015/08/12 职场文书
军训决心书范文
2015/09/22 职场文书
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
2021/05/17 Python
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers