Fuzzywuzzy 匹配 2 列...脚本继续运行

Posted

技术标签:

【中文标题】Fuzzywuzzy 匹配 2 列...脚本继续运行【英文标题】:Fuzzywuzzy match 2 columns... script keeps running 【发布时间】:2021-01-01 02:17:12 【问题描述】:

我正在尝试将大约 50.000 个实例的 2 列与 Fuzzywuzzy 进行匹配。 A 列(公司)包含公司名称,有一些拼写错误。 B 列(正确)包含正确的公司名称。

我正在尝试将错字与正确的匹配。在下面运行我的脚本时,内核会持续执行几个小时并且不提供结果。

关于如何改进的任何想法?

非常感谢!

更新文件链接:https://fromsmash.com/STLz.VEub2-ct

import pandas as pd
from fuzzywuzzy import process, fuzz 
import matplotlib.pyplot as plt 

correct = pd.read_excel("correct.xlsx")
companies = pd.read_excel("companies2.xlsx")

actual_comp = []
similarity = []

for i in companies.Customers: 
    ratio = process.extract(i, correct.Correct, limit=1)
    actual_comp.append(ratio[0][0])
    similarity.append(ratio[0][1])
    
companies['actual_company'] = pd.Series(actual_comp)
companies['similarity'] = pd.Series(similarity) 

companies.head(10)

【问题讨论】:

【参考方案1】:

您可以更改以下几项来提高性能:

    使用Rapidfuzz而不是Fuzzywuzzy,因为它实现了相同的算法,但速度更快(我是作者)

    进程函数正在预处理您传递给它们的所有字符串(将它们小写,删除非字母数字字符并修剪空格)。现在你的预处理correct.Correctlen(companies.Customers) 次,这会花费大量时间,并且可以在循环前完成一次

    您只使用最佳匹配,因此最好使用process.extractOne 而不是process.extract。这更具可读性,并且在 extractOne rapidfuzz 内部使用先前比较的结​​果来提高性能

以下 sn-p 为您的代码实现了这些更改。请记住,您仍在执行 50k^2 比较,因此虽然这应该比您当前的解决方案快很多,但仍需要一段时间。

import pandas as pd
from rapidfuzz import process, fuzz, utils
import matplotlib.pyplot as plt 

correct = pd.read_excel("correct.xlsx")
companies = pd.read_excel("companies2.xlsx")

actual_comp = []
similarity = []

company_mapping = company: utils.default_process(company) for company in correct.Correct

for customer in companies.Customers:
    _, score, comp = process.extractOne(
        utils.default_process(customer),
        company_mapping,
        processor=None)
    actual_comp.append(comp)
    similarity.append(score)
    
companies['actual_company'] = pd.Series(actual_comp)
companies['similarity'] = pd.Series(similarity) 

companies.head(10)

出于兴趣,我执行了一个快速基准测试来计算使用您的数据集时的平均运行时间。在我的机器上,使用此解决方案每次查找大约需要 1 秒(因此总共大约需要 4.7 小时),而您之前的解决方案每次查找大约需要 55 秒(因此总共大约需要 10.8 天)。

【讨论】:

非常感谢!我尝试使用 pip install 进行安装,但仍然出现此错误:“ImportError: DLL load failed while importing fuzz: The specified module could not be found.” 在 Windows 上,您必须安装 C++ 19 可再发行组件:support.microsoft.com/en-us/help/2977003/… 感谢@maxbachmann。我应该在某处定义'utils'吗? NameError: name 'utils' is not defined 这是库的一部分。在我的回答中,它是从 rapidfuzz 导入的 再次感谢,我的错!现在它正在运行,但是,结果显示公司和相似性都显示“NaN”......为了便于参考,我在原始帖子的 WeTransfer 中添加了这两个文件

以上是关于Fuzzywuzzy 匹配 2 列...脚本继续运行的主要内容,如果未能解决你的问题,请参考以下文章

模糊字符串匹配:FuzzyWuzzy

Python中实现模糊匹配的魔法库:FuzzyWuzzy

在 Pandas 中模糊搜索列

Python字符串匹配神器TheFuzz库的实战详解

FuzzyWuzzy的fuzz.ratio没有达到预期的效果。

SQL Server自动化运维系列——批量执行SQL脚本(Power Shell)