26备战秋招day11——基于CoNLL-2003的bert序列标注

深度学习中的序列标注任务:从数据到实践的详细指南

1. 序列标注任务是什么?

序列标注(Sequence Labeling)是自然语言处理(NLP)中的一种基本任务,它的目标是为输入的序列(比如一个句子)中的每个元素(如每个单词)分配一个标签。这类任务常见于很多应用场景中,如:

  • 命名实体识别(NER):识别文本中的人名、地名、组织名等实体。
  • 词性标注(POS Tagging):为每个单词分配其词性,如名词、动词、形容词等。
  • 分块标注(Chunking):将句子划分成句法短语,比如名词短语或动词短语。

举个例子

假设我们有一个句子:“Apple is a technology company.” 我们想对这个句子进行命名实体识别(NER),目标是识别出其中的“Apple”是一个组织名(ORG),而“technology company”则是一般的词。最后的输出可以是:

Apple     B-ORG
is        O
a         O
technology O
company    O

在这个例子中,“B-ORG” 表示“Apple”是一个组织名的开始部分,“O” 表示其他不需要标注的部分。

2. 常见的数据集

在NLP中,很多标注任务都有标准的数据集,这些数据集帮助我们在研究中进行对比和验证。以下是一些常见的数据集:

  • CoNLL-2003:命名实体识别任务的标准数据集,包含来自新闻报道的句子,每个单词都标注了相应的实体类别,如人名(PER)、地名(LOC)、组织名(ORG)等。

  • OntoNotes 5.0:更大规模的数据集,不仅包含命名实体识别任务,还包含语义角色标注等多个任务。

  • Universal Dependencies:一个多语言的句法标注数据集,适用于词性标注(POS)和句法分析任务。

这些数据集为模型提供了训练和验证的基础,确保研究人员可以在相同的基准上比较不同方法的效果。

3. 常见的模型

针对序列标注任务,模型的发展历程从传统的机器学习方法到如今的深度学习模型。这里我们介绍两种主要的模型类型:

传统方法

  • 条件随机场(CRF):这是一个典型的序列标注模型,它的特点是能够处理标签之间的依赖关系,比如“B-ORG”后面通常接“I-ORG”。

深度学习方法

  • BiLSTM-CRF:双向长短期记忆网络(BiLSTM)结合条件随机场(CRF)的经典模型。BiLSTM用于从句子的上下文中提取特征,而CRF则用于捕捉输出标签之间的依赖关系。

  • Transformer/BERT:近年来预训练语言模型(如BERT)表现出色。BERT通过自注意力机制对整个句子进行建模,能够捕捉更复杂的上下文关系。

举个例子:BERT的应用

BERT 是一种基于 Transformer 结构的双向模型,它的特点是能够同时考虑一个单词前后的上下文信息。在序列标注任务中,我们可以在预训练的 BERT 模型上添加一个分类器,用来对每个单词进行标注。

4. 如何评价模型的好坏?

在序列标注任务中,模型的好坏通常用以下几个指标来衡量:

  • 精确率(Precision):正确标记的实体占模型标记出的实体的比例。
  • 召回率(Recall):正确标记的实体占实际实体的比例。
  • F1分数(F1-Score):精确率和召回率的调和平均值,综合了两者的表现。

评价公式

P r e c i s i o n = T P T P + F P Precision = \frac{TP}{TP + FP} Precision=TP+FPTP

R e c a l l = T P T P + F N Recall = \frac{TP}{TP + FN} Recall=TP+FNTP

F 1 = 2 × P r e c i s i o n × R e c a l l P r e c i s i o n + R e c a l l F1 = 2 \times \frac{Precision \times Recall}{Precision + Recall} F1=2×Precision+RecallPrecision×Recall

其中,TP表示真阳性,即正确标注的数量;FP表示假阳性,即错误标注的数量;FN表示漏标的数量。

5. 实践案例:用BERT做序列标注

接下来,我们将通过一个实践案例,使用 Hugging Face 的 transformers 库和 datasets 库进行序列标注任务。

环境准备

在 Kaggle 或本地GPU环境下,首先安装所需的库:

!pip install transformers datasets evaluate

代码实现

1. 加载数据集

我们将使用CoNLL-2003数据集,它包含命名实体识别任务的标注数据。

from datasets import load_dataset# 加载CoNLL-2003数据集
datasets = load_dataset("conll2003")
2. 加载BERT分词器和模型

我们使用BERT的预训练模型,并为每个单词做分类任务。

