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

时间:2018-08-12 10:01:10

标签: python fuzzy-comparison

有两个列表-每个列表都包含名称。 将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: 只是一个偶然的想法-

  • 我们是否有类似“粗匹配”的方法来缩小列表的范围,然后进行“精匹配”以获取确切的相似性指标?

2 个答案:

答案 0 :(得分:0)

有一种SOUNDEX算法可以将听起来相似的英语单词组合在一起。当电话音质不如今天时使用。可能今天仍在使用。

答案 1 :(得分:-1)

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

下一个中断列表1变成一口小块。根据花费的时间,您可能会选择每块10或50个名称。因此,现在您有了一个文件列表,每个文件的成员都将与您的大文件2进行模糊比较。

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

最后,您可以将所有块结果合并到最终的单个结果文件中。很有可能您的陪审员仍然没有足够的精力来解决整个问题,但是至少这种方法将使您能够利用处理器的宽度。