转自https://blog.youkuaiyun.com/mpk_no1/article/details/72458003
Doc2vec
虽然Word2vec表示的词性量不仅考虑了词之间的语义信息,还压缩了维度。但是,有时候当我们需要得到Sentence/Document的向量表示,虽然可以直接将Sentence/Document中所有词的向量取均值作为Sentence/Document的向量表示,但是这样会忽略了单词之间的排列顺序对句子或文本信息的影响。基于此,大神Tomas Mikolov 提出了 Doc2Vec方法。Doc2vec模型其实是在Word2vec模型的基础上做出的改进,基本思路很接近,所以在这里就简单总结一下Doc2vec特有的一些东西。
与Word2vec一样,Doc2Vec也有两种模型,分别为:Distributed Memory(DM)和Distributed Bag of Words(DBOW)。DM模型在给定上下文和文档向量的情况下预测单词的概率,DBOW模型在给定文档向量的情况下预测文档中一组随机单词的概率。其中,在一个文档的训练过程中,文档向量共享(意味着在预测单词的概率时,都利用了真个文档的语义)。
其实,知道Word2vec原理的朋友们一看就会知道,Doc2vec的DM模型跟Word2vec的CBOW很像,DBOW模型跟Word2vec的Skip-gram很像。
接下来,我们先看一下Doc2vec的DM模型:
DM模型在训练时,首先将每个文档ID和语料库中的所有词初始化一个K维的向量,然后将文档向量和上下文词的向量输入模型,隐层将这些向量累加(或取均值、或直接拼接起来)得到中间向量,作为输出层softmax的输入。在一个文档的训练过程中,文档ID保持不变,共享着同一个文档向量,相当于在预测单词的概率时,都利用了真个句子的语义。
DBOW模型的输入是文档的向量,预测的是该文档中随机抽样的词。
Word2Vec和Doc2vec的一些开源实现
Word2vec和Doc2vec的现在已经有了各个版本的实现,有C语言实现的版本,Java语言实现的版本,Python语言实现的版本。我只用过Java版本和Python版本,所以这里列一下这两个版本。
Java版本实现:https://github.com/mpk001/doc2vec_java
Python版本实现:https://radimrehurek.com/gensim/models/word2vec.html