简介

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()方法匹配第二个数据集,来得到匹配度最高的项。