文本分析概述

11/2/2017 8:34:23 PM面试

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

1、统计语言模型

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

咱们有两种方法,即基于规则的方法和基于统计的方法。大数据

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

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

咱们须要将这个任务化简,创建一个模型进行对句子出现的几率进行大体的估计。因为句子是由词组成的。假设S由一串特定顺序排列的词\(w_1,w_2,\cdots,w_n\)组成。那么有文档

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

利用条件几率的公式,咱们能够展开获得数学

\[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})\]it

其中\(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})}\]

2、中文分词

使用统计语言模型能够处理天然语言中的不少问题,但统计语言模型是创建在词的基础上的,由于词是表达语义的最小单位。对于西方拼音语言而言,词之间有明确的分界符,统计和使用语言模型很是直接。而对于中、日、韩、泰等语言,词之间没有明确的分界符。所以,首先须要对句子进行分词,才能作到进一步的天然语言处理。

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

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

这种简单的分词方法彻底可以处理上面例子中的句子。在这基础上发展了最小词数的分词理论,即一句话应该分红数量最少的词串。

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

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

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

在实际条件下,一个句子的分词方法每每远不止3种。若是穷举全部可能的分词方法,并计算每种可能下句子的几率,那么计算量是至关大的。使用维特比算法,咱们就能够快速找到最佳分词方案了。

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。

4、主题模型

咱们仍然经过一个问题开始讲。此次咱们的目标是判断两篇文档的类似程度

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

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

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

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

所以,咱们不能简单地使用两边文章中词的类似程度,来衡量文章的类似程度。

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指的是狄利克雷分布。狄利克雷分布是关于分布的分布。一个主题,是关于词汇的分布。那么主题分布,就是关于分布的分布。

5、Word2Vec

在不少算法中,咱们须要将词转化为可计算的数值。咱们经常使用一个向量,表示一个词。

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

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

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

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

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

参考

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

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

相关文章
相关标签/搜索