如何将词嵌入向量组合成一个向量?

Posted

技术标签:

【中文标题】如何将词嵌入向量组合成一个向量?【英文标题】:How combine word embedded vectors to one vector? 【发布时间】:2017-11-30 20:31:35 【问题描述】:

我完全知道word embedding(skip-gram, CBOW)的含义和方法。而且我知道,Google 有一个 word2vector API,通过获取单词可以生成向量。 但我的问题是这样的:我们有一个包含主语、宾语、动词的子句......每个单词以前都由 Google API 嵌入,现在“我们如何将这些向量组合在一起以创建一个等于条款?” 例子: 子句:V=“狗咬人” 在 Google 的词嵌入之后,我们有 V1、V2、V3,它们每个都映射到狗、咬、人。我们知道: V = V1+ V2 +V3 我们如何提供V? 如果您以真实向量为例进行解释,我将不胜感激。

【问题讨论】:

感谢您之前的帮助。我已经成功地通过 Python 从 GoogleNews 数据集中找到了三个单词的向量。现在我的问题是,为了找到输入三元组和所有其他三元组之间的相似性,哪种方法最好?我们有超过十万个三元组单词,我们想要创建相似度矩阵。 【参考方案1】:

两种解决方案:

    对短语的组成词使用向量加法 - 这通常效果很好,因为加法是对语义构成的良好估计。

    使用paragraph vectors,它能够将任意长度的单词序列编码为单个向量。

【讨论】:

太棒了。我真的很感谢你的帮助。你能告诉我向量加法的规则吗?(它是如何工作的?)你能给我一个真实向量的例子并将它们与这种方法结合起来吗? 一个向量是一个实数序列......所以添加两个向量只需添加序列的每个对应分量,例如如果a=(1,2)和b=(3,1)是两个向量,那么a+b=(1+3,2+1)=(4,3) 你知道这个向量加法的代码/python脚本是什么吗?【参考方案2】:

向量基本上只是一个数字列表。您可以通过将每个列表中相同位置的数字相加来添加向量。这是一个例子:

a = [1, 2, 3]
b = [4, 5, 6]
c = a + b # vector addition
c is [(1+4), (2+5), (3+6)], or [5, 7, 9]

如this question 所示,在 python 中执行此操作的简单方法如下:

map(sum, zip(a, b))

向量加法是线性代数的一部分。如果您不了解向量和矩阵的运算,那么围绕词向量的数学将很难理解,因此您可能希望了解更多有关线性代数的一般知识。

通常将词向量加在一起是近似句子向量的好方法,因为对于任何给定的词集,都有一个明显的顺序。但是,您的 Dog bites manMan bites dog 示例显示了添加向量的弱点 - 结果不会根据词序而改变,因此这两个句子的结果将是相同的,即使它们的含义非常不同。

关于获取受词序影响的句子向量的方法,请查看doc2vec 或刚刚发布的InferSent。

【讨论】:

【参考方案3】:

所以,在本文中:https://arxiv.org/pdf/2004.07464.pdf 他们通过连接将图像嵌入和文本嵌入结合起来。

X = TE + IE 

这里 X 是融合嵌入,TE 和 IE 分别作为文本和图像嵌入。 如果您的 TE 和 IE 的尺寸分别为 2048,则您的 X 的长度为 2*2024。那么如果可能的话,也许你可以使用它,或者如果你想减少维度,你可以使用 t-SNE/PCA 或https://arxiv.org/abs/1708.03629(在此处实现:https://github.com/vyraun/Half-Size)

【讨论】:

以上是关于如何将词嵌入向量组合成一个向量?的主要内容,如果未能解决你的问题,请参考以下文章

R + 将一个向量列表组合成一个向量

将向量中的所有元素组合成一个新的字符串 MFC VC++

如何将两个 std::vector 与 std::pair 组合成一个 std::vector

C++ - 如何有效地找出向量中的任何字符串是不是可以由一组字母组合而成

NLP之词向量

Embedding层和word2vec的区别