HMM用于自然语言处理(NLP)中文分词,是用来描述一个含有隐含未知参数的马尔可夫过程,其目的是希望通过求解这些隐含的参数来进行实体识别,说简单些也就是起到词语粘合的作用。

HMM隐马尔可夫模型包括:

  OBS 显现层(observations)

  States 隐含层

  Start_p 初始概率 P(a)

  Trans_p 转移概率 P(b|a)

  Emit_p 发射概率

例题:小黑每天根据天气【下雨、晴天】决定当天的活动【散步、购物、清理房间】,她有在朋友圈里发了一条信息“我前天在公园散步,昨天购物,今天清理房间了”,如何根据发的信息推断这三天的天气?

第一天:

【第一天】【散步】=【初始概率,下雨】*【发射概率,散步】=0.6*0.1=0.06
【第一天】【散步】=【初始概率,晴天】*【发射概率,散步】=0.4*0.6=0.24
  因为0.24>0.06,第一天可能是晴天

第二天:

【第二天】【购物】=【第一天散步,初始概率,下雨】*【转移概率,下雨】*【发射概率,购物】=0.06*0.7*0.4=0.0168

【第二天】【购物】=【第一天散步,初始概率,下雨】*【转移概率,晴天】*【发射概率,购物】=0.06*0.3*0.3=0.0054

【第二天】【购物】=【第一天散步,初始概率,晴天】*【转移概率,下雨】*【发射概率,购物】=0.24*0.4*0.4=0.0384

【第二天】【购物】=【第一天散步,初始概率,晴天】*【转移概率,晴天】*【发射概率,购物】=0.24*0.6*0.3=0.0432

  第一天散步+第二天购物的情况下,第一天可能是晴天,第二天也可能是晴天

第三天:

【第三天】【清理】=【初始概率,晴天,下雨】*【转移概率,下雨】*【发射概率,清理】=0.0384*0.7*0.5=0.01344

【第三天】【清理】=【初始概率,晴天,下雨】*【转移概率,晴天】*【发射概率,清理】=0.0384*0.3*0.1=0.00114

【第三天】【清理】=【初始概率,晴天,晴天】*【转移概率,下雨】*【发射概率,清理】=0.0432*0.4*0.5=0.00864

【第三天】【清理】=【初始概率,晴天,晴天】*【转移概率,晴天】*【发射概率,清理】=0.0432*0.6*0.1=0.00259

【第三天】【清理】=【初始概率,下雨,下雨】*【转移概率,下雨】*【发射概率,清理】=0.0168*0.7*0.5=0.00588

【第三天】【清理】=【初始概率,下雨,下雨】*【转移概率,晴天】*【发射概率,清理】=0.0168*0.3*0.1=0.00050

【第三天】【清理】=【初始概率,下雨,晴天】*【转移概率,下雨】*【发射概率,清理】=0.0054*0.4*0.5=0.00108

【第三天】【清理】=【初始概率,下雨,晴天】*【转移概率,晴天】*【发射概率,清理】=0.0054*0.6*0.1=0.00032

  第一天散步+第二天购物+第三天打扫的情况下,第一天晴天,第二天下雨,第三天下雨概率最大

用Python实现:

# Python -version 3.5以上版本

