本实验旨在使用 PyTorch 实现基于循环神经网络的英文命名实体识别(Named Entity Recognition, NER)模型,在 CoNLL-2003 数据集上识别人名、组织机构、地点和其他专有名词四类实体,并使用实体级 Precision、Recall 和 F1 评价模型效果。
本实验的具体目标如下:
- 掌握命名实体识别任务的基本流程;
- 熟悉 BIO 序列标注格式、数据加载、词表构建和实体级评价方法;
- 实现并对比 BiLSTM-softmax、Char-CNN + BiLSTM + CRF 和加入 GloVe 词向量后的模型;
- 参考 Ma & Hovy (2016) 与 Lample et al. (2016) 的结构设计,分析当前实现与论文结果之间的差距。
命名实体识别是自然语言处理中的序列标注任务。给定一个 token 序列:
EU rejects German call to boycott British lamb .
模型需要为每个 token 输出一个 BIO 标签:
B-ORG O B-MISC O O O B-MISC O O
其中 B- 表示实体开始,I- 表示实体内部,O 表示非实体。本实验识别 PER、ORG、LOC、MISC 四类实体。
BiLSTM 同时从左到右和从右到左编码句子上下文,使每个 token 的表示能够包含前后文信息。对于 NER 任务,这比普通单向 RNN 更适合处理实体边界和实体类型判断。
初始实现使用:
word embedding -> BiLSTM -> Linear -> softmax
该结构能完成基本序列标注,但每个位置独立分类,没有显式建模 BIO 标签转移关系。
为了对齐参考论文,本实验进一步实现了:
word embedding + character CNN -> BiLSTM -> CRF
其中:
- 词嵌入层将 token ID 映射为稠密向量;
- 字符 CNN 从单词字符序列中提取大小写、后缀、形态等词内部特征;
- BiLSTM 编码上下文信息;
- CRF 建模标签之间的转移关系,并输出全局最优标签序列。
CRF 层可以学习 B-ORG 后更可能接 I-ORG,I-PER 不应随意接在 B-LOC 后等序列约束,因此比逐 token softmax 更适合 BIO 标注。
参考论文通常使用无监督预训练词向量增强泛化能力。本实验下载并使用 GloVe 6B 词向量,主要采用 glove.6B.100d.txt。由于 GloVe 6B 词表本身为小写,本实验在最佳配置中加入 --lower,同时保留字符 CNN 来捕捉大小写信息。
训练中还加入:
- dropout;
- singleton word dropout;
- ReduceLROnPlateau 学习率衰减;
- early stopping;
- 梯度裁剪。
CoNLL-2003 是英文命名实体识别常用数据集,文本主要来自新闻语料。数据按句子组织,每个 token 对应一个 NER 标签。
本实验最终采用 Hugging Face datasets 加载 conll2003 数据集,训练、验证和测试划分均来自该数据源。代码会直接读取 eriktks/conll2003 仓库中已转换的 Parquet 文件,并固定到具体 revision,避免依赖已不再支持的 trust_remote_code 或本机缓存。仓库中保留的 data/conll2003 仅作为离线缓存和备用导出目录,不作为最终实验的主要入口。
实验采用实体级 Precision、Recall 和 F1。只有当预测实体的类别、起始位置和结束位置都与真实实体一致时,才认为该实体预测正确。
Precision = 正确预测实体数 / 预测实体总数
Recall = 正确预测实体数 / 真实实体总数
F1 = 2 * Precision * Recall / (Precision + Recall)
另外程序也输出 token accuracy,但最终以实体级 F1 为主要指标。
python3 -m pip install -r requirements.txt主要依赖如下:
| 依赖 | 用途 |
|---|---|
| PyTorch | 模型训练与推理 |
| datasets | 加载 Hugging Face CoNLL-2003 数据集 |
| NumPy | 随机种子与数值处理 |
| tqdm | 训练进度显示 |
| 参数 | 取值 |
|---|---|
| 模型 | Char-CNN + BiLSTM + CRF |
| Word Embedding | 128(随机初始化时) |
| Hidden Dim | 256 |
| LSTM Layers | 1 |
| Char Embedding Dim | 30 |
| Char CNN Channels | 30 |
| Dropout | 0.3 |
| Optimizer | AdamW |
| Learning Rate | 0.005 |
| Batch Size | 32 |
| 参数 | 取值 |
|---|---|
| 预训练词向量 | GloVe 6B 100d |
| Lowercase | true |
| Dropout | 0.5 |
| Singleton Word Dropout | 0.05 |
| Learning Rate | 0.003 |
| LR Decay Patience | 3 |
| LR Decay Factor | 0.5 |
| Early Stop Patience | 8 |
| Best Epoch | 6 |
当前项目核心目录如下:
|-- README.md # 项目说明与实验报告
|-- requirements.txt # Python 依赖
|-- src
| `-- train_ner.py # 数据加载、模型定义、训练与评估主脚本
|-- data # datasets 导出的离线缓存目录,已加入 .gitignore
|-- embeddings # GloVe 词向量目录,已加入 .gitignore
`-- outputs # 训练输出、模型权重和指标文件,已加入 .gitignore
最终保留的 outputs 结果目录如下:
outputs/conll2003_char_crf_full # 随机初始化 Char-CNN + BiLSTM + CRF
outputs/conll2003_glove # 直接加入 GloVe 100d
outputs/conll2003_glove100_lower_tuned # 最终最佳配置
每个正式输出目录中保存:
best_model.pt:验证集 F1 最好的模型参数;metrics.json:训练历史、最佳验证集 F1 和测试集指标;vocab.json:词表;char_vocab.json:字符表;label_to_id.json:标签映射。
基础实验使用 datasets 加载 CoNLL-2003,并训练随机初始化词向量的 Char-CNN + BiLSTM + CRF 模型:
python3 src/train_ner.py \
--dataset_name conll2003 \
--epochs 8 \
--batch_size 32 \
--output_dir outputs/conll2003_char_crf_fullpython3 src/train_ner.py \
--dataset_name conll2003 \
--epochs 20 \
--batch_size 32 \
--pretrained_embeddings embeddings/glove.6B.100d.txt \
--output_dir outputs/conll2003_glove当前最佳复现实验命令如下:
python3 src/train_ner.py \
--dataset_name conll2003 \
--epochs 30 \
--batch_size 32 \
--pretrained_embeddings embeddings/glove.6B.100d.txt \
--lower \
--dropout 0.5 \
--word_dropout 0.05 \
--lr 0.003 \
--lr_decay_patience 3 \
--lr_decay_factor 0.5 \
--early_stop_patience 8 \
--no_progress \
--output_dir outputs/conll2003_glove100_lower_tuned关闭字符特征和 CRF,退化到普通 BiLSTM-softmax:
python3 src/train_ner.py \
--dataset_name conll2003 \
--no_char \
--no_crf \
--epochs 8 \
--batch_size 32 \
--output_dir outputs/bilstm_softmax| 模型 | Precision | Recall | F1 | Token Acc |
|---|---|---|---|---|
| BiLSTM-softmax(初始实现) | 0.5611 | 0.7311 | 0.6349 | 0.9127 |
| Char-CNN + BiLSTM + CRF | 0.8010 | 0.8189 | 0.8098 | 0.9609 |
| Char-CNN + BiLSTM + CRF + GloVe 100d | 0.8644 | 0.8252 | 0.8444 | 0.9669 |
| Char-CNN + BiLSTM + CRF + GloVe 100d + 调参 | 0.8699 | 0.8456 | 0.8576 | 0.9708 |
最佳配置在验证集上达到:
best_epoch = 5
valid_f1 = 0.9192
对应测试集结果为:
precision = 0.8699
recall = 0.8456
f1 = 0.8576
token_acc = 0.9708
| 方法 | CoNLL-2003 F1 |
|---|---|
| Lample et al. (2016) BiLSTM-CRF + character representation + pretrained embeddings | 90+ |
| Ma & Hovy (2016) BiLSTM-CNNs-CRF | 91.21 |
| 本实验最佳结果 | 85.76 |
当前实现已经对齐了参考论文的主要结构:字符级表示、BiLSTM、CRF 和预训练词向量。但测试集 F1 仍低于论文结果,说明在词向量来源、训练细节、超参数搜索、随机种子稳定性以及官方评测脚本对齐方面仍有改进空间。
从初始 BiLSTM-softmax 到 Char-CNN + BiLSTM + CRF,测试集 F1 从 0.6349 提升到 0.8098,提升约 17.49 个百分点。主要原因是:
- 字符 CNN 能捕获大小写、后缀和词形信息,对未登录词和罕见实体更友好;
- CRF 能显式建模 BIO 标签转移,减少非法或不合理标签序列;
- BiLSTM 提供上下文表示,适合判断实体边界和类型。
直接加入 GloVe 100d 后,测试集 F1 从 0.8098 提升到 0.8444。继续加入 --lower、更强 dropout、singleton word dropout、学习率衰减和 early stopping 后,测试集 F1 进一步提升到 0.8576。
--lower 对本实验很关键,因为 GloVe 6B 是小写词表。lowercase 后词表规模从约 23625 降到约 21011,预训练向量覆盖更集中;字符 CNN 仍保留原始 token 的字符信息,因此大小写特征没有完全丢失。
当前最佳测试集 F1 为 85.76,验证集最佳 F1 为 91.92,二者仍存在约 6.16 个百分点差距,说明泛化能力仍有提升空间。后续可以尝试:
- 多随机种子训练并报告平均值;
- 使用官方
conlleval脚本复核指标; - 尝试 SENNA、fastText 等其他预训练词向量;
- 将 Char-CNN 替换或对比为 Char-BiLSTM;
- 对 dropout、学习率、word dropout、batch size 做更系统的搜索;
- 加入合法 BIO 转移约束,进一步限制 CRF 解码空间。
本实验基于 PyTorch 完成了 CoNLL-2003 英文命名实体识别系统,实现了从数据读取、词表构建、模型训练、验证集选择最佳模型到测试集评估的完整流程。
实验表明,初始 BiLSTM-softmax 虽然能完成基本序列标注,但实体级 F1 较低。加入字符 CNN 和 CRF 后,模型性能明显提升;进一步引入 GloVe 100d、lowercase、dropout、singleton word dropout、学习率衰减和 early stopping 后,测试集 F1 达到 0.8576。
与 Ma & Hovy (2016) 和 Lample et al. (2016) 的 90+ F1 相比,本实验仍有差距,但模型结构已经对齐参考论文的核心思路,实验结果也验证了字符级特征、CRF 解码和预训练词向量对 NER 任务的有效性。
项目已开源 https://github.com/ChriCheng/RNNRecon
- Ma X, Hovy E. End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF. ACL, 2016. https://arxiv.org/pdf/1603.01354.pdf
- Lample G, Ballesteros M, Subramanian S, et al. Neural Architectures for Named Entity Recognition. NAACL, 2016. https://arxiv.org/pdf/1603.01360.pdf
- Tjong Kim Sang E F, De Meulder F. Introduction to the CoNLL-2003 Shared Task: Language-Independent Named Entity Recognition. CoNLL, 2003.
- Pennington J, Socher R, Manning C D. GloVe: Global Vectors for Word Representation. EMNLP, 2014.