命名实体识别,根据实体计算准确率、召回率和F1

文章目录

    • 简介
    • 数据格式介绍
    • 准确率、召回率和F1评估
      • 评估代码
      • 评估结果
    • 进一步阅读
    • 参考

简介

使用大模型训练完命名实体识别的模型后,发现不知道怎么评估实体识别的准确率、召回率和F1。于是便自己实现了代码,同时提供了完整可运行的项目代码。

完整代码: https://github.com/JieShenAI/csdn/tree/main/KnowledgeGraph/ner_compute

数据格式介绍

  • instruction: 大模型做实体抽取的指令;
  • label: 真实的label;
  • output: 训练完成的大模型的预测结果;
{"id": "ce0...21","task": "NER","source": ".","instruction": "{\"instruction\": \"你是专门进行实体抽取的专家。请从input中抽取出符合schema定义的实体,不存在的实体类型返回空列表。请按照JSON字符串的格式回答。\", \"schema\": [\"PER\", \"ORG\", \"LOC\"], \"input\": \"我们变而以书会友,以书结缘,把欧美、港台流行的食品类图谱、画册、工具书汇集一堂。\"}","label": "[{\"entity\": \"\", \"entity_type\": \"LOC\"}, {\"entity\": \"\", \"entity_type\": \"LOC\"}]","output": "{\"PER\": [], \"ORG\": [], \"LOC\": [\"\", \"\"]}"
}

原始的label不便于使用,首先转换labelextra_label如下:

{"id": "ce0...21","task": "NER","source": ".","instruction": "{\"instruction\": \"你是专门进行实体抽取的专家。请从input中抽取出符合schema定义的实体,不存在的实体类型返回空列表。请按照JSON字符串的格式回答。\", \"schema\": [\"PER\", \"ORG\", \"LOC\"], \"input\": \"我们变而以书会友,以书结缘,把欧美、港台流行的食品类图谱、画册、工具书汇集一堂。\"}","label": "[{\"entity\": \"\", \"entity_type\": \"LOC\"}, {\"entity\": \"\", \"entity_type\": \"LOC\"}]","output": "{\"PER\": [], \"ORG\": [], \"LOC\": [\"\", \"\"]}","extra_label": {"PER": [],"ORG": [], "LOC": ["美","台"]}
}

下述代码完成labelextra_label的转换,然后再使用outputextra_label计算准确率、召回率和F1;

labelextra_label的转换的代码如下:

import json
ent_class = ["PER", "ORG", "LOC"]
# 添加额外标签
def add_extra_labels(file_path, output_path):def _add_extra_labels(file_path):with open(file_path, 'r', encoding='utf-8') as f:for line in f:data = json.loads(line)label_data = eval(data['label'])extra_labels = {ent: []for ent in ent_class}for ent in label_data:entity = ent['entity']entity_type = ent['entity_type']if entity_type in ent_class:extra_labels[entity_type].append(entity)data['extra_label'] = extra_labelsyield datawith open(output_path, 'w', encoding='utf-8') as f:for data in _add_extra_labels(file_path):f.write(json.dumps(data, ensure_ascii=False) + '\n')
input_file = 'data/predict_data.json'
output_file = 'data/data.json'
add_extra_labels(input_file, output_file)

准确率、召回率和F1评估

  • 精确率:识别出正确的实体数 / 识别出的实体数

  • 召回率:识别出正确的实体数 / 样本的实体数

  • F1值 = (精确率 * 召回率 * 2) / ( 精确率 + 召回率)

评估代码

代码核心思路:
将预测结果与label转为集合,再利用集合的与操作,即可判断出模型预测成功的实体;

Node:

  • predict_right_num:当前文本,模型预测正确的实体数;
  • predict_num:模型预测实体总数;
  • label_num:label中真实的实体数;
