词的表示方法
在上一篇文章中简要地介绍了中文自然语言处理中先导性的工作——分词的原理,通过jieba分词工具将整个文章划分为单个词语便于接下来的各种处理,这一篇文章主要介绍的是词语的向量表示。
因为计算机只能计算离散的数据,要通过计算机对自然语言进行处理,所以首要的问题就是输入形式的问题。对于语音信号来说,可以将频谱抽样量化编码,转化为计算机可以识别的形式。对于图像来说,计算机中天然地将每个像素的RGB通道表示为0-255的数值,这都很适合计算机处理。但是自然语言不是天生就存在的,是人类在不断地进化之中逐渐总结形成的高度抽象的信息形式,两个词语意思相同但只要字面不同计算机识别就会有很大的问题,比如“计算机”和“电脑”二者语义相同,但是却没有一个相同的字,如何用能够让计算机识别的表示方法表示词语无疑是一个很重要的问题,另外在表示的时候要尽量体现出词语之间的相似关系。
1、独热表示
独热表示(one-hot representation)是NLP中最常见也是最直观的一种词语表示形式,它的表示方法是这样的,对于一个词表来说,如果它的长度为N,那么其中每一个词语的one-hot表示为一个N维的向量,其中只有一个位置为1,其余位置为0,这样可以唯一区分每个词语。例如“计算机”可以表示为[0,0,0,1,0,0……0,0],“电脑”可以表示为[0,1,0,0……0,0,0],因为只有一个位置数据为1,其余位置数据为0,所以称为独热表示。
这种表示的优点是简单,不需要很复杂的编程即可实现,配合SVM等方法,可以很好的胜任NLP任务。但是缺点也是显而易见的,如果词表中词语数量过多的时候,每个词语向量的维度会很大,词表中动辄十几万的词语数量会造成维度灾难,并且不管维度多大,其中只有一个位置为1,这样会造成向量稀疏,不利于存储和计算。另外,这种表示方法只能够区分不同的词语,但不能表示词语之间的相关性,比如之前提到的“计算机”和“电脑”,在我们看来二者相似,但独热表示的方法不能体现二者的相似性。
注:这里区分一下词表和语料的区别:语料是一个完整的文章经过分词后的数据,它包含了所有的分词,并且分词可以重复,有词语的数量信息。而词表相当于一个集合,将所有的语料中的词语进行集合操作,没有重复的词语,只能得到不同词语的数量
2、分布式表示
针对以上的种种不足,提出的了词语的分布式表示方法(distributed representation)。
首先是关于词语之间相关性的问题,分布式表示认为词语的语义应该由其上下文来决定,不同词语的上下文相似,词语的语义也相似,比如“小狗很可爱”和“小猫很可爱”中“小狗”“小猫”语义是相同的,在表示这两个词语的时候,词向量应该是相近的。所以在构建词向量的时候,要考虑词语上下文的关系。
一个词语在句子中要考虑语法和语义两方面的合理性,但通常语义占据更重要的关系。
其次是关于维度的问题,独热表示中,词语的维度是根据词表中词语的数量来决定的,词语数量越多,向量维度也就越大。分布式表示固定一个词语向量的维度,向量中每个位置用一个浮点数而不是0或1来表示,通常分布式表示的向量维度要远小于独热表示的向量维度,对于一个包含两万个词语的词表来说,独热表示每个词向量要有两万维,而分布式表示通常只需要几百维,维度选取通常在100-500维之间。
可以看到向量维度减少了,独热表示是每个向量都占据不同维度的一个轴,而分布式表示是将向量映射到了低维的整个空间中,因此又叫做词嵌入(word embedding)
总之分布式表示相对于独热表示来说:1、将原来稀疏的巨大维度压缩到了更低维度中 。2、将整数数据转变为浮点型数据。
语言模型
语言模型是判断一个句子是否符合语法语义的模型,输入是一个句子,输出是这个句子的合理性(概率),概率越大,句子越符合平时的语言习惯。
最初语言模型分为文法语言模型和统计语言模型。前者是根据专家指定的一套语法规则,根据不同词性的排列顺序得到句子的合理性,比如形容词后面接名词的概率要大于动词的概率。但是语言并不是一成不变的,随着越来越多新潮词语的出现,比如“凡尔赛”之前是一个名词,现在成了一个形容词,文法语言模型显得更加不灵活。下面介绍统计语言模型。
1、基于统计的语言模型
贝叶斯公式
<br />这个公式称之为贝叶斯公式,进而有很多种变形,常用的有,这也是条件概率常用的公式。对于一个句子来说,其是由许多词语构成的,记为,其中为词语的个数。这样,一个句子的概率就可以表示为各个词语的联合概率,根据贝叶斯公式可以写成,这样只要统计出每个部分的概率,然后相乘即可得到句子的概率。
缺点于不足
1、计算量大。对于一个很长的句子来说,含有词语个,计算时就需要计算一个单独词语,两个连续词语,三个连续词语……,所需要的计算量为
计算繁琐,另外存储开销也不容忽视,所以不适合于实际应用。
2、需要平滑操作。可以从公式中看出,一个句子的概率是若干个概率的乘积,其中一个概率为0那么整个的句子概率也为0。对于一个新的,不包含与词典中的词语来说,其频率为0,那么根据统计方法,其出现的概率也为0 ,那么最终计算出的概率也为0,这显然不是很合理,所以需要进行平滑操作,对于概率为0或者概率很小的因子进行加一操作,使其概率不为0,这样得到的结果会更加合理一些。
马尔可夫假设
通过上计算公式可以看到
是
出现的概率,
是
出现的条件下
出现的概率,
是
同时出现的条件下出现的概率,以此类推,那么第t个词语要和其前面t-1个词语有关,这在语言中显然是不合理的。马尔可夫假设的内容为,一个词语出现的概率只与其前面n个词语有关而不是全部词语有关。
n-gram模型
根据马尔可夫假设,如果某个词语出现的概率与其前一个词有关称为unigram,n=2 称为bigram,n=3称为trigram。当然n越大计算量越大,但并不是n越大效果越好,具体n的取值要视情况而定。
当n=1时,计算公式变为
其中对于每一个因子来说,根据大数定律
,
,这里
,
,
,这样只需要计算各个词语出现的频数就可以计算最终的概率值了。使得计算更加简单,计算量更加减少。
2、基于神经网络的语言模型
随着对语言模型的不断发展,2003年,Bengio等人发表了一篇开创性的文章,A neural probabilistic language model,在这篇文章中提出了用神经网络建立语言模型的框架(Neural Network Language Model ,简称NNLM),NNLM模型结构如下图所示:
如图是一个简单的神经网络结构,由三层组成,分别为输入层,隐藏层和输出层。下面做简要的介绍。
NNLM的最终目的是求解也就是通过输入前T-1个词语,预测下一个词语出现的概率,其输入为前t-1个词语输出为第t个词语的概率。
输入层:首先对于每一个词语进行编号,这里可以用one-hot表示方法,假设每一个one-hot都有V个维度,每一个向量乘以一个VD的矩阵C(上图中的Matrix C),对于每一个向量来说,得到1D的结果,也就是说将一个V维的向量,通过矩阵相乘的运算,得到了D维的向量,这里就是word embedding的过程,因为输入为T-1个向量,最终得到的为(T-1)D的矩阵。因为one-hot表示中,每个向量只有一个分量的值为1,其余都为0,所以在向量相乘的时候相当于把C矩阵中的某一行取出来了,因此C矩阵中的每一行对应着每个单词的向量表示,所以行数V为词语的个数,列数D为向量的维度。
隐藏层:首先对于输入层得到的矩阵进行拼接得到一个1((T-1)*D)的向量,送入隐藏层,进行一次非线性运算,得到的,其中
,
输出层:对于隐藏层的输出,进行sigmoid运算最终得到输出结果,主要是为了计算概率,要输出0-1之间的数字,用sigmoid函数进行归一化操作。隐藏层和输出层进行了两次全连接前向传递。
前向传递之后针对损失函数进行反向传递更新权值,loss函数为:
对于NNLM来说,大部分计算量集中在隐藏层和输出层,参数过多,训练过慢,这是其主要缺点。
3、word2vec语言模型
1、CBOW
NNLM的目的是通过前n-1个词语来预测第n个词语的概率,而CBOW模型的目的是通过前后几个词语来预测中间的几个词语。CBOW的网络结构如图所示:
CBOW 由三层结构,分别为输入层,投影层和输出层相比于上面提到的NNLM模型,
- CBOW模型去掉了中间的隐藏层,在投影层之后接输出层。
- 在输入层没有太多的差别,将中间词语的前后n个词语的one-hot形式作为输入,与一个V*D的矩阵相乘取出其中的词向量送入投影层。中间的投影层在nnlm中是输入词语的拼接,在cbow中是通过求和取平均的形式来实现的。这一步中前后的词语的贡献度是相同的,没有顺序,这也是CBOW名称的由来。
结构的输出为通过上下文使得中心词的概率最大,通过一段文本,会有很多个中间词语,因此最终的目的是使得所有的概率最大,也就是似然函数
,等价于最小化损失函数
,通过梯度下降法逐渐优化。