【问题标题】:How to speed up time when calculate cosine similarity using nested loops in python如何在python中使用嵌套循环计算余弦相似度时加快时间
【发布时间】:2019-10-24 19:26:04
【问题描述】:

我正在尝试计算所有值之间的余弦相似度。

1000*20000 的计算时间花了我 10 多分钟。

代码:

from gensim import matutils
# array_A contains 1,000 TF-IDF values
# array_B contains 20,000 TF-IDF values 
for x in array_A:
   for y in array_B:
      matutils.cossim(x,y)

需要使用gensim包获取tf-idf值和相似度计算。

有人可以给我一些建议和指导以加快时间吗?

【问题讨论】:

  • 是否有可能摆脱其中一个 for 循环? Cython 会加快速度吗?

标签: python gensim cosine-similarity


【解决方案1】:

对数组使用 memoize,也可以使用元组(可能更快):

def memoize(f):
    memo = {}

    def helper(a, b):
        if (b, a) in memo: return memo[b, a]
        elif (a, b) in memo: return memo[a, b]
        else:
            memo[(a, b)] = f(a, b)
            return memo[a, b]

    return helper


@memoize
def myfunc(a, b):
    matutils.cossim(x,y)

编辑 也可以在使用上面的代码之后添加这个,以防你对数据做其他事情

cossim_responses = [myfunc(a, b) for a in array_A for b in array_B]
# you could also do (myfunc(a, b) for a in array_A for b in array_B)

【讨论】:

  • 结果显示“TypeError: unhashable type: 'list'”
  • 哪个代码?我更新了它,让它现在说 a, b 而不是 a, a
【解决方案2】:

可以查看gensim的matutils.cossim()的出处:

https://github.com/RaRe-Technologies/gensim/blob/2e58a1c899af05ee6a39a1dd1c49dd6641501a9c/gensim/matutils.py#L436

你会看到它在它的两个(稀疏数组)参数上做了一些工作,将它们的非零维度移动到临时字典中,然后计算它们的长度——每次在你的循环。

您可以通过仅对每个向量执行一次这些步骤并记住这些字典和长度以在每次最终成对计算中重复使用来获得合理的加速。 (也就是说,记住中间值,而不仅仅是最终值。)

【讨论】:

    【解决方案3】:

    您可以使用NmslibFaiss 进行矢量搜索操作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 2018-07-28
      • 2021-09-02
      • 2015-05-24
      • 2022-07-07
      • 1970-01-01
      相关资源
      最近更新 更多