将句子转换为嵌入表示

Posted

技术标签:

【中文标题】将句子转换为嵌入表示【英文标题】:converting a sentence to an embedding representation 【发布时间】:2018-09-14 08:20:21 【问题描述】:

如果我有一句话,例如:“离开这里” 我想使用 word2vec 嵌入。来表示它.. 我发现了三种不同的方法来做到这一点:

1- 对于每个单词,我们计算其嵌入向量的 AVG,因此每个单词都替换为单个值。

2- 同 1,但使用嵌入向量值的标准差。

3- 或通过添加嵌入。矢量原样。因此,如果我使用 300 长度的嵌入向量 .. 对于上面的示例,我将在最后一个(300 * 4 个单词)长度为 1200 的向量作为最终向量来表示句子

其中哪一个最合适..?具体来说,对于句子相似度应用..

【问题讨论】:

【参考方案1】:

您描述选项 (1) 的方式听起来像是每个单词都变成了一个数字。那是行不通的。

通常使用的简单方法是将句子中单词的所有词向量平均在一起 - 因此,对于 300 维词向量,您仍然会得到一个 300 维的句子平均向量。也许这就是您的选项(1)的意思。

(有时,在此操作之前,所有向量都被归一化为单位长度,但有时不是 - 因为非归一化的向量长度有时可以指示单词含义的强度。有时,单词向量按其他频率加权- 基于它们相对重要性的指标,例如 TF/IDF。)

我从未见过您使用过您的选项 (2),也不太明白您的意思或它可能如何工作。

您的选项 (3) 最好描述为“连接词向量”。它根据句子中单词的数量给出不同大小的向量。单词放置的细微差异,例如比较“离开这里”和“离开这里”,会导致非常不同的向量,通常比较向量的方法(如余弦相似度)不会检测为“接近”一点也不。所以它没有意义,我还没有看到它使用过。

因此,只有您的选项 (1) 正确实现为(加权)平均词向量,才是句子相似度的良好基准。

但是,它仍然相当基本,还有许多其他方法可以使用文本向量来比较句子。这里只是一些:

与 word2vec 本身密切相关的一种算法称为“段落向量”,通常称为Doc2Vec。它使用非常类似于 word2vec 的过程来训练全范围文本的向量(无论它们是短语、句子、段落还是文档),其工作方式类似于在全文上的“浮动文档 ID 词”。有时它比仅仅平均词向量提供了一个好处,并且在某些模式下可以产生也可以相互比较的文档向量和词向量。

如果您的兴趣不仅仅是成对的句子相似性,而是某种下游分类任务,那么 Facebook 对 word2vec 的“FastText”改进有一种分类模式,其中训练词向量不仅可以预测相邻词,而且当简单地添加/平均在一起时,擅长预测已知的文本类。 (由此类分类向量构造的文本向量也可能擅长相似性,这取决于训练类捕捉文本之间显着对比的能力。)

另一种仅使用词向量计算成对相似度的方法是“Word Mover 距离”。它不是将文本的所有词向量平均为一个文本向量,而是将每个词向量视为一种“意义堆”。与另一个句子相比,它计算了将所有“堆”从一个句子移动到另一个句子的配置的最小路由工作(沿着许多潜在的单词到单词路径的距离)。计算成本可能很高,但通常比简单的词向量平均实现的简单单向量摘要更好地表示句子对比。

【讨论】:

要找到两个文本之间的相似性,我们是否也可以找到 nxm 个单词之间的相似性(n 和 m 是每个文本中的单词数),然后取平均值(例如除以所有分数的总和)由 n*m)? 你可以尝试任何事情!无论它是否有效,或者比更简单的方法效果更好,都需要针对一些真实的语料库/任务进行测试。 (如上所述,我怀疑您提出的结果与比较 m 个单词的平均值和 n 个单词的平均值非常相似,但涉及更多计算。因此它可能“有效”,但由更简单的方法,除非进一步细化。)

以上是关于将句子转换为嵌入表示的主要内容,如果未能解决你的问题,请参考以下文章

在 Google Cloud BigQuery 中存储句子嵌入

句子编码和语境化词嵌入有啥区别?

论文阅读之Syntax Encoding with Application in Authorship Attribution(2018)

在 Keras 中使用通用句子编码器嵌入层

BERT 获取句子嵌入

如何使用带有词嵌入的 Keras LSTM 来预测词 id