【问题标题】:String similarity between two vectors of words两个词向量之间的字符串相似度
【发布时间】:2018-07-15 20:29:02
【问题描述】:

我有两个非常长的 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。

【问题讨论】:

  • 只是好奇,are_similar 是对称的吗?那是are_similar(x, y) == are_similar (y, x)?
  • @Elmex80s 是的,它是对称的。
  • 不是一个解决方案,而是一个 nit,您实际上并没有使用这种方法计算两个列表的语义相似度。这绝不会捕获两段文本的含义以及它们是否相似。
  • @NickChapman 你是对的。我编辑了主题名称。

标签: python semantics


【解决方案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)。我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-10-12
    • 1970-01-01
    • 2016-03-06
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多