http://blog.csdn.net/heavendai/article/details/7030102

1.       首先来说一下马尔科夫链。

 

一个事件序列发生的概率可以用下面的概率论里面的乘法公式展开

 

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

乘法公式的证明非常有意思,它本身就是一个递推的过程,

根据条件概率的定义:P(A|B) = P(AB)/ P(B)

那么 P(AB) = P(A|B) X P(B),由此可得:

P(w1,w2,…wn) = P(w1,w2,…wn-1) X P(wn|w1 w2…wn-1)

一路往下递推就能得到乘法公式的结果了。

假定任意一个事件wi的出现概率只同它前面的事件wi-1 有关(即一阶马尔可夫假设,多阶的情况这里不讨论)。那么上面那个乘法公式就变成下面的公式了:

P(w1,w2,…wn) = P(w1)P(w2|w1)P(w3|w2)…P(wi|wi-1)…

这个模型非常的简单,但是用处的确很大。举个例子,比如说要进行分词,我们用马尔科夫链来理解这个,假设句子中词的构成只和上一个词相关,那么这就是一个马尔可夫链,分词问题变成,要寻找一个划分 w1,w2,..wn使得 max(P(w1,w2,…wn)) 成立。一般来说 P(w2|w1) 比较小,要是 几千个这样小的数相乘的话,就会变成一个很小的数,在数学里面可以在等式两边加个 log,这样就得到

W = Log(P(w1,w2,…wn)) = P(w1)+P(w2|w1)+P(w3|w2)+…+P(wi|wi-1)+…现在求max (w) 就方便多了。

当然,接下来的工作还是有一定的难度,但是分词的基本的思想就是这样的。

2.    隐性马尔可夫链。

隐性马尔可夫链要复杂一点,基本的问题是这样的:

有两个序列,一个序列是原因,一个序列是结果。现在,我们已经知道了结果,问,这个序列的原因是什么?如果对概率论比较熟悉,你肯定知道,由结果推导原因就是 是个贝叶斯推断问题。的确,隐性马尔可夫链 就是源于这样的一个问题,当然它也有很多其他的用途。比如,分词里面一个词的词性的标记问题。已知的是一个词序列,要求这个序列每个词隐含的词性。

用数学公式表示就是这样的:

P (h(t1),h(t2),h(t3),...|o(t1),o(t2),o(t3)....), o 表示 observed(结果,你可以观察到的) , h 表示 hidden states(原因,你不能观察到的,或者说是隐性的),t1, t2, t3 表示你观察的时间。注意,o(t1),o(t2),o(t3).... 是已经确定的。因此 P(o(t1),o(t2),o(t3)....) 是一个常数。对 P (h(t1),h(t2),h(t3),...|o(t1),o(t2),o(t3)....) 用贝叶斯公式展开,

我们可以得到

