在不使用嵌套循环的情况下查找所有 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-learn
的 pairwise_distances()
这样的库函数来计算距离矩阵:
from sklearn.metrics import pairwise_distances
distances = pairwise_distances(kv.vectors, metric="cosine")
因为 sklearn
例程使用优化的本机数学例程,它可能比您最初的纯循环 Python 方法快很多。但请注意,生成的距离矩阵可能很大!
(你可以通过kv.index2entity
中的列表找出哪些单词在kv.vectors
个槽位,或者通过kv.vocab
中的字典查找单词的槽位。)
我需要为 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-learn
的 pairwise_distances()
这样的库函数来计算距离矩阵:
from sklearn.metrics import pairwise_distances
distances = pairwise_distances(kv.vectors, metric="cosine")
因为 sklearn
例程使用优化的本机数学例程,它可能比您最初的纯循环 Python 方法快很多。但请注意,生成的距离矩阵可能很大!
(你可以通过kv.index2entity
中的列表找出哪些单词在kv.vectors
个槽位,或者通过kv.vocab
中的字典查找单词的槽位。)