掘金 人工智能 05月22日 15:58
Hugging Face Transformers NER 实战总结
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文总结了基于Hugging Face Transformers的命名实体识别(NER)项目的实战经验,涵盖了从NER基础概念、BERT模型应用、数据预处理、训练流程、推理流程到实际问题排查的全过程。文章深入浅出地介绍了NER任务的核心技术,并提供了详细的代码示例和问题解决方案,帮助读者快速掌握NER的实践技能。

💡 NER 是自然语言处理中的基础任务,旨在从文本中识别并分类具有特定意义的“实体”,例如人名、组织、地点等。NER 任务可以被视为“序列标注”问题,即为文本中的每个 token 分配一个标签。

🤖 使用 BERT 进行序列标注是实现 NER 的常用方法。Hugging Face 提供了 AutoModelForTokenClassification 模型,该模型基于 BERT 架构,可以方便地进行 token 级别的分类。模型通过 BERT encoder 将文本转换为 token embeddings,然后经过 Linear 分类层输出 label logits。

📝 数据预处理中的 Token 对齐至关重要。由于 BERT 分词器是 subword 级别,需要将 word-level label 对齐到 subword。通常,首字段保留原标签,后续 subword 指定 -100 被 loss 算法忽略,以确保标签与 token 的正确对应。

🚀 Hugging Face 的 Trainer 类简化了训练流程。Trainer 自动处理 batch 化、损失计算、checkpoint 保存和优化器等任务,并支持 GPU/多 GPU 自动切换,极大地提高了训练效率。

💡 推理流程可以通过 Pipeline 快速使用已训练好的模型。通过 pipeline 函数,可以实现自动切词、编码、预测和转换,方便快捷地进行 NER 推理。

🤔 在实际应用中,可能会遇到模型预测结果为空的情况。这可能是由于 aggregation_strategy 设置、输入文本不包含模型识别的实体或未定义 id2label 等原因造成的。需要根据具体情况进行排查和解决。

Hugging Face Transformers NER 实战总结

本文主要构建一个基于 Hugging Face Transformers 的命名实体识别(NER)项目,结合个人实战涵盖从原理讲解、代码结构、训练、预测到踩坑排查等全流程。


一、NER 是什么?

NER 是自然语言处理中的基础任务,目标是从文本中识别并分类具有特定意义的“实体”,如:

示例:

文本:Barack Obama was born in Hawaii.

输出:

    Barack Obama → PERHawaii → LOC

NER 是其实上的“序列标注”问题,就是给每个 token 打一个标签。


二、使用 BERT 进行序列标注

基础模型:AutoModelForTokenClassification

Hugging Face 提供了 BERT 基础上进行 token-level 分类的简单方式:

model = AutoModelForTokenClassification.from_pretrained("bert-base-cased", num_labels=9)

它本质是:


三、数据预处理:Token 对齐

BERT 分词器是 subword 级别,例如:

HuggingFace → ['Hugging', '##Face']

需要把数据中的 word-level label 对齐到 subword,通常做此处理时:

即:tokenize_and_align_labels() 是很核心的预处理部分


四、训练流程:Trainer 自动化

Hugging Face 提供了 Trainer 类,它包装了很多系统性工作:

trainer = Trainer(    model=model,    args=training_args,    train_dataset=train_data,    eval_dataset=val_data,    tokenizer=tokenizer,    compute_metrics=metrics_fn)

包括:

同时,Trainer 支持 GPU/多 GPU 自动切换


五、推理流程:Pipeline 快速使用

很多时候,我们已经训好了模型,只想用一行代码进行使用,那么就是:

nlp_ner = pipeline("ner", model=OUTPUT_DIR, tokenizer=OUTPUT_DIR, aggregation_strategy="simple")

六、实际问题:为什么我什么都没看到?

我在运行成功后,却发现:

text = "I love playing basketball."results = nlp_ner(text)print(results)

输出:

[]

原因:

1. 模型预测全是 'O' 标签,被 aggregation 过滤了

2. 输入文本不包含模型识别的实体

3. 未定义 id2label

如果你看到这样输出:

Apple -> LABEL_3California -> LABEL_5

说明没有传入 id2label,需要:

id2label = {i: label for i, label in enumerate(LABEL_LIST)}model = AutoModelForTokenClassification.from_pretrained(OUTPUT_DIR, id2label=id2label)

七、总结流程

            文本              ↓           Tokenizer              ↓    tokenize_and_align_labels              ↓         BERT Encoder              ↓         Token logits (Linear)              ↓           Softmax + loss              ↓          Trainer 训练              ↓           保存模型              ↓           Pipeline 进行推理

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Hugging Face Transformers NER 序列标注 BERT
相关文章