12

我想了解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)上找到的定义/信息,这个函数:

在选择列表或字典中查找最佳匹配项,返回包含匹配项的元组列表及其分数。如果使用字典,则还返回每个匹配项的键。

但是,它没有提供有关如何找到最佳的详细信息?是否需要我上面提到的所有 3 个场景才能找到这个?

之所以这么问,是因为我在使用这个函数的时候,有时候会出现两个非常相似但不匹配的字符串。

例如在我当前的样本数据集中,对于待匹配字符串

“总补货提前期(工作日)”

它匹配到

“PLANNING_TIME_FENCE_CODE”、“BUILD_IN_WIP_FLAG”

但不是(正确答案)

“FULL_LEAD_TIME”

即使正确答案与待匹配字符串一样具有“提前期”,但它根本不匹配待匹配字符串。为什么?不知何故,其他看起来不像待匹配字符串的字符串会被匹配。为什么?我现在很无知。

4

3 回答 3

14

另一个答案在一个关键方面是错误的 - 推断结果与一种情况process.extract相同fuzz.partial_ratio,因此默认情况下他们正在做同样的事情。

process.extract实际上WRatio()默认使用,这是四个fuzz比率的加权组合。这实际上是一个很酷的功能,在模糊匹配场景中凭经验可以很好地工作。

scorer不过,您可以通过参数手动指定字符串比较函数extract

来源process.extracthttps ://github.com/seatgeek/fuzzywuzzy/blob/master/fuzzywuzzy/process.py

于 2020-03-03T15:04:17.893 回答
8

模糊比较中有四个比率。

  • 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,您可以随时覆盖它。

于 2017-10-11T12:12:58.227 回答
0

我一直在问自己关于 process.extract 默认记分员 WRatio 的相同问题 -> 由于某种原因,结果真的很奇怪,所有其他记分员都识别出正确的匹配项,即 Alphabet,但可能是由于我的一个孤独的 A 字符查询字符串与默认解析器的 Alphabet -> Alphabet 相比,A/S 子字符串的匹配度更高,如果有人能解释为什么会这样,那就太棒了:

process.extract("ALPHABET- A",RIFT_IDS['EntityName'], scorer = fuzz.token_set_ratio, limit=3)
[('Alphabet Inc', 89, 4955), ('Haemato AG', 60, 9078), ('Vale SA', 59, 1894)]

process.extract("ALPHABET- A",RIFT_IDS['EntityName'], scorer = fuzz.token_sort_ratio, limit=3)
[('Alphabet Inc', 73, 4955), ('Haemato AG', 60, 9078), ('Vale SA', 59, 1894)]

process.extract("ALPHABET- A",RIFT_IDS['EntityName'], scorer = fuzz.partial_ratio, limit=3)
[('Alphabet Inc', 82, 4955), ('EQT AB', 73, 5838), ('BEL SA', 67, 2430)]

process.extract("ALPHABET- A",RIFT_IDS['EntityName'], scorer = fuzz.ratio, limit=3)
[('Alphabet Inc', 78, 4955), ('Alpha Bank SA', 67, 4720), ('Pharnext SA', 64, 9228)]

process.extract("ALPHABET- A",RIFT_IDS['EntityName'], limit=3)
[('Iss A/S', 86, 4), ('Vestas Wind Systems A/S', 86, 87), ('AP Moeller - Maersk A/S', 86, 126)]

编辑:从 github 代码看来,似乎还有一个名为 partial_token_set_ratio 的记分器,这似乎是罪魁祸首,但我仍然想了解 Wration 中使用了哪个记分器以及它们各自的权重是多少。如果可以创建我们自己的自定义 WRatio 并选择它使用的记分器,那就太好了。

于 2022-02-07T21:46:23.780 回答