自然语言处理之语言模型与词向量

自然语言处理之语言模型与词向量

语言模型

从语言学的角度

  在研究机器如何“理解”自然语言之前,不妨先看看人们是怎么理解自己的语言的。根据语言学(Linguistics)的课程大纲,我们认为语言包括语音、构词、语法、句法等内容。不妨对语言进行如下建模(个人意见):
语言学的自然语言模型

  • 自然语言定义:L=(V,T,S,P)
  • 非终结符集V:句子成分如主语、定语、谓语……
  • 终结符集T:语言中的所有单词
  • 起始符S:句子
  • 生成规则集P:所有句法S–>主语+谓语;谓语–>谓语+状语;……
    自然语言处理之语言模型与词向量

  从上文模型可知,我们可以用L=(V,T,S,P)定义世界上每一种语言。凡是符合生成规则的句子,都被认为是语言L中的合法句子。
  早期计算机学者从语言学的角度帮助计算机理解语言,在高级编程语言方面,《编译原理》告诉我们高级编程语言均包括词法、句法、终结符、非终结符等,符合L=(V,T,S,P)模型。在自然语言方面,早期计算机学者发明了POS标注和依存句法,从语言规则的角度使计算机能对句子进行解读。
  POS标注和依存句法对现行的深度学习主导的NLP研究有意义嘛?答案是有的,研究前沿中EMNLP2019最新论文《Aspect-Level Sentiment Analysis Via Convolution over Dependency Tree》结合依存句法进行细粒度情感分析。个人对这篇论文有分析,见链接

从计算机科学的角度

  为了方便计算机对语言的计算,提出基于统计的语言模型。与语言学定义的,基于语法的语言模型不同,统计语言模型通过单词、句子、段落的概率来解释语言现象。
  对于一个自然语言序列(句子), S=w1,w2,...,wnS = {w_1,w_2,...,w_n} 定义这个句子在这一语言模型下出现的概率为:
P(S)=P(w1,w2,...,wn)=P(w2w1)P(w3w1,w2)...P(wnw1,w2,...,wn1) P(S)=P(w_1,w_2,...,w_n)\\=P(w_2|w_1)P(w_3|w_1,w_2)...P(w_n|w_1,w_2,...,w_{n-1})
  上式描述的语言模型属于一种理想情况,为什么呢?我们看这一项P(wnw1,w2,...,wn1)P(w_n|w_1,w_2,...,w_{n-1}),如果我们想求出wnw_nw1,w2,...,wn1w_1,w_2,...,w_{n-1}语境下的概率,就只能去统计给定w1,w2,...,wn1w_1,w_2,...,w_{n-1}语境后,下一个词出现wnw_n的概率。当n足够大时,我们可能翻遍文本库也找不到几个w1,w2,...,wn1w_1,w_2,...,w_{n-1}语境,那么统计出来的wnw_n的条件概率就是严重失真的。因此上式描述的语言模型(n元语法模型,n-gram model)是一种理想模型。一般来讲,语言模型只需要考虑n=2n=2n=3n=3的情况就已足够使用了(在需要语言模型的场景下),及二元语言模型或三元语言模型。
  我们可以通过设计程序去统计每一个词的条件概率。以二元语言模型为例,假设语料库中有1000个不重复单词。步骤如下:

  1. 初始化一个1000*1000大小的矩阵A,矩阵中的(i,j)(i,j)元用于记录wiw_i后出现wjw_j的次数。
  2. 以大小为2的窗口遍历文本库,将统计数据计入矩阵A。
  3. 按照如下公式计算每个词的条件概率。
    P(wjwi)=A(i,j)/x=1nA(i,x) P(w_j|w_i)=A(i,j)/\sum\nolimits_{x=1}^{n}{A(i,x})

  得到想要的语言模型后,我们最简单的应用(之一),就是用它去生成一段文本,比如给定一个词“中国”,得到后续概率最大的词为“是”,是后边是“一个”,“一个”后边可能是“人”。那么我们就生成了一个二元语言模型下十分合理(概率最高),现实语境下不可理喻的句子。
  我认为这就是n元语言模型的两大问题之一,也就是除非n取到无限大,词的概率都无法完整地考虑到语境。而另一大问题是,如果我的文本有1000000个独立单词,那么就需要1000000*1000000大小的矩阵(这仅是二元的情况),可见n元语言模型难以应用到大文本库下。

词向量