NLP:命名实体识别及案例(Bert微调)

1. 命名实体识别

1.1 序列标注

  序列标注(Sequence Labeling)是NLP中最基础的任务之一,其应用十分广泛。它指的是对给定的序列(如文本中的单词或字符)中的每个元素进行标注,以识别出该元素在序列中的特定角色或属性。

1.2 命名实体识别

  命名实体识别(Named Entity Recognition, NER)是序列标注任务中的一种,旨在从文本中识别并分类特定的实体。识别的实体通常包括人名、地名、机构名、时间、日期、货币等。这种识别在许多实际应用中非常重要,如信息提取、自动问答、机器翻译和文本摘要。

2. 利用Bert微调模型进行命名实体识别

2.1 BIO标记

  BIO标记法是命名实体识别中的一种常用数据标注方案,用于标记文本中每个单词的标签,明确它是属于实体的哪部分。BIO 标记法通过B-、I- 和O三个前缀来表示命名实体的边界和结构:

  • B-(Begin):表示命名实体的开头。例如,B-PER表示人名实体的第一个单词。
  • I-(Inside):表示命名实体的内部部分。例如,I-PER 表示人名实体中非首字的单词。
  • O(Outside):表示这个单词不属于任何命名实体。

BIO标记方法中通常包含:PER(人名)ORG(组织名)LOC(地名)MISC(事件、产品、国籍、语言)

2.2 数据集介绍

  这里使用NER任务中常用的数据集:CoNLL-2003,该数据集最早由 CoNLL(Conference on Computational Natural Language Learning)共享任务发布,广泛应用于自然语言处理中的 NER 任务。该数据集中训练集共14041条,验证集共3250条,测试集共3453。训练集中的数据如下:

{"chunk_tags": [11, 12, 12, 21, 13, 11, 11, 21, 13, 11, 12, 13, 11, 21, 22, 11, 12, 17, 11, 21, 17, 11, 12, 12, 21, 22, 22, 13, 11, 0],"id": "0","ner_tags": [0, 3, 4, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],"pos_tags": [12, 22, 22, 38, 15, 22, 28, 38, 15, 16, 21, 35, 24, 35, 37, 16, 21, 15, 24, 41, 15, 16, 21, 21, 20, 37, 40, 35, 21, 7],"tokens": ["The", "European", "Commission", "said", "on", "Thursday", "it", "disagreed", "with", "German", "advice", "to", "consumers", "to", "shun", "British", "lamb", "until", "scientists", "determine", "whether", "mad", "cow", "disease", "can", "be", "transmitted", "to", "sheep", "."]
}

关于这个数据集,每个部分的具体含义如下:

  • tokens表示文本中的单词。所有的tokens组合起来就是句子的原始文本。NER任务中需要为数据集中的每个单词都会被标注相关的标签。
  • chunk_tags表示短语块标签。它标记出句子中的短语结构,帮助识别出名词短语(NP)、动词短语(VP)、介词短语(PP)等。
  • ner_tags表示命名实体识别标签,使用的是BIO标记法。在该数据集在hugging face上的主页上可以找到BIO标记与数字的对应方式。具体如下:
{'O': 0, 'B-PER': 1, 'I-PER': 2, 'B-ORG': 3, 'I-ORG': 4, 'B-LOC': 5, 'I-LOC': 6, 'B-MISC': 7, 'I-MISC': 8}

依据这个信息,European Commission被标记为ORG。

  • pos_tags为词性标签。
2.3 labels准备

  因为使用BertTokenizer处理数据的tokens时,使用WordPiece分词算法时可能会将一个完整的单词拆分成了多个,所有训练数据集中的ner_tags并不能直接作为后续分类器BertForTokenClassification的labels用于训练。在这种情况下,标签需要与每个子词对齐,可以采用如下规则:

  • 第一个子词保留原始标签,比如B-ORG,其余子词可以标注为I-ORG。举例如下:
