Python计算字符串相似度¶
背景¶
笔者最近有个任务需要从多个系统取出工单信息进行处理, 但是工单只有一个标题可以关联,而且还不是严格相等的。 例如:
易查通日常升级的发布请示
【易查通】易查通系统日常升级
这种判断比较棘手,只能利用 字符串相似度 进行衡量:
if similarity('易查通日常升级的发布请示', '【易查通】易查通系统日常升级') > 0.5:
print('哥俩是同个工单')
那么, Python 有现成的类库可衡量字符串相似度么?
difflib¶
基于 difflib.SequenceMatcher 类,我们可以实现一个用于计算字符串相似度的函数:
from difflib import SequenceMatcher
def similarity(a, b):
return SequenceMatcher(None, a, b).ratio()
ratio 方法返回一个系数,衡量两个字符串的相识度,取值在 0-1 之间。
如果两个字符串完全相同,则系数为 1.0 :
>>> similarity('fasionchan', 'fasionchan')
1.0
如果两个字符串完全没有任何相同之处,则系数为 0.0 :
>>> similarity('fasionchan', '')
0.0
>>> similarity('aaaaaaaa', 'bbbbbbbb')
0.0
其他情况则介于 0 与 1 之间,越接近 1 越相似:
>>> similarity('apple', 'banana')
0.18181818181818182
>>> similarity('易查通日常升级的发布请示', '【易查通】易查通系统日常升级')
0.5384615384615384