用difflib计算字符串相似度

背景

笔者最近有个任务需要从多个系统取出工单信息进行处理, 但是工单只有一个标题可以关联,而且还不是严格相等的。例如:

  • 易查通日常升级的发布请示
  • 【易查通】易查通系统日常升级

这种判断比较棘手,只能利用 字符串相似度 进行衡量:

1
2
if similarity('易查通日常升级的发布请示', '【易查通】易查通系统日常升级') > 0.5:
    print('哥俩是同个工单')

那么, Python 有现成的类库可衡量字符串相似度么?

difflib

基于 difflib.SequenceMatcher 类,我们可以实现一个用于计算字符串相似度的函数:

1
2
3
4
from difflib import SequenceMatcher

def similarity(a, b):
    return SequenceMatcher(None, a, b).ratio()

ratio 方法返回一个系数,衡量两个字符串的相识度,取值在 0-1 之间。

如果两个字符串完全相同,则系数为 1.0

1
2
>>> similarity('fasionchan', 'fasionchan')
1.0

如果两个字符串完全没有任何相同之处,则系数为 0.0

1
2
3
4
>>> similarity('fasionchan', '')
0.0
>>> similarity('aaaaaaaa', 'bbbbbbbb')
0.0

其他情况则介于 0 与 1 之间,越接近 1 越相似:

1
2
3
4
>>> similarity('apple', 'banana')
0.18181818181818182
>>> similarity('易查通日常升级的发布请示', '【易查通】易查通系统日常升级')
0.5384615384615384

【小菜学Python】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜学Python】系列文章首发于公众号【小菜学编程】,敬请关注: