单词

时间:2018-02-05 21:29:27

标签: python semantics

我有两个非常长的O(100k)单词列表,我需要找到所有类似的对。我的解决方案的时间复杂度为O(n * m)。它是优化此算法的一种方法 - 降低其复杂性吗?

def are_similar(first, second):
    threshold = 0.88
    return difflib.SequenceMatcher(a=first.lower(), b=second.lower()).ratio() > threshold


list_1 = ["123456","23456",  ...] # len(list_1) ~ 100k
list_2 =["123123","asda2131", ...] # len(list_2)~ 500k

similar = []
for element_list1 in list_1:
    for element_list2 in list_2:
        if are_similar(element_list1,element_list2 ):
            similar.append((element_list1,element_list2 ))

print (similar)

并行化上述代码的最佳方法是什么?我当前的实现(不包括在内)在第一个循环中使用了multiprocessing.Pool。

1 个答案:

答案 0 :(得分:1)

我可以建议另一个解决方案,但我不确定你是否想要完全相同的建议。 首先,有两个lists,如果我们将列表中的一个元素与其自身匹配,则相似度为1,即完全匹配。所以,我们可以从下一个词开始比较。现在,让我们通过一组列表来获取单个列表中的所有单词。

list_1 = ["123456","23456",  ...] # len(list_1) ~ 100k
list_2 =["123123","asda2131", ...] # len(list_2)~ 500k


list_3 = list_1 + list_2
list_3 = list(set(list_3)) # this will merge all same words to a list of unique words.
similar = []
for i in range(0, len(list_3)):
    if are_similar(list_3[i], list_3[i+1]):
        similar.append((list_3[i],list_3[i+1]))

print (similar)

我把这里的list of words集合列表进行比较,因为如果我们可以反复比较完全相同的单词,那么我们会大量减少重复单词的比较次数。此方法的复杂性为O(n)。我希望这可能有所帮助。