利用隐马尔科夫链(HMM)模型实现中文分词

1.什么是HMM?

隐马尔科夫链(HMM)是一个五元组:

  • 隐状态集合 ;
  • 观测状态集合;
  • 状态概率转移矩阵;
  • 观察状态概率矩阵;
  • 初始状态概率分布;

2.HMM有两个假设:

  • 齐次马尔可夫链假设:任意时刻的隐藏状态只依赖与前一时刻的隐藏状态。
  • 观测独立性假设:任意时刻的观察状态,只依赖与当前时刻的隐藏状态。

3.HMM可以解决3类基本问题:

  • 评估观察序列的概率。
  • 学习模型参数。即给定观察序列,估计模型的参数,是观察序列出现的概率最大。
  • 预测问题。即给定观察序列和模型,求最有可能出现的对应状态序列。

4.中文分词

<1>抽象出五元组

  • StatusSet。状态集合为{B, M, E, S}.其中B表示词首,M表示词中间,E表示词尾,S表示单字成词。
  • ObservedSet。观察状态集合就是所有的汉字,甚至包括标点符号组成的集合。
  • TransProbMatrix。状态转移概率矩阵,就是{B, M, E, S} X {B, M, E, S}的一个4X4矩阵。
  • EmitProbMatrix。观察矩阵的每个元素都是一个条件概率,代表P(Observed[i]|Status[j])。
  • InitStatus。初始状态概率分布表示句子的第一个字属于{B,E,M,S}这四种状态的概率。

<2>模型训练

A_dic = {}        #状态转移概率矩阵B_dic = {}           #观察概率矩阵Count_dic = {}       #记录每一个状态出现的次数Pi_dic = {}          #记录了每一行第一个状态出现的次数word_set = set()     #存放所有出现的字(包括数字,标点符号等)state_list = [‘B‘,‘M‘,‘E‘,‘S‘]line_num             #记录样本行数

按行遍历训练样本:

(1) 获取每行样本对应的字符列表 word_list 以及状态列表  line_state;

(2)记录字符集合 word_set 以及行数 line_num;

(3)记录每行第一个状态出现的次数 Pi_dic[line_state[0]]+=1;

(4)记录第 i-1 到 第 i 个状态转移的次数 A_dic[line_state[i-1]][line_state[i]]+=1;

(5)记录每个状态出现的次数 count_dic[line_state[i]]+=1;

(6)记录每个状态对应的发射概率 B_dic[line_state[i]][word_list[i]]+=1;

(7)统计概率

Pi_dic[state] = pi_dic[state] / line_num

A_dic[state1][state2] = A_dic[state1][state2] / count_dic[state1]

B_dic[state][word]  = B_dic[state][word] / count_dic[state]

<3>利用Viterbi算法进行分词

 1 #obs:待分词的字符串
 2 #states:状态列表(‘B‘,‘M‘,‘E‘,‘S‘)
 3 #start_p:初始概率分布
 4 #trans_p:转移概率矩阵
 5 #emit_p: 发射概率矩阵
 6 def viterbi(obs, states, start_p, trans_p, emit_p):  #维特比算法
 7     V = [{}]#每个字对应一个字典,构成一个字典列表。字典格式:{‘B’:val,‘M‘:val,‘E‘:val,‘S‘:val},val表示概率。字典表示当前字符对应的状态概率
 8     path = {}#以状态y结尾的路径如:{‘B’:[‘S‘,‘B‘],‘M‘:[‘B‘,‘M‘],‘E‘:[‘B‘,‘E‘],‘S‘:[‘S‘,‘S‘]}
 9     for y in states:   #字符串的第0个位置。初始值
10         V[0][y] = start_p[y] * emit_p[y].get(obs[0],0)   #初始概率*发射概率。在位置0,以y状态为末尾的状态序列的最大概率
11         path[y] = [y]#
12     for t in range(1,len(obs)):#遍历字符串后面的字符
13         V.append({})
14         newpath = {}
15         for y in states:      #从y0 -> y状态的递归,y表示当前时刻的状态,y0表示前一个时刻的状态。
16             #prob对应状态的最大概率,state对应最大概率下上一时刻的状态。
17             #(prob, state) = max([(V[t-1][y0] * trans_p[y0].get(y,0) * emit_p[y].get(obs[t],0) ,y0) for y0 in states if V[t-1][y0]>0])
18             (prob, state) = max([(V[t-1][y0] * trans_p[y0].get(y,0) * emit_p[y].get(obs[t],0) ,y0) for y0 in states])
19
20             V[t][y] =prob
21             newpath[y] = path[state] + [y]#以状态y结尾的路径如:{‘B’:[‘S‘,‘B‘],‘M‘:[‘B‘,‘M‘],‘E‘:[‘B‘,‘E‘],‘S‘:[‘S‘,‘S‘]}
22         path = newpath  #记录状态序列
23     (prob, state) = max([(V[len(obs) - 1][y], y) for y in states])  #在最后一个位置,以y状态为末尾的状态序列的最大概率
24     return (prob, path[state])  #返回概率和状态序列

原文地址:https://www.cnblogs.com/cainiao-xf/p/8366402.html

时间: 2024-11-07 14:06:57

利用隐马尔科夫链(HMM)模型实现中文分词的相关文章

由隐马尔科夫意淫无字典中文分词 C#

