维特

隐马尔科夫模型(HMM)学习笔记

只谈情不闲聊 提交于 2019-12-06 14:14:14
参考文献 1.李航《统计学习方法》 2. 刘建平老师的博客内容 3. 一文搞懂HMM 1.HMM模型的应用场景 首先我们来看看什么样的问题解决可以用HMM模型。使用HMM模型时我们的问题一般有这两个特征: 1)我们的问题是基于序列的,比如时间序列,或者状态序列。 2)我们的问题中有两类数据,一类序列数据是可以观测到的,即观测序列;而另一类数据是不能观察到的,即隐藏状态序列,简称状态序列。 2.HMM模型的基本定义 强调HMM的两个强假设: 【1】状态依前:即任意时刻的隐藏状态只依赖于它前一个隐藏状态 【2】观测独立:即任意时刻的观察状态只仅仅依赖于当前时刻的隐藏状态 HMM模型的三元组表示:(A,B,π) 3.HMM观测序列生成算法 4.HMM模型的三个基本问题 4.1评估观测序列出现的概率 (1)暴力解法求HMM观测序列出现的概率 直观上的想法就是:既然模型参数已知,观测序列也已知,那么我们可以穷举所有的隐藏序列。对于每一个隐藏序列, 首先计算其出现的概率,而后计算观测序列出现的概率,则隐藏序列和观测序列同时出现的联合概率就是两个概率相乘,然后求边缘概率分布,即可得到观测序列O在模型λ下出现的条件概率。计算看起来很容易,也很直观,但是当隐藏状态数N较大时,穷举的所有隐藏序列数目将是非常可怕的,这会使得这种计算方式无法进行。 (2)用前向算法求HMM观测序列出现的概率

Hanlp中使用纯JAVA实现CRF分词

自作多情 提交于 2019-11-29 18:54:57
与基于隐马尔可夫模型的最短路径分词、N-最短路径分词相比,基于条件随机场(CRF)的分词对未登录词有更好的支持。本文(HanLP)使用纯Java实现CRF模型的读取与维特比后向解码,内部特征函数采用 双数组Trie树(DoubleArrayTrie)储存,得到了一个高性能的中文分词器。 开源项目 本文代码已集成到HanLP中开源: http://hanlp.com/ CRF简介 CRF是序列标注场景中常用的模型,比HMM能利用更多的特征,比MEMM更能抵抗标记偏置的问题。 CRF训练 这类耗时的任务,还是交给了用C++实现的CRF++。关于CRF++输出的CRF模型,请参考《CRF++模型格式说明》。 CRF解码 解码采用维特比算法实现。并且稍有改进,用中文伪码与白话描述如下: 首先任何字的标签不仅取决于它自己的参数,还取决于前一个字的标签。但是第一个字前面并没有字,何来标签?所以第一个字的处理稍有不同,假设第0个字的标签为X,遍历X计算第一个字的标签,取分数最大的那一个。 如何计算一个字的某个标签的分数呢?某个字根据CRF模型提供的模板生成了一系列特征函数,这些函数的输出值乘以该函数的权值最后求和得出了一个分数。该分数只是“点函数”的得分,还需加上“边函数”的得分。边函数在本分词模型中简化为f(s',s),其中s'为前一个字的标签,s为当前字的标签。于是该边函数就可以用一个4