如何将词嵌入向量组合成一个向量?
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 man
和 Man 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)
【讨论】:
以上是关于如何将词嵌入向量组合成一个向量?的主要内容,如果未能解决你的问题,请参考以下文章
如何将两个 std::vector 与 std::pair 组合成一个 std::vector