命名实体识别(Named Entity Recognition,简称 NER)这一自然语言处理任务,其核心技术框架可归纳为三大核心模块:WordEmbedding(词向量嵌入)、BiLSTM(双向长短期记忆网络)与 CRF(条件随机场)。WordEmbedding 作为 NER 模型的输入底座,其本质是将字符或词语转换为具备语义特征的稠密向量,使 BiLSTM 能够准确捕捉上下文信息。真正完成实体识别的流程中,BiLSTM 负责捕获序列依赖关系,CRF 则保障标签序列的合理性,而 WordEmbedding 的质量决定了整个识别流程的起点是否扎实。

WordEmbedding 在 NER 中的应用方式
它并非独立的功能模块,而是嵌入整个 NER 流程的初始环节:
- 每个汉字(中文通常按字符切分)或词汇被映射为固定维度的稠密向量,例如 96 维或 300 维
- 向量可随机初始化,也可加载预训练词向量(如 Word2Vec、GloVe 或 BERT 子词向量),后者能显著提升模型的泛化能力与迁移效果
- 举例来说,“安徽”与“江苏”在向量空间中距离较近,即使模型在训练阶段仅见过“安徽”标注为 LOC(地点),也能以更高概率将“江苏”识别为地名
- 对于未登录词(如新兴公司名称或生僻地名),系统使用统一的
向量进行兜底处理,避免模型因未知词而中断推理
BiLSTM-CRF 模型的关键分工机制
WordEmbedding 负责将输入转化为向量表示,后续两层网络则分别承担“理解”与“决策”任务:
- BiLSTM 层:将词向量序列进行双向输入处理,输出每个位置的隐藏状态,从而融合前后文语义信息。例如“马云”在“创办阿里巴巴”语境中属于人名,在“马云路”语境中可能指代地名,BiLSTM 依靠上下文差异进行判别
- CRF 层:并非单独为每个标签打分,而是对整条标签序列(如 B-PER、I-PER、O、B-ORG 等)计算全局得分,强制满足标签约束规则:I-PER 不可出现在 B-PER 之前,O 标签后不能直接跟 I-ORG 等
- 最终预测并非选取每个位置得分最高的独立标签,而是采用 Viterbi 算法搜索全局最优的标签路径
实战中容易忽略的关键问题
代码层面跑通流程相对容易,但要获得理想效果却需要留意以下细节:
- BIO 标注必须严格对齐:每个字符只能对应一个标签,空格、标点符号及换行符均需参与标注,否则输入长度与标签长度不一致会引发错误
- 填充与截断需同步处理:句子过短时补足
,过长时进行截断,word_ids 与 tag_ids 必须保持等长,且 对应的标签应设为特殊值(例如 -1),CRF 计算时主动进行 mask 屏蔽 - CRF 的转移矩阵应设置为可学习参数:初始化避免全零,建议使用小随机数;训练过程中模型会自动学习到“B-PER→I-PER 高分、B-PER→B-ORG 低分”等先验约束
- 评估指标不能仅依赖 accuracy:NER 任务更关注实体级别的准确率,需采用实体边界与类型双重匹配计算 F1 值,scikit-learn 的
seqeval库比单纯的 token-level 评估更加可靠
快速启动建议(以 PyTorch 为例)
无需从零实现 CRF,推荐直接站在成熟开源方案的基础上进行迭代优化:
- 使用
torch.nn.Embedding构建词表,预先建立word_to_ix和tag_to_ix映射字典 - 参考 PyTorch 官方 NER 教程中的 CRF 实现(包含
_forward_alg和_viterbi_decode方法),该实现已处理 LogSumExp 以防止数值溢出 - 从小数据起步:可选用 CLUE 基准中的 CLUENER(涵盖 10 类中文 NER 标签)或自行构建 500 句医疗/客服领域样本,先验证整体流程是否闭环
- 调试阶段建议打印前 3 个 batch 的
logits与viterbi_path,确认 CRF 层是否真正发挥作用(例如 O 标签后不再出现 I-ORG 等违规序列)
