news 2026/4/18 1:43:20

保姆级教程!命名实体识别(NER)训练实战:从数据到模型全流程,建议收藏。

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
保姆级教程!命名实体识别(NER)训练实战:从数据到模型全流程,建议收藏。

一、命名实体识别(NER)训练实战

完整的数据集+模型+代码示例, 公众号内回复ner示例即可免费获取

1. 什么是NER

命名实体识别(Named Entity Recognition,简称NER)是自然语言处理中的一项基础任务,它的目标是从文本中识别出具有特定意义的实体,并将其分类到预定义的类别中。

这里解释下什么是实体?
通常实体类别通常包括:组织名(ORG)、人名(PER)、地名(LOC)、时间(TIME)、数字(NUM)等。
当然了,你也可以根据具体任务定义自己的实体类别。

举例说明

对于如下文本:

苹果公司蒂姆·库克昨天在北京会见了中国政府官员,讨论了在上海建立新工厂的计划。”

NER的任务就是识别出:

  • 苹果公司→ 组织名(ORG)
  • 蒂姆·库克→ 人名(PER)
  • 北京上海→ 地名(LOC)
  • 中国→ 地名(LOC)

2. NER数据标注格式

在NER任务中,我们需要教会模型识别实体的边界类别。这就涉及到了标注格式的问题。

  • 这里标注对于文本中的每个字符都需要进行标注,标注的结果是实体的开始、内部或非实体。

BIO标注格式

BIO是最基础的标注格式,包含三种标签:

  • B-XXX(Begin):实体的开始
  • I-XXX(Inside):实体的内部
  • O(Outside):非实体

示例

1 2 3 4 5 6 7 我 O 在 O 北 B-LOC 京 I-LOC 市 I-LOC 工 O 作 O

BIOES标注格式(推荐)

BIOES是更精细的标注格式,在BIO基础上增加了:

  • S-XXX(Single):单字实体 (有些实体只有单个字,就用一个单独的标签来表示)
  • E-XXX(End):实体的结束

示例

1 2 3 4 5 6 7 我 O 在 O 北 B-LOC 京 I-LOC 市 E-LOC 工 O 作 O

为什么选择BIOES?

  • 很明显,BIOES格式提供了更丰富的边界信息,让模型更容易学习实体的完整结构。

对于实体"北京市":

  • BIO格式:B-LOC I-LOC I-LOC(模型需要学会I-LOC后面可能跟I-LOC或O)
  • BIOES格式:B-LOC E-LOC S-LOC(明确的开始-结束关系)

3. 数据预处理问题-Token标签对齐

问题描述

  • 在说明这个问题之前,我们先要明白NER任务是怎么实现的,他本质上就是个分类问题!!!
  • 对于传统的分类任务而言,是针对整个句子进行分类(如情感分类), 但是在NER任务中,我们的目的是针对每个字符进行分类的。
  • 但是这是我们希望的, 但是模型输入的是token, 对模型而言这是一个token分类的问题
  • 但是,由于BERT等预训练模型的Tokenizer会可能会将字符进一步拆分成子词(subword), 这就导致了一个潜在问题: 一个字符对应一个标签, 但是一个字符可能被分成多个token(每个子词也是一个token), 这就导致了标签对齐的问题。

简单讲讲子词是什么?

  • 简而言之,要分词,我们就得有词表 (这里知识简单介绍下,因为涉及到子词模型)
  • 但是要是遇到不认识的词呢? 那也只能拆成词表中认识的词了
  • 对于英文场景,举例
  • 比如 “apple” 可能会被分成 “app” “##le” 两个子词 (这个##是为了表示这是个子词,不是新的词,是和上一个词"app"拼接起来的), 当词表中没有"apple"这个词时,就只能拆分成"app"和"##le"这两个子词了
  • 所以产生这么个情况, 你的数据集里面给的标签是给到 “apple” 这个词的, 但是分完词它产生了两个token, 这就导致了标签对齐的问题
  • 对于中文场景, 一般的BertTokenizer会将每个字都拆成一个token, 比如 “北京” 会被分成 “北” “京” 两个token
  • 这看起来没问题, 毕竟我们标注是每个字符
  • 但是我问了一些大模型, 它们指出可能有问题的两种情况
  • 情况1: 不认识的繁体字
  • 情况2: emoji 表情符号

一个字符底层存储的是多个字节,这看你的编码方式, 这些字节可能会被拆分成多个子词, 这就导致了标签对齐的问题。

  • 但是我用google-bert模型会将不认识的词给一个特殊的token, “[UNK]”, 不会拆成多个子词, 这其实避免了标签对齐的问题, 但是这里仍然讲讲子词模型的标签对齐问题的处理方案。
解决方案
  • 说白了, 我们标注的是一个字符,但是这个字符可能会被分成多个token(子词), 这些token才是真正要模型给学习的, 这些token的标签咋给?
  • 一个最简单的策略是:第一个子词保持原标签,后续子词使用-100(一般都给这个-100作为忽略值)
  • 当然基于对于最简单的策略下, 我们可以做一些额外处理
  • 当然对于B-XXX, 可以拆成 [B-XXX, I-XXX, …] 这种
  • •对于S-XXX, 可以拆成 [B-XXX, I-XXX, …, E-XXX] 这种
