从NLP的最基础开始吧。。不过自己看到这里,还没做总结,这里有一篇很不错的解析,可以分享一下。

N-gram语言模型

考虑一个语音识别系统,假设用户说了这么一句话:“I have a gun”,因为发音的相似,该语音识别系统发现如下几句话都是可能的候选:1、I have a gun. 2、I have a gull. 3、I have a gub. 那么问题来了,到底哪一个是正确答案呢?

一般的解决方法是采用统计的方法。即比较上面的1、2和3这三句话哪一句在英语中出现的概率最高,哪句概率最高就把哪句返回给用户。那么如何计算一个句子出现的概率呢?说白了就是“数数”的方法。但是即使是“数数”也有很多种数法,其中,最简单的策略如下:

给定一个语料库,数出其中所有的长度为4的句子的个数,设为N,然后再看在这N个长度为4的句子中,“I have a gun”出现了多少次,不妨设为N0,那么句子“I have a gun”的概率就是N0/N。其它两个句子的概率也这么计算。

上述的这种数数方法,从逻辑上讲是完全OK的,但是因为自然语言的灵活多变性,以及语料库的规模总是有限的,对于一个稍长一点的句子,很可能语料库中根本就没有。比如说下面这个句子:“I am looking for a restaurant to eat breakfast”,直观上看,这句话在语料库中应该出现次数很多吧?但是如果把这句话输入到Google的搜索框中,点击搜索,你会发现返回的结果中根本就没有完全匹配上的。所以,我们需要提出更加有效的“数数”方法。

为了把事情说清楚,需要引入一些简单的数学符号。

1、word序列:w1, w2, w3, … , wn

2、链式规则:P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)

好了,我们想要计算“I have a gun”的概率,也就是计算P(I,have,a,gun),按照链式规则,则有:

P(I,have,a,gun)=P(I)P(have|I)P(a|I,have)P(gun|I,have,a)

但是事情并没有得到简化,例如要计算P(gun|I,have,a),按照条件概率公式展开:

P(gun|I,have,a) = P(I,have,a,gun)/P(I,have,a)

发现了什么?为了计算P(gun|I,have,a),我们需要先计算P(I,have,a,gun)和P(I,have,a)。哎?P(I,have,a,gun)不就是我们一开始想要计算的值吗?所以绕了一圈,我们又回到了原地?

好了,现在我们来整理一下思路。

对于一个句子,其可以表示为一个word序列:w1, w2, w3, … , wn。我们现在想要计算句子出现的概率,也就是计算P(w1, w2, w3, … , wn)。这个概率我们可以直接用数数的方法求解,但是效果并不好,所以我们利用链式规则,把计算P(w1, w2, w3, … , wn)转化为计算一系列的乘积:P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)。但是转化之后,问题并没有变得简单。怎么办?

N-gram这时候就派上用场了。

对于1-gram,其假设是P(wn|w1w2…wn-1)≈P(wn|wn-1)

对于2-gram,其假设是P(wn|w1w2…wn-1)≈P(wn|wn-1,wn-2)

对于3-gram,其假设是P(wn|w1w2…wn-1)≈P(wn|wn-1,wn-2,wn-3)

依次类推。

所以:

在1-gram模型下:

P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)

≈P(w1)P(w2|w1)P(w3|w2)P(w4|w3)…P(wn|wn-1)

在2-gram模型下:

P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)

≈P(w1)P(w2|w1)P(w3|w1w2)P(w4|w2w3)…P(wn|wn-2wn-1)

在3-gram模型下:

P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)

≈P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|wn-3wn-2wn-1)

假设我们采用的是1-gram模型,那么:

P(I,have,a,gun)=P(I)P(have|I)P(a|have)P(gun|a).

然后,我们再用“数数”的方法求P(I)和其他的三个条件概率:

P(I)=语料库中I出现的次数 / 语料库中的总词数

P(have|I) = 语料库中I和have一起出现的次数 / 语料库中I出现的次数。

总结,本文只是对N-gram做了非常简单的介绍,目的在于简单易懂,但是不够严谨。感兴趣的同学可以进一步查阅相关的资料。在任何一本关于自然语言处理的书上都能够找到N-gram的内容。

 
 

