Как женсиму удается так быстро найти самые похожие слова? - PullRequest
1 голос
/ 29 апреля 2020

Допустим, мы обучаем модель более чем 1 миллиону слов. Чтобы найти наиболее похожие слова, нам нужно вычислить расстояние между вложением тестового слова и вложениями всех слов из миллиона слов, а затем найти ближайшие слова. Похоже, Генсим очень быстро вычисляет результаты. Хотя, когда я хочу вычислить самое похожее, моя функция очень медленная:

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 удается так быстро вычислить самые близкие слова и как эффективный способ вычислить большинство подобных.

1 Ответ

1 голос
/ 30 апреля 2020

Как прокомментировал @ g-anderson, источник gensim можно просмотреть, чтобы точно узнать, что он делает. Однако gensim фактически не использует какой-либо собственный оптимизированный Cython или скомпилированный код C как часть своего метода most_similar(), который можно просмотреть по адресу:

https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/models/keyedvectors.py#L491

Вместо этого, используя операции массового массива numpy / scipy, высокооптимизированный код этих библиотек использует преимущества как примитивов ЦП, так и многопоточности для вычисления всех соответствующих сходств. гораздо быстрее, чем интерпретированный Python l oop.

(Ключевой рабочей лошадкой является операция numpy dot: один вызов, который создает упорядоченный массив всех сходств - пропуская l oop и ваши промежуточные результаты dict полностью. Но argsort, проходящий также к numpy реализациям, вероятно, также превосходит идиоматизм c sorted().)

...