【Transformers实战篇2】练习之命名实体识别

文章目录

  • 一、命名实体识别简介
    • 1.1 数据标注体系
    • 1.2 IOB2标注体系
    • 1.3 IOBES标注体系
  • 二、代码实战
    • 2.1 导入相关包
    • 2.2 加载数据集
    • 2.3 数据集预处理
      • 2.3.1 借助word_idx实现标签映射
    • 2.4 创建模型
    • 2.5 创建评估函数
    • 2.6 配置训练参数
    • 2.7 创建训练器
    • 2.8 模型训练
    • 2.9 模型预测


本文为 https://space.bilibili.com/21060026/channel/collectiondetail?sid=1357748的视频学习笔记

项目地址为:https://github.com/zyds/transformers-code


一、命名实体识别简介

  • 命名实体识别(Named Entity Recognition, 简称NER)是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。 通常包括两部分:① 实体边界识别 ② 确定实体类别(人名、地名、机构名或其他)
    例:“小明在北京上班”
实体类别实体
地点北京
人物小明

1.1 数据标注体系

  • 数据标注体系:IOB1、IOB2、IOE1、IOE2、IOBES、BILOU

1.2 IOB2标注体系

  • I 表示实体内部
  • O 表示实体外部
  • B 表示实体开始, 如B/I-xxx, XXX表示具体的类别。如下表格:
标记说明
B-Person人名开始
I-Person人名中间
B-Organization组织名开始
I-Organization组织名中间
O非命名实体

1.3 IOBES标注体系

  • I 表示实体内部
  • O 表示实体外部
  • B 表示实体开始
  • E 表示实体结束
  • S 表示一个词单独形成一个命名实体
  • 有时也会用M来代替I

二、代码实战

2.1 导入相关包

import evaluate
from datasets import load_dataset
from transformers import AutoTokenizer, AutoModelForTokenClassification, TrainingArguments, Trainer, DataCollatorForTokenClassification, AutoModel

2.2 加载数据集

# 如果可以联网,直接使用load_dataset进行加载
#ner_datasets = load_dataset("peoples_daily_ner", cache_dir="./data")
# 如果无法联网,则使用下面的方式加载数据集
from datasets import DatasetDict
ner_datasets = DatasetDict.load_from_disk("ner_data")

先看一下数据集,发现tokens是由多个单个字token组成,是一个字一个字的。
ner_tags 是标签。ner_tags的长度和tokens的长度是对应的

ner_datasets["train"][0]
# 查看数据集的属性,其中ner_tags 也是一个序列
ner_datasets["train"].features

输出如下:
在这里插入图片描述

#%%
# 获取 ner_tags 中的 labels
label_list = ner_datasets["train"].features["ner_tags"].feature.names
label_list

输入如下:O表示非命名实体,B-PER表示人名开始。
在这里插入图片描述

2.3 数据集预处理

# 加载tokenizer
tokenizer = AutoTokenizer.from_pretrained("../../models/hfl/chinese-macbert-base")

这里注意:
如果直接tokenizer,会将每个拆分好的token,也就是每一个字都当成一个句子。因此,要指定is_split_into_words参数为True

# 如果直接tokens,会将每个拆分好的token,都当成一个句子
#tokenizer(ner_datasets["train"][0]["tokens"])  # 对于已经做好tokenize的数据,要指定is_split_into_words参数为True
# is_split_into_words=True 则当成整个句子
tokenizer(ner_datasets["train"][0]["tokens"], is_split_into_words=True)   # 对于已经做好tokenize的数据,要指定is_split_into_words参数为True

考虑到一个字可能会分成几个子字,如:interesting就被分成了4个子词,因此我们还需要对标签进行特殊的处理。

# tokenizer子词处理,拆出来了5个token
res = tokenizer("interesting word a")
res.word_ids()

2.3.1 借助word_idx实现标签映射

# 借助word_ids 实现标签映射
def process_function(examples):tokenized_exmaples = tokenizer(examples["tokens"], max_length=128, truncation=True, is_split_into_words=True)labels = []for i, label in enumerate(examples["ner_tags"]):word_ids = tokenized_exmaples.word_ids(batch_index=i)label_ids = []for word_id in word_ids:if word_id is None:label_ids.append(-100) # -100 指不会被交叉熵用上来else:label_ids.append(label[word_id])labels.append(label_ids)tokenized_exmaples["labels"] = labelsreturn tokenized_exmaples
#%%
tokenized_datasets = ner_datasets.map(process_function, batched=True)

2.4 创建模型

一定要设置num_labels

# 对于所有的非二分类任务,切记要指定num_labels,否则就会device错误
model = AutoModelForTokenClassification.from_pretrained("../../models/hfl/chinese-macbert-base", num_labels=len(label_list))