# 打印路径概率表
def print_dptable(V):
print (" ",)
for i in range(len(V)):
print ("%7d" % i,)
print ()
for y in V[0].keys():
print ("%.5s: " % y,)
for t in range(len(V)):
print ("%.7s" % ("%f" % V[t][y]),)
print () def viterbi(obs, states, start_p, trans_p, emit_p):
# 路径概率表 V[时间][隐含层] = 概率
V = [{}]
# 中间变量
path = {}
# 状态初始化 (t == 0)
for y in states:
V[0][y] = start_p[y] * emit_p[y][obs[0]]
path[y] = [y]
# 对 t > 0 跑一遍维特比算法
for t in range(1, len(obs)):
V.append({})
newpath = {}
for y in states:
# 概率 隐含层 = 前状态是y0的初始概率 * y0转移到y的转移概率 * y表现为当前状态的发射概率
(prob, state) = max([(V[t - 1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0) for y0 in states])
# 记录最大概率
V[t][y] = prob
# 记录路径
newpath[y] = path[state] + [y]
path = newpath
print_dptable(V)
(prob, state) = max([(V[len(obs) - 1][y], y) for y in states])
return (prob, path[state]) # HMM 实例导入
states = ('Rainy', 'Sunny')
observations = ('walk', 'shop', 'clean')
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
transition_probability = {
'Rainy': {'Rainy': 0.7, 'Sunny': 0.3},
'Sunny': {'Rainy': 0.4, 'Sunny': 0.6},
}
emission_probability = {
'Rainy': {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
'Sunny': {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
} def example():
#将实例值传输到viterbi函数
return viterbi(observations,
states,
start_probability,
transition_probability,
emission_probability
)
print (example())

HMM隐马尔可夫模型(词语粘合)的更多相关文章

  1. HMM隐马尔可夫模型来龙去脉(一)

    目录 隐马尔可夫模型HMM学习导航 一.认识贝叶斯网络 1.概念原理介绍 2.举例解析 二.马尔可夫模型 1.概念原理介绍 2.举例解析 三.隐马尔可夫模型 1.概念原理介绍 2.举例解析 四.隐马尔 ...

  2. HMM隐马尔可夫模型来龙去脉(二)

    目录 前言 预备知识 一.估计问题 1.问题推导 2.前向算法/后向算法 二.序列问题 1.问题推导 2.维特比算法 三.参数估计问题 1.问题推导 2.期望最大化算法(前向后向算法) 总结 前言 H ...

  3. HMM隐马尔科夫模型

    这是一个非常重要的模型,凡是学统计学.机器学习.数据挖掘的人都应该彻底搞懂. python包: hmmlearn 0.2.0 https://github.com/hmmlearn/hmmlearn ...

  4. 机器学习-HMM隐马尔可夫模型-笔记

    HMM定义 1)隐马尔科夫模型 (HMM, Hidden Markov Model) 可用标注问题,在语音识别. NLP .生物信息.模式识别等领域被实践证明是有效的算法. 2)HMM 是关于时序的概 ...

  5. 自然语言处理(1)-HMM隐马尔科夫模型基础概念(一)

    隐马尔科夫模型HMM 序言 文本序列标注是自然语言处理中非常重要的一环,我先接触到的是CRF(条件随机场模型)用于解决相关问题,因此希望能够对CRF有一个全面的理解,但是由于在学习过程中发现一个算法像 ...

  6. HMM 隐马尔科夫模型

    参考如下博客: http://www.52nlp.cn/itenyh%E7%89%88-%E7%94%A8hmm%E5%81%9A%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8 ...

  7. HMM:隐马尔可夫模型HMM

    http://blog.csdn.net/pipisorry/article/details/50722178 隐马尔可夫模型 隐马尔可夫模型(Hidden Markov Model,HMM)是统计模 ...

  8. 隐马尔可夫模型(Hidden Markov Model)

    隐马尔可夫模型(Hidden Markov Model) 隐马尔可夫模型(Hidden Markov Model, HMM)是一个重要的机器学习模型.直观地说,它可以解决一类这样的问题:有某样事物存在 ...

  9. 隐马尔科夫模型HMM学习最佳范例

    谷歌路过这个专门介绍HMM及其相关算法的主页:http://rrurl.cn/vAgKhh 里面图文并茂动感十足,写得通俗易懂,可以说是介绍HMM很好的范例了.一个名为52nlp的博主(google ...

随机推荐

  1. luogu P4726 多项式指数函数(模板题FFT、多项式求逆、多项式对数函数)

    手动博客搬家: 本文发表于20181127 08:39:42, 原地址https://blog.csdn.net/suncongbo/article/details/84559818 题目链接: ht ...

  2. 【hihoCoder挑战赛28 A】异或排序

    [题目链接]:http://hihocoder.com/problemset/problem/1509 [题意] [题解] 每次找到相邻两个数的二进制形式中; 不同的最高位; 显然S在这一位必然是确定 ...

  3. PHP学习总结(14)——PHP入门篇之常用运算符

    一.什么是运算符 什么是运算符?运算符是告诉PHP做相关运算的标识符号.例如,你需要计算123乘以456等于多少,这时候就需要一个符号,告诉服务器,你需要做乘法运算. PHP中的运算符有哪些?PHP运 ...

  4. 0419MySQL ORDER BY的实现分析

    转自:http://www.2cto.com/database/201202/120001.html 简朝阳 总的来说,在 MySQL 中的ORDER BY有两种排序实现方式,一种是利用有序索引获取有 ...

  5. ExtJs之Ext.grid.GridPanel(部分未完)

    今天在家休息,年假不用就作费啊. 看了几部香港老电影,陪爸爸看了勇士占奇才, 然后,测试了一下EXTJS未完的内容, 在京东上订了七本历史普及书,近两百块..:) 搞定. <!DOCTYPE h ...

  6. SPOJ 10628 Count on a tree (lca+主席树)

    题意:给定一棵有n个结点的树,每一个点有一个权值.共同拥有m个询问.对于每一个询问(u,v,k),回答结点u至v之间第k小的点的权值. 思路:主席树+lca.首先指定一个根结点dfs一次并在此过程中建 ...

  7. 能够在子线程绘画的View SurfaceView

    转载请注明出处:王亟亟的大牛之路 近期两天都没有写文章,一方面是自己在看书.一方面不知道写什么,本来昨天想写Glide或者RxAndroid的东西结果公司的"狗屎"网怎么都刷不好G ...

  8. SpringMVC 拦截器不拦截静态资源的三种处理方式方法

    方案一.拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml) <mvc:resources location="/" mapping="/**/* ...

  9. GIT 源码管理-简介

    关于GIT GIT 是一个分布式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds)创作,于2005年以GPL发布.最初目的是为更好地管理Linux内核开发而设计.是目前世界上最先进的分 ...

  10. vim设置为indent折叠以后,每次打开文件时代码处于折叠状态,能改变吗?

    vim设置为indent折叠以后,每次打开文件时代码处于折叠状态.即使这次编辑的时候把折叠展开,保存关闭文件,重新打开,所有的代码都又折叠起来了. 请问有没有默认不折叠的方法? 是否有可以一次展开所有 ...