简介
FuzzyWuzzy是一个基于Levenshtein Distance算法的模糊字符串匹配工具包。该算法计算两个序列之间的差异,即从一个字符串转换到另一个字符串所需的最少编辑操作次数。编辑操作可以是替换、插入或删除字符。编辑距离越小,两个字符串的相似度越大。
详解
场景
前两天工作遇到了一个场景。是一个数据集匹配另一个数据集,正常来说是一对一或者多对一的关系,但是由于叫法的差异,只能进行模糊匹配。比如中国
和中华
。
FuzzyWuzzy
FuzzyWuzzy有两个模块,一个是fuzz
,另一个是process
。
fuzz
fuzz模块有四种匹配算法。
- 简单匹配(Ratio)
- 非完全匹配(Partial Ratio)
- 忽略顺序匹配(Token Sort Ratio)(多字符匹配,需要空格隔开)
- 去重子集匹配(Token Set Ratio)(多字符匹配,需要空格隔开)
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
process有两种匹配算法,主要用多项匹配。
- extract:提取多条数据
- extractOne:提取一条数据
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()
方法匹配第二个数据集,来得到匹配度最高的项。