zoukankan      html  css  js  c++  java
  • NLP(三)_统计语言模型

    概念

    统计语言模型:是描述自然语言内在的规律的数学模型。广泛应用于各种自然语言处理问题,如语音识别、机器翻译、分词、词性标注,等等。简单地说,语言模型就是用来计算一个句子的概率的模型
    即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(“什么”|“在”,“现在”)
    

    隐马尔科夫模型

    待续

  • 相关阅读:
    赫尔维茨公式
    从解析几何的角度分析二次型
    Struts 1 Struts 2
    记一次服务器被入侵的调查取证
    契约式设计 契约式编程 Design by contract
    lsblk df
    Linux Find Out Last System Reboot Time and Date Command 登录安全 开关机 记录 帐号审计 历史记录命令条数
    Infrastructure for container projects.
    更新文档 版本控制 多版本并发控制
    Building Microservices: Using an API Gateway
  • 原文地址:https://www.cnblogs.com/yehui-mmd/p/8082877.html
Copyright © 2011-2022 走看看