实体识别中,或序列标注任务中的维特比Viterbi解码

2024-05-26 15:18

本文主要是介绍实体识别中,或序列标注任务中的维特比Viterbi解码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

看懂这个算法,首先要了解序列标注任务     QQ522414928 可以在线交流

 

大体做一个解释,首先需要4个矩阵,当然这些矩阵是取完np.log后的结果,

分别是:初始strat→第一个字符状态的概率矩阵,转移概率矩阵,发射概率矩阵,最后一个字符状态→end结束的概率矩阵,

这些概率矩阵可以是通过统计得到,或者是LSTM+crf这种训练迭代得到。 

zero_log 指的是在统计中发射概率没有的情况下用这个很小的值来代替,lstm+crf中应该不会出现不存在的发射概率。

 

然后看代码

一个矩阵V:里面保存的是每个时间步上的每个状态对应的概率

一个字典path:里面保存的是  {当前标签:他之前所经过的路径}     

 

然后最佳路径的计算经过三个部分:初试概率矩阵到第一个字符状态那部分,序列中字符状态转移和发射那部分,最后一个字符状态到end那部分

里边的发射分数和转移分数都使用加法计算是因为   发射矩阵和转移矩阵都经过了log取对数运算

 

def start_calcute(self,sentence):'''通过viterbi算法计算结果:param sentence: "小明硕士毕业于中国科学院计算所":return: "S...E"'''zero = -3.14e+100zero_log = np.log(-3.14e+100)init_state = self.prob_dict["PiVector_prob"]trans_prob = self.prob_dict["TransProbMatrix_prob"]emit_prob = self.prob_dict["EmitProbMartix_prob"]end_prob = self.prob_dict["EndProbMatrix_prob"]V = [{}] #其中的字典保存 每个时间步上的每个状态对应的概率path = {}#初始概率for y in self.state_list:V[0][y] = init_state[y] + emit_prob[y].get(sentence[0],zero_log)path[y] = [y]#从第二次到最后一个时间步for t in range(1,len(sentence)):V.append({})newpath = {}for y in self.state_list: #遍历所有的当前状态temp_state_prob_list = []for y0 in self.state_list: #遍历所有的前一次状态cur_prob = V[t-1][y0]+trans_prob[y0][y]+emit_prob[y].get(sentence[t],zero_log)temp_state_prob_list.append([cur_prob,y0])#取最大值,作为当前时间步的概率prob,state =  sorted(temp_state_prob_list,key=lambda x:x[0],reverse=True)[0]#保存当前时间步,当前状态的概率V[t][y] = prob#保存当前的状态到newpath中newpath[y] = path[state] + [y]#让path为新建的newpathpath = newpath#输出的最后一个结果只会是S(表示单个字)或者E(表示结束符)(prob, state) = max([(V[len(sentence)][y]+end_prob[y], y) for y in ["S","E"]])return (prob, path[state])

  

这篇关于实体识别中,或序列标注任务中的维特比Viterbi解码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004829

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

FreeRTOS学习笔记(二)任务基础篇

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 任务的基本内容1.1 任务的基本特点1.2 任务的状态1.3 任务控制块——任务的“身份证” 二、 任务的实现2.1 定义任务函数2.2 创建任务2.3 启动任务调度器2.4 任务的运行与切换2.4.1 利用延时函数2.4.2 利用中断 2.5 任务的通信与同步2.6 任务的删除2.7 任务的通知2

day-50 求出最长好子序列 I

思路 二维dp,dp[i][h]表示nums[i] 结尾,且有不超过 h 个下标满足条件的最长好子序列的长度(0<=h<=k),二维数组dp初始值全为1 解题过程 状态转换方程: 1.nums[i]==nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h]+1) 2.nums[i]!=nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h-1

Flink任务重启策略

概述 Flink支持不同的重启策略,以在故障发生时控制作业如何重启集群在启动时会伴随一个默认的重启策略,在没有定义具体重启策略时会使用该默认策略。如果在工作提交时指定了一个重启策略,该策略会覆盖集群的默认策略默认的重启策略可以通过 Flink 的配置文件 flink-conf.yaml 指定。配置参数 restart-strategy 定义了哪个策略被使用。常用的重启策略: 固定间隔 (Fixe