比方说,我们训练一个有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.comRaRe-Technologiesgensimblobdevelopgensimmodelskeyedvectors.py#L491。
相反,通过使用 numpy
scipy
批量数组操作,这些库的高度优化代码将利用 CPU 基元和多线程来计算 都 的相关相似性,远比解释的Python循环快。
(关键的工作原理是 numpy
dot
操作:一次调用,创建一个所有相似点的有序数组--跳过循环&;你的临时结果。dict
完全。但是 argsort
,通向 numpy
的实现,很可能也比成语的 sorted()
.)