文本的表示
因为文本是由文字、标点组成的,但是计算机并不能高效的处理真实的文本;为了解决这种问题,就需要一种形式化的方法来表示真实文本。通常将文本转换为向量进行表示。
向量空间模型
向量空间模型(vector space model,VSM)是一种最简单的文本表示方法。
VSM假设文档符合:a、各特征项 t i t_i ti不重复;b、各特征项没有顺序关系。在这两个假设下可以把所有的特征项 t 1 , . . . , t n t_1,...,t_n t1,...,tn看为一个正交的n维坐标系,那么一个文本就可以表示为这个n维坐标空间中的一个向量,例如坐标值为 ( w 1 , . . . , w n ) (w_1,...,w_n) (w1,...,wn),则有 d = ( w 1 , . . . , w n ) d=(w_1,...,w_n) d=(w1,...,wn),称为文本d在向量空间模型下的表示。其中几个概念:
- 文本:如短语、句子、段落、篇章这样具有一定粒度的文档片段;
- 特征项:VSM中不可再分的语言单元,可以是字、词、词组、短语等。一段文本可以看成是由特征项组成的集合,表示为 ( t 1 , . . . , t n ) (t_1,...,t_n) (t1,...,tn),其中 t i t_i ti表示第i个特征项;
- 特征项权重:对于含有n个特征项的文本,每个特征项t都依据一定的原则被赋予一个权重w,表示它们在文本中的重要性和相关性,表示为 ( t 1 : w 1 , . . . , t n : w n ) (t_1:w_1,...,t_n:w_n) (t1:w1,...,tn:wn)简单记为 ( w 1 , . . . , w n ) (w_1,...,w_n) (w1,...,wn)。
构建向量空间模型需要解决两个问题:如何构造特征项、如何计算特征项的权重。
特征项构造
在建立向量空间模型的文本表示之前,需要做一些预处理动作:分词、去停用词、词形规范化,之后转化为词项的序列。然后利用这些词项去重后构建特征词集合。
这些特征词的集合可以看作一个词表,这个词表可以从语料中产生,也可以从外部导入,所以形象的称为词袋。向量空间模型也被称为词袋模型(bag-of-word,BOW)。
特征项权重
对于词袋模型中的每个词赋于权重,一般有几种方式:
- 布尔权重:如果特征项 t i t_i ti在文本d中出现,则 t i t_i ti的特征为1,否则为0;
- 特征频率(term frequency,TF):即使用这个特征在文本中出现的次数,作为这个特征项的权重;
- 计算公式: t f i = N ( t i , d ) tf_i=N(t_i,d) tfi=N(ti,d)
- 为了避免使用绝对频率导致的权重远高于平均权重,可以使用对数词频权重: f i = l o g ( t f i + 1 ) f_i=log(tf_i+1) fi=log(tfi+1)
- 逆文档词频(inverse document frequency,IDF):DF表示包含特征项的文档的数目,一个特征项的DF越高那么这个特征项的有效信息量一般约低。IDF是反映特征项在整个语料中的全局统计特征。
- 计算公式: i d f i = l o g N d f i idf_i=log \frac{N}{df_i} idfi=logdfiN,N为文档总数
- 特征频率-逆文档频率(TF-IDF):认为区别文本最有意义的特征应该是在当前的文本中出现频率足够高,但是在整个文档集合中出现频率足够小的词语,为TF与IDF的乘积:
- 计算公式: t f i d f i = t f i ∗ i d f i tfidf_i=tf_i*idf_i tfidfi=tfi∗idfi
一般来说TFIDF应用的频率会高一些。在文本分类和情感分析中词袋模型也是很流行的文本表示方法,不过这种模型表示也有缺点:任意的两个词是相互独立的、容易造成数据的稀疏性。这对计算机理解语言是不利的。
词的分布式表示
传统的独热表示方法无法刻画词语的语法以及语意信息。针对这种情况,有研究人员提出了词语的分布式假说:一个词的语义由上下文决定,即上下文相似的词语,其语义也相似。核心思想是 利用低维连续的实数向量表示一个词语,使得语义相近的词在实数向量空间中也相近。 分布式假说表明词语表示的质量很大程度取决于对上下文信息的建模。
神经网络语言模型
神经网络模型中的训练数据都是以句子集合的形式表示: D = { w i m i } i = 1 M D=\{w^{m_i}_i\}^M_{i=1} D={wimi}i=1M:
- m i m_i mi表示第i个句子包含的词数
- w i m i w^{m_i}_i wimi表示句子词序列: w 1 , . . . , w m i w_1,...,w_{m_i} w1,...,wmi
- 统计在训练集D中出现的词,可以得到一个词汇表V,若每个词都映射到一个d维的分布式向量中,则可以得到一个词向量矩阵L
- 神经网络语言模型的目标在于怎么优化词向量矩阵
语言模型
语言模型计算一段文本的出现概率,度量改文本的流畅程度。给定m个词语构成的句子 w 1 , . . . , w m w_1,...,w_m w1,...,wm;通过链式法则计算该句出现的可能性:
- p ( w 1 , . . . , w m ) = p ( w 1 ) p ( w 2 ∣ w 1 ) p ( w 3 ∣ w 1 w 2 ) . . . p ( w m ∣ w 1 . . . w m − 1 ) p(w_1,...,w_m)=p(w_1)p(w_2|w_1)p(w_3|w_1w_2)...p(w_m|w_1...w_{m-1}) p(w1,...,wm)=p(w1)p(w2∣w1)p(w3∣w1w2)...p(wm∣w1...wm−1)
- p ( w m ∣ w 1 w m − 1 ) = c o u n t ( w 1 , . . . , w m ) c o u n t ( w 1 , . . . , w m − 1 ) p(w_m|w_1w_{m-1})= \frac{count(w_1,...,w_m)}{count(w_1,...,w_{m-1})} p(wm∣w1wm−1)=count(w1,...,wm−1)count(w1,...,wm)
通过公式可以看出,当m越大时, w 1 , . . . , w m w_1,...,w_m w1,...,wm出现的可能性越小,最大似然越不准确。所以可以考虑使用n阶马尔科夫链来对语言模型进行建模:
- p ( w m ∣ w 1 . . . w m − 1 ) ~ p ( w m ∣ w m − n + 1 , . . . , w m − 1 ) p(w_m|w_1...w_{m-1})~p(w_m|w_{m-n+1,...,w_{m-1}}) p(wm∣w1...wm−1)~p(wm∣wm−n+1,...,wm−1)
- 这样一个词只会与前几个词的出现相关,这样就可以进行建模了
- 但是这种方法也具有一些缺点:依然具有严重的数据稀疏性;无法正确的捕捉到词之间的语义相似性。
基于前馈神经网络的语言模型
将每个词映射为一个低维连续的实数向量,并在连续向量空间中对n元语言模型的概率
p
(
w
m
∣
w
m
−
n
+
1
,
.
.
.
,
w
m
−
1
)
p(w_m|w_{m-n+1,...,w_{m-1}})
p(wm∣wm−n+1,...,wm−1)进行建模:
- 首先,对于词向量矩阵L进行初始化,参数在后面的训练中进行优化
- 然后,将历史信息,即前n-1个词映射为词向量,拼接后成为 h 0 = [ e ( w i − n + 1 ) , . . . , e ( w i ) ] h_0=[e(w_{i-n+1}),...,e(w_i)] h0=[e(wi−n+1),...,e(wi)]层
- 然后,通过两层的非线形隐藏层学习: h 1 = t a n h ( U 1 h 0 + b 1 ) , h 2 = t a n h ( U 2 h 1 + b 2 ) h_1=tanh(U^1h_0+b^1),h2=tanh(U^2h_1+b^2) h1=tanh(U1h0+b1),h2=tanh(U2h1+b2)
- 最后,利用softmax函数计算词表中每个词的概率分布:
- p ( w m ∣ w m − n + 1 , . . . , w m − 1 ) = e x p { h 2 ⋅ e ( w m ) } ∑ k = 1 ∣ V ∣ e x p { h 2 ⋅ e ( w k ) } p(w_m|w_{m-n+1,...,w_{m-1}}) = \frac{exp\{h_2·e(w_m)\}}{\sum^{|V|}_{k=1}exp\{h_2·e(w_k)\}} p(wm∣wm−n+1,...,wm−1)=∑k=1∣V∣exp{h2⋅e(wk)}exp{h2⋅e(wm)}
- 目标函数,最大化训练集的最大似然:
- ∑ m = 1 M l o g ( p ( w i m i ) ) \sum^M_{m=1}log(p(w^{m_i}_i)) ∑m=1Mlog(p(wimi))
- 通过对目标函数的优化,可以对词向量矩阵L进行参数优化,最终得到一个可用的词向量矩阵。
总结:
- 神经语言模型的目标在于准确的估计条件概率 p ( w m ∣ w m − n + 1 , . . . , w m − 1 ) p(w_m|w_{m-n+1,...,w_{m-1}}) p(wm∣wm−n+1,...,wm−1)
- 所以每一个时刻都需要利用隐藏层到输出层的矩阵运算,以及利用softmax函数计算整个词汇表的概率分布。
- 计算复杂度为: o ( ∣ h ∣ ⋅ ∣ v ∣ ) o(|h|·|v|) o(∣h∣⋅∣v∣),|h|是隐藏层的神经元节点数(几百到一千左右),|v|是词表的规模(几万到十万左右)。