from dataclasses import dataclass@dataclass
class Node:# 默认值predict_right_num: int = 0predict_num: int = 0label_num: int = 0
def compute(input_file):with open(input_file, 'r', encoding='utf-8') as f:total_ent = {ent: Node()for ent in ent_class}error = 0for line in f:data = json.loads(line)extra_labels = data['extra_label']# 大模型采取的是序列到序列到文本生成,不能转换为字典的数据跳过即可try:predict = eval(data['output'])except:error += 1continue# 每个不同的实体类别单独计数for ent_name in ent_class:extra_s = set(extra_labels[ent_name])predict_s = set(predict[ent_name])total_ent[ent_name].predict_right_num += len(extra_s & predict_s)total_ent[ent_name].predict_num += len(predict_s)total_ent[ent_name].label_num += len(extra_s)for ent in ent_class:acc = total_ent[ent].predict_right_num / (total_ent[ent].predict_num + 1e-6)recall = total_ent[ent].predict_right_num / (total_ent[ent].label_num + 1e-6)f1 = 2 * acc * recall / (acc + recall)print(f'{ent} acc: {acc:.4f} recall: {recall:.4f} f1: {f1:.4f}')if __name__ == '__main__':compute('infer_1_epoch_extra.json')

评估结果

在这里插入图片描述

进一步阅读

  • https://huggingface.co/docs/evaluate/base_evaluator

参考

  • 命名实体识别的评价指标

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

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

相关文章

SpringBoot快速入门(介绍,创建的3种方式,Web分析)

目录 一、SpringBoot介绍 二、SpringBootWeb快速入门 创建 定义请求处理类 运行测试 三、Web分析 一、SpringBoot介绍 我们可以打开Spring的官网(Spring | Home),去看一下Spring的简介:Spring makes Java simple。 Spring发展到今天已经形成了一种…

学会Web UI框架--Bootstrap,快速搭建出漂亮的前端界面

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏:前端泛海 景天的主页:景天科技苑 文章目录 Bootstrap1.Bootstrap介绍2.简单使用3.布局容器4.Bootstrap实现轮播…

机器学习|KNN和Kmeans

KNN和Kmeans KNN KNN-K个最近的邻居,而K是可人先预设出来的。 所谓近朱者赤,近墨者黑。 可以选取离当前最近的K个样本来作为辅助判断,因为本样本和最近的K个样本应该是处于一种相似的状态。 以下是一个苹果和梨的识别任务。 图上会出现一个未…

011-keep-alive详解

keep-alive详解 1、简介2、keep-alive的使用效果未使用keep-alive的效果图使用keep-alive的效果图include和exclude指定是否缓存某些组件使用keep-alive的钩子函数执行顺序问题 3、keep-alive的应用场景举例4、总结 1、简介 keep-alive 是 Vue 的内置组件,当它包裹…

Elasticsearch架构原理

一. Elasticsearch架构原理 1、Elasticsearch的节点类型 在Elasticsearch主要分成两类节点,一类是Master,一类是DataNode。 1.1 Master节点 在Elasticsearch启动时,会选举出来一个Master节点。当某个节点启动后,然后使用Zen D…

理清关系简化LeetCode题库第3047题求交集区域内的最大正方形面积问题求解

3047. 求交集区域内的最大正方形面积 难度:中等 问题描述: 在二维平面上存在 n 个矩形。给你两个下标从 0 开始的二维整数数组 bottomLeft 和 topRight,两个数组的大小都是 n x 2 ,其中bottomLeft[i]和topRight[i]分别代表第i个…

爬虫(五)

1. 前端JS相关 三元运算 v1 条件 ? 值A : 值B; # 如果条件成立v1值A,不成立v1等于值Bres 1 1 ? 99 : 88 # res99特殊的逻辑运算 v1 11 || 22 # Ture v2 9 || 14 # 9 v3 0 || 15 # 15 v3 0 || 15 || "zhangfei" # 15赋值和…

Java二叉树 (2)

🐵本篇文章将对二叉树的一些基础操作进行梳理和讲解 一、操作简述 int size(Node root); // 获取树中节点的个数int getLeafNodeCount(Node root); // 获取叶子节点的个数int getKLevelNodeCount(Node root,int k); // 获取第K层节点的个数int getHeight(Node r…

