2

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

代码工作得很好(它有大约 90% 的匹配准确度),我正处于试图找出为什么代码在某些情况下给出误报或误报的阶段。该代码仅标记 FuzzyWuzzyprocess.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”,问题仍然存在。同样更改字符串中x的位置(例如, )也不会改变分数。当我使用不同的过程函数(例如)时也是如此。'minimax''xminima''mixnima'process.Bests()

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

4

1 回答 1

1

默认情况下,两者都process.extractprocess.extractOne用作fuzz.WRatio得分手。 fuzz.WRatio使用加权的多个计分器计算结果。在您的示例中,结果来自fuzz.partial_ratio加权因子 0.9。因为x是它的子串,minimax所以返回100 * 0.9 = 90.

您可以通过以下方式指定不同的记分员:

> process.extractOne('minimax', ['x'], scorer=fuzz.ratio)
('x', 25)
于 2021-02-11T21:49:20.517 回答