【问题标题】:How does gensim manage to find the most similar words so fast?gensim 是如何快速找到最相似的单词的?
【发布时间】:2020-08-14 02:10:23
【问题描述】:

假设我们训练了一个超过 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】:

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

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

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

(关键的主力是 numpy dot 操作:一个调用创建所有相似性的有序数组 - 完全跳过循环和您的中间结果 dict。但是 argsort,通过到numpy 的实现,也可能优于惯用的sorted()。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2018-08-14
    • 2015-08-15
    • 1970-01-01
    • 2021-10-31
    • 2010-10-02
    相关资源
    最近更新 更多