python中搜索字符串和字符串列表之间最大百分比Levenshtein距离的最快方法是什么?

2024-04-25 16:47:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个程序,将一个较小的游戏名称列表与许多游戏的主列表进行比较,以查看较小列表中的哪些游戏与主列表中的游戏名称比其他游戏更接近。为了做到这一点,我一直在检查较小列表中每个游戏和主列表中每个游戏之间的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

Tags: 方法字符串name名称游戏距离列表close
1条回答
网友
1楼 · 发布于 2024-04-25 16:47:48

通过实验和进一步研究,我发现检查Levenshtein比率的最快方法是通过python-Levenshtein库本身。与在FuzzyFuzzy或difflib中使用任何函数相比,函数{}的速度要快得多(对于一个游戏,整个搜索平均只需要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()获得每个字符串与第一个字符串的比率,然后在每次迭代中检查最高值比率

相关问题 更多 >