读数学之美——统计语言模型(马尔科夫)
2015-06-13 10:03
239 查看
因为在学校做的东西用到了HSMM(隐式半马尔科夫模型),所以对马尔科夫也算是不少接触,但在看吴军的《数学之美》之后,我才知道马尔科夫在输入法等软件上的应用。
翻译软件、搜索引擎、输入法软件,这些都是我们常常使用到的工具。有没有好奇过百度、谷歌是怎么把英文翻译成中文的?我们在打字的时候,输入前面的字,输入法是如何联想到后面的字的(而且正确率居然还这么高)?
对于翻译软件,也许会觉得:是不是计算机理解了我输进去的英文的含义,然后再翻译成中文的?
一开始科学家们也是这么想的,他们花了大量的时间来让计算机理解人类语言,事实证明,效果并不好。
于是,一个新的想法就出现了。也许计算机根本就不需要理解人类语言,它只要能够给出正确的结果就好了。看起来有点不可思议,好像不太可行吧,不过事实上就是这样。(这让我想到我上大学之后,很多课都没有理解过老师在讲些什么,只要考试前刷一刷历年题,会考试就好了。)
就像不理解上课内容,通过考前刷题来考试一样。计算机也通过对大量的语言资料进行分析,通过统计分析,来估计我们接下来要输些什么,输入法联想就这么出现了。
还是有点抽象对不对?现在我们来想象一下下面的这个场景:
假设我们自己就是一个输入法软件。这个时候用户输入了一个字——“睡”,我们来大胆联想一下他下一个字会输入什么。
我猜这个时候大家的答案都一样,下一个他很可能输入——“觉”。
为什么我们会觉得他下一个字很可能输入的是——“觉”呢?因为我们在日常生活中发现,在“睡”这个字后面跟的一般都是“觉”。
现在的输入法软件就是这么做的:他搜集很多语言资料,发现在“睡”这个字后面,出现的下一个字很可能是“觉”,于是就把“觉”作为联想词呈现出来。
具体是怎么做的呢?
假设计算机现在了很多很多语言资料,它把其中出现的所有“睡”字及其它之后的那一个字找出来,当语料非常多的时候,根据大数定律,我们可以得到:
![](http://latex.codecogs.com/gif.latex?P(State_{t}|State_{t-1})\approx&space;\frac{Num(State_{t},State_{t-1})}{Num(State_{t-1})})
这里的
![](http://latex.codecogs.com/gif.latex?State_{t-1})
为“睡”,
![](http://latex.codecogs.com/gif.latex?State_{t})
为“觉”。
![](http://latex.codecogs.com/gif.latex?Num(State_{t},State_{t-1}))
代表在预料中,“睡觉”两个字连续出现的次数;
![](http://latex.codecogs.com/gif.latex?Num(State_{t-1}))
代表“睡”出现的次数。
计算机对于“睡”之后出现的每一个字计算一次这个条件概率,再比较所有条件概率的大小,根须条件概率的大小排序,就可以给出在“睡”之后,应该联想出来的字。
以上就是统计语言模型的基本原理。那么问题来了:
1.为什么只考虑
![](http://latex.codecogs.com/gif.latex?State_{t-1})
和
![](http://latex.codecogs.com/gif.latex?State_{t})
的条件概率,不多往前考虑几个字呢?
以上其实是马尔科夫模型。它服从马尔科夫假设:在已知现在的条件下,它的将来不依赖于它以往的过去。
听起来有点抽象,上概率表达:
![](http://latex.codecogs.com/gif.latex?P(State_{t}|State_{t-1},State_{t-2},...)=P(State_{t}|State_{t-1}))
我们也可以提高该模型的阶次:
![](http://latex.codecogs.com/gif.latex?P(State_{t}|State_{t-1},State_{t-2},...)=P(State_{t}|State_{t-1},State_{t-2}))
但是我们不能一直一直把阶次增加下去,因为对于实用性来说,阶次的增加会导致计算时间的增长。
并且马尔科夫模型存在一个局限性,即使我们不断的增加阶次,对于跨度太大的关系,它也是cover不到的。这种情况可用长程依赖性来解决(这是个坑!加粗来提醒我填!!)。
2.对于零概率问题
对于某些
![](http://latex.codecogs.com/gif.latex?P(State_{t}|State_{t-1}))
可能会出现概率为0的情况。这种情况,我们可以基于Zipf定律和古德-图灵估计来解决。
Zipf定律是指:出现一次的词数量比出现两次的多,出现两次的比出现三次的多。
古德-图灵估计是指:对于在语料中没有出现的词,我们不能认为它的概率为0,因此我们从概率的总量中,分配一个很小的比例给予这些没有出现的词。
所以,我们选择把一些出现频度较小的词的概率分配一点给没有出现的词。对于频度较大的词,它出现的频率即为它的概率。
翻译软件、搜索引擎、输入法软件,这些都是我们常常使用到的工具。有没有好奇过百度、谷歌是怎么把英文翻译成中文的?我们在打字的时候,输入前面的字,输入法是如何联想到后面的字的(而且正确率居然还这么高)?
对于翻译软件,也许会觉得:是不是计算机理解了我输进去的英文的含义,然后再翻译成中文的?
一开始科学家们也是这么想的,他们花了大量的时间来让计算机理解人类语言,事实证明,效果并不好。
于是,一个新的想法就出现了。也许计算机根本就不需要理解人类语言,它只要能够给出正确的结果就好了。看起来有点不可思议,好像不太可行吧,不过事实上就是这样。(这让我想到我上大学之后,很多课都没有理解过老师在讲些什么,只要考试前刷一刷历年题,会考试就好了。)
就像不理解上课内容,通过考前刷题来考试一样。计算机也通过对大量的语言资料进行分析,通过统计分析,来估计我们接下来要输些什么,输入法联想就这么出现了。
还是有点抽象对不对?现在我们来想象一下下面的这个场景:
假设我们自己就是一个输入法软件。这个时候用户输入了一个字——“睡”,我们来大胆联想一下他下一个字会输入什么。
我猜这个时候大家的答案都一样,下一个他很可能输入——“觉”。
为什么我们会觉得他下一个字很可能输入的是——“觉”呢?因为我们在日常生活中发现,在“睡”这个字后面跟的一般都是“觉”。
现在的输入法软件就是这么做的:他搜集很多语言资料,发现在“睡”这个字后面,出现的下一个字很可能是“觉”,于是就把“觉”作为联想词呈现出来。
具体是怎么做的呢?
假设计算机现在了很多很多语言资料,它把其中出现的所有“睡”字及其它之后的那一个字找出来,当语料非常多的时候,根据大数定律,我们可以得到:
这里的
为“睡”,
为“觉”。
代表在预料中,“睡觉”两个字连续出现的次数;
代表“睡”出现的次数。
计算机对于“睡”之后出现的每一个字计算一次这个条件概率,再比较所有条件概率的大小,根须条件概率的大小排序,就可以给出在“睡”之后,应该联想出来的字。
以上就是统计语言模型的基本原理。那么问题来了:
1.为什么只考虑
和
的条件概率,不多往前考虑几个字呢?
以上其实是马尔科夫模型。它服从马尔科夫假设:在已知现在的条件下,它的将来不依赖于它以往的过去。
听起来有点抽象,上概率表达:
我们也可以提高该模型的阶次:
但是我们不能一直一直把阶次增加下去,因为对于实用性来说,阶次的增加会导致计算时间的增长。
并且马尔科夫模型存在一个局限性,即使我们不断的增加阶次,对于跨度太大的关系,它也是cover不到的。这种情况可用长程依赖性来解决(这是个坑!加粗来提醒我填!!)。
2.对于零概率问题
对于某些
可能会出现概率为0的情况。这种情况,我们可以基于Zipf定律和古德-图灵估计来解决。
Zipf定律是指:出现一次的词数量比出现两次的多,出现两次的比出现三次的多。
古德-图灵估计是指:对于在语料中没有出现的词,我们不能认为它的概率为0,因此我们从概率的总量中,分配一个很小的比例给予这些没有出现的词。
所以,我们选择把一些出现频度较小的词的概率分配一点给没有出现的词。对于频度较大的词,它出现的频率即为它的概率。
相关文章推荐
- win10网络位置怎么设置 win10网络位置设置图文教程
- JQuery中DOM加载与事件执行实例分析
- Java serve_ client聊天之client端(合工大java实验四)by峰宇
- 整合ssh框架的具体步骤
- Python实例属性和类属性的区别
- linux C++ 进程间共享内存以及临界区的实现
- 【Android Net】Volley实现(multipart/form-data)Post请求
- 一种 IM 删除信息的恢复方法
- Shiro框架的理论集成
- slf4j+logback基本配置
- 安装JDK,配置环境变量
- apache kafkac系列lient发展-java
- bestcoders pog love szhIII
- iptables里filter表前面几个数字的意思
- 不更改时区,会返回一个空的NSDate对象
- 找出数组中只出现一次的数字
- windows下安装tern for vim
- Java知多少(91)对话框
- 希尔排序算法
- mySQL远程访问