有两个列表-每个列表都包含名称。 将list1中的每个名称与list2中的名称进行比较,以找出确切/相似的名称。
我不是模糊比较专家。决定对这个问题使用Fuzzywuzzy。
示例代码:
from fuzzywuzzy import fuzz, process
import datetime
file1 = open('list1.txt', 'r');names = file1.readlines();file1.close;
file2 = open('list2.txt', 'r');choices = file2.readlines();file2.close;
for name in names:
print ("--");
print(datetime.datetime.now());
length = len(process.extractBests(
name,
choices,
scorer=fuzz.token_sort_ratio,
score_cutoff=85
));
print (name.strip() + ":" + str(length));
print(datetime.datetime.now());
示例输出:
C:\Anaconda3\lib\site-packages\fuzzywuzzy\fuzz.py:35: UserWarning: Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning
warnings.warn('Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning')
--
2018-08-12 11:21:55.821950
Ara Edgecomb:5
2018-08-12 11:21:57.921380
--
2018-08-12 11:21:57.922381
Carita Burnley:5
2018-08-12 11:22:00.155454
--
列表2仅包含1万个名称(用于测试)。即使列表很小,每次迭代也要花费2秒以上的时间。实际上,list2包含超过一百万。所以-绝对不是一个可行的解决方案。
因此,寻求建议是否有任何可以改进的地方。 如果Fuzzywuzzy不是正确的工具,请提供正确方向的指针。
关于“安装python-Levenshtein”,我已经尝试过,但仍然无法安装该模块。无论如何,我预计性能不会发生巨大变化。
编辑#1: 根据ForceBru的建议,我安装了python-Levenshtein。它有所帮助,并且平均迭代时间从〜2secs降到了.7secs (与10K名称进行比较时)。不过,与1M +个名称进行比较还是太慢了。任何建议都会有很大帮助!
编辑#2: 只是一个偶然的想法-
答案 0 :(得分:0)
有一种SOUNDEX算法可以将听起来相似的英语单词组合在一起。当电话音质不如今天时使用。可能今天仍在使用。
答案 1 :(得分:-1)
分开并同意。首先,您需要找出实际可以使用的后台列表中有多大,因此我建议针对整个mill +列表使用一个名称,以了解需要多长时间。
下一个中断列表1变成一口小块。根据花费的时间,您可能会选择每块10或50个名称。因此,现在您有了一个文件列表,每个文件的成员都将与您的大文件2进行模糊比较。
下一步是在分析脚本中添加一个sys参数,以便您可以指定要运行的块,确保输出文件名包含块信息(输入文件名),并编写一个将启动的控制器脚本对每个卡盘进行分析,因为它是自己的python进程。
最后,您可以将所有块结果合并到最终的单个结果文件中。很有可能您的陪审员仍然没有足够的精力来解决整个问题,但是至少这种方法将使您能够利用处理器的宽度。