from transformers import BertTokenizerFast, BertForTokenClassification# 加载BERT分词器和模型
tokenizer = BertTokenizerFast.from_pretrained("bert-base-cased")
model = BertForTokenClassification.from_pretrained("bert-base-cased", num_labels=9)  # 9个标签
3. 数据预处理:分词和标签对齐

我们需要确保每个单词的标签能够正确地对齐到分词后的token。

def tokenize_and_align_labels(examples):tokenized_inputs = tokenizer(examples["tokens"], truncation=True, padding="max_length",  # 确保输入长度一致max_length=128,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)  # 对padding部分标记为-100elif word_idx != previous_word_idx:label_ids.append(label[word_idx])else:label_ids.append(-100)  # 对应拆分的单词部分标记为-100previous_word_idx = word_idxtokenized_inputs["labels"] = label_idsreturn tokenized_inputs# 批量处理数据集
tokenized_datasets = datasets.map(tokenize_and_align_labels, batched=True)
4. 模型训练和评估
from transformers import TrainingArguments, Trainer
import evaluate
import numpy as np# 加载评价指标
metric = evaluate.load("seqeval")# 定义评价函数
def compute_metrics(p):predictions, labels = ppredictions = np.argmax(predictions, axis=2)true_labels = [[label_list[l] for l in label if l != -100] for label in labels]true_predictions = [[label_list[p] for (p, l) in zip(prediction, label) if l != -100]for prediction, label in zip(predictions, labels)]return metric.compute(predictions=true_predictions, references=true_labels)# 设置训练参数
training_args = TrainingArguments(output_dir="./results",evaluation_strategy="epoch",learning_rate=2e-5,per_device_train_batch_size=16,per_device_eval_batch_size=16,num_train_epochs=3,weight_decay=0.01,
)# 初始化Trainer
trainer = Trainer(model=model,args=training_args,train_dataset=tokenized_datasets["train"],eval_dataset=tokenized_datasets["validation"],tokenizer=tokenizer,compute_metrics=compute_metrics,
)# 训练模型
trainer.train()# 评估模型
trainer.evaluate()

5. 测试集上的预测

# 在测试集上进行预测
test_results = trainer.predict(tokenized_datasets["test"])# 查看部分预测结果
predictions = np.argmax(test_results.predictions, axis=2)
true_labels = [[label_list[l] for l in label if l != -100] for label in test_results.label_ids]
true_predictions = [[label_list[p] for (p, l) in zip(prediction, label) if l != -100]for prediction, label in zip(predictions, test_results.label_ids)
]for i in range(5):print(f"Sentence {i+1}:")print("Tokens:", datasets["test"]["tokens"][i])print("Predictions:", true_predictions[i])print("Labels:", true_labels[i])print("\n")

6. 总结

本文详细介绍了序列标注任务的概念、常见的数据集和模型,并通过一个实践案例展示了如何使用BERT进行序列标注任务。这个案例使用了 Hugging Face 的 transformers 库和 datasets 库,代码结构清晰,易于在 Kaggle 或本地GPU环境中运行。

通过这个博客,你应该可以更好地理解序列标注任务的流程,并掌握如何利用预训练语言模型(如BERT)进行命名实体识别任务。如果有更多问题,欢迎关注公众号【算法最TOP】进一步讨论!

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

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

相关文章

Java的买家秀探秘:API数据的优雅捕获

在编程世界的某个角落,Java特工正坐在他的高科技办公室里,沉浸在代码的海洋中。今天,他接到了一个有趣的任务:获取买家秀的API数据。这不仅是一次技术的挑战,更是一次深入了解买家心声的机会。Java特工,这位…

宇音天下最新力作 | VTX356语音识别合成芯片问世

北京宇音天下科技有限公司,依托在语音技术领域的丰富经验和技术积累,成功推出了一款具有里程碑意义的语音识别合成芯片——VTX356。这款芯片的问世,不仅彰显了公司在智能语音处理领域的专业实力,也预示着智能家居、车载电子、智能…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十五集:制作更多地图,更多敌人,更多可交互对象

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、第一个代表性场景 1.制作更多敌人2.制作更多可交互对象二、第二个代表性场景 1.制作更多敌人2.制作更多可交互对象三、第三个代表性场景 1.制作更多敌人2.制…

Java生死簿管理小系统(简单实现)

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…

pikachu靶场CSRF-post测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、抓包使用burp生成csrf脚本 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机:本机(127.0.0.1) 靶 机:本机(127.0.0.1) 2、使用工具/软件 Burp sui…

华为OD机试 - 篮球比赛 - 递归(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

Nginx超简洁知识:负载均衡-反向代理,动静分离,配置文件

首先介绍一下为什么需要nginx? 在低并发场景下(也就是用户量特别少的情况下),我们只需要部署一台服务器就能满足用户数量少的需求。 但是如果用户量逐渐增多,只有一台服务器是不够的。于是我们需要部署多台服务器。 …

juzigei/基于Java语言的充电桩系统(充电桩小程序+充电桩管理平台)

简述 SpringBoot 框架,充电桩平台充电桩系统充电平台充电桩互联互通协议云快充协议1.5新能源汽车电动自行车公交车-四轮车充电充电源代码充电平台源码Java源码无加密项目 介绍 云快充协议云快充1.5协议云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充…

长短期记忆网络(Long Short-Term Memory,LSTM)

简介:个人学习分享,如有错误,欢迎批评指正。 长短期记忆网络(Long Short-Term Memory,简称LSTM)是一种特殊的循环神经网络(Recurrent Neural Network,简称RNN)架构&#…

【Qt】Windows下Qt连接DM数据库

环境信息:W11 Qt5.12及以上 dm8 QODBC达梦 Windows环境创建ODBC数据源 使用 ODBC 方法访问 DM 数据库服务器之前,必须先配置 ODBC 数据源 在控制面板Windows工具中显示ODBC数据源管理器 ODBC数据源管理器标签 用户 DSN:添加、删除或配置本…

安达发|氢能源产业与APS生产排程软件的结合

氢能产业,作为一种科技与资本密集型行业,覆盖新材料、电力装备、新能源汽车、航空航天以及国防军工等多个领域,对于推动传统产业的转型升级及新兴产业链的形成具有显著作用。氢能的应用领域广泛,主要可划分为交通、工业、发电和储…

软件设计模式------抽象工厂模式

抽象工厂模式(Abstract Factory Pattern),又称Kit模式,属于对象创建型模式。 一:先理解两个概念: (1)产品等级结构: 即产品的继承结构。 通俗来讲,就是不同品…

php中的错误和异常捕获

目录 一: 异常(Exceptions) 二: 错误(Errors) 三:实际项目的异常和错误处理 在PHP中,异常(Exceptions)和错误(Errors)是两个不同的…

vuex的store应用

1.在pakage.json加一行 2.和main同级别加一个js文件 import Vue from vue import Vuex from vuexVue.use(Vuex)export default new Vuex.Store({state: {langFlag: new Date().getTime()},mutations: {setLangFlag(state) {state.langFlag new Date().getTime()}} })3.在mai…

NewStarCTF2024-Week2-Misc-WP

目录 1、wireshark_checkin 2、wireshark_secret 3、字里行间的秘密 4、你也玩原神吗 5、Hertas Study 6、用溯流仪见证伏特台风 7、热心助人的小明 1、wireshark_checkin 直接字符串搜 flag flag{ez_traffic_analyze_isnt_it} 2、wireshark_secret 查看原始数据 导出十…

「C/C++」C++ STL容器库 之 std::map 键值对的集合容器

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

鸿蒙网络编程系列25-TCP回声服务器的实现

1. TCP回声服务器实现可行性 在前文鸿蒙网络编程系列2-UDP回声服务器的实现中,介绍了什么是回声服务器,并且基于UDP协议实现了一个简单的回声服务器,本节将基于TCP协议实现一个类似的回声服务器。在鸿蒙API10以后,提供了TCPSocke…

【C++】使用vscode进行 C/C++ 开发,内含c_cpp_properties.json、launch.json 和 tasks.json解释

在 Visual Studio Code (VSCode) 中进行 C/C 开发时,这三个 .json 文件(c_cpp_properties.json、launch.json 和 tasks.json)分别用于配置编译、调试和代码提示等功能。它们是 VSCode 配置环境的一部分,由 C/C 扩展生成&#xff0…

将java项目jar包打包成exe服务

1.结构展示 2.注意事项 前提: 环境准备:jdk8 和 .net支持 { 1.控制面板》程序和功能》启用和关闭windows功能》.net的勾选》2.jdk8自行百度安装环境3.其他项目必须的软件环境安装等(数据库...) }第一次准备: 1.将打包好的jar包放到premiumServices.exe…

智和信通助力某大型服饰集团建设综合监控运维

某大型服饰集团成立于90年代,是广受认可的国民生活时尚品牌,近年来随着集团公司业务规模的不断扩大,信息化作为支撑集团公司业务发展的重要技术手段,信息系统无论在规模上还是在复杂程度上均有了很大程度的增加。 项目现状 当前信…