有两个列表 - 每个列表都包含名称。 列表 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 算法可以将发音相似的英语单词组合在一起。在电话音质不如今天的时候使用。今天可能还在某个地方使用。