如何使用 jaro-winkler 相似性检查处理巨大的列表

How to work with gigantic list with jaro-winkler similarity check

我有一个包含超过 1000 万个字符串的列表,我需要在使用相似度函数时对其进行迭代并获得分数。 我通过从另一个列表中获取一个项目来执行此操作,该项目将用于检查 giga 列表的相似性,如下所示..

similarities = []
del similarities[:]
i = 0
drugs ['amoxil', 'acyclovir', 'univir', ...]
while i < len(drugs):
    for idx, item in enumerate(drugs):        
        similarity1 = jaro.jaro_winkler_metric(text1,item)*100
        similarity2 = jaro.jaro_winkler_metric(text2,item)*100
        similarity3 = jaro.jaro_winkler_metric(text3,item)*100
        similarity4 = jaro.jaro_winkler_metric(textn..,item)*100
        similarityn..= ..


        similarities.append(similarity1)
    i += 1
    return similarities

要使用的文本(文本 1、文本 2 等)大约为 50 到 100。如果药物列表有 10 个左右的项目,代码运行良好且快速。我添加的项目越多,它变得越慢,问题越多,如果我有 50 万个项目,笔记本电脑可能会死机。我有超过 1000 万种物品要用于药物清单。 如何在不使系统崩溃的情况下加快速度? 此致

您可能想看看 batch_jaro_winkler。我为与此类似的用例创建了它,您需要在这些用例中获得最佳性能。您构建了一个 模型 ,然后您可以将其重复用于任意数量的运行时计算。将你的 drugs 或你的 texts 作为参数传递给 build_exportable_model,无论哪个更大。

import batch_jaro_winkler as bjw

drugs = ['amoxil', 'acyclovir', 'univir', ...]
exportable_model = bjw.build_exportable_model(drugs)
runtime_model = bjw.build_runtime_model(exportable_model)
for text in ['text1', 'text2', 'text3']:
  similarities = bjw.jaro_winkler_distance(runtime_model, text)
  # similarities = [('amoxil', 0.0), ('acyclovir', 0.5), ('univir', 0.96)]

如果您只关心与至少某个分数匹配的最佳结果 and/or,我强烈建议将 min_scoren_best_results 作为参数传递给 bjw.jaro_winkler_distance .