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
投稿

猜你喜欢

  • JavaScript链式调用的设计

    2009-12-04 12:46:00
  • Python3实现自定义比较排序/运算符

    2023-04-15 23:32:25
  • python轻松过滤处理脏话与特殊敏感词汇

    2022-02-07 15:53:28
  • python使用openpyxl操作excel的方法步骤

    2022-09-30 20:59:24
  • Python Sympy计算梯度、散度和旋度的实例

    2023-03-11 05:14:10
  • 基于Python实现火车票抢票软件

    2021-08-28 18:31:08
  • asp分段插入数据库

    2010-07-02 13:13:00
  • python 在某.py文件中调用其他.py内的函数的方法

    2021-02-25 23:56:09
  • Python2.7版os.path.isdir中文路径返回false的解决方法

    2021-02-03 09:56:42
  • python 统计文件中的字符串数目示例

    2022-05-14 11:29:34
  • Python退出时强制运行一段代码的实现方法

    2021-02-07 08:04:16
  • Tensor 和 NumPy 相互转换的实现

    2023-07-05 04:55:51
  • 在Python中操作列表之List.append()方法的使用

    2021-07-07 04:09:45
  • Python简单实现自动删除目录下空文件夹的方法

    2021-07-28 20:28:39
  • Oracle Portal及其门户网站开发概述

    2010-07-20 13:30:00
  • JS的千分位算法实现思路

    2023-08-23 22:40:32
  • 在Oracle中向视图中插入数据的方法

    2009-02-28 10:42:00
  • asp我对后台安全的一些做法

    2011-09-01 19:22:09
  • python异步Web框架sanic的实现

    2021-01-17 01:37:57
  • 站长如何活用"nofollow"标签

    2008-05-13 12:40:00
  • asp之家 网络编程 m.aspxhome.com