我有一个字符串列表small_list = ['string1', 'this is string 2', ...]
和一个更大的字符串列表big_list = ['is string 2', 'some other string 3', 'string 1', ...]
。我想在big_list的small_list中找到所有通过编辑距离最接近的字符串。
我发现this与数字相同。
我尝试过的解决方案1:
from difflib import get_close_matches
import datetime
a = datetime.datetime.now()
print(get_close_matches(str(small_list.iloc[0]), big_list.values.astype(str), n=3, cutoff=0.7))
b = datetime.datetime.now()
c = b - a
print(c.seconds)
但是对于我的数据集和那条记录,我花了834 seconds
。 len(big_list) = 27989793
和len(small_list) = 9329931
,因此性能至关重要。
我尝试过的解决方案2:
s = str(small_list.iloc[0])
a = datetime.datetime.now()
for i in big_list:
m = editdistance.eval(i[0], s)
if m < min:
min = m
i_s = i
b = datetime.datetime.now()
c = b - a
print(c.seconds)
为此,我使用了editdistance程序包,该程序包在C ++中有效地实现了,我得到了48秒的时间。
为了改进上述解决方案,我要求我不详尽地检查big_list中的所有值。我正在寻找做同样的方法。
我想到的一种方法是使用串联的big_list字符串创建一个trie(或某种后缀树),并查询该trie以查找匹配项。由于缺乏经验,我希望从中获得一些包装建议或代码。另一种方法是修改使用编辑距离作为度量标准的KNN算法。是否有任何sklearn或其他这样做的软件包?
预期输出:[3, 1, ...]
,它是big_list中最接近的位置。