gensim是如何做到如此快速地找到最相似的单词的?

问题描述 投票:0回答:1

比方说,我们训练一个有100多万个单词的模型。为了找到最相似的词,我们需要计算测试词的嵌入和所有100万词的嵌入之间的距离,然后找到最近的词。看来Gensim计算结果的速度非常快。但是当我想计算最相似的词时,我的函数却非常慢。

def euclidean_most_similars (model, word, topn = 10):
  distances = {}
  vec1 = model[word]
  for item in model.wv.vocab:
    if item!= node:
      vec2 = model[item]
      dist = np.linalg.norm(vec1 - vec2)
      distances[(node, item)] = dist
  sorted_distances = sorted(distances.items(), key=operator.itemgetter(1))

我想知道Gensim是如何快速计算出最接近的单词 以及有什么有效的方法来计算最相似的单词。

python time-complexity gensim word2vec similarity
1个回答
1
投票

正如@g-anderson所评论的那样 gensim 源,可以查看它的具体作用。然而, gensim 实际上并没有使用任何自己的优化的Cython或编译的C代码作为其 most_similar() 方法--可以在以下网址查看。

https:/github.comRaRe-Technologiesgensimblobdevelopgensimmodelskeyedvectors.py#L491。

相反,通过使用 numpyscipy 批量数组操作,这些库的高度优化代码将利用 CPU 基元和多线程来计算 的相关相似性,远比解释的Python循环快。

(关键的工作原理是 numpy dot 操作:一次调用,创建一个所有相似点的有序数组--跳过循环&你的临时结果。dict 完全。但是 argsort,通向 numpy 的实现,很可能也比成语的 sorted().)

© www.soinside.com 2019 - 2024. All rights reserved.