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

3
假设我们使用超过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是如何快速计算最接近的单词的,以及计算最相似单词的高效方法。


2
word2vec文档中最靠前的一件事是“在安装Gensim之前确保您有C编译器,以使用优化的word2vec例程(与普通NumPy实现相比,速度提高了70倍,https://rare-technologies.com/parallelizing-word2vec-in-python/)。”这为您提供了至少一些优化的提示。除此之外,[源代码](https://github.com/RaRe-Technologies/gensim)是免费提供的。 - G. Anderson
关于如何提高自己代码的效率,这可能是一个更好的问题,可以在[codereview.se]上得到答案。 - G. Anderson
1个回答

1
正如@g-anderson所评论的那样,可以查看gensim源代码以了解其确切作用。然而,在most_similar()方法中,gensim实际上并没有使用任何自己优化的Cython或编译的C代码。该方法可在以下位置查看:

https://github.com/RaRe-Technologies/gensim/blob/b287fd841c31d0dfa899d784da0bd5b3669e104d/gensim/models/keyedvectors.py#L689

相反,通过使用numpy/scipy批量数组操作,这些库的高度优化代码将利用CPU原语和多线程比解释型Python循环更快地计算所有相关相似性。

(关键工作是numpydot操作:一个调用可以创建一个有序数组,其中包含所有相似性-跳过循环和您的中间结果dict。但是,argsort也通过传递到numpy实现,可能也优于惯用的sorted()。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接