无需使用嵌套循环即可查找所有word2vec编码对的余弦距离

时间:2018-10-05 10:47:46

标签: python pandas nlp word2vec

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

我无法使用pandas库/ lambda的apply函数。使用嵌套循环大约需要花费时间。 9小时(根据tqdm)。

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

1 个答案:

答案 0 :(得分:1)

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

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

然后您可以使用scikit-learn的{​​{3}}之类的库函数来计算距离矩阵:

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

由于sklearn例程使用了优化的本机数学例程,因此它可能比最初的纯Python循环方法快很多。但是请注意,结果距离矩阵可能很大!

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