主要介绍word2vec词向量算法和doc2vec文本向量算法。
文本表示是自然语言处理中的基础工作,直接影响到整个自然语言处理系统的性能,而文本向量化是文本表示的一种重要方式。
文本向量化根据对象的差异分为:
word2vec算法(词向量化)
doc2vec算法(文章向量化)
str2vec算法(句子向量化)
处理过程包括两部分内容:
1)对文本中出现的每个词进行统计和编码,生成词典;
2)对每个文档统计词典中各个词出现的次数,将词的编号作为索引,生成词向量列表;
存在的问题:
1)维度灾难:对每个文档都会产生非常高维的词典空间;
2)无法保留次序信息;
3)存在语义鸿沟;
分布假说的核心思想:上下文相似的词,其语义也相似。
神经网络模型能够灵活的对上下文进行建模,构造词表示。
神经网络的词向量模型:根据上下文与目标词之间的关系进行建模
目标:
构建一个语言概率模型
基本流程:
从语料库中搜集一系列长度为n的文本序列 w i − ( n − 1 ) , . . . , w i − 1 , w i w_{i-(n-1)},...,w_{i-1},w_i wi−(n−1),...,wi−1,wi,假设这些长度为n的文本序列组成的集合为 D D D,NNLM的目标函数为:
∑ D P ( w i ∣ w i − ( n − 1 ) , . . . , w i − 1 ) \sum_DP(w_i|w_{i-(n-1)},...,w_{i-1}) D∑P(wi∣wi−(n−1),...,wi−1)
NNLM模型采用的是经典的三层前馈神经网络结构,其中包括输入层、中间层、隐藏层和输出层三部分。
为了解决词袋模型数据稀疏问题,输入层的输入为低维度的、紧密的词向量,具体操作犯法是将词序列 w i − ( n − 1 ) , . . . , w i − 1 w_{i-(n-1)},...,w_{i-1} wi−(n−1),...,wi−1中的每个词向量按照顺序拼接,得到:
x = [ v ( w i − ( n − 1 ) ) , . . . , v ( w i − 2 ) , v ( w i − 1 ) ] x = [v(w_{i-(n-1)}),...,v(w_{i-2}),v(w_{i-1})] x=[v(wi−(n−1)),...,v(wi−2),v(wi−1)]
输入层得到上述 x x x输入之后,将 x x x输入隐藏层得到 h h h,再将 h h h输入到输出层得到最后的输出变量 y y y,其中:
h = t a n h ( b + H x ) h = tanh(b + Hx) h=tanh(b+Hx) y = b + U h y = b + Uh y=b+Uh
这里输入层到隐藏层的激活函数采用双曲正切函数 t a n h tanh tanh
输出的 y y y是一个向量,向量中的每个分量 ( y ( w ) ) (y(w)) (y(w))指的是下一个词为词表中词 w w w的可能性,为了使得输出的 y ( w ) y(w) y(w)能够表示概率,经常采用softmax函数对多分类输出进行归一化,对应的函数表达式为:
P ( w i ∣ w i − ( n − 1 ) , . . . , w i − 1 ) = e x p ( y ( w i ) ) ∑ e x p ( y ( w i ) ) P(w_i|w_{i-(n-1)},...,w_{i-1})=\frac{exp(y(w_i))}{\sum^{}exp(y(w_i))} P(wi∣wi−(n−1),...,wi−1)=∑exp(y(wi))exp(y(wi))
模型优点:
1)解决了词袋模型的高维稀疏矩阵问题;
2)考虑了词的上下文语境,能够更加准确的预测相似的目标词;
目标函数:
输出的 y ( w i ) y(w_i) y(wi)表示的是上文出现词序 w i − ( n − 1 ) , . . . , w i − 1 w_{i-(n-1)},...,w_{i-1} wi−(n−1),...,wi−1的情况下,下一个词为 w i w_i wi的概率,因为上述情况是给定的样本(事实),所以模型的参数应该朝着最大化 y ( w i ) y(w_i) y(wi)的方向进行的方向迭代,具体的目标函数为(对长度为N的文本序列集合D中每个文本的预测概率结果求乘积,再取对数):
∑ w i − ( n − 1 ) : i ∈ D l o g P ( w i ∣ w i − ( n − 1 ) , . . . , w i − 1 ) \sum_{w_{i-(n-1)}:i\in{D}}logP(w_i|w_{i-(n-1)},...,w_{i-1}) wi−(n−1):i∈D∑logP(wi∣wi−(n−1),...,wi−1)
使用梯度下降算法进行求解,梯度迭代公式为:
θ : θ + α ∂ l o g P ( w i ∣ w i − ( n − 1 ) , . . . , w i − 1 ) ∂ θ \theta:\theta + \alpha \frac{\partial{logP(w_i|w_{i-(n-1)},...,w_{i-1})}}{\partial{\theta}} θ:θ+α∂θ∂logP(wi∣wi−(n−1),...,wi−1)
与NNLM模型的对比:
NNLM:以构建语言概率模型为目标,从隐藏层到输出层的权重计算过程运算量很大
C&W:以生成词向量为目标,通过对n元短语进行打分的方式,快速获取词向量
C&W核心机理:
如果待评估的n元短语在语料库中出现过,模型会给该短语打高分,否则打低分(为保证上下文词数的一致性,n应为奇数)
目标函数:
∑ ( w , c ) ∈ D ∑ w ′ ∈ V m a x ( 0 , 1 − s c o r e ( w , c ) + s c o r e ( w ′ , c ) ) \sum_{(w,c)\in{D}}\sum_{w^{'}\in{V}}max(0,1-score(w,c)+score(w^{'},c)) (w,c)∈D∑w′∈V∑max(0,1−score(w,c)+score(w′,c))
其中 ( w , c ) (w,c) (w,c)为语料库中抽取的n元短语( w w w为目标词, c c c表示目标词上下文的语境), w ′ w^{'} w′为词典空间中随机抽取的一个词。
采用成对词语的方式对目标函数进行优化,目标函数期望正样本 ( w , c ) (w,c) (w,c)(来自语料库)的得分至少比负样本 ( w ‘ , c ) (w{‘},c) (w‘,c)高1分,否则改样本的损失函数值将大于0。
C&W模型的输出层是单神经元结构,输出节点的大小代表n元短语的打分高低,相比较于NNLM模型,隐藏层到输出层的计算量大大降低。