基于Python的自然语言处理系列(42):Token Classification(标注分类)

        在本篇文章中,我们将探讨如何进行 Token Classification(标注分类),这是一类为句子中的每个 token(词或子词)分配标签的任务。该任务可以解决很多问题,例如命名实体识别(NER)、词性标注(POS)和分块(Chunking)。本文将聚焦于命名实体识别任务,并展示如何使用 BERT 模型进行微调。

1. 数据加载

        我们使用 CoNLL-2003 数据集,这是一个常用的命名实体识别数据集。通过 load_dataset() 函数加载数据集:

from datasets import load_dataset

raw_datasets = load_dataset("conll2003")

        加载后的数据集包含三个任务的标签:NER、POS 和 Chunking。我们主要关注 NER 任务,因此接下来我们会处理 ner_tags 标签。

2. 数据预处理

        在进行标注分类任务时,输入文本需要被转换为 token ID。由于我们处理的是预分词数据(即每个输入已按词分割),我们需要使用 is_split_into_words=True 参数告诉 tokenizer 如何处理这些分词数据。首先,下载并缓存 BERT 预训练模型的 tokenizer:

from transformers import AutoTokenizer

model_checkpoint = "bert-base-cased"
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)

        我们可以用 tokenizer 处理预分词输入,同时利用 word_ids() 方法确保 token 与标签正确对齐:

inputs = tokenizer(raw_datasets["train"][0]["tokens"], is_split_into_words=True)
inputs.word_ids()

        通过处理后的输入,特殊 token(如 [CLS][SEP])被添加到序列中,此外模型对一些词进行了子词切分。我们还需要确保标签能够正确匹配这些子词,特别是处理切分后的子词标签对齐问题。

3. 标签对齐

        接下来,我们编写一个函数,用于将标签与 tokenizer 生成的 token 对齐。特殊 token 将被标记为 -100(这在损失计算中会被忽略),而子词的标签会与该词的第一个 token 一致。具体代码如下:

def align_labels_with_tokens(labels, word_ids):
    new_labels = []
    current_word = None
    for word_id in word_ids:
        if word_id != current_word:
            current_word = word_id
            label = -100 if word_id is None else labels[word_id]
            new_labels.append(label)
        elif word_id is None:
            new_labels.append(-100)
        else:
            label = labels[word_id]
            if label % 2 == 1:
                label += 1
            new_labels.append(label)
    return new_labels

        然后我们可以对整个数据集进行预处理,将 tokenizer 和标签对齐函数应用到整个数据集上:

def tokenize_and_align_labels(examples):
    tokenized_inputs = tokenizer(examples["tokens"], truncation=True, is_split_into_words=True)
    all_labels = examples["ner_tags"]
    new_labels = []
    for i, labels in enumerate(all_labels):
        word_ids = tokenized_inputs.word_ids(i)
        new_labels.append(align_labels_with_tokens(labels, word_ids))
    tokenized_inputs["labels"] = new_labels
    return tokenized_inputs

tokenized_datasets = raw_datasets.map(tokenize_and_align_labels, batched=True, remove_columns=raw_datasets["train"].column_names)

4. 模型准备

        我们将使用 AutoModelForTokenClassification 类加载 BERT 模型。首先,需要指定模型的标签映射:

id2label = {str(i): label for i, label in enumerate(label_names)}
label2id = {v: k for k, v in id2label.items()}

        然后加载模型:

from transformers import AutoModelForTokenClassification

model = AutoModelForTokenClassification.from_pretrained(model_checkpoint, id2label=id2label, label2id=label2id)

5. 模型训练与评估

        接下来我们创建训练和评估所需的 DataLoader,并定义损失函数和优化器。使用 DataCollatorForTokenClassification 来确保输入和标签在填充时保持相同的长度:

from transformers import DataCollatorForTokenClassification
from torch.utils.data import DataLoader

data_collator = DataCollatorForTokenClassification(tokenizer=tokenizer)

train_dataloader = DataLoader(tokenized_datasets["train"], shuffle=True, collate_fn=data_collator, batch_size=8)
eval_dataloader = DataLoader(tokenized_datasets["validation"], collate_fn=data_collator, batch_size=8)