P(h(t1),h(t2),h(t3),...|o(t1),o(t2),o(t3)....) = P(h(t1),h(t2),h(t3)……) X P (o(t1),o(t2),o(t3)....|(h(t1),h(t2),h(t3),...) / P(o(t1),o(t2),o(t3)……)

其中 P(o(t1),o(t2),o(t3)……) 是一个常数,我们的目的是找原因,所以,我们要求概率最大的P(h(t1),h(t2),h(t3),...|o(t1),o(t2),o(t3)....) ,因此常数可以忽略。

我们做下面的两个假设:

第一,   h(t1),h(t2),h(t3),... 是一个马尔可夫链,也就是说,h(i) 只由 h(i-1) 决定。

第二,    第 i 时刻的观察值 oi 只由第i时刻的原因 h(i) 决定(又称为独立输出假设, 即 P(o(t1),o(t2),o(t3)....| h(t1),h(t2),h(t3)....)

= P(o(t1)|h(t1)) X P(o(t2)|h(t2)) X P(o(t3)|h(t3))...。

这样问题就简单多了:

HHM = P(h(t1),h(t2),h(t3),...|o(t1),o(t2),o(t3)....)

= P(h(t1)) X P(h(t2)|h(t1))… X  P(o(t1)|h(t1)) X P(o(t2)|h(t2)) X P(o(t3)|h(t3))...。

求Max HHM。

求解这个公式,最出名的一个算法就是 Viterbi 算法,在说这个算法之前,我们要强调的是 求 Max(HHM). 为了更好的理解上面的模型,我们举个HMM的例子。

周文王被关在 天牢里面,永不见天日。但是呢,他能说出外面是晴,还是下雨。这是怎么回事呢?根据以前的经验,房子里面的潮湿程度 和 外面的天气有一定的关系。

Dry

Dryish

Damp

Soggy

Sun

0.6

0.2

0.15

0.05

Cloud

0.25

0.25

0.25

0.25

Rain

0.05

0.1

0.35

0.50

(表示 P(o(ti)|h(ti)) 的所有情况)

我们还知道,天气之间的转移矩阵如下:

Sun

Cloud

Rain

Sun

0.5

0.375

0.125

Cloud

0.25

0.125

0.625

Rain

0.25

0.375

0.375

(表示:P(h(ti)|h(ti-1)) 的所有情况)

现在某几天他观察到 房子里面的干燥程度是这样的:

Dry Dryish Damp 问,这几天 天气最有可能的情况是什么?

也就是说要求:

HHM  = P(h(t1),h(t2),h(t3)| Dry Dryish Damp) , 求 h(t1),h(t2),h(t3)的一个组合,使得 HHM   最大。

当然,你肯定想到了,用枚举法就可以了。当然,这个是一个 指数级的 复杂度,很简单的就可以证明 复杂度为 N^N.

下面我简单说下用 Viterbi 算法求解的思路。它的基本思路就是递归。和我们前面证明乘法公式的算法一样,求t3 可以 先求 t2, 求 t2 可以先求 t1, t1 当然十分的好求解了,就是

Max(P(h(t1) | Dry)),h(t1) 只有三种情况,[sun,cloud,rain].然后再反推回去。所以关键就是推导这个递推公式了。关于这个递推公式的推导就留给大家自己去做了,相信,你也能够自己发现 Viterbi 算法,不用看书上枯燥的算法描述。要注意的是,t2 的最优解,不一定是 t3的最优解。

分词中的HMM的更多相关文章

  1. 中文分词中的战斗机-jieba库

    英文分词的第三方库NLTK不错,中文分词工具也有很多(盘古分词.Yaha分词.Jieba分词等).但是从加载自定义字典.多线程.自动匹配新词等方面来看. 大jieba确实是中文分词中的战斗机. 请随意 ...

  2. 浅谈分词算法(3)基于字的分词方法(HMM)

    目录 前言 目录 隐马尔可夫模型(Hidden Markov Model,HMM) HMM分词 两个假设 Viterbi算法 代码实现 实现效果 完整代码 参考文献 前言 在浅谈分词算法(1)分词中的 ...

  3. ICTCLAS中的HMM人名识别

    http://www.hankcs.com/nlp/segment/ictclas-the-hmm-name-recognition.html 本文主要从代码的角度分析标注过程中的细节,理论谁都能说, ...

  4. 浅谈分词算法基于字的分词方法(HMM)

    前言 在浅谈分词算法(1)分词中的基本问题我们讨论过基于词典的分词和基于字的分词两大类,在浅谈分词算法(2)基于词典的分词方法文中我们利用n-gram实现了基于词典的分词方法.在(1)中,我们也讨论了 ...

  5. 结巴分词中TFIDF的原理

    之前了解TFIDF只是基于公式,今天被阿里面试官问住了,所以深入讨论下TFIDF在结巴分词中原理. 概念 TF-IDF(term frequency–inverse document frequenc ...

  6. Hanlp在java中文分词中的使用介绍

    项目结构 该项目中,.jar和data文件夹和.properties需要从官网/github下载,data文件夹下载 项目配置 修改hanlp.properties: 1 #/Test/src/han ...

  7. 结巴分词3--基于汉字成词能力的HMM模型识别未登录词

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 1 算法简介 在 结巴分词2--基于前缀词典及动态规划实现分词 博 ...

  8. 自制基于HMM的中文分词器

    不像英文那样单词之间有空格作为天然的分界线, 中文词语之间没有明显界限.必须采用一些方法将中文语句划分为单词序列才能进一步处理, 这一划分步骤即是所谓的中文分词. 主流中文分词方法包括基于规则的分词, ...

  9. 自制基于HMM的python中文分词器

    不像英文那样单词之间有空格作为天然的分界线, 中文词语之间没有明显界限.必须采用一些方法将中文语句划分为单词序列才能进一步处理, 这一划分步骤即是所谓的中文分词. 主流中文分词方法包括基于规则的分词, ...

随机推荐

  1. Centos7 安装 ActiveMQ 5.15.1

    环境 [root@node1 ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@node1 ~]# uname -r -.el ...

  2. 喵哈哈村的魔法考试 Round #4 (Div.2) 题解

    有任何疑问,可以加我QQ:475517977进行讨论. A 喵哈哈村的嘟嘟熊魔法(1) 题解 这道题我们只要倒着来做就可以了,因为交换杯子是可逆的,我们倒着去模拟一遍就好了. 有个函数叫做swap(a ...

  3. Linux学习笔记09—Sqlyog链接mysql配置

    第一步打开Linux命令窗口,进入超级用户.命令:[test@localhost ~]$ suPassword:输入超级用户密码第二步启动Mysql服务命令:[root@localhost test] ...

  4. Linux学习笔记03—初识Linux

    命令介绍 忘记root密码的处理方法 系统安装盘的救援模式的使用 一.命令介绍 1.LS命令 ls 查看当前目录下的文件 Ls –l 等同于ll 查看目录的详细信息 Ls –a 查看当前目录下的所有文 ...

  5. Redis "MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk"问题的解决(转)

    今天第二次遇到Redis “MISCONF Redis is configured to save RDB snapshots, but is currently not able to persis ...

  6. 分享下使用 svn,测试服务器代码自动更新、线上服务器代码手动更新的配置经验

    分享下使用 svn,测试服务器代码自动更新.线上服务器代码手动更新的配置经验 利用SVN的POST-COMMIT钩子自动部署代码 Linux SVN 命令详解 Linux SVN 命令详解2 使用sv ...

  7. Programming 2D Games 读书笔记(第五章)

      http://www.programming2dgames.com/chapter5.htm 示例一:Planet 真正示例的开始,首先是载入2张图片 1.Graphics添加了2个方法 load ...

  8. python脚本后台执行

    在Linux中,可以使用nohup将脚本放置后台运行,如下: nohup python myscript.py params1 > nohup.out 2>&1 & 1 但 ...

  9. Delphi 类的类 class of 用法

    http://blog.csdn.net/blue_morning/article/details/8815609 Delphi 类的类 class of 用法   这个概念本来在一个关于Delphi ...

  10. Python:日期和时间类型学习

    背景 在非开发环境经常需要做一下日期计算,就准备使用Python,顺便记下来学习的痕迹. 代码 1 # coding = utf-8 2 3 from datetime import * 4 5 ## ...