python实现HMM做中文分词-----有监督模型

35人阅读 评论(0) 收藏 举报
分类:

隐马尔科夫模型的简单介绍:
i是隐含状态值,o是观测值
五个元组:
1、初始化π
2、状态转移矩阵 A N*N (N为所有可能的状态q数)
3、观测概率分布 B N*M(M为所有可能的观测值)
4、观测值序列 O {o1,o2……oT}
5、状态值序列 I {i1,i2……iT}

以中文分词为例


状态值的取值有四个{B,E,M,S}
B: begin 起始词
E:end 结尾词
M: middle 中间词
S:siggle 单个词
观测值则为要分词的句子,例:你和你那些本不属于这里的行李


其中的参数集合为λ=(A,B,π
状态转移矩阵A:aij=P(it+1=qj | it=qi) 是在时刻t处于状态qi的条件下,时刻t+1转移到状态qj的概率。如第一个词的状态值是B,第二个词的状态分别为B,E,M,S的概率就是(a00,a01,a02,a03)。

观测概率矩阵B:bik=P(ot=vk | it=qi) 是在时刻t出去状态qi的条件下生成观测vk的概率。

π是初始状态概率:πi 是第一时刻状态qi的概率。

HMM的三个基本问题:
1、概率计算问题
已知模型λ=(A,B,π)和观测序列 O {o1,o2……oT},计算在模型λ下观测序列出现的概率P(O|λ)。
2.学习问题:
已知观测序列 O {o1,o2……oT},求可以使观测序列P(O|λ)最大的λ=(A,B,π)参数。
3.预测问题:
已知模型λ=(A,B,π)和观测序列 O {o1,o2……oT},求给定观测序列条件概率P(I|O,λ)最大的序列I。

在有监督的分词中,我们要解决的是问题一(前向概率-后向概率)和问题三(Vertibi),

1.前向概率:
给定参数λ,定义 到时刻t的观测序列为o1,o2……ot 且状态为qi的概率为前向概率。
(给定参数λ,求1~t时刻的观测序列为o1,o2……ot ,同时t时刻状态为i的概率)
αt(i)=P(o1,o2…… ot,it=qi|λ)
由此可得,αT(i)=P(o1,o2…… oT,iT=qi|λ)
T时刻状态的可能性有N种,把每种状态下的前向概率加和,就可以得到
P(O|λ)=Σiαt(i)

初值:α1(i)=P(o1,i1=qi|λ)
其实就是第一时刻,状态值为i的概率πi(因为是初始时刻)观测值为o1的概率:πibio1

递推:αt+1(i)={Σ αt(j)αji}biot+1

后向概率:
给定λ,定义到时刻t状态为qi的前提下,从t+1到T的观测序列为ot+1,ot+2……oT的概率为后向概率。
βt(i)=P(ot+1,ot+2…… oT | it=qi , λ )
有此可得,αT(i)=P(o1,o2…… oT,iT=qi|λ)
(公式之后还会补充的……)


简单的原理已经介绍完了,下面开始代码部分

1,用分好词的训练模型计算参数λ

#读取训练文本
f = file(".\\pku_training.utf8")
data = f.read()[3:].decode('utf-8')
f.close()
tokens = data.split('  ')
#len(data)=4065424  #文章长度
#len(tokens)=1109948 #分词长度

#对参数进行初始化 初始化状态 π,状态转移矩阵A,观测概率矩阵B
pi = [0] * 4   # 隐含状态有四个取值{B:0,M:1,E:2,S:3}
a = [[0] * 4 for x in range(4)]     # a[i][j]:从i状态转移到j状态的概率
b = [[0]* 65536 for x in range(4)]  # b[i][o]:从i状态到o观测值的概率

# 开始训练
last_q = 2 #初始化第一个词的状态是从E(2)开始转移

for k, token in enumerate(tokens):
    #对token进行洗涤
    token = token.strip() 
    n = len(token)
    if n <= 0:
        continue

    #如果词的长度为1,则它的状态是S:3
    if n == 1: 
        pi[3] += 1 
        a[last_q][3] += 1   # 从last_q状态转移到S的数量+1
        b[3][ord(token[0])] += 1 #ord()函数是对token[0]字符取unicode数值
                                 #状态为S 观测值为token的数量+1

     #如果n>1,则这个token包含一个B,E,如果还有多余词则包含n-2个M
     #状态B+1,状态E+1,如果n>2,则状态M+n-2
     pi[0] += 1
     pi[2] += 1
     pi[1] += (n-2)

     # 状态转移矩阵
     a[last_q][0] += 1
     last_q = 2
     #n==2,意味着这个token的状态是BE,则a[0][2]+1
     if n == 2:
         a[0][2] += 1
     #n>2,意味着这个token的状态是BMME,其中的M数是n-2
     else:
         a[0][1] += 1
         a[1][1] += (n-3)
         a[1][2] += 1

    # 发射矩阵
    b[0][ord(token[0])] += 1 #状态是B,观测值是token[0]的数量+1
    b[2][ord(token[n-1])] += 1 #状态是E,观测值token[n-1]的数量+1
    for i in range(1, n-1): #状态是M,观测值token[i]的数量分别都+1
        b[1][ord(token[i])] += 1
    # 对概率取log值
    log_normalize(pi)
    for i in range(4):
        log_normalize(a[i])
        log_normalize(b[i])
    return

由此我们能看出,初始化状态概率π是各状态值在的出现概率,即πi=p(i)

查看评论

有画快说番外篇

美术绘画的基础教程,用视频的形式呈现出来!让美术绘画更加清晰自然!
  • 2016年01月25日 10:50

基于隐马尔可夫模型的有监督词性标注

  • 2014年06月22日 09:50
  • 4.37MB
  • 下载

中文分词的python实现----HMM、FMM

转自:http://blog.csdn.net/orlandowww/article/details/52706135 隐马尔科夫模型(HMM) 模型介绍 HMM模型是由一个“五元组...
  • Together_CZ
  • Together_CZ
  • 2017-06-27 18:50:41
  • 574

中文分词的python实现-基于HMM算法

隐马尔科夫模型(HMM)模型介绍HMM模型是由一个“五元组”组成: StatusSet: 状态值集合 ObservedSet: 观察值集合 TransProbMatrix: 转移概率矩阵 EmitPr...
  • orlandowww
  • orlandowww
  • 2016-09-29 23:44:55
  • 4938

用HMM模型进行中文分词

用HMM模型进行中文分词
  • PKU_ZZY
  • PKU_ZZY
  • 2017-02-22 09:49:23
  • 1165

HMM(参数训练一有监督训练)

上文已经讲述的HMM的第一个问题,如何用前向后向算法求解观测序列的概率。本文讲述如何训练模型一、HMM参数的训练有2种方法,一种是有监督学习,另一种是无监督学习。其中有监督学习很简单,无监督理解起来稍...
  • qfzxhy
  • qfzxhy
  • 2016-07-02 20:04:58
  • 1366

HMM(参数训练无监督方法EM)

隐马尔可夫事实上是一个含有隐变量的概率模型 P(O|λ)=∑IP(O,I|λ)P(I|λ)P(O|\lambda) = \sum_{I}P(O,I|\lambda)P(I|\lambda) 它的训...
  • qfzxhy
  • qfzxhy
  • 2016-07-07 11:02:54
  • 1261

HMM模型在中文分词中的应用

模型介绍 第一次听说HMM模型是从李开复的博文论文中听说的: 李开复1988年的博士论文发表了第一个基于隐马尔科夫模型(HMM)的语音识别系统Sphinx,被《商业周刊》评为1988年美国最重...
  • shenxiaoming77
  • shenxiaoming77
  • 2016-05-26 22:56:34
  • 1513

机器学习:HMM隐马尔可夫模型用于中文分词

1. 定义 隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。它的状态不能直接观察到,但能通过观测向量序列观察到,每个观测向量都...
  • ztf312
  • ztf312
  • 2016-03-26 21:08:43
  • 6505

【Rosseta中文分词】python下利用HMM思想进行中文分词

刚刚打了半天没保存 突然崩溃 全毁了。!QAQ 心好累,不想多说什么了,说点重要的放几个连接就算了。 github连接: 1.这个项目是大一上计算导论的大作业之一,感觉比较有挑战性就选了,也学到了很...
  • Island_lin
  • Island_lin
  • 2015-01-25 23:56:36
  • 720
    个人资料
    持之以恒
    等级:
    访问量: 771
    积分: 65
    排名: 160万+
    文章存档
    最新评论