在不使用嵌套循环的情况下查找所有 word2vec 编码对的余弦距离

Find cosine distance for all pairs of word2vec encodings without using nested loops

我需要为 word2vec 编码的所有词对计算并存储余弦距离。每个单词都表示为存储在 pandas 数据帧中的 4 * 1 向量,每个元素都在连续范围 [1, 9] 中。 我需要将结果存储在 pandas 数据帧中,以便可以在恒定时间内访问它。

我无法使用 pandas library/lambda 的应用功能。使用嵌套循环将花费大约。 9 小时(根据 tqdm)。

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

如果您要使用 Python gensim 库之类的东西将预先存在的矢量集(以原始 word2vec.c 格式)加载到其 KeyedVectors表示,那么原始向量将在其 vectors 属性 中的一个 numpy 数组中。例如:

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

然后您可以使用像 scikit-learnpairwise_distances() 这样的库函数来计算距离矩阵:

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

因为 sklearn 例程使用优化的本机数学例程,它可能比您最初的纯循环 Python 方法快很多。但请注意,生成的距离矩阵可能很大!

(你可以通过kv.index2entity中的列表找出哪些单词在kv.vectors个槽位,或者通过kv.vocab中的字典查找单词的槽位。)