from torch.optim import AdamW
optimizer = AdamW(model.parameters(), lr=2e-5)

        接下来,使用 accelerator 和学习率调度器进行训练,并保存模型到 Hugging Face Hub:

from accelerate import Accelerator
from transformers import get_scheduler

accelerator = Accelerator()
model, optimizer, train_dataloader, eval_dataloader = accelerator.prepare(model, optimizer, train_dataloader, eval_dataloader)

num_train_epochs = 3
num_training_steps = num_train_epochs * len(train_dataloader)
lr_scheduler = get_scheduler("linear", optimizer=optimizer, num_warmup_steps=0, num_training_steps=num_training_steps)

# 开始训练
for epoch in range(num_train_epochs):
    model.train()
    for batch in train_dataloader:
        outputs = model(**batch)
        loss = outputs.loss
        accelerator.backward(loss)
        optimizer.step()
        lr_scheduler.step()
        optimizer.zero_grad()

6. 推理

        模型训练完成后,我们可以使用 Hugging Face 的 pipeline 进行推理:

from transformers import pipeline

model_checkpoint = "Chaklam/bert-finetuned-ner-accelerate"
token_classifier = pipeline("token-classification", model=model_checkpoint, aggregation_strategy="simple")

print(token_classifier("My name is Peter and I work at AIT in Bangkok, Thailand."))

        通过这些步骤,你将能够微调并部署一个命名实体识别模型。

结语

        在本篇文章中,我们介绍了如何使用 BERT 模型进行 Token Classification(标注分类)任务。我们从数据的加载与预处理开始,详细讲解了如何处理预分词数据,并将标签与模型的输入 tokens 对齐。接着,我们通过 BERT 模型进行微调,使用 DataLoader 来构建训练与验证数据集,最终完成了模型的训练与评估。在最后,我们展示了如何通过 Hugging Face 的 pipeline 进行命名实体识别的推理。

        标注分类任务(如命名实体识别)在自然语言处理中有广泛的应用,本篇文章展示的 BERT 模型微调流程可以为多种标注任务提供基础。无论是命名实体识别、词性标注还是分块识别,都可以使用类似的方法进行模型微调与部署。通过对该过程的深入理解,你将能够在实际项目中应用这些技术,解决更多复杂的 NLP 问题。

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用Pyhon写一款简单的益智类小游戏——2048

文字版——代码及讲解 代码—— import random# 初始化游戏棋盘 def init_board():return [[0] * 4 for _ in range(4)]# 在棋盘上随机生成一个2或4 def add_new_tile(board):empty_cells [(i, j) for i in range(4) for j in range(4) if board[i][j] 0]if empty_cells:i,…

『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC

『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC 文章目录 一. 『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC1. 介绍 二. 参考文献 一. 『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC 如何在 Ubuntu 22.04 上安装和配置 VNC 1. 介绍 虚拟网络计算…

【Java】方法的使用 —— 语法要求、方法的重载和签名、方法递归

目录 1. 方法基础知识 1.1 方法的概念 1.2 语法格式 * 注意事项【与C不同】 1.3 return —— 返回值的严格检查【比C语言严格】 2. 形参与实参的关系 3. 方法重载 3.1 什么是方法重载?为什么要方法重载? 3.2 方法重载的规则 4. 方法签名 5. 递…

HT7178 带输出关断的20V,14A全集成同步升压转换器

1、特点 输入电压范围VpIN:2.7V-20V 输出电压范围VouT:4.5V-20V 可编程峰值电流:14A 高转换效率: 95%(VPIN7.2V, VoUT 16V, IouT3A) 94%(VPIN12V,VoUT18V,IoUT4A) 90%(VPIN3.3, VoUT-9V,IOUT3A) 轻载条件下两种调制方式:脉频调制(PFM)和 强制脉宽调试(PWM) 集成输出关断的栅极…

【史上最全SD教程】Stable Diffusion系统教学!Ai绘画零基础入门到精通商业实战 人工智能绘图画图商业变现

一、为什么要学Stable Diffusion,它究竟有多强大? 1.Stable Diffusion能干嘛 Stable Diffusion(SD)作为一种先进的AI图像生成技术,其功能和应用场景非常广泛。以下是SD的一些主要功能和应用领域: \1. 图…

《链表篇》---两数相加(中等)

