文本分析概述

11/2/2017 8:34:23 PM

下面对文本分析的五个问题介绍进行粗浅的介绍。

一、统计语言模型

我们首先考虑一个问题,我们该如何衡量一个句子是否合理

我们有两种方法,即基于规则的方法和基于统计的方法。

基于规则的方法的手段是判断这个句子是否合乎文法、含义是否正确。但是文法规则是十分复杂的而且数量庞大,覆盖哪怕是20%的真实语句的文法也至少是几万条。而且,就算找到了所有的文法规则,用计算机解析也是非常困难的。

基于统计的方法则是推测这个句子出现可能性的大小。假设S是一个句子,我们令它出现的概率为\(P(S)\)。为了估计\(P(S)\),我们需要统计人类有史以来出现的句子中
S出现的比例。显然,这行不通。

我们需要将这个任务化简,建立一个模型进行对句子出现的概率进行大致的估计。由于句子是由词组成的。假设S由一串特定顺序排列的词\(w_1,w_2,\cdots,w_n\)组成。那么有

\[P(S)=P(w_1,w_2,\cdots,w_n) \]

利用条件概率的公式,我们可以展开得到

\[P(w_1,w_2,\cdots,w_n)=P(w_1)\cdot P(w_2|w_1)\cdot P(w_3|w_1,w_2)\cdots P(w_n|w_1,w_2,\cdots,w_{n-1}) \]

其中\(P(w_1)\)表示第一个词\(w_1\)出现的概率;\(P(w_2|w_1)\)表示在第一个词\(w_1\)出现的前提下,第二个词出现的概率;以此类推。

这种展开方式虽然看起来将一个大问题分解成多个小问题,但是并未解决计算上的问题。从计算上来看,第一个词的条件概率\(P(w_1)\)很容易计算,第二个词的条件概率\(P(w_2|w_1)\)还不太麻烦,而第三个词的条件概率\(P(w_3|w_1,w_2)\)已经非常难算了,而\(P(w_n|w_1,w_2,\cdots,w_{n-1})\)根本无法估算。

马尔科夫给了一个偷懒但是颇为有效的方法:假设任意一个词\(w_i\)出现的概率只与它前面的词\(w_{i-1}\)有关,那么问题就变得简单了

\[P(w_1,w_2,\cdots,w_n)=P(w_1)\cdot P(w_2|w_1)\cdot P(w_3|w_2)\cdots P(w_i|w_{i-1})\cdots P(w_n|w_{n-1}) \]

而条件概率\(P(w_i|w_{i-1})\),可以使用下面的式子计算

\[P(w_i|w_{i-1})=\frac{P(w_{i-1},w_{i})}{P(w_{i-1})} \]

二、中文分词

使用统计语言模型可以处理自然语言中的很多问题,但统计语言模型是建立在词的基础上的,因为词是表达语义的最小单位。对于西方拼音语言而言,词之间有明确的分界符,统计和使用语言模型非常直接。而对于中、日、韩、泰等语言,词之间没有明确的分界符。因此,首先需要对句子进行分词,才能做到进一步的自然语言处理。

假设分词的输入是一个句子:中国航天官员应邀到美国与太空总署官员开会。那么分词的输出应该为:中国/航天/官员/应邀/到/美国/与/太空/总署/官员/开会。

最容易想到的分词方法,也是最简单的办法,就是查字典。“查字典”的办法,其实就是把一个句子从左向右扫描一遍,遇到字典里有的词就标识出来,遇到复合词(比如“上海大学”)就找最长的词匹配,遇到不认识的字串就分割成单字词,于是简单的分词就完成了。

这种简单的分词方法完全能够处理上面例子中的句子。在这基础上发展了最小词数的分词理论,即一句话应该分成数量最少的词串。

这种方法一个明显的不足是当遇到有二义性的分割时就无能为力了。比如,对短语“发展中国家”,正确的分割应该是“发展/中/国家”,而从左向右查字典的办法会将它分割成“发展/中国/家”,这显然错了。另外,并非所有的最长匹配都一定时正确的。比如“北京大学生”的正确分词时“北京/大学生”,而不是“北京大学/生”。

1990年前后,郭进博士用统计语言模型成功地解决了分词二义性的问题,将汉语分词的错误率降低了一个数量级。

具体来说,对于句子S,假设它有三种分词方法,那么最好的一种分词方法应该保证分完词后,这个句子出现的概率最大。至于如何求概率,就要用到上面讲到的统计语言模型。

在实际条件下,一个句子的分词方法往往远不止3种。如果穷举所有可能的分词方法,并计算每种可能下句子的概率,那么计算量是相当大的。使用维特比算法,我们就可以快速找到最佳分词方案了。

三、TF-IDF权重

当对一篇文章进行分词之后,如果想要提取这篇文章的关键词,我们就需要衡量一个词对一篇文章的重要程度

最简单也最直接的方法是,统计这篇文章中词语出现的频率,使用词频(Term Frequcency, TF)最大的词作为文章的关键词。显然,这种方法存在较大的问题。因为,有些常见的词,在所有文章中的出现频率都比较高。

那么如何描述词的常见程度?

这便是逆向文档频率(Inverse Document Frequcency, IDF)。对于一个词来说,包含它的文档数越多,它越常见,那么它的IDF就越低。

而TF-IDF则是结合了二者,对词在文章中的重要程度进行衡量。一个词\(i\)对文档\(j\)的TF-IDF值为

\[{\rm tf\_idf}_{i,j}={\rm tf}_{i,j}\times {\rm idf}_i \]

一个词的TF很容易计算。假设词\(i\)在文档\(j\)中出现\(n\)次,而文档\(j\)中一共有\(N\)个词,那么词频\({\rm tf}_{i,j}\)

