第3章 知识抽取之命名实体识别(NER):方法对比与实战选型

命名实体识别,圈内人简称 NER,是知识图谱构建的第一道关卡。说白了,就是把人名、地名、机构名、时间、专有名词这些“实体”从一堆文本里揪出来。

我在好几家公司的知识图谱项目里都做过 NER,踩过的坑还真不少。我记得有一次项目上线,基于规则的方法搞了两个月,最后一换模型,准确率直接掉了十几个点——调优那会儿真是焦头烂额。

咱们今天就把三种主流的 NER 方法掰开揉碎聊一聊:基于规则、基于统计(CRF)、基于深度学习(BiLSTM-CRF、BERT)。看完本讲,你在实际项目里就知道该选哪把刀了。

3.1 基于规则的NER:老兵不死,只是逐渐凋零

最早做 NER 的人,靠的是词典+正则。比如你手头有一份全国地名库,再配上“省、市、县、镇”等后缀规则,就能把地址类实体抽个七七八八。

其实这种方法特别适合一个场景:领域封闭、实体边界清晰。比如医院信息系统里的药品名称、检查项目——就那么几千个标准词,规则做起来又快又稳。

基于规则的核心要素:
- 词典:预定义实体列表
- 正则模式:触发词 + 上下文模式
- 后处理:消歧与冲突解决

拿个医疗场景举例:

"患者王小明服用阿莫西林胶囊后出现皮疹"

规则说明:
1. 词典匹配:阿莫西林胶囊 → 药品实体
2. 触发词:'服用' → 左侧名词候选药品
3. 边界规则:胶囊 → 三字/四字药品名后缀

但现实很骨感。你想想看,自然语言里“小米”是公司名还是粮食?“苹果”是水果还是科技公司?没有上下文,规则根本搞不定。

规则法的致命伤:

  • 维护成本高:规则膨胀到几百条后,谁动谁崩
  • 跨领域不可移植:换个行业,全部重写
  • 召回率低:实体形态一变,规则立马哑火
我个人习惯:规则法只作为快速原型或兜底方案。在冷启动阶段用规则跑一批标注数据出来,然后喂给机器学习模型,这招百试不爽。

3.2 基于统计的NER:CRF是传统方法的扛把子

统计方法里,条件随机场(CRF)是绕不开的模型。它干的事很简单:给定一个字/词序列,预测每个位置的标签(B-Person, I-Person, B-Org, O...)。

CRF 最大的特点——它引入了标签之间的转移约束。举个例子,B-Person 后面不能接 I-Org,否则就是错误序列。这个约束在浅层模型里非常有效。

项目特征工程大概长这样:

# 特征模板示例(CRF++ 格式)
# 当前词、前后词、词性、形态特征

U00:%x[-1,0]      # 前一个词
U01:%x[0,0]       # 当前词
U02:%x[1,0]       # 后一个词
U03:%x[-1,0]/%x[0,0]  # 前一词+当前词组合
U04:%x[0,0]/%x[1,0]   # 当前词+后一词组合

# 词性特征
U10:%x[-1,1]
U11:%x[0,1]
U12:%x[1,1]

# 是否为数字、大写字母等
U20:%x[0,2]

我在一个金融公告项目里用过 CRF,当时标注了大概两万条财报摘要,跑出来的 F1 值稳定在 82% 左右。后来加了 BERT 特征,直接干到 90%+。

CRF 的优劣:

  • ✅ 推理速度快,适合线上部署
  • ✅ 对小样本友好,几十万条数据就能出效果
  • ❌ 依赖人工特征工程,坑多事杂
  • ❌ 对语义理解弱,复杂嵌套实体(比如“上海市浦东区人民法院”)经常出错

3.3 基于深度学习的NER:BiLSTM-CRF vs BERT

深度学习方法一出来,之前那套特征工程就显得有点笨了。模型自己学特征,端到端,省心得多。

3.3.1 BiLSTM-CRF:经典的序列标注方案

这个结构我用了好几年,落地过七八个知识图谱项目。它分三层:

  • 嵌入层:把字/词映射成向量
  • BiLSTM 层:双向时序建模,捕获上下文信息
  • CRF 层:输出全局最优标签序列

为什么用 BiLSTM 加 CRF 而不是直接 Softmax?因为 CRF 层强制了标签之间的转移合法性。我以前踩过坑:只用 BiLSTM + Softmax,输出经常出现 B-Person 紧接 I-Org 这种违例序列,后处理纠错能把代码写吐。