2.5 创建评估函数

#%%
# 这里方便大家加载,替换成了本地的加载方式,无需额外下载
seqeval = evaluate.load("seqeval_metric.py")
import numpy as npdef eval_metric(pred):predictions, labels = predpredictions = np.argmax(predictions, axis=-1)# 将id转换为原始的字符串类型的标签true_predictions = [[label_list[p] for p, l in zip(prediction, label) if l != -100]for prediction, label in zip(predictions, labels) ]true_labels = [[label_list[l] for p, l in zip(prediction, label) if l != -100]for prediction, label in zip(predictions, labels) ]result = seqeval.compute(predictions=true_predictions, references=true_labels, mode="strict", scheme="IOB2")return {"f1": result["overall_f1"]}

2.6 配置训练参数

args = TrainingArguments(output_dir="models_for_ner",per_device_train_batch_size=64,per_device_eval_batch_size=128,eval_strategy="epoch",save_strategy="epoch",metric_for_best_model="f1",load_best_model_at_end=True,logging_steps=50,num_train_epochs=1,save_safetensors=False
)

2.7 创建训练器

trainer = Trainer(model=model,args=args,tokenizer=tokenizer,train_dataset=tokenized_datasets["train"],eval_dataset=tokenized_datasets["validation"],compute_metrics=eval_metric,data_collator=DataCollatorForTokenClassification(tokenizer=tokenizer)
)

2.8 模型训练

trainer.train()

2.9 模型预测

from transformers import pipeline
# 使用pipeline进行推理,要指定id2label
model.config.id2label = {idx: label for idx, label in enumerate(label_list)}
# 如果模型是基于GPU训练的,那么推理时要指定device
# 对于NER任务,可以指定aggregation_strategy为simple,得到具体的实体的结果,而不是token的结果
ner_pipe = pipeline("token-classification", model=model, tokenizer=tokenizer, device=0, aggregation_strategy="simple")
res = ner_pipe("小明在北京上班")
# 根据start和end取实际的结果
ner_result = {}
x = "小明在北京上班"
for r in res:if r["entity_group"] not in ner_result:ner_result[r["entity_group"]] = []ner_result[r["entity_group"]].append(x[r["start"]: r["end"]])ner_result

输出:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM的图书管理管理系统的设计与实现 (含源码+sql+视频导入教程)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的图书管理管理系统4拥有两种角色,用户可以浏览评论图书、登录注册,管理员可以进行图书馆管理、用户管理、分类管理等功能 1.1 背景描述 图书书店销售管理…

Apache OFBiz SSRF漏洞CVE-2024-45507分析

Apache OFBiz介绍 Apache OFBiz 是一个功能丰富的开源电子商务平台,包含完整的商业解决方案,适用于多种行业。它提供了一套全面的服务,包括客户关系管理(CRM)、企业资源规划(ERP)、订单管理、产…

Colorful/七彩虹将星X17 AT 22 Win11原厂OEM系统 带COLORFUL一键还原

安装完毕自带原厂驱动和预装软件以及一键恢复功能,自动重建COLORFUL RECOVERY功能,恢复到新机开箱状态。 【格式】:iso 【系统类型】:Windows11 原厂系统下载网址:http://www.bioxt.cn 注意:安装系统会…

这五本大模型书籍,让你从大模型零基础到精通,非常详细收藏我这一篇就够了

大模型(Large Language Models, LLMs)是近年来人工智能领域的一大热点,它们在自然语言处理、对话系统、内容生成等多个方面展现出了强大的能力。随着技术的发展,市面上出现了许多介绍大模型理论与实践的书籍,为研究人员…

【ADC】SAR 型 ADC 和 ΔΣ ADC 的选型决策方法

本文学习于TI 高精度实验室课程,介绍如何选择 SAR 或 delta-sigma 型 ADC。 文章目录 一、选型决策树二、特定传感器的应用三、需要 DC 精度但分辨率较低的应用四、需要 DC 精度且分辨率较高的应用五、极低噪声的 DC 精密测量六、需要捕获瞬态信号值的应用七、需要高…

敏感字段加密 - 华为OD统一考试(E卷)

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 【敏感字段加密】给定一个由多个命令字组成的命令字符串: 1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号; 2、命令字之间以一个或多个下划线 进行分割; 3、可…

朋友圈信息流广告投放,曝光成本是多少?

微信作为国内最流行的社交平台之一,其朋友圈广告凭借精准的用户画像和强大的社交属性,成为了众多品牌商家进行市场推广的重要渠道。云衔科技推出了专业的微信朋友圈广告开户及代运营服务,旨在帮助企业轻松跨越技术门槛,精准触达目…