通俗理解N-gram语言模型。(转)的更多相关文章

  1. 通俗理解Android事件分发与消费机制

    深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...

  2. Effective Java通俗理解(持续更新)

    这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...

  3. Effective Java通俗理解(下)

    Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...

  4. 关于MySQL中的自联结的通俗理解

    关于MySQL中的自联结的通俗理解 前言:最近在通过SQL必知必会这本书学习MySQL的基本使用,在学习中也或多或少遇到了点问题,我也正好分享给大家,我的这篇博客用到的所有表格的代码都是来自SQL必知 ...

  5. Effective Java通俗理解(上)

    这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...

  6. OSI七层模式简单通俗理解

    OSI七层模式简单通俗理解 这个模型学了好多次,总是记不住.今天又看了一遍,发现用历史推演的角度去看问题会更有逻辑,更好记.本文不一定严谨,可能有错漏,主要是抛砖引玉,帮助记性不好的人.总体来说,OS ...

  7. 通俗理解决策树中的熵&条件熵&信息增益

    参考通俗理解决策树算法中的信息增益 说到决策树就要知道如下概念: 熵:表示一个随机变量的复杂性或者不确定性. 假如双十一我要剁手买一件衣服,但是我一直犹豫着要不要买,我决定买这件事的不确定性(熵)为2 ...

  8. CNN笔记:通俗理解卷积神经网络【转】

    本文转载自:https://blog.csdn.net/v_july_v/article/details/51812459 通俗理解卷积神经网络(cs231n与5月dl班课程笔记) 1 前言 2012 ...

  9. 通俗理解LDA主题模型

    通俗理解LDA主题模型 0 前言 印象中,最開始听说"LDA"这个名词,是缘于rickjin在2013年3月写的一个LDA科普系列,叫LDA数学八卦,我当时一直想看来着,记得还打印 ...

  10. 举个例子去理解vuex(状态管理),通俗理解vuex原理,通过vue例子类比

    通俗理解vuex原理---通过vue例子类比   本文主要通过简单的理解来解释下vuex的基本流程,而这也是vuex难点之一. 首先我们先了解下vuex的作用vuex其实是集中的数据管理仓库,相当于数 ...

随机推荐

  1. windows下wmic命令

    转载 https://www.cnblogs.com/archoncap/p/5400769.html 第一次执行WMIC命令时,Windows首先要安装WMIC,然后显示出WMIC的命令行提示符.在 ...

  2. 2017-11-04 Sa OCT codecombat

    def hasEnemy(): e = hero.findNearestEnemy() if e: return True else: return False def enemyTooClose() ...

  3. a链接的onclick与js中的return false

    在学习<javascript基础教程>第八版时,有一个小细节开始不是很明白,查了一些资料后,理了一下思路. 例子的html代码: <!DOCTYPE html> <htm ...

  4. keepalive高可用

    Keepalived软件起初是专门为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能.因此,Keepalived除了能够管理LVS软 ...

  5. java学习笔记(十):scanner输入

    可以通过 Scanner 类来获取用户的输入. 通过next()类和nextLine()类来获取字符串. 通过 Scanner 类的 next() 类来获取输入的字符串. import java.ut ...

  6. 十二、Decorator 装饰器模式

    设计: 代码清单: Display public abstract class Display { public abstract int getColumns(); public abstract ...

  7. 专题 查找与排序的Java代码实现(一)

    专题 查找与排序的Java代码实现(一) 查找(Searching) 线性查找(linear search) 属于无序查找算法,适合于存储结构为顺序存储或链接存储的线性表. 基本思想:从数据结构线形表 ...

  8. WM-结汇

    PI发给客户以后, 客户打过来定金之后. 把PI的 P单词去掉,改为只剩invoice, 再把PI改成一份contract为标题的文件,两份文件都是要自己和客户的签字的. 然后需要用这两份文件进行结汇 ...

  9. Centos7安装部署Zabbix3.4

    1.关闭selinux和firewall 1.1检测selinux是否关闭 [root@localhost ~]# getenforce  Disabled                       ...

  10. CSS实现左侧多级菜单栏

    首先看要实现的效果, 主要是关心技术实现, 所以没怎么美化 我也是初学html, 所以写的比较啰嗦 1. 使用列表将内容显示出来 <!DOCTYPE html><html>&l ...