命名实体识别(NER):从文本中精准提取关键信息的完整指南
目录
NER概述与应用
换句话说,NER 就是让机器读懂文本里“谁、哪里、什么组织、什么时候、多少钱”这类关键信息。
常见预定义实体类型
这些类别可以根据业务需求灵活扩展,比如医疗场景下会有“症状”“药品”等实体,金融场景下会有“公司”“金额”“日期”等。
核心应用场景
NER 通常是信息抽取的第一步,为更复杂的应用铺路:
理解了它能做什么,我们再来看 NER 在技术上到底怎么实现。
BIO标注法详解
NER 通常被建模为一个序列标注问题:给定一串字符(或词),为每个位置打上一个标签。BIO 标注法是这个领域 最通用、最易实现 的标注方式。
核心标注规则
例如,“小明在北京大学读书”这句话,如果按字符级别标注,结果如下:
为什么中文通常按字符而不是词来做标注?
因为分词本身就可能出错,如果“北京大学”被错误切分成“北京”和“大学”,实体的边界就很难对齐。基于字符的标注可以避免这种错误传播,让模型直接学习字符之间的实体边界。
在实际项目里,BIO 已经能覆盖绝大多数场景。当你发现模型经常把实体的边界弄错时,再考虑升级到 BIOES。
中文NER数据集与预处理
常用公开中文数据集
想要训练自己的 NER 模型,你需要有标注好的数据。以下是几个高质量、免费的中文 NER 数据集:
选择数据集时要注意:如果你做的是社交媒体分析,用 Weibo 数据集更贴近真实场景;如果做简历解析,Resume 数据集就非常合适。
核心预处理:文本与实体互转
拿到数据后,最常见的预处理操作就是在原始文本和BIO 标签序列之间互相转换。下面是一个通用的处理工具类:
这个类做了两件事:
- text_to_bios:给定文本和实体区间(例如
[(0,2,"PER")]),生成每个字符的标签。 - bios_to_entities:从字符序列和标签序列中把实体重新“拼接”出来,这在模型预测后还原结果时非常有用。
你可以借助它快速查看训练样本的标注效果,或者在模型推理后把标签转换成人类可读的实体。
基于BERT的NER实现
今天最主流的做法是基于预训练语言模型(如 BERT)来完成 NER。好消息是,社区已经有很多预训练好并且微调到 NER 任务上的中文模型,你甚至不用自己训练就能直接使用。
使用现成模型快速推理
Hugging Face 的 transformers 库提供了一个非常方便的 pipeline 接口:
输出可能类似:
模型微调与评估
虽然直接用现成模型很方便,但如果你的业务中实体类型很特殊(比如内部产品代号、特定行业的术语),微调就是必不可少的了。
微调核心流程(精简版)
微调 BERT 做 NER 通常包含几个关键步骤:
- 数据对齐:把你的字符级 BIO 标签对应到 BERT 的 token 级别。BERT 可能会把一个字符拆成多个子词(token),这时需要合理处理标签(例如把子词的标签都设成同一个实体的 I- 标签)。
- 模型适配:在预训练 BERT 的基础上加一个分类头,将隐藏层的输出映射到
num_labels个类别上。 - 训练与评估:使用交叉熵损失进行训练,并用实体级别的 F1 分数进行评测。
实体级评估指标
评估 NER 模型时,不能只看 token 级别的准确率。因为大部分 token 都是 'O'(非实体),模型就算全预测成 'O' 也能拿到很高的准确率,却一个实体都没识别出来。所以我们要用实体级 F1 分数,它要求实体的边界和类型都完全正确才算预测成功。
使用 seqeval 库可以很方便地进行实体级评估:
在这个例子中,预测把“小明”的“明”错标成了 O,导致“小明”这个实体没能被完整召回,F1 分数就会下降。classification_report 还会详细给出每个实体类别的准确率、召回率和 F1,帮你定位问题。
实际应用案例
电商客服意图槽位提取
NER 在对话系统里最常见的落地形式就是槽位填充。比如一个电商客服的查询:“帮我查下订单号AB123456的退款,昨天付的999元”,我们需要从中提取出产品、订单号、时间、金额等信息。
下面是一个简化的实现框架:
如果模型训练得当,输出会类似于:
拿到这些结构化的槽位后,客服系统就可以直接去后台查询订单、匹配金额和时间,大大提升自动处理率。
相关教程
🔗 扩展阅读
📂 所属阶段:第四阶段 — 预训练模型与迁移学习(应用篇)

