本文主要是介绍命名实体识别学习-从基础算法开始(01)-维特比算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
title: 命名实体识别学习-从基础算法开始-维特比算法
date: 2020-06-22 15:28:49
tags:
命名实体识别学习-从基础算法开始(01)-维特比算法
文章目录
代码地址: https://github.com/SStarLib/NERfromBasic
Day1: 维特比算法
HMM的小例子
从一个小例子开始实现维特比算法:
例子来自知乎一个答案对维特比算法和HMM的讲解:
如何通俗地讲解 viterbi 算法? - Kiwee的回答 - 知乎
https://www.zhihu.com/question/20136144/answer/239971177
大致介绍下这个例子:
题目背景
从前有个村儿,村里的人的身体情况只有两种可能:健康或者发烧。
假设这个村儿的人没有体温计或者百度这种神奇东西,他唯一判断他身体情况的途径就是到村头我的偶像金正月的小诊所询问。
月儿通过询问村民的感觉,判断她的病情,再假设村民只会回答正常、头晕或冷。
有一天村里奥巴驴就去月儿那去询问了。
第一天她告诉月儿她感觉正常。
第二天她告诉月儿感觉有点冷。
第三天她告诉月儿感觉有点头晕。
那么问题来了,月儿如何根据阿驴的描述的情况,推断出这三天中阿驴的一个身体状态呢?
将问题抽象为一个HMM
从问题中过可以看出,{健康,发烧}对应隐马尔可夫模型中的状态序列,{正常,冷,头晕},则对应观察序列。(本例子其实不严谨,冷,头晕这两个观察现象是可以同时存在的,不过本例中假设其不同时存在)
问题要求:推断出这三天中阿驴的一个身体状态
问题本质:解码这三天的状态序列。
模型参数:状态转移概率矩阵,状态-观察概率分布矩阵,初始状态
-
**初始状态:**月儿预判的阿驴身体状态的概率分布 = { 健康:0.6 , 发烧: 0.4 }
-
状态转移概率矩阵: {
健康->健康: 0.7 ,
健康->发烧: 0.3 ,
发烧->健康:0.4 ,
发烧->发烧: 0.6
} -
状态-观察概率分布矩阵:{
健康,正常:0.5 ,冷 :0.4 ,头晕: 0.1 ;
发烧,正常:0.1 ,冷 :0.3 ,头晕: 0.6
}
有了模型参数。就可以构建模型并用维特比算法进行解码了即预测三天的身体状态。
Python实现维特比算法
为了方便后面学习,使用Pytorch框架(其实numpy应该更简单些)
手算维特比过程:
伪代码:
维特比算法的伪代码(来自宗成庆老师的ppt):
这篇关于命名实体识别学习-从基础算法开始(01)-维特比算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!