给定一个字符串列表,请在另一个大字符串列表中找到其每个字符串最接近的匹配(编辑距离)

时间:2019-06-26 18:23:37

标签: python knn trie suffix-tree edit-distance

我有一个字符串列表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 secondslen(big_list) = 27989793len(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中最接近的位置。

0 个答案:

没有答案