自然语言处理-序列标注算法-01
序列标注算法工程指南:HMM、CRF、BiLSTM-CRF 与 BERT-CRF
大模型时代公司接了序列标注相关的项目,乘此机会简单整理下之前所学,有不对之处还请指教,互相学习。
本系列共 5 篇,本文为总览篇,后续四篇分别深入每个算法的原理推导与完整可运行代码。
一、什么是序列标注
序列标注(Sequence Labeling)是 NLP 中最基础的结构预测任务:给定输入序列x=(x1,x2,…,xn)x = (x_1, x_2, \ldots, x_n)x=(x1,x2,…,xn),为每个位置预测一个标签yiy_iyi,输出标签序列y=(y1,y2,…,yn)y = (y_1, y_2, \ldots, y_n)y=(y1,y2,…,yn)。
典型任务:
| 任务 | 输入示例 | 输出示例 |
|---|---|---|
| 命名实体识别(NER) | 张三 在 北京 工作 | B-PER O B-LOC O |
| 词性标注(POS) | I love NLP | PRP VBP NN |
| 中文分词 | 我爱自然语言处理 | B I B I I I I I |
| 语义角色标注(SRL) | 张三 打 了 李四 | A0 V O A1 |
二、标注方案:BIO / BIOES
工程中最常用BIO和BIOES两种方案:
BIO 格式
B-{TYPE}:实体开始I-{TYPE}:实体内部O:非实体
张 三 是 北 京 人 B-PER I-PER O B-LOC I-LOC OBIOES 格式(推荐)
B-{TYPE}:多词实体开始I-{TYPE}:多词实体中间O:非实体E-{TYPE}:多词实体结束S-{TYPE}:单词实体
张 三 是 京 城 人 B-PER E-PER O S-LOC ... O工程建议:BIOES 对边界区分更精细,NER 任务中通常比 BIO 高 0.5~1% F1。
三、四大算法一览
序列标注 ├── 统计学习方法(可解释 · 低资源) │ ├── HMM 隐马尔可夫模型 → 详见 01_HMM.md │ └── CRF 条件随机场 → 详见 02_CRF.md └── 深度学习方法(高精度 · 端对端) ├── BiLSTM-CRF → 详见 03_BiLSTM-CRF.md └── BERT-CRF → 详见 04_BERT-CRF.md四、横向对比
| 维度 | HMM | CRF | BiLSTM-CRF | BERT-CRF |
|---|---|---|---|---|
| 建模类型 | 生成模型 | 判别模型 | 判别模型 | 判别模型 |
| 特征工程 | 无需 | 需要人工 | 自动学习 | 预训练表示 |
| 训练数据量 | 极少 | 少~中 | 中 | 少(微调) |
| 推理速度 | 极快 | 快 | 中 | 慢 |
| 典型 F1(NER CoNLL-03) | ~70 | ~85 | ~90 | ~93+ |
| 可解释性 | 高 | 高 | 低 | 极低 |
| 适用场景 | 资源极受限 | 可解释/低资源 | 无预训练条件 | 主流生产方案 |
| 显存占用 | 无 | 无 | 低 | 高 |
五、技术演进路线
HMM (1990s) └─► 解决了:序列建模问题 └─► 缺陷:生成模型,特征独立性假设强 CRF (2001, Lafferty et al.) └─► 解决了:判别建模,任意特征,无独立性假设 └─► 缺陷:需要人工特征模板,特征工程成本高 BiLSTM-CRF (2016, Lample et al.) └─► 解决了:自动学习特征,端到端训练 └─► 缺陷:从零训练,需要一定标注数据量 BERT-CRF (2019, Devlin et al. + CRF) └─► 解决了:迁移学习,少量数据高精度 └─► 缺陷:推理慢,部署成本高六、工程化选型建议
标注数据量 < 500 条? └─► 用 CRF(sklearn-crfsuite),快速验证数据可行性 有 GPU + 数据量 1k~10k? └─► 直接上 BERT-CRF(bert-base-chinese) 需要极低延迟(< 10ms)? └─► 蒸馏到 BiLSTM-CRF 或量化 BERT 需要可解释的特征权重? └─► CRF,可查看每个特征的权重系数七、评估标准
序列标注统一使用span-level F1(而非 token-level accuracy),通过seqeval库计算:
fromseqeval.metricsimportf1_score,classification_report y_true=[['B-PER','I-PER','O','B-LOC']]y_pred=[['B-PER','I-PER','O','O']]print(f1_score(y_true,y_pred))# output: 0.6667print(classification_report(y_true,y_pred))# precision / recall / f1 / support by entity typetoken-level accuracy 在 O 标签占多数时虚高,必须用 span-level F1 才能真实反映实体识别质量。
八、文档索引
| 文件 | 内容 |
|---|---|
自然语言处理-序列标注算法-01 | 本文:概念、对比、选型 |
自然语言处理-HMM深度解析-02 | HMM 完整推导 + 可运行训练代码 |
自然语言处理-CRF深度解析-03 | CRF 完整推导 + sklearn-crfsuite 完整代码 |
自然语言处理-BiLSTM-CRF深度解析-04 | BiLSTM-CRF 完整推导 + PyTorch 完整训练代码 |
自然语言处理-BERT-CRF深度解析-05 | BERT-CRF 完整推导 + HuggingFace 完整训练代码 |
