问题描述
我正在尝试将2列〜50.000实例与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)
解决方法
您可以更改以下几项以提高性能:
-
使用Rapidfuzz代替Fuzzywuzzy,因为它实现了相同的算法,但是速度要快得多(我是作者)
-
进程函数正在预处理传递给它们的所有字符串(将其小写,删除非字母数字字符并修剪空格)。现在,您的预处理
correct.Correct
len(companies.Customers)
次,这会花费很多时间,并且可以在循环前执行一次 -
您仅使用最佳匹配,因此最好使用
process.extractOne
而不是process.extract
。这更易读,并且在extract里面,一个RapidFuzz使用以前的比较结果来改善性能
以下代码段为您的代码实现了这些更改。请记住,您仍在执行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天)。