本文主要讲解Mikolov在2014年发表的论文《Distributed Representations of Sentences and Documents》,论文主要是基于word2vec方法的一种改进,建议在理解word2vec的基础再来看这篇文章。
一、全文概述
基于word2vec提出了两个计算句子相似度的方法,一个是PV-DM,对应于word2vec中的CBOW算法,另一个是PV-DBOW,对应于word2vec中的Skip-gram算法。
二、word2vec
想弄明白doc2vec,首先要搞清楚word2vec,这里对word2vec进行简要说明,word2vec简单的说就是实现了单词到向量空间的一种映射,通过word2vec生成的词向量使稠密的,并且在映射之后的向量中保留了一定的语义信息。例如V“King” - V“Man” + V"Woman" = V"Queen", V表示下标单词的词向量。
word2vec模型结构其实就是一个简单的神经网络,见下图:
我们最终用该神经网络的隐层权重来表示词向量。
在进行训练的时候有两种不同的训练方式:
- CBOW(连续词袋模型)
将神经网络的训练任务设定为用一个单词周围的单词来预测这个单词。
- Skip-gram
将神经网络的训练任务设定为用一个单词预测其周围的单词。
三、doc2vec
1. PV-DM
和CBOW几乎相同,就是加一个段落矩阵和周围单词一起预测中心词,可以简单的将这个代表段落的向量当作一个表征段落信息的单词,他和其他表征单词的向量没有区别,但是要注意:上下文信息是按照固定长度在段落上根据滑动窗口不断采样,段落向量会被该段落产生的所有上下文窗口所共同拥有,但是不跨越段落,也就是说,不同段落的段落向量是不同的。但是不同段落的词向量是相同的。
2. PV-DBOW
PV-DBOW方法是在输入中忽略上下文单词,但是在输出中强制模型对段落中随机采样的单词进行预测。事实上,SGD的每一次迭代中,我们都会随机选择一个文本窗口,然后从这个文本窗口中随机采样一个单词并且构建一个基于段落向量的分类任务。
论文中表明,PV-DM通常可以取得很好的成绩在很多任务上,但是如果和PV-DBOW搭配的话(即每个段落向量由2部分组成:一个是通过标准段落向量(PV-DM)另一个是(PV-DBOW)),能对多个系统都取得更连续的好的成绩。
三、Python代码实现
# Author Hans
import sys
import utils
import gensim
import sklearn
import numpy as np
import jieba
from gensim.models.doc2vec import Doc2Vec, LabeledSentence
from jieba import analyse
TaggededDocument = gensim.models.doc2vec.TaggedDocument
def jieba_cut(content, stop_words):
'''jieba精准分词(常用)
:param content: 要分词的句子
:param stop_words: 停用词集合或者列表
:return: 返