Python 中 fuzzywuzzy 进行字符串模糊匹配的全过程
fuzzywuzzy 是 Python中 基于 Levenshtein 距离算法的字符串模糊匹配库,提供 fuzz.ratio 、 partial_ratio 、 token_sort_ratio 等核心函数,用于高效计算字符串相似度。该库广泛应用于数据清洗、拼写纠错、文本挖掘和用户输入处理等场景。比如识别相同新闻(有些新闻可能会在不同平台进行发布,标题和内容基本上没太大差异,爬取时需要把这种的识别出来,避免重复处理浪费相应资源)。
依赖安装
|
1 |
|
依赖安装可以使用清华的 pip 镜像源,不然会很慢,甚至很可能导致安装失败:
|
1 |
|
编辑距离
你可以把编辑距离想象成一场“变脸游戏”:给你两个词,比如“kitten”和“sitting”,你要通过最少的操作次数,把第一个词变成第二个词。允许的操作只有三种:
- 插入 (Insert):加个字母
- 删除 (Delete):删个字母
- 替换 (Substitute):换个字母
比如将 “kitten” 怎么变成 “sitting” ?
- k → s (替换)
- e → i (替换)
- 在末尾加个 g (插入)
总共三步完成,所以它们的编辑距离就是3。这种以“最小改动次数”来衡量相似度的方式,非常符合人类的直觉。改动越少,说明俩词越像;改动越多,就越不像。
相似度得分
fuzzywuzzy 把编辑距离转化成了一个 0 到 100 的直观评分。分数越高,越像。
|
1 |
|
匹配函数
常用的匹配函数一般是下面这些,可能还会有一些衍生出来的变体,但整体分类上没有太大变化。下面示例中,不同依赖包版本的算法可能会稍有差异,运行的结果可能会有不同属于正常现象。
完整比对
ratio() 要求整体上尽量一致,包括顺序,词汇,长度等。它就像一把尺子,从头到尾量一遍两个字符串的相似度。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
局部比对
partial_ratio() 自动把短的那个字符串当成模板,在长的那个字符串上滑动,挨个位置截取同样长度的子串,然后调用 ratio() 去比,最后返回最高的那个得分。
|
1 2 3 4 5 |
|
排序比对
token_sort_ratio() 会先把两个字符串按空格或其他分隔符拆分成词(token),然后排序,最后再调用 ratio() 比对得到结果。
|
1 2 |
|
排序局部比对 partial_token_sort_ratio()
上面这种比对,如果有额外的干扰项的话,还是会影响最终的得分结果。
|
1 2 |
|
所以还有变体 partial_token_sort_ratio(),排序后再进行局部比对,就能避免额外项的干扰了
|
1 2 3 |
|
核心比对
token_set_ratio() 会提取两个字符串的所有唯一词汇,然后分成三部分:交集(共同有的词)、A独有、B独有。接着,它会组合这些部分进行多次比对,取最高分。在处理电商商品标题、文章标签等富含冗余信息场景时比较有效。
|
1 2 3 4 |
|
核心局部比对 partial_token_set_ratio()
当然,同排序比对一样,如果两者有额外的干扰项,也会影响最终的得分。
所以还有变体 partial_set_sort_ratio(),核心部分再进行局部比对,就能避免额外项的干扰了
|
1 2 3 4 5 |
|
process
extractOne()
传给它一个查询词和一个候选列表,它会默默帮你把每个候选都比一遍,然后把得分最高的那位和它的分数打包送回来。默认的 full_process 预处理器会帮你做小写转换、去标点等清洗工作。
|
1 2 3 4 5 6 7 8 9 10 11 |
|
extract()
提取最好的几个,默认是 5 个,会将最佳匹配的几个候选和得分返回来。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
复制讲解
extractBests()
目前来看和 extract() 差别不大,唯一的区别是可以设置 score_cutoff 的阈值,使得只返回得分高于阈值的选项。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
extractWithoutOrder
这个就是上面 extractOne()、extract()、extractBests() 内部所调用的函数,就是按照原始的输入顺序(不会按照评分进行排序)返回每个可选项及其评分。
更多推荐



所有评论(0)