我有两个非常长的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。
答案 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)
。我希望这可能有所帮助。