\[{\rm tf}_{i,j}=\frac{n}{N} \]

一个词的IDF相对复杂些。假设语料库中共有\(M\)个文档,其中\(m\)个文档中出现了词\(i\),那么逆向文档频率\({\rm idf}_i\)

\[{\rm idf}_i=\log \frac{M}{m+1} \]

这里分母使用\(m+1\)时为了防止被除数为0。

四、主题模型

我们仍然通过一个问题开始讲。这次我们的目标是判断两篇文档的相似程度

直观的想法是,文章是由词构成的,那么我们只需统计这两篇文章中同时出现的词的比例。但这是很难行的通的。因为词存在“同义和多义”的现象。

同义指的是不同词汇在一定背景下有相同的意思;多义指的是一个词汇在不同背景下有着不同的意思。比如下面的例子

同义:
我今天面试就是去打酱油。
今天的面试,就是随便参与一下。

多义:
我今天面试就是去打酱油。
中午要吃饺子,下班先去打酱油。

因此,我们不能简单地使用两边文章中词的相似程度,来衡量文章的相似程度。

LSA

潜在语义分析(Latent Semantic Analysis,LSA)创新地引入了语义维度。语义维度是文档集上相同和相关信息的浓缩表示。

假设词典为\({A_1,A_2,B_1,B_2,C_2,C_2}\),第一个文档的词序为“\(A_1A_2A_1A_2\)”,第二个文档的词序为“\(C_1C_2B_1B_2\)”。这里假设\(A_1\)\(A_2\)表示话题一,\(B_1\)\(B_2\)表示话题二,\(C_1\)\(C_2\)表示话题三。

我们可以看出文档1与话题一有紧密联系,文档2与话题二和话题三有紧密联系。那么如何自动学习到这一知识呢?

假设我们有\(n\)个文档,\(m\)个词汇。给定一个矩阵\(A(m\times n)\),其中\(A_{i,j}\)表示词\(i\)在文档\(j\)中的权重。(这里的权重,我们可以选择TF-IDF权重方案或者其他的)
这样,矩阵\(A\)的每一行对应一个词汇,每一列对应一个文档。

接下来,LSA对矩阵\(A\)进行奇异值分解(SVD)。简单来说,就是将\(A\)分解为三个矩阵相乘。

\[A=TSD^{T} \]

其中,\(T\)是一个\(m\times r\)的词汇矢量矩阵,\(D\)是一个\(n\times r\)的文档矢量矩阵,而\(S\)是一个\(r\times r\)的对角阵。

实际上,LSA做了降维的近似处理。通过这一处理,只保留了\(S\)中最大的K个对角值(也就是奇异值),进而文档矢量矩阵\(D\)和词汇矢量矩阵\(T\)都被缩成了K列。其中词汇矢量矩阵\(D\)的每一列就是一个主题,而文档向量矩阵\(T\)的每一行就是一个文档对应在这K个主题上的系数表示。

主题-词汇 通过这样的表示,可以看到每一个主题向量可以近似表示成词汇向量的一个线性加权。一主题向量中的元素表示该主题内对应词汇的权重,一个词汇权重越大,表示在该主题内部越具有代表性。

文档——主题 对于多个文档,这K个主题是共享的,而线性结合系数是文档特定的。一个文档对应着多个主题的线性加权。

LDA

接下来,人们提出了pLSA,将潜在语义分析从线性代数的分析模型提升到概率统计的展现模式。

简单来说,一个词语在文档中的出现概率为

\[P(词语|文档)=\sum_{主题}P(词语|主题)\times P(主题|文档) \]

pLSA是LSA在概率上的一种呈现。在LSA中,我们假设主题向量是正交的,那么在pLSA中,我们的假设则是不同主题变量之间是独立的。

尽管pLSA采用了概率模型作为刻画方法,但是它并没有“将概率表示进行到底”。形式化的说,它并不是一个完整的贝叶斯模型,其中的\(P(词汇|主题)\)\(P(主题|文档)\)都是根据数据估计出来的,都是模型参数,而且没有进一步对这些参数引入先验。

2004年,David Blei首次提出全贝叶斯版本的pLSA,并且将其称为主题模型,英文名为Latent Dirichlet Allocation(Blei, et al. 2003)。(线性判别分析的缩写也是LDA,注意区分)

这里不对LDA的细节进行探讨,毕竟太过枯燥。我们简单地举一个例子说明LDA。

假设我们要使用LDA生成一篇文档。我们要做的是

  1. 选择一个主题分布
  2. 从主题分布中选择一个主题
  3. 根据这个主题,选择一个单词

这样进行多次,我们就是生成了一篇文档。

LDA中的D指的是狄利克雷分布。狄利克雷分布是关于分布的分布。一个主题,是关于词汇的分布。那么主题分布,就是关于分布的分布。

五、Word2Vec

在很多算法中,我们需要将词转化为可计算的数值。我们常常使用一个向量,表示一个词。

一个简单的方法是OneHot方法。

假设词典中一共有4个词,那么向量的长度为4。每个向量仅在词的对应位置为1,其余为0。

但在实际应用中,这种方法有诸多不足。最显著的就是,维度灾难。在实际应用,字典往往是非常大的,那么每个词对应的向量的维度就非常高。

其实,现实世界中的词并不是孤立存在的,词之间存在许多联系。比如,象棋与棋和大象之间存在着联系。

Word2Vec就是基于这种思路的无监督方法。

参考

[1] 吴军. 人民邮电出版社. 数学之美.
[2] 刘知远,崔安欣等. 电子工业出版社. 大数据智能.

本文链接:www.superzhang.site/blog/text-analysis

posted on 2017-12-06 11:01  SuperZhang828  阅读(714)  评论(0编辑  收藏  举报

导航