viterbi 算法
核心思想:
概率图基本 -> 求出 A, B, π --> 通过动态规划构造dp保存最优路径 --> 反向获得最佳标签序列
具体代码:
# @TIME : 2019/10/29 下午01:22
# @File : viterbi_func.pyimport numpy as npwith open('penn_data', 'r', encoding='utf-8') as f:data = f.readlines()a = 1# 1) tag2id, id2tag, word2id, id2word
tag2id, id2tag = {}, {}
word2id, id2word = {}, {}for line in data:line = line.strip("\n")word, tag = line.rsplit('/',1)if word not in word2id:word2id[word] = len(word2id)if tag not in tag2id:tag2id[tag] = len(tag2id)
id2tag = {v:k for k, v in tag2id.items()}
id2word = {v:k for k, v in word2id.items()}N = len(id2tag)
M = len(word2id)
a = 1# 2)构建概率矩阵 A, π, B
pi = np.zeros(N)
A = np.zeros((N, M))
B = np.zeros((N, N))pre_tag = ""
for line in data:line = line.strip("\n")word, tag = line.rsplit('/',1)# print("word", word, 'tag', tag)wordId, tagId = word2id[word], tag2id[tag]if pre_tag == "":pi[tagId] += 1A[tagId][wordId] += 1else:A[tagId][wordId] += 1B[tag2id[pre_tag]][tagId] += 1if word == ".":pre_tag = ""else:pre_tag = tagpi = pi/sum(pi)
for i in range(N):A[i] /= sum(A[i])B[i] /= sum(B[i])a = 1# 平滑处理
def log(v):if v == 0:return np.log(v + 0.00001)else:return np.log(v)# 3) viterbi
def viterbi(x, pi, A, B):""":param x: 外部输入的句子 空格分隔:param pi: 首个开头的概率 1 * N:param A: 发射概率矩阵 N * M:param B: 转移概率矩阵 N * N:return:"""x_input = x.split(" ")x = [word2id[i] for i in x.split(" ")]T = len(x)dp = np.zeros((T, N)) # 这里是T行,N列(tag 种类)# ptr = np.zeros((T, N)) # 用于记录每个当前单元格中最优的路径来自前面哪个tag, 注意需要用整型,而不是浮点型,浮点型不能用于indexptr = np.array([[0 for x in range(N)] for y in range(T)])# 填充dp矩阵,记录最优路径的概率值,动态规划 &# 先算第一行for j in range(N):dp[0][j] = log(pi[j]) + log(A[j][x[0]])# 后续部分for i in range(1, T): # 每个单词for j in range(N): # 每个词性dp[i][j] = -999for k in range(N): # 每一条路径k到达j,因为dp中需要存储最优路径,需要比较一下每种路径score = dp[i-1][k] + log(B[k][j]) + log(A[j][x[i]])if score > dp[i][j]:dp[i][j] = scoreptr[i][j] = k # 反向获得最好的tag# decoding# 先找出最后一个单词的词性,best_seq = [0] * T # 有T个词best_seq[T-1] = np.argmax(dp[T-1])# 然后往前推,倒序for i in range(T-2, -1, -1):best_seq[i] = ptr[i+1][best_seq[i+1]] # 注意这里其实就是最后一列上最优的N是第几个,然后取ptr中取出# overrel = [id2tag[best_seq[i]] for i in range(len(best_seq))]print("input:", x_input)print("rel:", rel)if __name__ == "__main__":x = "Although preliminary findings were reported more than a year ago"### IN JJ NNS VBD VBN RBR IN DT NN INviterbi(x, pi, A, B)
input: ['Although', 'preliminary', 'findings', 'were', 'reported', 'more', 'than', 'a', 'year', 'ago']
rel: ['IN', 'JJ', 'NNS', 'VBD', 'VBN', 'JJR', 'IN', 'DT', 'NN', 'IN']
viterbi 算法相关推荐
- HMM 前向 后向 Viterbi算法讲解通透的
HMM 前向 后向 Viterbi算法讲解通透的 https://blog.csdn.net/xueyingxue001/article/details/52396494 什么是HMM https: ...
- 隐马尔可夫HMM中viterbi算法
引言 viterbi算法简化最有可能的天气序列的运算过程,forward算法简化该该观察值的概率. 问题描述 你在中国,你朋友F在美国,F的作息有walk, shop, clean,但这选择跟天气有关 ...
- Viterbi 算法无线通信信号处理Demo
问题描述 信道H长度L=3,H = (h0,h1,h2),其中h0=,h1=,h2=; 基本信号类型 x =10或-10,一个完整的信号序列为X = (x0,x1,x2,...,x9);噪声W = ( ...
- 隐马尔可夫(HMM)、前/后向算法、Viterbi算法
HMM的模型 图1 如上图所示,白色那一行描述由一个隐藏的马尔科夫链生成不可观测的状态随机序列,蓝紫色那一行是各个状态生成可观测的随机序列 话说,上面也是个贝叶斯网络,而贝叶斯网络中有这么一种,如下 ...
- 机器学习知识点(二十四)隐马尔可夫模型HMM维特比Viterbi算法Java实现
1.隐马尔可夫模型HMM 学习算法,看中文不如看英文,中文喜欢描述的很高深. http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/ht ...
- viterbi算法_HMM模型和Viterbi算法如何应用于分词
首先感谢以下博主的分享,第一,二个链接是讲的HMM模型,第三个文章讲的是Viterbi算法 结巴分词3--基于汉字成词能力的HMM模型识别未登录词 - 老顽童2007 - 博客园www.cnblog ...
- 隐马尔可夫模型中的Viterbi算法zz
隐马尔可夫模型中的Viterbi算法zz 这篇文章简单描述一下Viterbi算法--一年之前我听过它的名字,直到两周之前才花了一点时间研究了个皮毛,在这里做个简单检讨.先用一句话来简单描述一下:给出一 ...
- 线性链条件随机场与HMM在viterbi算法中的图解对比
先整理下相关概念: 条件随机场P(Y|X): 表示的是给定一组输入随机变量 X 的条件下另一组输出随机变量 Y 的马尔可夫随机场,也就是说 CRF 的特点是假设输出随机变量构成马尔可夫随机场. 什么是 ...
- viterbi算法_序列比对(十四)——viterbi算法和后验解码的比较
原创: hxj7 本文比较了viterbi算法求解最可能路径以及后验解码这两种不同的解码方法. 前文<序列比对(十)viterbi算法求解最可能路径>介绍了用viterbi算法求解最可能路 ...
- 语音识别维特比解码_HMM连续语音识别中Viterbi算法的优化及应用
HMM 连续语音识别中 Viterbi 算法的优化及应用 袁俊 [期刊名称] <电子技术> [年 ( 卷 ), 期] 2001(028)002 [摘要] 基于 HMM 连续语音识别系统声学 ...
最新文章
- Python 使用CORS跨域资源共享解决flask服务器跨域问题、浏览器同源策略
- 2016年,新的开始
- messenger android 4.,AndroidIPC机制(4)-Messenger
- UART_RECV详细设计方案
- 神舟六号的投入产出比:1比12
- Java swing中的keyListener使用事例
- 近期 AI 领域招聘、招生信息汇总
- 在开启bin-log日志下Mysql报错
- 智能优化算法:乌鸦搜索算法-附代码
- jvm系列(五):tomcat性能调优和性能监控(visualvm)
- JDK源码分析(2)之 Array 相关
- 周期信号的博里叶级数表示(连续时间)
- 奖补多的2022年合肥高新区高成长企业申报时间入选范围及申报条件材料
- 桌面图标有蓝底处理刚才
- Oracle怎样创建共享文件夹,OracleVirtualBox虚拟机如何实现文件夹共享
- 【POJ3349】snowflakes
- 石家庄地铁查询双人项目进度总结
- 重启计算机按哪几个键,电脑键盘哪个键是重启键?
- 算法设计与分析 二叉树
- 快手官宣全员开启大小周?996、997,网友:「国产式加班」花样真多!
热门文章
- 一篇吃透mysql(个人笔记)
- 基于Matlab的遗传算法优化BP神经网络的算法实现(附算法介绍与代码详解)
- 浅谈Dynamics CRM开发转Dynamics AX开发的感受与差异
- 跟随鼠标一起流动的粒子动画 JS 原生代码
- 利用Python自动化操作鼠标键盘刷金币,工作室都靠这种脚本搬砖!
- 这样使用开口霍尔传感器,可获得更好的动态特性和灵敏度
- 【漏洞复现】IE 浏览器远程代码执行漏洞
- linux中测试带宽的命令,【linux】测试网络带宽
- 互联网电商启示录:雷柏鼠标带来的思考!
- 最近,软博会”收官“发布会如约而至……