zoukankan      html  css  js  c++  java
  • 文本分析概述

    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值为

    [{ m tf\_idf}_{i,j}={ m tf}_{i,j} imes { m idf}_i ]

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

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

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

    [{ m 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 imes n)),其中(A_{i,j})表示词(i)在文档(j)中的权重。(这里的权重,我们可以选择TF-IDF权重方案或者其他的)
    这样,矩阵(A)的每一行对应一个词汇,每一列对应一个文档。

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

    [A=TSD^{T} ]

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

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

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

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

    LDA

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

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

    [P(词语|文档)=sum_{主题}P(词语|主题) imes 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

  • 相关阅读:
    变态跳台阶
    循环删除元素,返回最后一个被删除元素的下标
    阿拉伯数字转中文大写
    最长相同子串
    最多购买种类
    win10 64位 安装scrapy
    requests+正则爬取猫眼电影前100
    Django forms表单 select下拉框的传值
    更改静态图片后,前端依旧显示之前的图片
    阿里云远程连接CentOS
  • 原文地址:https://www.cnblogs.com/super-zhang-828/p/7991666.html
Copyright © 2011-2022 走看看