Python fuzz.ratio 和 process.extractOne 结果之间的 FuzzyWuzzy 意外不匹配

Python FuzzyWuzzy unexpected mismatch between fuzz.ratio and process.extractOne results

我正在编写一个代码,该代码使用 模糊字符串匹配 将用户输入的数据框(经过一些清理后的字符串列表的数据框)与感兴趣的特定单词进行匹配。我使用 Python Pandas 来处理数据帧,使用 FuzzyWuzzy 包来匹配字符串。我在 Anaconda 的 Jupyter notebook 中做所有事情。

该代码运行良好(它具有大约 90% 的匹配准确率),我正处于尝试找出代码在某些情况下给出误报或漏报的原因的阶段。该代码仅标记 FuzzyWuzzy 的 process.extractOne() 函数得分高于 80 分的匹配项。

然而,我偶然发现了一个奇怪的问题:在一个单元格中,测试者输入的只是一个 ['x'],它仍然被标记为 'minimax',一个感兴趣的词,这意味着它的分数肯定是80以上,但绝对不应该。

模块 fuzzywuzzy.fuzzfuzzywuzzy.process 似乎产生了不同的结果。

这是预料之中的,fuzz.ratio()的分数已经够低了:

In [1]: fuzz.ratio('x', 'minimax')
Out [1]: 25

这是我实际使用的代码,其结果与上一个不匹配:

In [2]: process.extractOne('minimax', ['x'])
Out [2]: ('x', 90)

我检查并测试了代码的许多变体,无论 process.extractOne 函数的哪个参数包含 'x',问题仍然存在。此外,更改 'minimax' 字符串中 x 的位置(例如 'xminima''mixnima')也不会改变分数。当我使用不同的过程函数时也是如此(例如 process.Bests())。

可能是什么问题?我使用的功能或包错了吗?不要忘记,在大多数情况下,我的代码都能正常工作。

process.extractprocess.extractOne都默认使用fuzz.WRatio作为得分手。 fuzz.WRatio 使用加权的多个计分器计算结果。在您的示例中,结果来自 fuzz.partial_ratio,加权系数为 0.9。由于 xminimax 的子字符串,因此 returns 100 * 0.9 = 90.

您可以通过以下方式指定不同的得分手:

> process.extractOne('minimax', ['x'], scorer=fuzz.ratio)
('x', 25)