计算语言学之语言模型
来源:互联网 发布:金十数据怎么看白银 编辑:程序博客网 时间:2024/05/16 01:11
0. 写在前面
这一章我们介绍语言模型。不过要说的是,这里的语言模型基本上是基于字词的,但是其思想也是要掌握的,如果以后到句子、段落、篇章的时候,这些思想都是十分有用的。
1. 语言模型
语言模型(LM)在自然语言处理中占有重要地位,而且像n元语法模型是一个简单但是比较有效的模型。只能说比较有效,但是想要提高到非常高的地步,还需要继续改进才行。
1.1 n元语法
我们正常人的思维,肯定是这样想的,一句话的每个单词,都会与之前所有出现的词相关,甚至是与后面出现的词也相关(双向RNN)。
而一个语言模型通常构建为字符串s的概率分布p(s),这里p(s)试图反应的是字符串s作为一个句子出现的频率。对于一个由l个基元(基元就是基本单元,这里一般指字、词、短语,没有再大的了)构成的句子
上面就是n元语法,它只考虑前n-1个词与当前词的关系,而且n的取值一般是1,2,3,…,7等这种比较小的数。之所以这样做,当然是为了简化计算,因为如果我们考虑的前n个词过多的话,那么我们的自由参数都是几何式增长,计算机一是训练不来,二是根本没有这么多语料可供我们使用。
1.1.1 一元文法
一元文法就是n=1,也就是只考虑当前词,这样的话,就相当于是统计词频了。没有什么太大价值。
1.1.2 二元文法
二元文法则是n=2,这就有价值了,我们称为是一阶马尔科夫链。因为有一个概率是我们能够看到的,但是会影响最终结果的:
而
如果是这样子,那么它就是这样一个样子,需要在头和尾分别添加一个开头标记和结尾标记
1.1.3 三元文法
三元文法则是n=3,这时平时用的比较多的,我们称为二阶马尔科夫链。同样的,它的样子我们也可以写出来:
但有时候,如果数据太过稀疏的话,我们可能要考虑数据平滑了。
或者说可以使用下面式子来近似:
其中
1.2 语言模型评价
评价一个语言模型的性能通常就是使用交叉熵或者困惑度来进行,
一个n元文法,总结来讲,可以使用如下公式来统一:
那么
其中
那么对于句子(
那么交叉熵
这里的
利用与模型有关的压缩算法对数据集合中的W_T个词进行编码,每一个编码所需要的平均比特位数。
而困惑度只需要是这样的:
交叉熵和困惑度都是越小越好,一般的困惑度为50~1000之间。
2. 数据平滑
上面我们说过了N元文法最大的缺陷就是容易引起数据稀疏,也就是说,有可能一些情况的概率是0,那么解决办法就是数据平滑。我们这里简要介绍一下几种数据平滑方法。
2.1 加法平滑
加法平滑是非常常用而又特别简单的平滑方法,其重要含义,就是给所有的可能都增加一个基础概率,这个基础概率就是让每种可能均分那么一点概率。数学表达式如下:
2.2 古德-图灵估计法
上面的加法平滑,实际上是改变了已出现的概率情况,它把每个概率都减少了不同的值,但并没有按比例减少。下面这种古德——图灵估计法则是按比例减少已出现的概率,然后再均分给那些没有出现的概率的情况。
2.3 Katz平滑方法(属于后备平滑)
这种方法是当某一事件在样本中出现的概率大于k时,运用最大似然估计经过减值来估计其概率。当某一事件的频率小于k时,使用低阶的语法模型作为代替高阶语法模型的后备,然后再使用归一化来进行处理。
2.4Jelinek-Mercer平滑方法
这种方法,我们在上面也提过了,例如对于三元语法:
这样处理就是Jelinek-Mercer平滑方法。
2.5 绝对减值法
绝对减值法,就是对于已有概率的事件,减去相同的量,然后再把这匀出来的概率均分给未见的情况。
2.6 Kneser-Ney平滑方法
这种平滑方法是对于已有概率的事件,按比例减去不同的量,然后再把这匀出来的概率均分给未见的情况。
3. 语言模型的自适应
N元模型的缺点我们都十分明确,也就是它只考虑了与前n-1个词有关,但这显然和实际情况不符。
为此,需要进行语言模型自适应,这里提供3种模型。
3.1. 基于缓存的语言模型
基于换粗你的语言模型的原理就是,之前出现过的词,再出现的概率会更大,这个编程过程中的“局部性原理”差不多。因此我们需要建立一个缓存区,记录下之前出现过的词语。因此模型就变成了这样:
但同样的,未考虑缓存区内的顺序,因此有改进:
其中
当然,还有其他改进模型,我就不一一举例。
3.2. 基于混合的语言模型
基于混合的语言模型是为了解决可能训练语料不是同源的,但是为了保证测试效果比较好而做出的这种办法。
它的想法是,对于每一个来源相同的子语料
其中:
3.3. 基于最大熵的语言模型
基于最大熵的语言模型则是通过一组不同约束的模型,从中选择熵最大的模型。
例如可以是距离为1的标准二元模型,或者是距离为2的二元模型。然后再通过线性插值,使用后备方法进行数据平滑。
4. 小结
事实上,在网上关于这方面的描述还是很少的。大多集中于科研论文中。因此难度还是挺大的。可能只有专攻计算语言学的,才会细致的研究这方面内容吧。
- 计算语言学之语言模型
- 计算语言学之隐马尔可夫模型
- 计算语言学之绪论
- 计算语言学之语料库
- 计算语言学之语言理解与认知(1)
- 计算语言学之开篇随想
- 计算语言学之预备知识
- 计算语言学之汉语分词
- 计算语言学之语法理论
- 计算语言学之拼写纠错
- 计算语言学之形式语言与自动机
- 计算语言学之句法理论(1)
- 大哉,计算语言学之为用!(冯志伟)
- 学习之旅-计算语言学工作者需要了解的数学知识
- 真正的计算语言学?!
- 计算语言学相关刊物
- 计算语言学基础概论
- 计算语言学学习总结
- Java HashMap实现详解
- .Net高级技术——对象序列化
- .pch文件创建及相对路径
- 并查集
- .Net高级技术——IDisposable
- 计算语言学之语言模型
- 牛人博客
- .NET快速查找某个类所在的命名空间
- java终端获取输入
- android File listFiles()崩溃问题
- 代码块-快捷(自己拖的)
- VS2010发布网站
- tnsnames.ora
- MyEclipse使用总结——MyEclipse去除网上复制下来的来代码带有的行号