【问题标题】:Find cosine distance for all pairs of word2vec encodings without using nested loops在不使用嵌套循环的情况下查找所有 word2vec 编码对的余弦距离
【发布时间】:2019-03-10 20:38:59
【问题描述】:

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

我无法使用 pandas library/lambda 的 apply 功能。使用嵌套循环大约需要。 9 小时(根据 tqdm)。

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

【问题讨论】:

  • 为什么不能使用 lambda 函数?此外,嵌套的 for 循环确实效率不高。明确地使用.loc 可能会更好。为了提高性能,您还可以考虑使用cythonizing 您的代码。
  • 两种方法都试了,比较费时间,哪种方法效率最高?
  • 看看本教程,来自 pandas 文档:Enhancing Performance

标签: python pandas nlp word2vec


【解决方案1】:

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

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中的字典查找插槽中的单词。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2018-05-17
    • 2017-07-10
    • 2015-10-07
    • 2017-12-12
    相关资源
    最近更新 更多