对齐算法示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 def align_labels_with_tokens(labels, word_ids, label_list=None): new_labels = [] current_word = None for word_id in word_ids: if word_id is None: # 特殊token处理:[CLS], [SEP], 填充token new_labels.append(-100) elif word_id != current_word: # 新词的开始:保持原标签 current_word = word_id new_labels.append(labels[word_id]) else: # 同一个词的后续subword if label_list is not None: label_name = label_list[labels[word_id]] # BIOES智能转换 if label_name.startswith('B-'): # B-LOC -> I-LOC,保持实体连贯性 entity_type = label_name[2:] inside_label = f'I-{entity_type}' if inside_label in label_list: new_labels.append(label_list.index(inside_label)) else: new_labels.append(-100) else: # S-XXX, E-XXX, I-XXX, O 都使用-100 new_labels.append(-100) else: new_labels.append(-100) return new_labels
  1. 关键代码示例详解

  • • 基本上讲完数据处理的问题, 这个任务其实就好理解了, 本身上就是一个 token 分类的问题
  • • 分类问题, 就是直接使用 softmax 函数, 再计算交叉熵损失即可, 这是一个标准的分类任务, 没有什么特殊的地方
  • • 硬要说特殊, 就是每个token都要分类而已

现在的库封装的很严实, 其实我们只需要关注数据处理的问题, 模型训练的问题, 关于损失函数怎么写等, 库已经帮我们封装好了, 我们只需要调用即可。 当然也过于严实了, 可能导致一些细节不太直观。

数据加载器实现

我们的数据采用BIO格式,每行是字符\t标签,空行分隔句子:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 def load_bio_format_data(file_path): sentences = [] sentence_tokens = [] sentence_labels = [] with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if line == '' or line.startswith('-DOCSTART-'): if sentence_tokens: sentences.append({ 'tokens': sentence_tokens, 'ner_tags': sentence_labels }) sentence_tokens = [] sentence_labels = [] else: parts = line.split() if len(parts) >= 2: token = parts[0] label = parts[-1] # 最后一列是标签 sentence_tokens.append(token) sentence_labels.append(label) return sentences

模型训练核心

我们使用Hugging Face Transformers库进行训练,这是最优雅的方式:

注意我们使用了 AutoModelForTokenClassification 这个类, 它是一个通用的类, 可以用于所有的 token 分类任务, 我们只需要指定 num_labels 这个参数, 就可以自动添加一个分类头, 用于分类任务。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 加载预训练模型,设置分类头 model = AutoModelForTokenClassification.from_pretrained( model_path, num_labels=len(label_list), # 关键:设置标签数量 id2label=id2label, # 标签ID到名称映射 label2id=label2id # 标签名称到ID映射 ) # 训练参数配置(经验之谈) training_args = TrainingArguments( output_dir=output_dir, learning_rate=2e-5, # 学习率:不宜过大 per_device_train_batch_size=16, # 根据GPU内存调整 per_device_eval_batch_size=16, num_train_epochs=3, # 轮数根据效果调整 weight_decay=0.01, # 权重衰减防止过拟合 eval_strategy="epoch", # 每个epoch评估一次 save_strategy="epoch", load_best_model_at_end=True, # 自动加载最佳模型 metric_for_best_model="f1", # 使用F1作为评估指标 fp16=torch.cuda.is_available(), # 混合精度加速训练 )

评估指标实现

NER任务使用seqeval库计算评估指标:

  • • 分类任务的指标无非是精确率、召回率、F1值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 def compute_metrics(eval_preds, label_list): predictions, labels = eval_preds # 从logits获取预测标签 predictions = np.argmax(predictions, axis=2) # 移除被忽略的标签(-100) true_labels = [] true_predictions = [] for prediction, label in zip(predictions, labels): true_label = [] true_prediction = [] for pred, lab in zip(prediction, label): if lab != -100: # 忽略特殊token true_label.append(label_list[lab]) true_prediction.append(label_list[pred]) true_labels.append(true_label) true_predictions.append(true_prediction) # 计算精确率、召回率、F1值 return { 'precision': precision_score(true_labels, true_predictions), 'recall': recall_score(true_labels, true_predictions), 'f1': f1_score(true_labels, true_predictions), }

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 3:48:04

为什么语音合成总报错?修复numpy/scipy依赖的稳定镜像来了

为什么语音合成总报错?修复numpy/scipy依赖的稳定镜像来了 📌 背景:中文多情感语音合成的工程痛点 在语音合成(Text-to-Speech, TTS)领域,Sambert-Hifigan 是 ModelScope 平台上备受关注的一套高质量中文…

作者头像 李华
网站建设 2026/4/18 3:45:35

【开题答辩全过程】以 基于VUE的打车系统的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华
网站建设 2026/4/17 8:38:52

Sambert-HifiGan性能深度测评:合成速度与音质全面对比

Sambert-HifiGan性能深度测评:合成速度与音质全面对比 📊 测评背景与目标 随着语音合成(TTS)技术在智能客服、有声阅读、虚拟主播等场景的广泛应用,中文多情感语音合成逐渐成为行业关注焦点。ModelScope 推出的 Samber…

作者头像 李华
网站建设 2026/4/18 3:50:14

从gerber文件提取信息并重建pcb文件的系统化思路

从Gerber文件重建PCB:一条被低估的硬件逆向工程实战路径 你有没有遇到过这样的情况?一台关键设备突然故障,维修需要更换电路板,但原厂早已停产,资料不全,连设计团队都解散了。你手头只有一套用于生产的 G…

作者头像 李华
网站建设 2026/4/18 3:45:26

Sambert-HifiGan在医疗领域的应用:为视障人士朗读病历

Sambert-HifiGan在医疗领域的应用:为视障人士朗读病历 🏥 应用背景与社会价值 在现代医疗体系中,信息可及性是保障患者权益的重要一环。然而,对于视障人士而言,纸质或电子形式的病历、检查报告、用药说明等关键医疗文档…

作者头像 李华