tokens = ['Ap', '##ple', 'is', 'a', 'technology', 'company']
labels = ['B-ORG', 'I-ORG', 'O', 'O', 'O', 'O']
2.4 Bert微调
from datasets import load_dataset
from transformers import BertTokenizerFast, BertForTokenClassification
from transformers import TrainingArguments, Trainer# 加载 CoNLL-2003 数据集
dataset = load_dataset("conll2003")
train_dataset = dataset["train"]
eval_dataset = dataset["validation"]
test_dataset = dataset["test"]
# 加载 BERT tokenizer 和模型
tokenizer = BertTokenizerFast.from_pretrained("bert-base-cased")
label_list = dataset["train"].features["ner_tags"].feature.names
print(train_dataset[0])
def tokenize_and_align_labels(examples):tokenized_inputs = tokenizer(examples["tokens"], truncation=True, padding="max_length",is_split_into_words=True)labels= []for i, label in enumerate(examples["ner_tags"]):word_ids = tokenized_inputs.word_ids(batch_index=i)previous_word_idx = Nonelabel_ids = []for word_idx in word_ids:if word_idx is None:label_ids.append(-100)elif word_idx != previous_word_idx:label_ids.append(label[word_idx])else:label_ids.append(label[word_idx])previous_word_idx = word_idxlabels.append(label_ids)tokenized_inputs["labels"] = labelsprint(labels[0])print(len(tokenized_inputs.input_ids[0]),len(labels[0]))return tokenized_inputstrain_dataset = train_dataset.map(tokenize_and_align_labels, batched=True)
eval_dataset = eval_dataset.map(tokenize_and_align_labels, batched=True)
test_dataset = test_dataset.map(tokenize_and_align_labels, batched=True)model= BertForTokenClassification.from_pretrained("bert-base-cased", num_labels=len(label_list))
training_args = TrainingArguments(output_dir='./results',          # 输出目录eval_strategy="epoch",     # 每个 epoch 进行评估learning_rate=2e-5,              # 学习率per_device_train_batch_size=16,  # 训练 batch sizeper_device_eval_batch_size=16,   # 评估 batch sizenum_train_epochs=3,              # 训练 epoch 数weight_decay=0.01,               # 权重衰减
)# 使用 Trainer API
trainer = Trainer(model=model,                      # 待训练的模型args=training_args,               # 训练参数train_dataset=train_dataset,  # 训练数据集eval_dataset=eval_dataset,  # 验证数据集tokenizer=tokenizer               # 使用的 tokenizer
)trainer.train()
eval_results = trainer.evaluate()
print(eval_results)
2.5 抽取结果

  正如嵌入所述,有些完整的单词投入Bert模型之后会被切成子词,我们在抽取模型预测的结果的时候也需要进行一个反操作,将子词及子词对应的预测结果合并到一起,具体代码如下:

def transform_labels_to_nertags(dataset,labels):new_labels=[]for i,label in enumerate(labels):label=[item for item in label if item != -100]words_id=dataset["word_ids"][i]idx_label=[]for i in range(len(words_id)):if i==0:idx_label.append(label[0])else:if words_id[i]==words_id[i-1]:continueelse:idx_label.append(label[i])new_labels.append(idx_label)return new_labels_, labels, _ = trainer.predict(test_dataset)test_dataset= test_dataset.add_column("pred_ner_tags",transform_labels_to_nertags(test_dataset,labels))print(test_dataset[0]["pred_ner_tags"],test_dataset[0]["ner_tags"])
print(test_dataset[1]["pred_ner_tags"],test_dataset[1]["ner_tags"])

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

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

相关文章

【React】useEffect

