我试图了解python模块如何模糊函数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)上找到的定义/信息,这个功能:
在选项列表或词典中查找最佳匹配,返回a 包含匹配及其分数的元组列表。如果是字典 使用,也返回每场比赛的关键。
但是,它没有提供有关它如何找到最佳效果的详细信息?我上面提到的所有3个场景都能找到这个吗?
我问的原因是因为,当我使用这个函数时,有时会有两个非常相似但不匹配的字符串。
例如在我当前的样本数据集中,用于匹配字符串
"总补货提前期(工作日)"
与
相匹配" PLANNING_TIME_FENCE_CODE"," BUILD_IN_WIP_FLAG"
但不是(正确答案)
" FULL_LEAD_TIME"
即使正确的答案有"提前期"就像to-be-match-string一样,它根本不匹配to-be-match-string。为什么?并且不知何故,其他看起来不像匹配字符串的那些匹配。为什么?我现在很无能为力。
答案 0 :(得分:6)
上述答案在关键方面是错误的-推断process.extract
的结果与fuzz.partial_ratio
相同,因此默认情况下它们的作用相同。
process.extract
实际上默认情况下使用WRatio()
,它是四个fuzz
比率的加权组合。实际上,这是一个很酷的功能,根据经验,它在模糊匹配场景中效果很好。
不过,您可以通过scorer
的{{1}}参数来手动指定字符串比较功能
extract
的来源:https://github.com/seatgeek/fuzzywuzzy/blob/master/fuzzywuzzy/process.py
答案 1 :(得分:4)
模糊模糊比较中有四个比例。
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)]
默认情况下,使用partial_ratio显示它,您可以随时覆盖它。