python - gensim 是如何快速找到最相似的单词的?
问题描述
假设我们训练了一个超过 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()
方法的一部分——可以在以下位置查看:
相反,通过使用numpy
/scipy
批量数组操作,这些库的高度优化的代码将利用 CPU 原语和多线程来计算所有相关的相似性,这比解释的 Python 循环要快得多。
(关键的主力是numpy
dot
操作:一个调用创建了所有相似性的有序数组——dict
完全跳过循环和你的中间结果。但是argsort
,传递给numpy
实现,也可能优于惯用的sorted()
.)
推荐阅读
- python - 基于组的 Bokeh 和 Holoviews 着色和弦图
- html - 如何从 woocommerce 快捷方式代码中删除 clearfix
- python - 新手的 Python 素数
- python - 使用 pandas 数据框将所有 sql 表导入 python
- node.js - 如何使用nodejs附加到json文件中
- spring-boot - 是否可以动态创建 JPA 存储库对象
- python-requests - 带有 python 请求的补丁页面抛出“请求的 JSON 无效”-MS OneNote API
- azure-devops - 如何在 Ubuntu 上的 Azure 管道中访问同一项目的私有存储库?
- javascript - 快递:express.urlencoded 不工作
- c# - 在 Xamarin android 问题中推送通知