题目传送门 方法一:迭代 文字描述看代母注释 class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {//定义头结点和当前节点ListNode head null,cur null;//carry记录进位情况。int carry 0; while(l1 ! null || l2 ! null){//判断节点是…

QT找不到ffmpeg链接库解决方法

error: undefined reference to avformat_network_init() 一个神奇的报错,查了很久,检查步骤: 1、检查了 pro工程文件 2、链接库的真实性和正确性 在main.cpp中调用没有报错,在其它cpp文件中调用就报错。 破案了,…

详细了解C++11(1)

大家好呀,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流哦 本文由:残念ing原创CSDN首发,如需要转载请通知 个人主页:残念ing-CSDN博客,欢迎各…

04.DDD与CQRS

学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 定义职责分离DDD与CQRS的关系领域模型和查询模型特点命令场景的领域模型查询场景的查询模型 架构方案领域事件方案1&#xff1a…

【运动的&高尔夫球】高尔夫球检测系统源码&数据集全套:改进yolo11-CA-HSFPN

改进yolo11-HWD等200全套创新点大全:高尔夫球检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.30 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视频可…

【python】flash-attn安装

这个命令: 确保使用正确的 CUDA 12.6 工具链 设置必要的 CUDA 环境变量 包含了常见的 GPU 架构支持 利用你的128核心进行并行编译 # 清理之前的安装 proxychains4 pip uninstall -y flash-attn# 获取 CUDA 路径 CUDA_PATH$(dirname $(dirname $(which nvcc)))# 使用…

得计算题者得天下!软考系统集成计算题详解!

软考中级系统集成项目管理工程师考试一共有《综合知识》和《案例分析》两门科目,而在这两科中都会涉及到计算题,特别是案例分析中,计算题每次考试都会占到一道大题,共25分,占到了科目总分的1/4,所以对于系统…

第2章 Android App开发基础

第 2 章 Android App开发基础 bilibili学习地址 github代码地址 本章介绍基于Android系统的App开发常识,包括以下几个方面:App开发与其他软件开发有什么不一 样,App工程是怎样的组织结构又是怎样配置的,App开发的前后端分离设计…

腾讯云视频文件上传云存储时自动将mp4格式转码成m3u8

针对问题: 弱网环境下或手机网络播放mp4格式视频卡顿。 存储环境:腾讯云对象存储。 处理流程: 1:登录腾讯云控制台,进入对象存储服务,找到对应的存储桶,点击进入。 在任务与工作流选项卡中找…

如何下载安装TestLink?

一、下载TestLink、XAMPP TestLink 下载 |SourceForge.net 备用:GitHub - TestLinkOpenSourceTRMS/testlink-code: TestLink开源测试和需求管理系统 下载XAMPP: Download XAMPP 注意:TestLink与PHP版本有关系,所以XA…

【AI学习】扩散模型的一点思考:生成过程为什么要增加噪声项

前面学习了扩散模型,并做了总结PPT。 其中有一个疑问:在生成过程中,就是下图的算法2中的第四步,为什么要在预测了噪声项后,Xt减去预测的噪声后,还有再叠加一个噪声项?就是增加的部分。 李宏毅…

Halcon 多相机统一坐标系(标定)

多相机统一坐标系是指将多个不同位置的相机的图像采集到同一个坐标系下进行处理和分析的方法。 在计算机视觉和机器视觉领域中,多相机统一坐标系被广泛应用于三维重建、立体视觉、目标跟踪等任务中。 以gen_binocular_rectification_map(生成描述图像映…

访问jenkins页面报错

安装fontconfig 即可 yum install fontconfig -y 安装完之后重启jenkins systemctl restart jenkins 再访问

安卓13 连接usb设备后不更新ui

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码更改4.彩蛋1.前言 有些界面在链接usb设备后,ui会被刷新,导致闪烁问题。 2.问题分析 像这种问题一般是usb事件,导致的ui事件更新了,处理方法是禁止该事件 3.代码更改 这块我们就需要在输入事件管理里面…

从变量的角度理解 Hooks , 变得更简单了

从变量角度理解Hooks 在React的世界里,Hooks的引入为函数式组件带来了前所未有的灵活性和能力。它们让我们得以完全摆脱class式的写法,在函数式组件中完成生命周期管理、状态管理、逻辑复用等几乎全部组件开发工作。这次,我们就从变量的角度…