大型列表的模糊比较期间的性能问题



有两个列表 - 每个列表都包含名称。 列表 1 中的每个名称都应与列表 2 中的名称进行比较,以找出确切/相似的名称。

我不是模糊比较的专家。决定使用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:Anaconda3libsite-packagesfuzzywuzzyfuzz.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
--

list2 仅包含 10K 个名称(用于测试目的(。即使列表这么小,每次迭代也需要 2 秒以上。实际上,list2 包含超过 100 万个。所以 - 这绝对不是一个实用的解决方案。

因此,如果有任何可以改进的地方,请寻求建议。 如果 fuzzywuzzy 不是正确的工具,请提供指向正确方向的指针。

关于"安装python-Levenshtein"-我已经尝试过但仍然无法安装模块。无论如何,我预计性能不会发生巨大变化。

编辑#1: 根据ForceBru的建议,我安装了python-Levenshtein。它有所帮助,平均迭代时间从~2秒下降到0.7秒(与10K名称相比(。尽管如此,与 1M+ 名称进行比较还是太慢了。任何建议都会有很大帮助!

编辑#2: 只是一个短暂的想法——

  • 我们是否有类似"粗匹配"的东西来缩小列表范围,然后进行"精细匹配"以获得确切的相似性指数?

划分并同意。首先,您需要找出实际可以使用的背景列表有多大,因此我建议针对整个mill+列表运行一个名称,以了解需要多长时间。

下一个将列表 1 分成一堆一口大小的碎片。根据花费的时间,您可以选择每个块 10 或 50 个名称。所以现在你有一个文件列表,每个成员都将模糊地与你的大文件 2 兼容。

下一步是向分析脚本添加一个 sys 参数,以便您可以指定要在哪个块上运行,确保输出文件名包含块信息(输入文件名(,并编写一个控制器脚本,该脚本将启动每个卡盘的分析,因为它是自己的 python 进程。

最后,您可以将所有块结果合并到最终的单一结果文件中。很有可能你的compy仍然没有果汁来咀嚼整个问题,但至少这种方法将允许你利用处理器的宽度。

有一个 SOUNDEX 算法可以将发音相似的英语单词组合在一起。在电话音质不如今天的时候使用。今天可能还在某个地方使用。

最新更新