当前位置: 首页 > news >正文

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.mrgr.cn/news/56870.html

相关文章:

  • 如何实现金蝶商品数据集成到电商系统的SKU
  • windows安装superset及各种问题解决
  • linux运行openfoam并行会报错:attempt to run parallel on 1 processor
  • AI 自学 Lesson2 - 回归(Regression)
  • HCIE-Datacom题库_13_认证多选、判断、简答【13道题】
  • 测试教程分享
  • pikachu靶场File Inclusion-local测试报告
  • Python爬取京东商品信息,详细讲解,手把手教学(附源码)
  • visio图片三维旋转后导出,格式错乱怎么解决?
  • 解锁团队高效秘诀:5款顶尖PHP任务管理工具推荐
  • 视频转换为8K60帧率
  • opencv - py_photo - py_non_local_means 非局部均值去噪
  • YOLO11改进-模块-引入分层互补注意力混合器HRAMi
  • AI大模型会对我们的生活带来什么改变?普通人终于有机会感觉到大模型的用处了
  • 网址工具(完善中)
  • ssh scp提示Bad configuration option: GSSAPIKexAlgorithms
  • Nodejs上传阿里云oss图片案例
  • antv g6
  • Ping32数据保护工具,提供全面的数据安全解决方案
  • mono源码交叉编译 linux arm arm64全过程
  • stm32f103zet6 ili9341(fsmc) freertos 制作数字电子时钟
  • 志华软件 openfile.aspx 任意文件读取漏洞复现
  • 【无人机设计与控制】机器人RRT路径规划或者无人机二维平面航迹规划
  • 【算法】归并排序概念及例题运用
  • 在线图片翻译有哪些?快来试试这5款
  • 大华智能云网关注册管理平台 doLogin SQL注入漏洞复现(CNVD-2024-38747)