猜拳数据集-石头-剪刀-布数据集

“石头-剪刀-布”计算机视觉项目是一个利用摄像头捕捉手势并识别出手势是石头、剪刀还是布的项目。这类项目通常用于学习和展示计算机视觉技术,如图像处理、特征提取以及机器学习或深度学习模型的应用。 数据介绍 rock-paper-scissors Computer Vision Project数…

信息学奥赛复赛复习05-CSP-J2020-01优秀的拆分-对数函数、自然对数、以2为底的对数、幂函数、打表

PDF文档回复:20240927 1 2020 CSP-J 题目1 优秀的拆分 [题目描述] 一般来说,一个正整数可以拆分成若干个正整数的和 例如,11,101234 等。对于正整数 n的一种特定拆分,我们称它为“优秀的”,当且仅当在这种拆分下&am…

[element-ui]记录对el-table表头样式的一些处理

1、表头换行 & 列表项换行 可用element-table组件自带的方法实现列标题换行的效果 2、小圆点样式

程序员成长第一步,从成为开源社区贡献者开始!

程序员想要快速成长,就必须要要阅读大量的代码,学习别人的经验。幸好,这个世界有开源! 从使用开源项目到阅读源码,从阅读源码到贡献代码,是程序员成长的重要标志。 Apache 开源基金会已经成立超过25年了&am…

C++之STL—常用排序算法

sort (iterator beg, iterator end, _Pred) // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置 // beg 开始迭代器 // end 结束迭代器 // _Pred 谓词 random_shuffle(iterator beg, iterator end); // 指定范围内的元素随机调…

JAVA JVM常见面试题

1.JVM的内存区域是怎么划分的? 2.OOM可能发生在哪些区域上? 根据javadoc的描述,OOM是指JVM的内存不够用了,同时垃圾收集器也无法提供更多的内存。从描述中可以看出,在JVM抛出OutOfMemoryError之前,垃圾收集…

rk3588S 调试USB摄像头

问题: 客户的 usb 摄像头 接上 板卡上的 USB2.0 的接口是可以的,但是 接上 typec 接口上的 OTGUSB的时候 ,就会出现,无法识别USB的问题。 情况的说明: 先来看一下硬件。 这里的 typec 接口实际上 只用到了 otg USB的 两根线, 也就是 把TYPEC 当做 USB2.0 来用了。(通…

2024-09-27 buildroot C和语言将 中文的GBK编码转换为 UTF-8 的代码, printf 显示出来,使用 iconv 库去实现。

一、GBK 的英文全称是 "Guobiao Kuozhan",意为 "National Standard Extended"。它是对 GB2312 编码的扩展,用于表示更多汉字和符号 GBK(国标扩展汉字编码)是一种用于简体中文和繁体中文字符的编码方式&#x…

起号半个月GMV 1300W+,视频号这个赛道真香!

双减”后,教育的主阵地重回学校和家庭,特别是家庭教育被赋予了更多的期待,家庭无疑要承担起更多教育职责。 同时亲子关系进一步受到考验,家庭教育除了辅导孩子学习外,更牵涉孩子成长的每个方面、每个点滴,掌…

计算机视觉|机器学习中图片特征向量的提取方式:开启图像世界的钥匙

文章目录 什么是特征向量?常见的图片特征向量提取方法1. **手工设计的特征**SIFT(尺度不变特征变换)HOG(方向梯度直方图) 2. **卷积神经网络 (CNN)**3. **预训练模型**4. **自监督学习** 结语 今天我们将一起深入探讨机…

C++:采用模板封装顺序表,栈,队列

1.顺序表&#xff1a; list.hpp #ifndef LIST_HPP #define LIST_HPP #include <iostream>using namespace std;template <class L>class Seqlist { private:L *ptr;L size;L len0;public:void init(L n){//堆区申请空间&#xff08;大小为n&#xff09;this->…

React学习笔记(2.0)

React事件绑定 语法&#xff1a;在对应标签上书写on事件&#xff08;比如onClick,onChange&#xff09;&#xff0c;注意和原生的事件区分&#xff0c;React的事件首字母要大写。 const handleChange(e:any)>{console.log(e);console.log(change事件触发);// e不是原生事件…

IGZO基底无电容DRAM单元前景看好

1.DRAM技术简介 DRAM&#xff08;Dynamic Random Access Memory&#xff0c;动态随机存取存储器&#xff09;是一种用于计算机和其他电子设备中的主存储器类型&#xff0c;其主要由存储单元阵列构成&#xff0c;而每一个存储单元由一个电容器和一个晶体管组成&#xff0c;如图…