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

作者:daisy 时间:2022-04-28 12:14:23 

编辑距离

编辑距离(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

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

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

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

总结

其他参考资料:

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,编辑,距离
0
投稿

猜你喜欢

  • 一文带你搞懂Golang依赖注入的设计与实现

    2023-07-23 14:33:53
  • ASP四级连动下拉列表程序段

    2009-07-03 15:33:00
  • python使用Matplotlib画条形图

    2023-09-04 06:30:50
  • python Matplotlib数据可视化(2):详解三大容器对象与常用设置

    2022-11-23 21:10:41
  • thinkPHP框架实现类似java过滤器的简单方法示例

    2023-11-22 12:24:47
  • Python查找算法之插补查找算法的实现

    2021-03-12 08:16:57
  • python爬虫headers设置后无效的解决方法

    2021-09-04 00:55:17
  • IE bug: 1像素的dotted/dashed边框

    2009-10-28 18:45:00
  • Oracle 实现类似SQL Server中自增字段的一个办法

    2009-08-02 07:51:00
  • python 合并列表的八种方法

    2022-06-10 10:07:29
  • python简单实现9宫格图片实例

    2021-10-22 13:23:25
  • Python制作CSDN免积分下载器

    2021-12-25 03:46:35
  • ASP动态生成的javascript表单验证代码

    2008-10-13 20:11:00
  • 用户体验之内容篇

    2010-11-05 18:21:00
  • 使用PHP批量生成随机用户名

    2023-07-22 13:10:10
  • python logging类库使用例子

    2023-10-31 11:17:11
  • jquery密码强度测试工具源码

    2009-12-23 19:38:00
  • 详解Python验证码识别

    2023-11-12 23:46:40
  • web2.0中流行的设计元素:颜色

    2007-12-10 12:16:00
  • 如何使用表单发送电子邮件?

    2010-05-16 15:13:00
  • asp之家 网络编程 m.aspxhome.com