NLP(三)_统计语言模型

来源:互联网 发布:淘宝十大作弊违规 编辑:程序博客网 时间:2024/06/14 01:04

概念

统计语言模型:是描述自然语言内在的规律的数学模型。广泛应用于各种自然语言处理问题,如语音识别、机器翻译、分词、词性标注,等等。简单地说,语言模型就是用来计算一个句子的概率的模型
即P(W1,W2,W3….WK)。利用语言模型,可以确定哪个词序列的可能性更大,或者给定若干个词,可以预测下一个最可能出现的词语。

N_gram语言模型

  • 简述
    NLP中,人们基于一定的语料库,可以利用Ngram来预计或者评估一个句子是否合理。另外一方面,Ngram可以用来评估两个字符串之间的差异程度,这是模糊匹配中常用的一种手段。而且广泛应用于机器翻译、语音识别、印刷体和手写体识别、拼写纠错、汉字输入和文献查询。
  • 引入Ngram模型
    假定S表示某个有意义的句子,由一串特定顺序排列的词w1,w2,w3,..,wn组成,n是句子的长度。想知道S在文本中(语料库)出现的可能性,也就是数学上所说的概率P(S):

    P(S)=P(w1,w2,w3,..,wn)=P(S)=P(w1,w2,w3,..,wn)=P(W1)P(W2|W1)P(W3|W1,W2)..P(Wn|W1,W2,..,Wn−1)

    可是这样的方法存在两个致命的缺陷:

參数空间过大:条件概率P(wn|w1,w2,..,wn-1)的可能性太多,无法估算,不可能有用;
数据稀疏严重:对于非常多词对的组合,在语料库中都没有出现,依据最大似然估计得到的概率将会是0。最后的结果是,我们的模型仅仅能算可怜兮兮的几个句子,而大部分的句子算得的概率是0。

  • 马尔科夫假设
    为了解决参数空间过大的问题二提出的马尔科夫假设指出:随意一个词出现的概率只是他前面出现的有限的一个或者几个词相关

    如果一个词的出现仅依赖于它前面出现的一个词,那么我们就称之为bigram(这时的Ngram模型的 N=2):

    P(S)=P(w1,w2,w3,..,wn)=P(W1)P(W2|W1)P(W3|W1,W2)..P(Wn|W1,W2,..,Wn−1)≈P(W1)P(W2|W1)P(W3|W2)..P(Wn|Wn−1)

    假设一个词的出现仅依赖于它前面出现的两个词,那么我们就称之为trigram(这时 N=3):

    P(S)=P(w1,w2,w3,..,wn)    =P(W1)P(W2|W1)P(W3|W1,W2)..P(Wn|W1,W2,..,Wn−1)    ≈P(W1)P(W2|W1)P(W3|W2,W1)..P(Wn|Wn−1,Wn−2)

    一般来说,N元模型就是假设当前词的出现概率只与它前面的N-1个词有关。而这些概率参数都是可以通过大规模语料库来计算,高于四元的用的非常少,由于训练它须要更庞大的语料,并且数据稀疏严重,时间复杂度高,精度却提高的不多。

  • 数据平滑
    对语言而言,由于数据稀疏的存在,极大似然法不是一种很好的参数估计办法。这时的解决办法,我们称之为“平滑技术”。(《数学之美》)

    数据平滑的目的有两个:

    1. 一个是使全部的Ngram概率之和为1;
    2. 二是使全部的Ngram概率都不为0。

    其主要策略是把在训练样本中出现过的事件的概率适当减小,然后把减小得到的概率密度分配给训练语料中没有出现过的事件。
    (数据平滑技术略)

N_gram模型应用(简述)
  • 基于Ngram模型定义的字符串距离

    模糊匹配的关键在于如何衡量两个长得很像的单词(或字符串)之间的“差异”,这种差异通常又称为“距离”。除了可以定义两个字符串之间的编辑距离(通常利用Needleman-Wunsch算法或Smith-Waterman算法),还可以定义它们之间的Ngram距离。

  • 利用Ngram模型评估语句是否合理
    从统计的角度来看,自然语言中的一个句子S可以由任何词串构成,不过概率P(S)有大有小。例如:

    S1 = 我刚吃过晚饭S2 = 刚我过晚饭吃

    显然,对于中文而言S1是一个通顺而有意义的句子,而S2则不是,所以对于中文来说P(S1)>P(S2)。