using System; using System.Windows.Forms; using System.IO; using System.Text.RegularExpressions; using System.Collections; using System.Collections.Generic; using System.ComponentModel; namespace HMM { public partial class Form1 : Form { string[] arr

理解隐马尔科夫(HMM)模型

前言 在李航的<统计学方法>第十章有对隐马尔科夫模型(Hidden Markov Model,HMM)比较详细的介绍和推导公式,我参考公式结合中文分词应用实现了隐马模型观测序列的生成.前向算法.维特比算法. 本文在此针对HMM模型在中文分词中的应用,讲讲实现原理.我尽可能的撇开公式,撇开推导.结合实际开源代码作为例子,争取做到雅俗共赏,童叟无欺. 没有公式,就没有伤害. 理解一个算法,我认为需要做到:会其意,知其形.本文回答的,其实主要是第一点.但是这一点呢,恰恰是最重要,而且很多书上不会讲的

隐马尔科夫模型HMM

隐马尔科夫模型HMM 作者:樱花猪 摘要: 本文为七月算法(julyedu.com)12月机器学习第十七次课在线笔记.隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔科夫过程.其难点是从可观察的参数中确定该过程的隐含参数,然后利用这些参数来作进一步的分析.在早些年HMM模型被非常广泛的应用,而现在随着机器学习的发展HMM模型的应用场景越来越小然而在图像识别等领域HMM依然起着重要的作用. 引言: 隐马尔科夫模型是马尔科夫链的一种,它

隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数

隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列(TODO) 在本篇我们会讨论HMM模型参数求解的问题,这个问题在HMM三个问题里算是最复杂的.在研究这个问题之前,建议先阅读这个系列的前两篇以熟悉HMM模型和HMM的前向后向算法,以及EM算法原理总结,这些在本篇里会用到.在李航的<统计学习方法>中,这个算法的讲解只考虑了单个观测

HMM(隐马尔科夫)用于中文分词

隐马尔可夫模型(Hidden Markov Model,HMM)是用来描述一个含有隐含未知参数的马尔可夫过程. 本文阅读了2篇blog,理解其中的意思,附上自己的代码,共同学习. 一.理解隐马尔科夫 1.1 举例理解 来源:< http://www.cnblogs.com/skyme/p/4651331.html > 假设我手里有三个不同的骰子.第一个骰子是我们平常见的骰子(称这个骰子为D6),6个面,每个面(1,2,3,4,5,6)出现的概率是1/6.第二个骰子是个四面体(称这个骰子为D4)

MCMC(二)马尔科夫链

MCMC(一)蒙特卡罗方法 MCMC(二)马尔科夫链 MCMC(三)M-H采样和Gibbs采样(待填坑) 在MCMC(一)蒙特卡罗方法中,我们讲到了如何用蒙特卡罗方法来随机模拟求解一些复杂的连续积分或者离散求和的方法,但是这个方法需要得到对应的概率分布的样本集,而想得到这样的样本集很困难.因此我们需要本篇讲到的马尔科夫链来帮忙. 1. 马尔科夫链概述 马尔科夫链定义本身比较简单,它假设某一时刻状态转移的概率只依赖于它的前一个状态.举个形象的比喻,假如每天的天气是一个状态的话,那个今天是不是晴天只

炎热天气看书还是钓鱼?隐马尔科夫模型教你预测!

高温天气与行为概率 夏季是一年最热的时候,气温普遍偏高,一般把日最高气温达到35℃以上的天气叫作高温天气,但是一般情况下高温天气分为两类.  (1)干热型高温.一般是指气温较高.太阳辐射强而且空气的湿度较小的高温天气.  (2)闷热型高温.一般是指水汽丰富,但是气温相对而言并不算太高,给人感受闷热.  小张在不同类型下的高温天气下会有不同的行为,但是归纳起来为主要为散步.垂钓.看书三类,分别在干热型高温和闷热型高温下对应行为的概率见下表.  假设干热型高温和闷热型高温之间会进行相互转变,每天可能

隐马尔科夫模型学习笔记

隐马尔科夫模型在股票量化交易中有应用,最早我们找比特币交易模型了解到了这个概念,今天又看了一下<统计学习方法>里的隐马尔科夫模型一章. 隐马尔科夫模型从马尔科夫链的概念而来,马尔科夫链是指下一个状态只和当前的n个状态有关,和历史状态无关的一个时间上的事件链,隐马尔科夫模型在这个状态链的基础上,让每一个状态都能产生观测值,从而可以产生一个可观测的数据链,让原来的状态链变成了幕后产生数据的状态链,称为因马尔科夫链. 隐马尔科夫链应用比较广泛,主要能够处理三类问题:. 一个是给定了马尔科夫模型参数和

隐马尔科夫模型(一)

隐马尔科夫模型是一种序列模型,广泛应用于自然语言处理,语音识别,生物信息等领域. 1. 模型的定义与约定:        定义:一个隐马尔科夫模型指的是如下的两个随机序列$I,O$: 1)一个不可观测随机序列:$I=(i_{1},...,i_{T})$, 可以取值状态集合$Q=\lbrace 1,...,K\rbrace$, 并且满足齐次马尔科夫性: \begin{equation}P(i_{t+1}\mid i_{t},i_{t-1},...,i_{1})=P(i_{t+1}\mid i_{t