白话HMM系列1——从一个缩略语还原的例子说起
HMM到底是一个什么样的东西,我想从我研究的一个应用场景开始说起。之所以想重新描述一下我对HMM的理解,是因为上次面试百度糯米的时候,自己没有把HMM在应用上说的很明白,不过糯米的那位郑姓面试官我也是服,盛气凌人完全不是招聘的样子啊,罢了,还是自己准备的不够充分,特来博客上总结一发。
我所研究的问题,概括来讲,就是缩略语的还原。且看下面的图1所示的例子:
图示很直观,怎么把网络中经常出现的武大电信院,还原为武汉大学电子信息学院呢?类似的例子还有很多,这里不再一一列举。可以说,缩略语的使用在汉语中是非常普遍的现象。如果采用字典查找的方法,当然也可以取得不错的准确率,前提是你构造的字典要足够完备,显然这种方法无法解决新登录缩略语的还原问题。这个场景,如何应用在HMM模型上,我想从这个图中,便可以很直观的感受出来:将待还原的缩略语看成是观测序列,而将缩略语对应的原短语,看成是隐马尔可夫链中的隐藏序列。这样,根据缩略语,寻找最有可能输出该缩略语的原短语,便成为了一个典型的隐马尔可夫模型的求解问题,使用Viterbi算法,便可以轻松的求解出来。
我们知道,HMM模型是基于三个假设产生的,那么这三个假设,在这个应用场景中,分别有什么意义呢?如下:
1)马尔科夫假设,即一阶马尔科夫假设。它的意思就是,下一个状态只依赖于其前一个状态,而和之前的其他状态无关(因此,由于第一个状态没有前一个状态,HMM会有一个参数pi,表示各个状态在马尔科夫链第一个位置出现的概率的大小,状态如不特别声明,都是指的隐藏状态,下同)。这里,拿武汉-大学-电子三个状态来讲,电子只依赖于大学,而和武汉没有关系。这里显然可以根据实际的应用问题,将该假设扩展为高阶假设。
2)不动性假设,也就是时间无关性假设。它的意思是说,状态i转移到状态j,在马尔科夫链上的任何位置发生的概率,是一样大的。在这个例子里面,我们可以这样理解:武汉这个状态i,出现在马尔科夫链的开头时,它转移到大学这个状态j的概率,和武汉出现在马尔科夫链的其他位置转移到大学这个状态的概率,是一样大的。但是这样的假设,在这个应用问题上,显然不是十分合适的,因为按照我们的经验来看,特定的位置上,一般会发生特定类型的转移,比如当武汉这个状态出现在比较靠前的位置,那么其转移到大学这个状态的概率就会大一些。
3)输出独立性假设。即当然得输出状态,仅和当前的隐藏状态有关,而和其他的状态没有关系。这个显然不是很好扩展,而且该假设很大的降低了计算复杂度。试想一下,如果每次你还要计算其他N个状态对该输出的影响,那么计算量是相当可怕的。但是,我们可以利用时间信息来影响输出概率。这显然是合理的,比如,当武汉这个状态出现在马尔科夫链的head处,则其输出“武”这个观测状态的概率,就需要增大,需要进行一定的加权。
这便是HMM的三个假设在该问题上的应用含义。可是,我们要利用HMM解决这个问题,需要哪些数据?我们又该如何进行,模型训练和模型求解呢?这其实就是HMM的三个基本问题:评估问题(数据集的似然概率),解码问题(找出最有可能的隐藏状态序列)以及学习问题(根据数据集训练模型参数)。HMM有三个基本的参数,A,B和pi,假设我们有N个隐藏状态,M个观测状态,则A是N阶矩,B则是N*M大小的矩阵,pi则是1*N的向量(表示第i个状态出现在位置0的概率大小)。那么在这个问题上,我们首先要确定什么是隐藏状态和观测状态。观测状态其实就是缩略语中的每一个字符,而隐藏状态则是中文词表。然而为了减小计算量,我们可以将那些不含有观测状态字符的词,生成该观测状态的概率,设置为0。
需要什么数据呢?首先,HMM的训练是一个非监督的训练(Baum-Welch算法接下来再讲解),我们只需要拿到观测序列的集合即可完成模型的EM方法求解。这是书上说的,但是要这么做,就需要先随机的初始化A和B,再不济你也可以设置A和B均匀分布,这样便可以生成任何的观测序列。然而,这样不负责任的初始化,很容易陷入局部最优解的问题,而且数学之美上也提到过,Baum-Welch算法一般没有监督方法得到的解好,但是监督训练需要大量的人工标注。因此,一般来讲,我们可以拿一份标注的数据,通过标注和统计,将A和B进行一次初始化,然后进行Baum-Welch的迭代优化。而且,由于在我的扩展中,我还需要统计位置信息,所以确实标注一下进行初始化是一个不错的选择,但是,这并不是必须的。
白话HMM系列1——从一个缩略语还原的例子说起的更多相关文章
- 用Qt写软件系列三:一个简单的系统工具(上)
导言 继上篇<用Qt写软件系列二:QIECookieViewer>之后,有一段时间没有更新博客了.这次要写的是一个简单的系统工具,需求来自一个内部项目.功能其实很简单,就是查看当前当前系统 ...
- [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)
[0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Ra ...
- E - 小晴天老师系列——我有一个数列!
E - 小晴天老师系列——我有一个数列! Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/O ...
- [大数据从入门到放弃系列教程]第一个spark分析程序
[大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...
- acdream 小晴天老师系列——我有一个数列! (ST算法)
小晴天老师系列——我有一个数列! Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)S ...
- 【ABAP系列】SAP 一个完整的SAP的Abap例子(idoc,edi文件的相互转换)
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 一个完整的SAP的Aba ...
- hdu1465不easy系列之中的一个(错排)
版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/37512659 转载请注明出 ...
- 【SpringBoot 基础系列】实现一个自定义配置加载器(应用篇)
[SpringBoot 基础系列]实现一个自定义配置加载器(应用篇) Spring 中提供了@Value注解,用来绑定配置,可以实现从配置文件中,读取对应的配置并赋值给成员变量:某些时候,我们的配置可 ...
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(中)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 四.创建一个Blazor应用程序 1. 第一种创 ...
随机推荐
- Android(java)学习笔记3:线程的优先级
1. Java线程的优先级从1到10级别,值越大优先级越高线程默认优先级是5.值越大优先级越高 (1) 继承自Thread类创建线程类: package cn.itcast_04; public cl ...
- 塔防cocos2d
塔防游戏,类似于保卫萝卜的一种. 需要注意的是几点问题是: 游戏地图是瓦片地图,设置特定的标记,用来标记哪些点是地图点,哪些是塔点. 游戏关卡选择:需要在两个cpp文件传参,用的是静态成员变量. 每一 ...
- POJ 1416 Shredding Company【dfs入门】
题目传送门:http://poj.org/problem?id=1416 Shredding Company Time Limit: 1000MS Memory Limit: 10000K Tot ...
- SSH Secure Shell Client连接Linux断开
修改/etc/ssh/sshd_config文件,将 ClientAliveInterval 0和ClientAliveCountMax 3的注释符号去掉,将ClientAliveInterval对应 ...
- 【luogu P3373 线段树2】 模板
题目链接:https://www.luogu.org/problemnew/show/P3373 lazy标记两个,先乘后加 #include <iostream> #include &l ...
- 初学bind
其实项目中还没有用到. 但自己还是想逐步了解一些高级的JS语法,不是为了炫技,也不像找前端的工作. 主要目的是:1.学习设计思想,提升解决问题的能力2.让自己的脑子动起来,别太笨. 简单的几句话总结一 ...
- 课时59.体验css(理解)
我们想做这样一个样式,应该怎么做? 分析: 有一个标题(h1),还有一些段落(p) 标题是居中的,段落也是居中的,所以我们可以设置h标签和p标签居的align属性等于center来实现 标题和段落都有 ...
- Java 基础总结
Java基础总结 jdk:Java的开发环境与部署环境jre:Java的运行环境 Java数据类型分为:基本类型和引用类型 基本类型:①整数类型 byte short int long 默 ...
- vue富文本编辑,编辑自动预览,单个图片上传不能预览的问题解决:
//预览<div class="htmlViewBox"> <p v-html="activity_html_defaultMsg" v-sh ...
- Spring-Day02-依赖注入-作业
配置beans约束自动提示 spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html中打开xsd-configuratio ...