命名实体识别(NER)
一、NER任务概述
1.1 任务定义
| 维度 |
说明 |
| 核心目标 |
从非结构化文本中识别出具有特定意义的实体,并标注其类别和边界 |
| 输入 |
原始文本序列 |
| 输出 |
实体文本 + 实体类别 + 起始/结束位置 |
| 评价指标 |
Macro-F1(严格匹配:实体文本+位置+类别完全一致才算正确) |
1.2 竞赛特殊挑战
| 挑战 |
说明 |
| 位置敏感性 |
实体位置偏移一个字符即判为错误,即使实体文本正确 |
| 标注噪声 |
医疗等领域标注主观性强,存在大量漏标和错标 |
| 类别不均衡 |
部分实体类别样本极少 |
| 嵌套实体 |
一个实体可能包含在另一个实体内 |
| 脱敏数据 |
部分竞赛将原始文本脱敏为数字ID |
二、标注方法
2.1 BIO标注体系
| 标签 |
含义 |
示例 |
| B-X |
实体X的开始Token |
"北" → B-LOC |
| I-X |
实体X的内部Token |
"京" → I-LOC |
| O |
非实体Token |
"是" → O |
2.2 BIOES标注体系
| 标签 |
含义 |
示例 |
| B-X |
实体X的开始Token |
"北" → B-LOC |
| I-X |
实体X的内部Token |
- |
| E-X |
实体X的结束Token |
"京" → E-LOC |
| S-X |
单Token实体X |
"中" → S-ORG |
| O |
非实体Token |
"是" → O |
2.3 标注方法选择
| 维度 |
BIO |
BIOES |
| 标签数量 |
2N+1 |
4N+1 |
| 边界信息 |
隐式 |
显式(E标签标记结束) |
| 单字实体 |
需B+I两个标签 |
S标签直接标记 |
| 竞赛推荐 |
通用 |
边界敏感任务推荐 |
三、编码器架构
3.1 主流编码器
| 编码器 |
说明 |
适用场景 |
| BERT |
双向Transformer编码器 |
基线首选 |
| RoBERTa |
动态Mask + 更大语料 |
强于BERT |
| DeBERTa |
注意力解耦 |
天花板最高 |
| MacBERT |
MLM as Correction |
中文优化 |
| BiLSTM |
双向LSTM |
轻量级方案 |
3.2 编码器选择建议
| 维度 |
说明 |
| 起步 |
BERT Base快速验证管线 |
| 进阶 |
RoBERTa-wwm-ext / MacBERT |
| 冲刺 |
DeBERTa V3 Large/XLarge |
| 显存受限 |
BiLSTM + CRF轻量方案 |
四、解码器对比
4.1 CRF(条件随机场)
| 维度 |
说明 |
| 核心原理 |
在给定观测序列(Token表征)的条件下,求解全局最优的标签序列 |
| 转移矩阵 |
学习标签间的转移概率(如B-PER→I-PER概率高,B-PER→I-ORG概率低) |
| 全局最优 |
通过Viterbi算法保证输出标签序列的全局一致性 |
| 约束效果 |
自动避免非法标签转移(如O→I-X),无需人工规则 |
| 训练开销 |
需要计算配分函数,训练速度比Linear慢2-3倍 |
| 推理开销 |
Viterbi解码增加少量计算 |
4.2 Linear(线性分类头)
| 维度 |
说明 |
| 核心原理 |
对每个Token独立分类,不考虑标签间依赖 |
| 实现方式 |
将每个Token的隐层向量接一个全连接层 |
| 优势 |
训练和推理速度快 |
| 劣势 |
可能产生非法标签转移(如O→I-X),需后处理修正 |
| 竞赛表现 |
配合后处理规则,效果可接近CRF |
4.3 Span-based(基于片段的解码)
| 维度 |
说明 |
| 核心原理 |
枚举所有可能的文本片段(Span),对每个Span分类 |
| 优势 |
天然支持嵌套实体,避免序列标注的边界问题 |
| 劣势 |
计算复杂度O(n^2),片段数量多 |
| 适用场景 |
嵌套实体、长实体 |
4.4 解码器选择建议
| 解码器 |
速度 |
效果 |
嵌套支持 |
推荐场景 |
| CRF |
中 |
高 |
不支持 |
通用首选 |
| Linear |
快 |
中 |
不支持 |
快速迭代 |
| Span-based |
慢 |
高 |
支持 |
嵌套实体 |
四-B、高级解码器
GlobalPointer
| 维度 |
说明 |
| 核心思想 |
将NER视为span分类问题,用相对位置编码高效枚举所有可能span |
| 实现方式 |
对每个Token对(i,j)计算其为实体span的得分,用旋转位置编码(RoPE)引入相对位置 |
| 优势 |
天然支持嵌套实体,计算效率高于传统Span-based(O(n)而非O(n^2)) |
| 损失函数 |
多标签交叉熵,每个实体类型独立计算 |
| 竞赛表现 |
中文NER竞赛中表现优异,是Span-based的强力替代 |
MRC-NER(机器阅读理解式NER)
| 维度 |
说明 |
| 核心思想 |
将NER转化为阅读理解任务:对每种实体类型构造问题,预测答案span |
| 问题构造 |
如"找到文本中所有的疾病名称",模型预测start和end位置 |
| 优势 |
统一不同NER范式(扁平/嵌套/不连续),少样本下效果好 |
| 劣势 |
每种实体类型需单独推理,N类实体需推理N次 |
| 竞赛应用 |
嵌套实体、不连续实体、少样本NER |
Biaffine解码器
| 维度 |
说明 |
| 核心思想 |
用双仿射变换对每对Token计算关系得分,判断是否属于同一实体 |
| 公式 |
score(i,j) = x_i * U * x_j^T + W * [x_i; x_j] + b |
| 优势 |
同时建模Token对关系和实体边界,支持嵌套实体 |
| 适用场景 |
依存解析、语义角色标注、嵌套NER |
解码器选择决策
| 场景 |
推荐解码器 |
理由 |
| 扁平实体、通用 |
CRF |
稳定可靠,竞赛首选 |
| 嵌套实体 |
GlobalPointer / Span-based |
天然支持嵌套 |
| 少样本NER |
MRC-NER |
问题构造引入先验知识 |
| 追求速度 |
Linear + 后处理 |
训练推理都快 |
| 追求极致 |
GlobalPointer / Biaffine |
表达能力最强 |
五、FLAT:中文NER的利器
| 维度 |
说明 |
| 核心问题 |
中文NER面临"词边界模糊"问题,字级别标注丢失词信息,词级别标注受分词错误影响 |
| FLAT方案 |
Flat-Lattice Transformer,将词信息以"附加注意力"的方式注入字符表征 |
| 实现方式 |
将词典中匹配到的词作为额外Token,通过特殊的位置编码与字符建立关联 |
| 位置编码 |
使用相对位置编码,每个词有head和tail两个位置 |
| 核心优势 |
不改变原始字符序列结构,仅通过注意力机制融合词信息 |
| 效果 |
在中文NER基准上显著优于纯字符模型 |
六、Offset Mapping修正
| 维度 |
说明 |
| 问题背景 |
分词器(Tokenizer)将原始文本切分为Token后,需要将Token级别的预测结果映射回原始字符位置 |
| Offset Mapping |
分词器返回的偏移映射表,记录每个Token在原文中的起止位置 |
| 常见问题 |
特殊Token([CLS]、[SEP])的Offset为(0,0),需过滤 |
| 子词对齐 |
一个词可能被切分为多个子词Token,需合并子词的预测结果 |
| 空格处理 |
部分分词器会将空格单独切分或合并,需特殊处理 |
| 修正代码 |
遍历Offset Mapping,跳过(0,0),合并同一词的子词预测 |
七、分词器空格切分修复
| 维度 |
说明 |
| 问题背景 |
部分分词器(如RoBERTa的BPE分词器)会将连续空格切分为独立Token |
| 导致后果 |
预测的实体边界可能包含多余空格,导致提交分数为零 |
| 解决方案 |
在提取预测区间时,动态检查并剥离首尾空格 |
| 头部处理 |
如果区间开头是空格,起始位置右移 |
| 尾部处理 |
如果区间结尾是空格,结束位置左移 |
八、Bad Case分析
| 维度 |
说明 |
| 核心方法 |
逐条分析验证集上预测错误的样本,归纳错误模式 |
| 常见错误模式 |
(1) 边界偏移(多一个字或少一个字);(2) 类别混淆;(3) 漏标;(4) 误报 |
| 分析维度 |
错误类型统计、错误实体长度分布、错误类别分布 |
| 改进闭环 |
Bad Case → 发现问题 → 修改模型/规则 → 重新验证 |
| 后处理规则来源 |
大部分后处理规则来源于Bad Case分析 |
九、NER模型融合策略
9.1 融合挑战
| 维度 |
说明 |
| 分词器差异 |
不同模型使用不同分词器,Token无法直接对齐 |
| 解决方案 |
通过Offset Mapping将Token级预测投射回字符级,在字符级融合 |
9.2 字符级融合流程
1. 各模型独立预测 → 得到Token级概率
2. 通过Offset Mapping → 映射到字符级概率
3. 字符级概率加权平均 → 得到融合概率
4. 从融合概率中解码实体 → 输出最终结果
9.3 融合权重优化
| 维度 |
说明 |
| 等权重 |
所有模型权重相同,简单有效 |
| 按F1加权 |
验证集F1高的模型权重更大 |
| 网格搜索 |
搜索最优权重组合 |
| Stacking |
用元模型学习最优组合方式 |
十、NER竞赛实战要点
10.1 提分路线图
1. 基线 → BERT Base + CRF + BIO标注
2. 编码器升级 → RoBERTa / DeBERTa
3. 解码器优化 → CRF调参 / Span-based
4. 数据增强 → 实体替换 + 同义词替换
5. 训练优化 → 对抗训练 + SWA
6. 伪标签 → K折伪标签降噪
7. 后处理 → 边界纠偏 + 空格修复
8. 模型融合 → 多模型字符级融合
10.2 常见踩坑点
| 坑点 |
原因 |
解决方案 |
| 提交分数为0 |
位置计算错误或格式问题 |
检查Offset Mapping和提交格式 |
| 线下远高于线上 |
验证集分布与测试集不一致 |
对抗验证 + 分层K折 |
| 实体边界偏移 |
分词器空格处理不当 |
动态剥离首尾空格 |
| CRF训练极慢 |
序列过长 |
截断或使用Linear+后处理 |
| 伪标签过拟合 |
在全量训练集上生成 |
仅在未见过的Fold上生成 |