查找所有 word2vec 编码对的余弦距离,而不使用嵌套循环



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

我无法使用熊猫库/lambda 的应用功能。使用嵌套循环大约需要 9 小时(根据 tqdm(。

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

如果你要使用像 Pythongensim库这样的东西将预先存在的向量集(以原始的 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中的字典查找单词的插槽。

最新更新