zoukankan      html  css  js  c++  java
  • N-gram基本原理

    N-gram模型是一种语言模型(Language Model,LM),语言模型是一个基于概率的判别模型,它的输入是一句话(单词的顺序序列),输出是这句话的概率,即这些单词的联合概率(joint probability)。

    N-gram本身也指一个由N个单词组成的集合,考虑单词的先后顺序,且不要求单词之间互不相同。常用的有 Bi-gram (N=2N=2N=2) 和 Tri-gram (N=3N=3N=3),一般已经够用了。例如在上面这句话里,我可以分解的 Bi-gram 和 Tri-gram :

    Bi-gram : {I, love}, {love, deep}, {love, deep}, {deep, learning}
    Tri-gram : {I, love, deep}, {love, deep, learning}N-gram中的概率计算

    联合概率的简单推导过程:A,B,C三个有顺序的句子。

    由于

    P(C/(A,B))=P(A,B,C)/P(A,B)

    P(B/A) = P(A,B)/P(B)

    所以

    P(C/(A,B))=P(A,B,C)/(P(B/A) *P(B))

    P(A,B,C) = P(C/(A,B))*P(B/A) *P(B)

    所以我们可以很容易的得到上面的多个单词的联合概率,但是由于存在参数空间过大等问题,我们可以仅仅考虑之前的一个或者几个词的前提条件的联合概率,可以降低时间复杂度,减少计算量。

    然后通过极大似然函数求解上面的概率值

    是从整个数据库中去计算上述的概率值,而不是一整句话。

    1、可以用于词性标注,类似成多分类的情况:

    例如:我爱中国!

    判断爱的词性可以通过P(词性i/(名词我出现,爱字出现))=P(名词我出现,爱字不同的词性)/P(名词的我出现,爱字所有出现的次数)

    2、可以用于垃圾短信分类:

    • 步骤一:给短信的每个句子断句。
    • 步骤二:用N-gram判断每个句子是否垃圾短信中的敏感句子。
    • 步骤三:若敏感句子个数超过一定阈值,认为整个邮件是垃圾短信。

    3、用于分词作用

    在NLP中,分词的效果很大程度上影响着模型的性能,因此分词甚至可以说是最重要的工程。用N-gram可以实现一个简单的分词器(Tokenizer)。同样地,将分词理解为多分类问题:X表示有待分词的句子,Yi表示该句子的分词方案:
    X=""

    Y1={"","",""}

    Y2={"","","",""}

    Y3={"","",""}

    p(Y1)=p()p()p()

    p(Y2)=p()p()p()p()

    p(Y3)=p()p()p()

    三个概率中,“我爱”可能在语料库中比较常见,因此p(爱∣我)p(爱|我)p(爱∣我)会比较大,然而“我爱深”这样的组合比较少见,

    于是p(爱深∣我)p(爱深|我)p(爱深∣我)和p(深∣我爱)p(深|我爱)p(深∣我爱)都比较小​ ,因此第三种分词方案最佳。

    语音识别和机器翻译中也用到。

    N-gram中的数据平滑方法  

          由于N-gram的N越大,模型效果越好。这在直观意义上是说得通的,毕竟依赖的词越多,我们获得的信息量越多,对未来的预测就越准确。然而,语言是有极强的创造性的(Creative),当N变大时,更容易出现这样的状况:某些n-gram从未出现过,这就是稀疏问题。  

         n-gram最大的问题就是稀疏问题(Sparsity)。例如,在bi-gram中,若词库中有20k个词,那么两两组合就有近2亿个组合。其中的很多组合在语料库中都没有出现,根据极大似然估计得到的组合概率将会是0,从而整个句子的概率就会为0。最后的结果是,我们的模型只能计算零星的几个句子的概率,而大部分的句子算得的概率是0,这显然是不合理的。

      因此,我们要进行数据平滑(data Smoothing),数据平滑的目的有两个:一个是使所有的N-gram概率之和为1,使所有的n-gram概率都不为0。它的本质,是重新分配整个概率空间,使已经出现过的n-gram的概率降低,补充给未曾出现过的n-gram。

    为了解决稀疏问题和参数空间过大的问题,从机器学习的角度看N-gram模型:

    vi*hi代表利用神经网络学习出来的预测值,利用预测值与真实的概率值的差值作为损失函数。

     v和h通过上述这种网络结构进行学习,然后经过softmax函数计算出概率值然后和目标值做差进行更新参数v,h。

    每一个神经元在上一个单词的前提下预测此单词的概率,最终把所有的计算出来,相乘就是最终的结果。在RNN上的应用

    RNN结构比神经网络结构好是因为可以减少参数。

     

     

     

  • 相关阅读:
    Vue-cli / webpack 加载静态js文件的方法
    shell curl 下载图片并另存为(重命名)
    sublime 技巧与快捷键篇
    es5 温故而知新 创建私有成员、私有变量、特权变量的方法
    es5 温故而知新 简单继承示例
    js 万恶之源 是否滚动到底部?
    ES6 基础知识
    jquery操作select(取值,设置选中)
    WebApi深入学习--特性路由
    Asp.net 代码设置兼容性视图
  • 原文地址:https://www.cnblogs.com/limingqi/p/12891738.html
Copyright © 2011-2022 走看看