Fuzzywuzzy匹配2列...脚本保持运行

问题描述

我正在尝试将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)

解决方法

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

  1. 使用Rapidfuzz代替Fuzzywuzzy,因为它实现了相同的算法,但是速度要快得多(我是作者)

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

  3. 您仅使用最佳匹配,因此最好使用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天)。