将单词嵌入应用于整个文档,以获得特征向量


38

如何使用词嵌入将文档映射到适合于监督学习的特征向量?

字嵌入每个单词映射到一个向量,其中是一些不太大数目(例如,500)。流行的词嵌入包括word2vecGlovev [R d dwvRdd

我想应用监督学习对文档进行分类。我目前正在使用单词袋表示法将每个文档映射到特征向量,然后应用现成的分类器。我想用一个基于现有的预训练词嵌入的词替换词袋特征向量,以利用词嵌入中包含的语义知识。有标准的方法吗?

我可以想象出一些可能性,但是我不知道是否有最有意义的东西。我考虑过的候选方法:

  • 我可以计算文档中每个单词的向量,然后将它们平均。但是,这似乎可能会丢失很多信息。例如,使用词袋表示法,如果有几个词与分类任务高度相关,而大多数词都不相关,则分类器可以轻松地学习到;如果我将文档中所有单词的向量平均,分类器就没有机会了。

  • 将所有单词的向量连接起来是行不通的,因为这不会导致固定大小的特征向量。同样,这似乎是一个坏主意,因为它将对单词的特定位置过于敏感。

  • 我可以使用单词嵌入将所有单词的词汇聚类为一组固定的聚类,例如1000个聚类,其中我在向量上使用余弦相似度作为单词相似度的度量。然后,我可以有一个词包,而不是词包:我提供给分类器的特征向量可以是1000个向量,其中第个分量计算文档中的词数是集群一部分。ii

  • 给定单词,这些单词嵌入使我能够计算出前20个最相似的单词及其相似度得分的集合。我可以使用它来适应类似词袋的特征向量。当我看到这个词,除了增加相应字元素由,我还可以增加对应的字元素通过,增加对应的字元素通过,等等。w 1w 20 s 1s 20 w w w 1 w 1 s 1 w 2 s 2ww1,,w20s1,,s20ww1w1s1w2s2

是否有任何特定的方法可能对文档分类有效?


我不是在寻找para2vec或doc2vec;这些需要在大型数据语料库上进行培训,而我没有大型数据语料库。相反,我想使用现有的单词嵌入。


1
您是否已决定使用预训练的嵌入来表示文档的特定方法?也许可以有所帮助?
turdus-merula

1
@ user115202,整洁!那并不能完全解决我遇到的问题,但这是一个聪明的主意,听起来很值得了解-感谢您指出!我从来没有找到一个解决此问题的很好的解决方案,该解决方案比单纯使用单词袋更好。也许这不是单词嵌入所擅长的。谢谢!
DW

这也与您的问题有关,可能比以前的问题还要多:使用加权词嵌入聚合对非常短的文本进行表示学习
turdus-merula,2013年


1
为什么不使用RNN?对于RNN,可变长度文档不是问题。 wildml.com/2015/09/…–
kalu

Answers:


23

一种似乎适用于短文本(例如,句子或推文)的简单技术是计算文档中每个单词的向量,然后使用坐标平均值,最小值或最大值将其汇总。

根据最近一篇论文的结果,似乎使用min和max相当有效。它不是最佳的,但它很简单,并且与其他简单技术一样好或更好。特别是,如果文档中单词的向量是,则您计算和。在这里,我们采用按坐标方向的最小值,即,最小值是向量,使得,并且对于最大值也是如此。特征向量是这两个向量的串联,因此我们在获得特征向量nv1,v2,,vnRdmin(v1,,vn)max(v1,,vn)uui=min(vi1,,vin)R2d。我不知道这是比词袋表示法更好还是更坏,但是对于简短的文档,我怀疑它的性能可能比词袋表示法更好,并且它允许使用预训练的词嵌入。

TL; DR:令人惊讶的是,最小和最大的串联工作得很好。

参考:

使用加权词嵌入聚合对非常短的文本进行表示学习。Cedric De Boom,Steven Van Canneyt,Thomas Demeester和Bart Dhoedt。模式识别字母;arxiv:1607.00570。 摘要pdf。尤其参见表1和2。

鸣谢:感谢@ user115202吸引了我的注意。


4
对于短文本,avg / min / max可能效果很好,但是如果是长文本(例如新闻报道)怎么办?
牛油果

1
对于那些读过该论文但又像我一样困惑的人:该论文并不关注@DW所提到的方法,他们只是在“ 5.1。Baselines”下简要地将其作为基线方法。本文的主体侧重于他们自己的技术,该技术涉及使用嵌入训练分类器,这比这里概述的方法要复杂得多!
米格韦尔

16

您可以使用类似于word2vec的doc2vec,并使用来自大型语料库的预训练模型。然后使用类似.infer_vector()gensim的方法构建文档向量。doc2vec培训不必来自培训集。

另一种方法是使用RNN,CNN或前馈网络进行分类。这有效地将单词向量组合到文档向量中。

您还可以将稀疏特征(单词)与密集特征(单词向量)组合在一起,以相互补充。因此,您的特征矩阵将是稀疏的单词矩阵包与单词矢量平均值的串联。https://research.googleblog.com/2016/06/wide-deep-learning-better-together-with.html

另一个有趣的方法是使用与word2vec类似的算法,但是可以预测目标标签,而不是预测目标单词。这直接将单词向量调整为分类任务。http://arxiv.org/pdf/1607.01759v2.pdf

对于更多的临时方法,您可以尝试根据语法对单词进行不同的加权。例如,您可以比谓词更强地加权动词。


6

如果您使用的是英文文本,并且希望开始使用预训练的单词嵌入,请参阅以下内容:https : //code.google.com/archive/p/word2vec/

这是word2vec的原始C版本。在发布此版本的同时,他们还发布了一个模型,该模型针对Google新闻文章中的1000亿个单词进行了训练(请参见标题为“预训练的单词和短语向量”的小节)。

以我的观点和从事词嵌入的经验来看,对于文档分类,像doc2vec(带有CBOW)这样的模型比词袋要好得多。

由于我的语料库很小,我建议您通过上述预训练的嵌入来初始化单词嵌入矩阵。然后在doc2vec代码中训练段落向量。如果您熟悉python,则可以签出它的gensim版本,该版本很容易修改。

还要检查这篇详细介绍word2vec / doc2vec内部工作原理的文章:http ://arxiv.org/abs/1411.2738 。这将使理解gensim代码变得非常容易。


1
感谢您的建议。我不是要嵌入单词;我已经知道如何进行预训练的词嵌入(我在问题中提到了word2vec)。我的问题是如何从预训练的词嵌入中构造特征向量。我很欣赏对doc2vec的引用,但是我的语料库很小,因此我怀疑/担心尝试训练doc2vec代码会过拟合并且性能不佳(即使我使用预先训练的嵌入初始化矩阵)。
DW
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.