我曾经在一个电商实体识别项目里,用了 BiLSTM-CRF 但没用预训练词向量。跑出来的 F1 只有 63%,后来换上 BERT 的动态词向量,同批数据直接干到 86%。——预训练才是王炸。

3.3.2 BERT:预训练时代的屠龙刀

BERT 出来以后,NER 的准确率又上了一个台阶。它用 Masked Language Model 做预训练,对上下文语义的理解甩传统模型几条街。

不过,贵、慢、吃显存。BERT-Base 一张 16G 的 V100 才能塞下 batch_size=32。如果你不是做精度要求极高的场景(比如金融交易、医疗诊断),我建议先用 CRF 或 BiLSTM-CRF 试水。

一个典型的 BERT-NER 配置:

pretrained_model_name_or_path = "bert-base-chinese"
max_seq_length = 128
train_batch_size = 16
learning_rate = 2e-5
num_train_epochs = 3

# 标签列表(BIO标注)
label_list = ["O", "B-PER", "I-PER", "B-ORG", "I-ORG",
              "B-LOC", "I-LOC", "B-TIME", "I-TIME"]

# 模型结构说明
# BERT 输出 → Dense层(768→9) → CRF层 → 预测标签

3.4 四种方法核心对比

维度 规则法 CRF BiLSTM-CRF BERT-NER
可解释性 ★★★★★ ★★★☆☆ ★★☆☆☆ ★☆☆☆☆
标注数据需求 ❌ 不需要 千条级 万条级 万条级
推理速度 毫秒级 毫秒级 秒级(GPU加速) 秒级~十秒级
跨领域适配 否 中等(需重做特征) 好(迁移学习) 极好(预训练)
实体边界准确率 高(封闭领域) 较高 高 极高
语义理解能力 无 弱 中 强
部署成本 极低 低 中(需GPU) 高(GPU显存>8G)

嗯,看到这里你会发现,没有银弹。选哪个主要看你的资源。

3.5 我的选型经验

我个人在做知识图谱项目的时候,一般按这个优先级做决策:

  1. 先评估领域复杂度:如果实体类别少、边界固定(如:身份证号、手机号),直接上规则,省时省力。
  2. 再看标注数据量:数据不足三千条,CRF 比深度学习还稳。我试过两千条数据跑 BiLSTM-CRF,F1 只有 70%,CRF 干到了 78%。
  3. 精度要求高吗?:比如金融合同的条款解析,识别错一个实体可能损失几十万。那宁可花资源上 BERT,也不赌 CRF 那点边界的稳定性。
  4. 线上延迟能不能忍?:实时交互场景(比如搜索)毫秒级响应,CRF 是首选。BERT 加优化勉强能压到百毫秒级,但要上 FastText 或剪枝。
快速上手建议:
① 小规模冷启动 → 规则法出种子标注数据
② 用种子数据训练 CRF → 主动学习 + 人工校对,扩充标注量
③ 数据够了 → 上 BiLSTM-CRF 或 BERT → 替换旧模型
这个路线,我在三个项目里跑通过。

3.6 核心知识体系图

下面这张图帮你梳理三种方法的演进关系和适用边界。

NER 方法选型体系图 基于规则 CRF (条件随机场) 深度学习 词典 + 正则表达式 触发词 + 边界规则 特征:零标注 / 领域封闭 特征工程 + 转移约束 千条级标注 / 推理飞快 特征:词性 / 前后缀 / 词边界 BiLSTM-CRF 经典结构 BERT / RoBERTa 预训练 特征:自动学习 / 需GPU 数据增强标注 过渡到端到端 实战选型决策逻辑 规则法 → 实体类型少、边界固定、零标注成本。用于种子数据生产。 CRF → 标注千~万级、推理需毫秒级、线上部署资源有限。 BiLSTM-CRF → 标注万级以上、中等精度、有 GPU 但显存<16G。 BERT-NER → 高精度要求、标注充分、不差钱的 GPU 集群场景。 记住一条:不要为了技术栈的炫酷,牺牲项目的交付成本和时效性。

最后说句实在的——我见过不少团队一上来就搞 BERT,结果标注数据才几百条,训练完效果还不如 CRF。技术选型不是追新,是看你的输入和约束条件。把三种方法都备着,哪个阶段用哪个,这才是老工程师的干活儿方式。