我试图理解python模块fuzzywuzzy的函数process.extract()是如何工作的?
我主要在这里阅读fuzzywuzzy包:http://chairnerd.seatgeek.com/fuzzywuzzy-fuzzy-string-matching-in-python/,这是一篇很好的文章,解释了尝试进行模糊匹配时的不同场景。他们讨论了部分字符串相似性的几种情况:
1)故障
2)令牌分类
3)令牌集
然后,在这篇文章中:https://pathindependence.wordpress.com/2015/10/31/tutorial-fuzzywuzzy-string-matching-in-python-improving-merge-accuracy-across-data-products-and-naming-conventions/我学习了如何使用fuzzywuzzy的process.extract()函数来基本上选择前k个匹配项。
我找不到太多关于process.extract()函数如何工作的信息。以下是我在他们的github页面(https://github.com/seatgeek/fuzzywuzzy/blob/master/fuzzywuzzy/process.py)上找到的定义/信息,该函数:
在选项列表或字典中查找最佳匹配项,返回
包含匹配项及其分数的元组列表。如果一本字典
使用时,还返回每个匹配项的键。
但是,它没有提供如何找到最好的细节?我上面提到的三个场景都找到了吗?
我问这个问题的原因是,当我使用这个函数时,有时有两个字符串非常相似,但不匹配。
例如,在我当前的示例数据集中,
“总补货提前期(工作日)”
它与
“计划时间界限代码”,“内置WIP标志”
但不是(正确答案)
“全部提前期”
即使正确的答案和待匹配字符串一样有“提前期”,但它与待匹配字符串根本不匹配。为什么?不知怎么的,其他看起来不像是匹配字符串的字符串也会被匹配。为什么?我现在完全糊涂了。
最佳答案
模糊模糊比较有四个比例。base_ratio
:两个字符串的levenshtein距离。partial_ratio
:最相似子串的比率。token_sort_ratio
:比较前对标记排序的序列相似性度量。token_set_ratio
:查找每个字符串中的所有字母数字标记。
有关定量供应的更多详情,请参见http://chairnerd.seatgeek.com/fuzzywuzzy-fuzzy-string-matching-in-python/
默认情况下process.extract()
使用Partial_ratio
进行比较,但也可以使用第三个参数将其覆盖到process.extract()
前任。
print(fuzz.partial_ratio('Total replenishment lead time (in workdays)', 'Lead_time_planning'))
query = 'Total replenishment lead time (in workdays)'
choices = ['PLANNING_TIME_FENCE_CODE', 'BUILD_IN_WIP_FLAG','Lead_time_planning']
print(process.extract(query, choices))
结果将是:
50
[('Lead_time_planning', 50), ('PLANNING_TIME_FENCE_CODE', 38), ('BUILD_IN_WIP_FLAG', 26)]
这表明它在默认情况下使用部分比例,您可以随时覆盖。