我正在Python中使用Fuzzywuzzy来匹配2个列表中的人物姓名。但是,运行时太长,一个列表包含25000个名称,另一个列表包含39000个名称。现在已经运行了20个小时。
以前,我使用相同的代码来匹配2个具有6000和3000个名称的列表,运行时间为1小时。基于此,我当前工作的运行时间将超过50小时。
下面是我的代码:
names_array=[]
ratio_array=[]
def match_names(wrong_names,correct_names):
for row in wrong_names:
x=process.extractOne(row, correct_names, scorer=fuzz.token_set_ratio)
names_array.append(x[0])
ratio_array.append(x[1])
return names_array,ratio_array
df=pd.read_csv("wrong-country-names.csv",encoding="ISO-8859-1")
wrong_names=df['name'].dropna().values
choices_df=pd.read_csv("country-names.csv",encoding="ISO-8859-1")
correct_names=choices_df['name'].values
name_match,ratio_match=match_names(wrong_names,correct_names)
我选择fuzz.token_set_ratio
作为得分手,根据我拥有的数据执行此多对多比赛。
下面是示例数据:
wrong_names = ['Alberto Steve', 'David Lee']
correct_names = ['Alberto Lee Steve', 'David Steve Lee']
基本上,错误的名称列表不包含中间名,为了忽略该中间名并生成合理的匹配项,我选择了fuzz.token_set_ratio
。
通过在线研究,我找到了安装python levenshtein软件包的解决方案,可以将运行时间加快4到10倍。但是,我的工作已经运行了20多个小时,我不想破坏当前的工作,因此在此之后我会尝试一下。
我想知道是否还有其他选择可以改善这一点。
谢谢。