0

我有一个包含超过 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

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

4

1 回答 1

0

您可能想看看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)]

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

于 2020-05-18T11:11:55.773 回答