FuzzyWuzzy是一个基于Levenshtein Distance算法的模糊字符串匹配工具包。该算法计算两个序列之间的差异,即从一个字符串转换到另一个字符串所需的最少编辑操作次数。编辑操作可以是替换、插入或删除字符。编辑距离越小,两个字符串的相似度越大。
前两天工作遇到了一个场景。是一个数据集匹配另一个数据集,正常来说是一对一或者多对一的关系,但是由于叫法的差异,只能进行模糊匹配。比如中国
和中华
。
FuzzyWuzzy有两个模块,一个是fuzz
,另一个是process
。
fuzz模块有四种匹配算法。
from fuzzywuzzy import fuzz
# 示例代码及结果
print(fuzz.ratio("cultureSun", "cultureSun")) # 结果: 100
print(fuzz.partial_ratio("culture", "cultureSun")) # 结果: 100
print(fuzz.token_sort_ratio("c ultureSun", "ultureSun c")) # 结果: 100
print(fuzz.token_set_ratio("c c cultureSun", "cultureSun")) # 结果: 100
process有两种匹配算法,主要用多项匹配。
from fuzzywuzzy import process
# 示例代码及结果
choices = ["culture", "Sun", "cultureSun", "Sunculture"]
print(process.extract("culture", choices, limit=4)) # 结果: [('culture', 100), ('cultureSun', 82), ('Sunculture', 82), ('Sun', 30)]
print(process.extractOne("culture", choices)) # 结果: ('culture', 100)
需要使用process
模块的extractOne
。
将两数据集封装成列表。循环第一个数据集,依次使用process.extractOne()
方法匹配第二个数据集,来得到匹配度最高的项。