如何在spaCy 3.0中微调基于en_core_web_trf的NER命名实体识别模型
spaCy 3.0 微调en_core_web_trf NER模型操作步骤
1. 环境准备
先安装所需依赖并下载基础模型:
pip install "spacy[transformers]" python -m spacy download en_core_web_trf
2. 标注数据格式转换
你需要把自己标注的NER数据转换为spaCy专属的.spacy二进制格式,可以参考以下示例脚本完成转换:
import spacy from spacy.tokens import DocBin nlp = spacy.blank("en") # 这里替换为你自己的标注数据,格式为(文本, 实体列表),实体列表每个元素是(起始位置, 结束位置, 实体类型) train_data = [ ("苹果公司总部位于加州", [(0, 4, "ORG"), (7, 9, "GPE")]), # 更多标注数据... ] db = DocBin() for text, annotations in train_data: doc = nlp.make_doc(text) ents = [] for start, end, label in annotations: span = doc.char_span(start, end, label=label) if span is not None: ents.append(span) doc.ents = ents db.add(doc) # 保存为训练集文件,验证集也用同样逻辑生成 db.to_disk("./train.spacy")
3. 编写训练配置文件
spaCy 3.0 采用配置文件驱动训练流程,你可以先生成基础配置再做针对性修改:
- 先执行命令生成基础配置:
python -m spacy init config base_config.cfg --lang en --pipeline transformer,ner --optimize accuracy
- 修改base_config.cfg的核心配置项:
[components.ner] source = "en_core_web_trf" # 加载预训练模型的NER权重作为初始化 [components.transformer] source = "en_core_web_trf" # 复用预训练的Transformer权重 [training] train = "./train.spacy" dev = "./dev.spacy" learning_rate = 2e-5 # Transformer微调学习率控制在1e-5~5e-5区间 max_epochs = 20 # 若要先冻结Transformer层训练NER头,可加以下配置,前几轮训完再注释掉解冻训练 # frozen_components = ["transformer"]
- 补全配置文件默认参数:
python -m spacy init fill-config base_config.cfg config.cfg
4. 启动训练
执行以下命令启动训练,有GPU的话将--gpu-id设为0,无GPU设为-1:
python -m spacy train config.cfg --output ./ner_model_output --gpu-id 0
训练完成后效果最好的模型会保存在./ner_model_output/model-best路径下。
5. 测试微调后模型
import spacy nlp = spacy.load("./ner_model_output/model-best") doc = nlp("你要测试的文本内容") for ent in doc.ents: print(f"实体文本:{ent.text},实体类型:{ent.label_}")
注意事项
- 微调时学习率不要设置过高,否则会破坏预训练模型已经学到的通用语义特征,导致过拟合
- 如果你的自定义实体和原
en_core_web_trf支持的实体类型有重叠,建议保留部分原实体的标注数据加入训练集,避免灾难性遗忘 - 训练前需要检查标注数据是否存在冲突、边界错误等问题,错误标注会大幅降低模型训练效果
内容的提问来源于stack exchange,提问作者Sai Prashanth
相关产品推荐
相关产品推荐

