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.fuzz
和 fuzzywuzzy.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.extract
和process.extractOne
都默认使用fuzz.WRatio
作为得分手。 fuzz.WRatio
使用加权的多个计分器计算结果。在您的示例中,结果来自 fuzz.partial_ratio
,加权系数为 0.9。由于 x
是 minimax
的子字符串,因此 returns 100 * 0.9 = 90
.
您可以通过以下方式指定不同的得分手:
> process.extractOne('minimax', ['x'], scorer=fuzz.ratio)
('x', 25)
我正在编写一个代码,该代码使用 模糊字符串匹配 将用户输入的数据框(经过一些清理后的字符串列表的数据框)与感兴趣的特定单词进行匹配。我使用 Python Pandas 来处理数据帧,使用 FuzzyWuzzy 包来匹配字符串。我在 Anaconda 的 Jupyter notebook 中做所有事情。
该代码运行良好(它具有大约 90% 的匹配准确率),我正处于尝试找出代码在某些情况下给出误报或漏报的原因的阶段。该代码仅标记 FuzzyWuzzy 的 process.extractOne()
函数得分高于 80 分的匹配项。
然而,我偶然发现了一个奇怪的问题:在一个单元格中,测试者输入的只是一个 ['x']
,它仍然被标记为 'minimax'
,一个感兴趣的词,这意味着它的分数肯定是80以上,但绝对不应该。
模块 fuzzywuzzy.fuzz
和 fuzzywuzzy.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.extract
和process.extractOne
都默认使用fuzz.WRatio
作为得分手。 fuzz.WRatio
使用加权的多个计分器计算结果。在您的示例中,结果来自 fuzz.partial_ratio
,加权系数为 0.9。由于 x
是 minimax
的子字符串,因此 returns 100 * 0.9 = 90
.
您可以通过以下方式指定不同的得分手:
> process.extractOne('minimax', ['x'], scorer=fuzz.ratio)
('x', 25)