python对比文本相似度

方法:使用difflib中的SequenceMatcher

  • s=difflib.SequenceMatcher(isjunk=None,a,b, autojunk=True) :构造函数,主要创建任何类型序列的比较对象。isjunk是关键字参数,主要设置过滤函数,如想丢掉a和b比较序列里特定的字符,就可以设置相应的函数
  • s.get_opcodes()函数每执行一次返回5个元素的元组,元组描述了a和b比较序列的相同不同处。5个元素的元组表示为(tag, i1, i2, j1, j2),其中tag表示动作,i1表示序列a的开始位置,i2表示序列a的结束位置,j1表示序列b的开始位置,j2表示序列b的结束位置。
  • tag表示的字符串有: 
    • replace :表示a[i1 : i2]将要被b[j1 : j2]替换。
    • delete : 表示a[i1 : i2]将要被删除。
    • Insert : 表示b[j1 : j2]将被插入到a[i1 : i1]地方。
    • equal  :表示a[i1 : i2] == b[j1 : j2]相同。
  • 相似度s.ratio(), 相似度的计算公式为2*m/t,其中m表示a,b相同的字符长度, t表示a,b两个字符串总共的长度

示例:

from difflib import SequenceMatcher
a = "abcdef"
b = "abcde"
s = SequenceMatcher(None, a, b)
print(s.ratio())
for tag, i1, i2, j1, j2 in s.get_opcodes():
    # print ("%7s a[%d:%d] (%s) b[%d:%d] (%s)" %  (tag, i1, i2, a[i1:i2], j1, j2, b[j1:j2]))
    if tag != 'equal':
        print("%7s a[%d:%d] (%s) b[%d:%d] (%s)" % (tag, i1, i2, a[i1:i2], j1, j2, b[j1:j2]))

运行结果:

其中相似度计算为:

相同的字符为abcde共5个字符,a,b总共字符数为11,则相似度为2*5/11 = 0.90909090…

参考链接:https://blog.csdn.net/m0_37586703/article/details/105707507

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值