Найти косинусное расстояние для всех пар кодировок word2vec без использования вложенных циклов - PullRequest
0 голосов
/ 05 октября 2018

Мне нужно рассчитать и сохранить косинусные расстояния для всех пар слов word2vec, кодирующих .Каждое слово представлено в виде вектора 4 * 1, хранящегося в кадре данных pandas, причем каждый элемент находится в непрерывном диапазоне [1, 9].Мне нужно сохранить результат в кадре данных pandas, чтобы к нему можно было получить доступ в постоянное время.

Я не могу использовать функцию применения библиотеки панд / лямбда.Использование вложенных циклов займет ок.9 часов (согласно tqdm).

word     word1    word2    word3 ...
word1    d11      d12      d13...
word2    d21      d22      d23...
word3    d31      d32      d33...
.
.
.

1 Ответ

0 голосов
/ 06 октября 2018

Если бы вы использовали что-то вроде библиотеки Python gensim для загрузки ранее существующего набора векторов (в исходном формате word2vec.c) в его представление KeyedVectors, тогда необработанные векторы будут находиться в массиве numpy.в его vectors собственности.Например:

kv = KeyedVectors.load_word2vec_format('word_vectors.bin', binary=True)
print(kv.vectors.shape)

Затем вы можете использовать библиотечную функцию, такую ​​как scikit-learn s pairwise_distances(), чтобы вычислить матрицу расстояний:

from sklearn.metrics import pairwise_distances
distances = pairwise_distances(kv.vectors, metric="cosine")

Потому чтоподпрограмма sklearn использует оптимизированные собственные математические подпрограммы, она, вероятно, будет намного быстрее, чем ваш первоначальный подход loop-in-pure-Python.Обратите внимание, однако, что полученная матрица расстояний может быть огромной!

(Вы можете узнать, какие слова в каких kv.vectors слотах располагаются через список в kv.index2entity, или найти слот для слова черездиктат в kv.vocab.)

...