python fuzzywuzzy' process.extract():它是如何工作的?

时间:2016-12-15 19:12:57

标签: python string fuzzywuzzy

我试图了解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。为什么?并且不知何故,其他看起来不像匹配字符串的那些匹配。为什么?我现在很无能为力。

2 个答案:

答案 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显示它,您可以随时覆盖它。