N-gram语言模型简单介绍
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语言模型简单介绍的更多相关文章
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍
一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...
- 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍
一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...
- yii2的权限管理系统RBAC简单介绍
这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...
- angular1.x的简单介绍(二)
首先还是要强调一下DI,DI(Denpendency Injection)伸手获得,主要解决模块间的耦合关系.那么模块是又什么组成的呢?在我看来,模块的最小单位是类,多个类的组合就是模块.关于在根模块 ...
- Linux的简单介绍和常用命令的介绍
Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...
- iOS-iOS开发简单介绍
概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的 ...
- iOS开发多线程篇—多线程简单介绍
iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...
- iOS开发UI篇—UITabBarController简单介绍
iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...
随机推荐
- AU3脚本 记录
编译程序使用自定义图标: #AutoIt3Wrapper_Icon=自定义图标地址 打开指定的网址:(也可以指定其他浏览器exe) Run(@ProgramFilesDir & "\ ...
- 从零开始学习OpenGL ES之一 – 基本概念
我曾写过一些文章介绍iPhone OpenGL ES编程,但大部分针对的是已经至少懂得一些3D编程知识的人.作为起点,请下载我的OpenGL Xcode项目模板,而不要使用Apple提供的模板.你可以 ...
- cc2530-----串口透明传输分析
Zigbee协议栈学习之串口透明传输实验(SerialApp)流程分析 第一个功能:协调器的组网,终端设备和路由设备发现网络以及加入网络 //第一步:Z-Stack 由 main()函数开始执行, ...
- cocos2d-x 3.x随机数
1.使用标准库std::rand()函数 rand();//产生0~RAND_MAX(0x7fff=32767)间的int类型随机数 rand()%;//产生0~5间的int类型随机数,不包括5 2. ...
- AndroidStudio使用注意事项
今天在引入GitHUb上的开源框架时,写好依赖后编译时,报以下错误: Error:Execution failed for task ':app:processDebugResources'.> ...
- input text设置字体
控件里设置: style="font-family:Arial" html里设置 <font face="Arial">
- Entity Framework 学习初级篇4--Entity SQL
Entity SQL 是 ADO.NET 实体框架 提供的 SQL 类语言,用于支持 实体数据模型 (EDM).Entity SQL 可用于对象查询和使用 EntityClient 提供程序执行的查询 ...
- 宿主机丢失vmnet0和vmnet8网卡
好久没打开虚拟机竟然发现与主机的连接网卡都不见了,有人说进入编辑-->虚拟网络编辑-->将主机虚拟适配器连接到此网络打钩就好,我觉得蛮有道理的,但是试验打勾并点击应用时虚拟机又会返回到没打 ...
- Android ---paint类
引自:http://www.cnblogs.com/-OYK/archive/2011/10/25/2223624.html Android Paint和Color类 要绘图,首先得调整画笔,待画 ...
- CentOS6.5 安装snorby
如果下列任何组件之一已经被安装,请酌情忽略 1.Snort 参照 CentOS6.5 安装snort 2.GIT 系统自带 3.Ruby 版本限制> 1.9.2 系统自带版本过低首先卸载掉,注意 ...