【问题标题】:What is the fastest method in python of searching for the highest percent Levenshtein distance between a string and a list of strings?python中搜索字符串和字符串列表之间最高百分比Levenshtein距离的最快方法是什么?
【发布时间】:2020-03-01 04:55:02
【问题描述】:

我正在编写一个程序,将较小的游戏标题列表与许多游戏的主列表进行比较,以查看较小列表中的哪些游戏与主列表中的游戏标题匹配度更高。为了做到这一点,我一直在检查较小列表中的每个游戏与主列表中的每个游戏之间的 Levenshtein 距离(以百分比形式),并取所有这些值中的最大值(最大百分比越低,游戏必须越独特)同时使用difflibfuzzywuzzy 模块。我遇到的问题是,使用process.extractOne()difflib.get_close_matches() 的典型搜索每场比赛大约需要 5 秒以上(主列表中有 38000 多个字符串),我有大约 4500 场比赛要搜索(5 * 4500 大约是 6 小时 15 分钟,我没有时间)。

为了找到一种更好更快的搜索字符串列表的方法,我在这里询问在 python 中搜索字符串和字符串列表之间的最高百分比 Levenshtein 距离的最快方法是什么。如果没有比使用上面的两个函数或编写一些其他循环代码更好的方法,那么请说出来。

我专门用于搜索最高距离的两个函数是:

metric = process.extractOne(name, master_names)[1] / 100
metric = fuzz.ratio(name, difflib.get_close_matches(name, master_names, 1, 0)[0]) / 100

【问题讨论】:

    标签: python fuzzy-search


    【解决方案1】:

    通过实验和进一步研究,我发现检查 Levenshtein 比率的最快方法是通过 python-Levenshtein 库本身。与使用fuzzywuzzy 或difflib 中的任何函数相比,函数Levenshtein.ratio()明显更快(对于一个游戏,整个搜索平均只需要0.05 秒),可能是因为它的简单性和C 实现。我在 for 循环中使用此函数迭代主列表中的每个名称以获得最佳答案:

    from Levenshtein import ratio
    
    metric = 0
    for master_name in master_names:
        new_metric = ratio(name, master_name)
        if (new_metric > metric):
            metric = new_metric
    

    总之,我说搜索字符串和字符串列表之间的最高百分比 Levenshtein 距离的最快方法是遍历字符串列表,使用 Levenshtein.ratio() 获得每个字符串与第一个字符串,然后在每次迭代中检查最高值比率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多