【Claude3】利用Python中完成对Bedrock上的Claude的API调用

文章目录 1. 前期准备工作2. 安装和配置AWS CLI v23. 使用AWS configure命令配置AWS凭据4. 安装访问Bedrock的SDK5. 访问Amazon Bedrock UI6. 订阅Bedrock上的Claude模型7. 通过CLI命令列出所有可用的Claude模型8. 向Claude 3 Sonnet on Bedrock生成文本9. 参考链接 1. 前期准备…

云原生架构设计:分布式消息队列技术解析

消息队列是在消息传输过程中保存消息的容器,消息队列管理器在将消息从源到目标时充当中间人的角色,消息队列的主要目的是提供路由并保证消息的可靠传递。如果发送消息时接收者不可用,那消息队列就会保留消息,直到下次成功消费为止…

Excel 快速填充/输入内容

目录 一. Ctrl D/R 向下/右填充二. 批量输入内容 一. Ctrl D/R 向下/右填充 ⏹如下图所示,通过快捷键向下和向右填充数据 🤔当选中第一个单元格之后,可以按住Shift后,再选中最后一个单元格,可以选中第一个单元格和最…

CleanMyMac X4.14.7永久免费Mac电脑清理和优化软件

CleanMyMac X 是一款功能强大的 Mac 清理和优化软件,适合以下几类人群使用: 需要定期清理和优化 Mac 的用户:随着时间的推移,Mac 设备上可能会积累大量的无用文件、缓存和垃圾,导致系统运行缓慢。CleanMyMac X 的智能扫…

DataLoader

import torchvision from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter# 准备的测试数据集 数据放在了CIFAR10文件夹下test_data torchvision.datasets.CIFAR10("./CIFAR10",trainFalse, transformtorchvision.transfor…

React useMemo钩子指南:优化计算性能

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【解读】OWASP大语言模型应用程序十大风险

OWASP大型语言模型应用程序前十名项目旨在教育开发人员、设计师、架构师、经理和组织在部署和管理大型语言模型(LLM)时的潜在安全风险。该项目提供了LLM应用程序中常见的十大最关键漏洞的列表,强调了它们的潜在影响、易利用性和在现实应用程序…

[Spring] IoC 控制反转和DI依赖注入和Spring中的实现以及常见面试题

目录 1. 什么是Spring 2.什么是IoC容器 3.通过实例来深入了解IoC容器的作用 3.1造一量可以定义车辆轮胎尺寸的车出现的问题 3.2解决方法 3.3IoC优势 4.DI介绍 5.Spring中的IoC和DI的实现 5.1.存对象 5.1.2 类注解 5.1.3 方法注解 5.2取对像 (依赖注入) 5.2.1.属性…

如何使用Hexo搭建个人博客

文章目录 如何使用Hexo搭建个人博客环境搭建连接 Github创建 Github Pages 仓库本地安装 Hexo 博客程序安装 HexoHexo 初始化和本地预览 部署 Hexo 到 GitHub Pages开始使用发布文章网站设置更换主题常用命令 插件安装解决成功上传github但是web不更新不想上传文章处理方式链接…

复盘-word

word-大学生网络创业交流会 设置段落,段后行距才有分 word-选中左边几行字进行操作 按住alt键进行选中 word复制excel随excel改变(选择性粘贴) 页边距为普通页边距定义 ##### word 在内容控件里面填文字(调属性&#xff09…

BC134 蛇形矩阵

一:题目 二:思路分析 2.1 蛇形矩阵含义 首先,这道题我们要根据这个示例,找到蛇形矩阵是怎么移动的 这是,我们可以标记一下每次移动到方向 我们根据上图可以看出,蛇形矩阵一共有两种方向,橙色…

LLM 推理优化探微 (2) :Transformer 模型 KV 缓存技术详解

编者按:随着 LLM 赋能越来越多需要实时决策和响应的应用场景,以及用户体验不佳、成本过高、资源受限等问题的出现,大模型高效推理已成为一个重要的研究课题。为此,Baihai IDP 推出 Pierre Lienhart 的系列文章,从多个维…