另外一个例子是,如果我们给出了某个句子的一个节选,我们其实可以能够猜测后续的词应该是什么,例如:

    她真在认真....

假设我们现在有一个语料库如下,其中是句首标记,是句尾标记:

<s1><s2>yes no no no no yes</s2></s1><s1><s2>no no no yes yes yes no</s2></s1>

下面我们的任务是来评估如下这个句子的概率:

<s1><s2>yes no no yes</s2></s1>

我们来演示利用trigram模型来计算概率的结果:

 P(yes|<s1>,<s2>)=1/2, P(no|yes,no)=1/2, P(</s2>|no,yes)=1/2, P(no|<s2>,yes)=1 **P(yes|no,no)=2/5** P(</s1>|yes,</s2>)=1

所以我们要求的概率就等于:
1/2×1×1/2×2/5×1/2×1=0.05

  • 基于Ngram模型的文本分类器
    只要根据每个类别的语料库训练各自的语言模型,实质上就是每一个类别都有一个概率分布,当新来一个文本的时候,只要根据各自的语言模型,计算出每个语言模型下这篇文本的发生概率,文本在哪个模型的概率大,这篇文本就属于哪个类别了!

  • Ngram在语言识别中的应用
    当要判断一个新的文档是用的什么语言时,我们首先要创建文档的Ngram概要文件并算出这个新文档概要文件与语言概要文件之间的距离。这个距离的计算根据的是两个概要文件之间的“out-of-place measure”。选择最短的距离,它表示此特定的文档属于该语言。这里要引入一个阈值,它的作用是当出现任何超过阈值的距离时,系统就会报告这个文档的语言不能被判定或判定有误。

  • 语音识别举例

     nixianzaizaiganshenme 你现在在干什么? 你西安载感什么?

    其对应的发音是完全一致的,这时如果我们借助于语言模型,我们会算出这句话的概率:

    P(“你”|“<s>”,“<s>”)P(“现在”|“你”,“<s>”)P(“在”|“你”,“现在”)P(“干什么”|“在”,“现在”)

    远大于

    P(“你”|“<s>”,“<s>”)P(“西安”|“你”,“<s>”)P(“载”|“西安”,“你”)P(“感”|“西安”,“载”)P(“什么”|“在”,“现在”)

隐马尔科夫模型

  • 背景
    随机变量到随机过程。
    举个例子来说,长江水面高度的监控其实是一件很重要的事情,长江水面的高度可能跟前些天的水面高度以及是否下雨等天气相关。所以要预测长江水面高度是一件很复杂的事情。马尔科夫为了简化问题,提出了一种假设—-假设当前的状态只与它的前一个状态相关,即P(st|s1,s2,s3,…st−1)=P(st|st−1).

    这个假设就是马尔科夫假设。而符合这个假设的随机过程称为马尔科夫过程,也称为马尔科夫链。
    这里写图片描述
    如上图所示,表示一个简单的离散马尔科夫链。其中四个长方形表示四个状态,每条边表示状态转换,边上的权值表示转换概率。

    从p1到p2的转换概率为1,即P(st+1=p2|st=p1)=1。p2到p3的概率为0.7,即P(st+1=p3|st=p2)=0.7。
  • 计算转移概率
    因为马尔科夫链中每个状态只与前一个状态相关,所以我们在看到一个马尔科夫链时,可以根据统计的方式来计算概率,比如说P(st+1|st),如果计算这个概率我们只需要统计st出现的次数nt,以及从st转换到st+1的次数nt,t+1,最终的结果为

    P(st+1|st)=ntnt,t+1
  • 隐含马尔科夫模型
    隐含马尔科夫模型是马尔科夫模型的拓展,即任意时刻的状态是不可观测的。所以我们无法直接观测一个马尔科夫链,以及根据根据马尔科夫链计算后续的转移概率。但是隐含马尔科夫模型在任意时刻会输出一个状态ot,且这个状态只与st相关,这个被称为独立输出假设
    这里写图片描述
    基于马尔科夫假设和独立输出假设,可以计算出某个特定的状态序列s1,s2,s3…产生输出状态o1,o2,o3…的概率:

    P(s1,s2,s3...,o1,o2,o3...)=∏tP(st|st−1)P(ot|st)