1. 基本介绍 概念 语法 副作用函数依赖项数组(空数组时,只会在组件渲染完毕后执行一次副作用函数) 2. 使用 import { useEffect, useState } from reactfunction App() {const [value, setValue] useState(0)useEffect(() > {console…

如何使用ssm实现小区物业管理系统

TOC ssm733小区物业管理系统jsp 第一章 绪论 1.1 研究背景 在现在社会,对于信息处理方面,是有很高的要求的,因为信息的产生是无时无刻的,并且信息产生的数量是呈几何形式的增加,而增加的信息如何存储以及短时间分析…

Quill Editor 富文本编辑器的高度问题

问题现象 1. 编辑框只有一行高; 2. 编辑框高度足够,但显示不全,左侧有滚动条。向下拉滚动条,编辑框把工具栏向上顶出去,工具栏看不见了。 网上搜出来一大堆各种说法,照猫画虎,有时候对&#…

基于微信小程序的美食外卖管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…

SPI驱动学习七(SPI_Slave_Mode驱动程序框架)

目录 一、SPI_Slave_Mode驱动程序框架1. Master和Slave模式差别1.1 主设备 (Master)1.2 从设备 (Slave)1.3 示例 2. SPI传输概述2.1 数据组织方式2.2 SPI控制器数据结构 3. SPI Slave Mode数据传输过程4. 如何编写程序4.1 设备树4.2 内核相关4.3 简单的示例代码4.3.1 master和s…

Anaconda虚拟环境默认路径在C盘怎么更改

笔者已经新建好了虚拟环境并且安装了对应库,输入conda env list查询发现虚拟环境竟然安装到了C盘(。•́︿•̀。),为避免下一次创建虚拟环境出错,笔者现在修改默认路径置D盘(软件安装盘) 参考两…

二分——二分查找

题目描述 输入n个不超过109的单调不减的(就是后面的数字不小于前面的数字)非负整数a1,a2,…,an,然后进行m次询问。对于每次询问,给出一个整数q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话…

【Oauth2整合gateway网关实现微服务单点登录】

文章目录 一.什么是单点登录?二.Oauth2整合网关实现微服务单点登录三.时序图四.代码实现思路1.基于OAuth2独立一个认证中心服务出来2.网关微服务3产品微服务4.订单微服务5.开始测试单点登录 一.什么是单点登录? 单点登录(Single Sign On&…

【YOLO目标检测车牌数据集】共10000张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式:YOLO格式 图片数量:10000(2000张绿牌、8000张蓝牌) 标注数量(txt文件个数):10000 标注类别数:1 标注类别名称:licence 数据集下载:车牌数据…

小程序-生命周期与WXS脚本

生命周期 什么是生命周期 生命周期(Life Cycle)是指一个对象从创建 -> 运行 -> 销毁的整个阶段,强调的是一个时间段。 我们可以把每个小程序运行的过程,也概括为生命周期: 小程序的启动,表示生命…

ant design vue中带勾选表格报Tree missing follow keys: ‘undefined‘解决方法

1、这里一定要给columns和data-source设置key即可。 <div><a-table:row-selection"rowSelection":dataSource"tableList":columns"columns":scroll"{ x: 100% }":pagination"false":loading"loading"&g…

配置STM32F103的高级定时器TIM1用于PWM功能

配置STM32F103的高级定时器TIM1用于PWM功能 之前在使用stm32f103的PA9引脚复用为高级定时器TIM1_CH2&#xff0c;用它来输出PWM波时发现无法正常输出PWM波形。出现这种问题的情况一般是将PA9先初始化成了串口&#xff0c;然后又配置成PWM功能&#xff0c;这样会导致无法输出PW…

RestSharp简介

RestSharp是一个轻量级HTTP客户端库&#xff0c;主要功能是通过HTTP对远程资源进行同步异步调用&#xff0c;可将请求主体序列化为JSON或XML并反序列化相应。 请求主体的方式&#xff1a;JSON、XML和表单数据 参数类型&#xff1a;查询、URL段、标头、cookie、正文 官方的例…

C++ -- 异常

C中的异常是用于处理程序执行过程中出现的错误情况。通过异常处理&#xff0c;程序可以在遇到错误时优雅地处理这些问题&#xff0c;而不是直接崩溃。 C语言处理错误的方式 C语言传统的处理错误的方式主要有两种&#xff1a; 终止程序&#xff1a;使用如assert这样的宏来检查…

Chromium 如何禁用自动加载指定路径扩展 c++

之前文章提到过浏览器启动会从[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Google\Chrome\Extensions\ 注册表下自动搜索需要加载的扩展&#xff0c;那么如何禁用此功能呢&#xff1f; 直接看源码 chrome\browser\extensions\external_registry_loader_win.cc chrome\browser\…

制作 rootfs步骤

1. 准备工作 地平线开发板通过root访问权限&#xff0c; 在开发板中安装所有的依赖库 2. 在开发板创建 rootfs 通过地平线开发板创建一个跟文件系统(rootfs)的方法是通过 chroot 工具将文件系统打包 2.1 挂载必需的文件系统 确保挂载必要的虚拟文件系统&#xff0c;以便正…

隐藏SpringBoot自动生成的文件

第一种方法——删除 第二种方法——Settings——Editor——fail types

做数据抓取工作要如何选择ip池

选择合适的IP池对于数据抓取工作至关重要。一个优质的IP池可以提高抓取的效率和成功率&#xff0c;同时减少被目标网站封禁的风险。以下是选择IP池时需要考虑的一些关键因素&#xff1a; 1. IP类型 住宅IP&#xff1a;住宅IP通常来自真实用户&#xff0c;难以被识别为代理。它…

idea 创建多模块项目

一、新建项目&#xff0c;创建父工程 新建项目&#xff0c;选择 spring initializr 填写相关信息后提交 删除不相关的目录&#xff0c;如下 修改打包方式为 pom&#xff0c;在 pom.xml 文件中新增一行&#xff0c;如下 二、创建子模块 新增子模块 三、修改 pom 文件 修…

2024首届人工智能计量学术大会在合肥成功召开

9月25日至9月26日&#xff0c;由中国计量测试学会主办&#xff0c;北京航天计量测试技术研究所承办的首届人工智能计量学术大会在安徽省合肥市召开。本次大会以“人工智能计量助力新质生产力发展”为主题&#xff0c;汇集人工智能及其计量测试等领域院士、专家和学者&#xff0…