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

标签 python time-complexity gensim word2vec similarity

假设我们训练了一个包含超过 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 如何如此快速地计算出最接近的单词,以及计算最相似度的有效方法是什么。

最佳答案

正如@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()。)

关于python - gensim 是如何快速找到最相似的单词的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61511101/

相关文章:

python - 如何使用 LDA (Python) 从标题列表生成主题?

python - 理解gensim word2vec的most_similar

python - 帮我选择一个网络服务平台来扩展现有的 python 网络服务

C++ STL 数据结构常量时间推送/弹出/通过索引随机访问元素的可靠指针

python - 为什么某些实现在Python中运行缓慢?

java - 这段代码的大O

python - 扩展数据库支持的 session 引擎

python - 谷歌搜索爬虫,Python

python - Pandas 分组并查找公共(public)字符串的数量

gensim - 如何使用gensim的LDA从查询中进行文本检索?