簡體   English   中英

gensim 是如何快速找到最相似的單詞的?

[英]How does gensim manage to find the most similar words so fast?

假設我們訓練了一個超過 100 萬字的 model。 為了找到最相似的詞,我們需要計算測試詞的嵌入與所有 100 萬個詞的嵌入之間的距離,然后找到最近的詞。 看來 Gensim 計算結果的速度非常快。 雖然當我想計算最相似的時候,我的 function 非常慢:

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 原語和多線程來計算所有相關的相似性,遠遠快於解釋的 ZA7F5F35426B927417FC9231B563Z 循環。

(關鍵的主力是numpy dot操作:一個調用創建所有相似性的有序數組 - 完全跳過循環和您的中間結果dict 。但是argsort ,傳遞到numpy實現以及,可能也優於慣用sorted() 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM