隐马尔可夫模型HMM+维特比算法(Viterbi Algorithm)进行词性标注代码实现(自然语言处理课程第二次作业)

文章目录

  • 一、理论描述
  • 二、算法描述
  • 三、详例描述
    • 具体过程
      • 分析题目
      • 数据预处理
        • 转移概率矩阵:
        • 发射概率矩阵:
      • HMM+维特比算法进行词性标注
        • 开始进行词性标注:
          • The:
          • bear:
          • is:
          • on:
          • the:
          • move:
          • 标注结果
  • 四、软件演示(完整代码及运行结果)
    • 关键代码
    • 完整代码
    • 运行结果
  • 五、参考链接
    • python实现
    • Java实现

一、理论描述

  • 隐马尔可夫模型是马尔可夫链的一种,它的状态不能直接观察到,但能通过观测向量序列观察到,每个观测向量都是通过某些概率密度分布表现为各种状态,每一个观测向量是由一个具有相应概率密度分布的状态序列产生。所以,隐马尔可夫模型是一个双重随机过程----具有一定状态数的隐马尔可夫链和显示随机函数集。自20世纪80年代以来,HMM被应用于语音识别,取得重大成功。到了90年代,HMM还被引入计算机文字识别和移动通信核心技术“多用户的检测”。HMM在生物信息科学、故障诊断等领域也开始得到应用。

  • HMM 是一个五元组(O,Q,O0,A,B) :
    O:{o1 … ot } 是状态集合,也称为观测序列
    Q:{q1 … qv } 是一组输出结果,也称隐序列
    aij =P(qj |qi ): 转移概率分布
    bij =P(oj |qi ): 发射概率分布
    O0是初始状态,有些还有终止状态

  • 维特比算法是以部分最优去获得全局最优,每个节点保存的是当前节点的局部最优概率,依据最后一个时刻中概率最高的状态,逆向找其路径中的上一个最大部分最优路径,从而找到整个最优路径。

二、算法描述

在这里插入图片描述

观察序列长度 T,状态个数N
for 状态s from 1 to Ndo//计算每个状态的概率,相当于计算第一观察值的隐状态t=1v[s,1] = a(0,s)*b(O1|s) //初始状态概率 * 发射概率//回溯保存最大概率状态back[s,1]=0
//计算每个观察(词语)取各个词性的概率,保存最大者
for from 观察序列第二个 to T dofor 状态s from 1 to Ndo//当前状态由前一个状态*转移*发射(该状态/词性下词t的概率),保存最大者v[s,t]=max v[i,t-1]*a[i,s]*b(Ot | s)//保存回溯点,该点为前一个状态转移到当前状态的最大概率点back[s,t]=arg{1,N} max v[i,t-1]*a(i,s)
//最后
v[T]=max v[T]
back[T] = arg{1,N} max v[T]
//回溯输出隐状态序列

三、详例描述

题目:
在这里插入图片描述
在这里插入图片描述

假定初始概率为:
AT BEZ IN NN VB PERIOD
[0.2 0.1 0.1 0.2 0.3 0.1]

依据以上两个表格,使用 HMM 和 和 Viterbi 算法标注下面的句子。

The bear is on the move

具体过程

分析题目

分析该例子,可知

观测序列O为: O:{The, bear, is, on, the, move}
隐序列Q为:Q:{AT,BEZ,IN,NN,VB,PERIOD}

假设:
在这里插入图片描述

数据预处理

上面的两个原始表格中:
第一个表格在进行数据平滑(表格中每个数+1)后、再对每个数以该表格各个数相加的即得到 转移概率矩阵

而第二个表格需要先将表格转置,再对数据进行平滑(表格中每个数+1)、将每个数以该表格各个数相加的即得到发射概率矩阵

将第一个表格中数据平滑后得到如下矩阵:
在这里插入图片描述
将第二个表格中数据(进行转置处理后)平滑后得到如下矩阵:
在这里插入图片描述
将处理后的两个矩阵中数值分别求和后,将每个单元格内的数以各自对应矩阵求和后的值,得到转移概率矩阵和发射概率矩阵:

转移概率矩阵:

在这里插入图片描述

发射概率矩阵:

在这里插入图片描述

解释:
上面两个矩阵中,
例如转移概率Z[AT][AT]=4.47E-06,Z[BEZ][IN]=0.00191,
发射概率F[AT][BEAR]=7.4551E-06,F[VB][MOVE]=0.000999

HMM+维特比算法进行词性标注

假设:

初始概率P0
概率P
转移概率Z
发射概率F

隐序列的初始概率为:
在这里插入图片描述
表格整体结构:
在这里插入图片描述

开始进行词性标注:

The:

在这里插入图片描述

bear:

在这里插入图片描述
在这里插入图片描述

is:

在这里插入图片描述
在这里插入图片描述

on:

在这里插入图片描述
在这里插入图片描述

the:

在这里插入图片描述
在这里插入图片描述

move:

在这里插入图片描述
在这里插入图片描述

标注结果

由上述过程可知{The, bear, is, on, the, move}最后的标注结果为:

[‘the/AT’, ‘bear/NN’, ‘is/BEZ’, ‘on/IN’, ‘the/AT’, ‘move/NN’]

四、软件演示(完整代码及运行结果)

关键代码

维特比算法相关关键代码:

def vierbi(obs, states, start_p, trans_p, emit_p):""":param obs:     观察序列    K:param states:  隐藏状态    S:param start_p: 初始概率    π:param trans_p: 转移概率    A:param emit_p:  发射概率    B:return:"""# 路径概率表 V[时间][隐状态] = 概率V = [{}]# 一个中间变量,代表当前状态是哪个隐状态path = {}# 初始化初始状态 t=0for 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 = newpathprint_dptable(V)(prob, state) = max([(V[len(obs) - 1][y], y) for y in states])return prob, path[state]

完整代码

(python实现)

# -*- coding:utf-8 -*-"""
维特比算法的实现
HMM 五个重要元素
S 隐藏序列的集合
K 输出状态或观测状态的集合
π对应隐藏状态的的初始概率
A 隐藏状态的转移概率 是一个N*M的概率矩阵
B 隐藏状态到观测状态的混淆矩阵,是一个N*M的发射概率的矩阵
"""# 隐藏序列 S
# states = ("Rainy", "Sunny")
states = ('AT', 'BEZ', 'IN','NN','VB','PERIOD')# 观测序列 K
# observations = ('walk', 'shop', 'clean')
observations = ("the", "bear","is","on","the","move")# print(observations)
# print(result)
# 初始概率 π
# start_probability = {'Rainy': 0.6, "Sunny": 0.4}
start_probability = {'AT':0.2, 'BEZ':0.1, 'IN':0.1,'NN':0.2,'VB':0.3,'PERIOD':0.1}sumA = 223499
# 转移概率 A
transition_probability = {# 'Rainy': {"Rainy": 0.7, "Sunny": 0.3},# "Sunny": {"Rainy": 0.4, "Sunny": 0.6}"AT": {'AT': 1/sumA, 'BEZ': 1/sumA, 'IN': 1/sumA,'NN': 48636/sumA,'VB': 1/sumA,'PERIOD': 20/sumA},"BEZ": {'AT': 1974/sumA, 'BEZ': 1/sumA, 'IN': 427/sumA,'NN': 188/sumA,'VB': 1/sumA,'PERIOD': 39/sumA},"IN": {'AT': 43323/sumA, 'BEZ': 1/sumA, 'IN': 1326/sumA,'NN': 17315/sumA,'VB': 1/sumA,'PERIOD': 186/sumA},"NN": {'AT': 1068/sumA, 'BEZ': 3721/sumA, 'IN': 42471/sumA,'NN': 11774/sumA,'VB': 615/sumA,'PERIOD': 21393/sumA},"VB": {'AT': 6073/sumA, 'BEZ': 43/sumA, 'IN': 4759/sumA,'NN': 1477/sumA,'VB': 130/sumA,'PERIOD': 1523/sumA},"PERIOD": {'AT': 8017/sumA, 'BEZ': 76/sumA, 'IN': 4657/sumA,'NN': 1330/sumA,'VB': 955/sumA,'PERIOD': 1/sumA}
}
# print(transition_probability['AT']['AT'])sumB = 134136
# 发射概率  B
emission_probability = {"AT": {'the': 69017/sumB, 'bear': 1/sumB, 'is': 1/sumB,'on': 1/sumB,'the': 69017/sumB,'move': 1/sumB},"BEZ": {'the': 1/sumB, 'bear': 1/sumB, 'is': 10066/sumB,'on': 1/sumB,'the': 1/sumB,'move': 1/sumB},"IN": {'the': 1/sumB, 'bear': 1/sumB, 'is': 1/sumB,'on': 5485/sumB,'the': 1/sumB,'move': 1/sumB},"NN": {'the': 1/sumB, 'bear': 11/sumB, 'is': 1/sumB,'on': 1/sumB,'the': 1/sumB,'move': 37/sumB},"VB": {'the': 1/sumB, 'bear': 44/sumB, 'is': 1/sumB,'on': 1/sumB,'the': 1/sumB,'move': 134/sumB},"PERIOD": {'the': 1/sumB, 'bear': 1/sumB, 'is': 1/sumB,'on': 1/sumB,'the': 1/sumB,'move': 1/sumB}
}def print_dptable(V):print("     ")for i in range(len(V)): print("%7d" % i, end="")print()for y in V[0].keys():# print("%.5s: " % y, end=" ")print("%-.30s: " % y, end=" ")for t in range(len(V)):# print("%.7s" % V[t][y], end=" ")print("%-.30s" % V[t][y], end=" ")print()def vierbi(obs, states, start_p, trans_p, emit_p):""":param obs:     观察序列    K:param states:  隐藏状态    S:param start_p: 初始概率    π:param trans_p: 转移概率    A:param emit_p:  发射概率    B:return:"""# 路径概率表 V[时间][隐状态] = 概率V = [{}]# 一个中间变量,代表当前状态是哪个隐状态path = {}# 初始化初始状态 t=0for 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 = newpathprint_dptable(V)(prob, state) = max([(V[len(obs) - 1][y], y) for y in states])return prob, path[state]# print(vierbi(observations,
#                   states,
#                   start_probability,
#                   transition_probability,
#                   emission_probability
#                   ))result_org = observations
tag = vierbi(observations,states,start_probability,transition_probability,emission_probability)
print(tag)
result = []
for i in range(len(result_org)):result.append(result_org[i]+"/"+tag[1][i])print("例句:")
print(observations)
print("标注结果:")
print(result)

运行结果

在这里插入图片描述

例句(‘the’, ‘bear’, ‘is’, ‘on’, ‘the’, ‘move’)的标注结果为:
[‘the/AT’, ‘bear/NN’, ‘is/BEZ’, ‘on/IN’, ‘the/AT’, ‘move/NN’]

五、参考链接

python实现

viterbi-algorithm 维特比算法的例子解析

Java实现

Java实现:抛开jieba等工具,写HMM+维特比算法进行词性标注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34420.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海尔计算机无法装win7系统,海尔Haier电脑预装win8换win7系统BIOS设置及安装教程

现在市场很多笔记本或一体机电脑都是预装win8或win8.1操作系统,但很多用户还是比较习惯使用Win7或xp操作系统,所以会在预装的win8系统上安装自己所习惯的操作系统,一般情况要更换预装的系统是要对BIOS进行设置的,在不同品牌的电脑…

海尔微型计算机硬盘如何拆卸,海尔a62的详细拆机步骤【图文教程】

随着社会的不断发展,台式电脑已经无法满足市场的需求了,现在 笔记本电脑 非常地流行,它以轻薄的机身和过高的配置赢得了很多顾客的喜爱,所以市场上也出现了各种品牌的笔记本电脑。大家知道吧,任何东西都是优势互补的&a…

海尔计算机无法装win7系统,海尔品牌机win10改win7系统教程

近期有朋友向小编反映说,最近想将海尔品牌机预装的win10系统改成win7的,但是每次ghost完系统后,总是启动不开,这是怎么回事呢?这一般是bios的设置不对,这里小编就来给大家介绍一下海尔品牌机怎么将win10改成…

海尔android 电视直播软件,海尔智能电视如何安装直播软件看直播

嗨,大家好,今天我来给大家简单介绍一下智能电视怎么安装第三方软件?买了智能电视,很多用户 都会发现它不能像传统电视一样去看直播电视。这个时候我们就需要去安装第三方软件去解决。 一般来说,在智能电视里面&#xf…

海尔微型计算机U盘启动,海尔台式电脑如何bios设置u盘启动教程

许多用户打算使用u盘给海尔台式电脑装系统,但在操作过程中发现不会设置u盘启动,其实只要了解清楚,掌握海尔台式电脑bios设置u盘为第一启动项的方法很是简单,今天快启动小编就为大家分享下详细操作教程把。 海尔台式电脑从u盘启动有…

海尔云悦2db微型计算机,家庭主机新选择 海尔云悦mini2首发评测

1海尔云悦mini2评测前言 虽然家用台式机的市场份额一直持续下滑,以至于业界很多人认为台式机已经退出历史舞台,被笔记本、一体电脑所代替。但是,笔者要在这里为台式机正音,台式机依然是很多用户的选择,并且台式机体积越来越小,功能越来越多。甚至,台式机开始进军客厅战场…

海尔电视android怎么设置,海尔电视怎么连接手机 海尔电视连接手机步骤

随着电视发展越来越迅速,电视的更新换代也是非常越来越快。而如今电视也变得越来越智能化了。它不但可以看电视,还可以连接网络,连接手机的。而电视行业品牌也是非常的多的。而对于电视老品牌 海尔 ,它们的产品也是非常优秀的。并…

海尔电视 android,海尔电视遥控器

海尔电视遥控器手机版是一款多功能智能电视控制软件。海尔电视遥控器app支持多种手机品牌,通过与手机连接之后,手机就变成了遥控器,使用更方便! 软件介绍 海尔电视遥控器app全面支持多品牌手机,没有网络也能轻松遥控电…

海尔电视 android,海尔电视怎么投屏

导言:你知道海尔电视怎么投屏吗? 摘要:海尔是当前国内非常受欢迎的品牌,在当下飞速发展的时代,海尔电视也与时俱进。现在的海尔电视不仅仅只限于观看,还可以连接手机,更可以电视投屏。那你知道海…

海尔微型台式计算机重装系统,海尔台式电脑bios设置u盘启动教程

海尔是全国知名品牌,相信用户朋友们多少都有点了解海尔这个老品牌,可是最近有用户想用u盘给海尔电脑重装系统,但是不知道海尔电脑bios设置u盘启动方法,其实海尔台式电脑bios设置启动项很简单,装机吧小编写了一份海尔台式机bios设置u盘启动的方…

海尔台式计算机配置,海尔台式机bios设置图解方法

海尔是全国知名品牌,相信用户朋友们多少都有点了解海尔这个老品牌,可是最近有用户想用u盘给海尔电脑重装系统,但是不知道海尔电脑bios设置u盘启动方法,其实海尔台式电脑bios设置启动项很简单,接下来是小编为大家收集的海尔台式机bios设置图解…

海尔电视显示连接不上服务器,海尔电视怎么连接手机

导言:你知道海尔电视怎么连接手机吗? 摘要:随着互联网科技的飞速发展,智能化已普遍运用到人们的生活中。电视产业也随着科技的发展飞速成长,变得越来越智能化。不但可以看电视,还可以连接网络、连接手机&am…

海尔微型计算机机箱如何拆解,海尔t628拆机详解

电脑在我们这个时代已经是我们生活的必需品了,不管是在家里的生活方面还是在工作方面,电脑都能给我们带来极大的帮助。可是电脑毕竟只是一部机器,机器就避免不了出现问题的时候,有一些小问题我们又不想拿到外面去给别人修,可是自己动手又怕把电脑给弄坏了,这真是一个很尴…

新书上市|一位家长的忠告:长大后不成才的孩子,父母都忽视了这个点!

不能因为孩子好像没有才能而早早放弃,而是应该精心养育。我相信,从“培养各方面都很均衡的人”的角度来看,这才是教育的出发点。 并非所有才能都是与生倶来的。不过,遗传确实会有所影响。 调查遗传影响的传统方法是双生子研究。该…

教育 - 幼儿教育

幼儿教育 教育参考资源品牌简介BBunion金宝贝美吉姆红黄蓝小马快跑七田真积木宝贝东方爱婴亲亲袋鼠运动宝贝蒙特梭利 教育参考资源 上海学前教育网 品牌简介 BBunion 简介 (1)0-3岁 性格教育品牌,沿用德国、犹太人早期家庭教育智慧 &…

[ZT]精彩的国外育儿教育读本,图文并茂

真是太有趣了!外國人對新爸新媽的育兒教育如此圖文並茂,相比之下,中國人的古板和拘謹顯得更加乏味與無趣,看看吧,真是寓教於樂的好東西。 測試奶水溫度 讓寶寶安靜下來 抱起寶寶 看小寶寶尿褲是干還是濕 包裹小寶寶 真…

三名学霸与计算机的缘,这三类家庭与学霸无缘,不是父母不用心,错在教育方式...

文/可馨育儿 教育孩子是一件苦中带乐的差事。父母要很完美、耐心、有教养、不暴躁,很多父母都是有缺点的,怀孕时宝妈从书中学育儿知识,想着后面如何与孩子相处,如何教育孩子,事实上,并不是你想这样做就能做…

文山计算机网络系统安装,文山智慧教育电脑版

文山智慧教育云网查成绩平台是一个可以在电脑上查分、学习的教育软件。提供了海量课程知识,实现了家校互联、成绩查询、网上教学等操作功能。目前,大家可以借助于安卓模拟器在pc设备上运行使用。 平台简介 文山智慧教育云平台依托智慧校园和无线4G网络全…

[日推荐] 『无忧育儿说』养育孩子就是这么简单!

今天小编要推荐一款小程序『无忧育儿说』,因为最近小编周围很多人说不知道怎么养育孩子。 无忧育儿说 无忧育儿说简介:提供2-6岁儿童心智成长课程,汇集首都儿研所等知名机构权威专家内容,让您的孩子真正健康成长! 进入…

中国父母最大的失职,就是没对孩子进行金钱教育

01 2018年1月12日,一个叫“一个失业父亲等待女儿归”的博主,在新浪微博上悲情哭诉:“我含辛茹苦积攒了300万,却被女儿偷走,挥霍一空。” 这名博主就是成都的老柴,他女儿今年已经18岁了。 女儿很小的时候&am…