spaCy Projects 示例实战指南:基于 examples 从零训练、评估并打包 NLP 流水线
2026/9/10 21:38:44 网站建设 项目流程

spaCy Projects 示例实战指南:基于 examples 从零训练、评估并打包 NLP 流水线

【免费下载链接】spaCy💫 Industrial-strength Natural Language Processing (NLP) in Python项目地址: https://gitcode.com/GitHub_Trending/sp/spaCy

导读:本指南以仓库中 examples/README.md 为骨架,系统讲解 spaCy v3 如何将传统 v2 示例脚本升级为端到端的 spaCy Projects 工作流。你将掌握spacy project clone / assets / run / push / pull / document等核心命令的完整用法,并能跟随ner_demo项目,从克隆模板、下载数据资产、生成配置、训练 NER 模型,一直到打包发布与可视化,跑通"数据 → 训练 → 评估 → 打包"的全链路。

从 v2 示例脚本到 v3 Projects 工作流

spaCy 在 v3 版本中对示例代码的组织方式做了一次重要演进。在 v2.x 中,训练示例以独立的 Python 脚本形式存在(例如经典的train_ner.py),用户需要自己管理数据格式转换、配置、训练、评估等步骤,脚本之间缺乏统一的可复用结构。

v3 的解法是引入spaCy Projects:一种基于project.yml声明的标准化工作流,把"原始数据 → 训练语料 → 配置生成 → 训练 → 评估 → 打包"的每一个环节拆解为可复现、可共享、可自动跳过的命令。仓库中的 examples/README.md 明确说明:

For spaCy v3 we've converted many of the v2 example scripts into end-to-end spacy projects workflows. The workflows include all the steps to go from data to packaged spaCy models.

也就是说,本仓库examples/目录的意义不在于存放大量可运行脚本,而在于引导你进入 v3 的项目化训练体系——这也是阅读本指南时最需要建立的认知转变:训练一个模型不再靠"复制粘贴脚本",而是靠"克隆项目模板 + 运行声明式工作流"。

examples 目录概览

仓库中的 examples/ 目录结构非常精简:

  • examples/README.md:主文档,介绍 demo 项目、教程项目与 ner_demo 端到端实战;
  • examples/training/README.md:v2 时代的训练示例目录,其内容目前仅一句话指引读者返回主 README(See examples/README.md),进一步印证了 v2 脚本已被 v3 Projects 全面取代。

如果你手里还持有 v2 的.json训练数据或.iob标注数据,无需手工转换——仓库的 extra/example_data/ 提供了可直接用于练习的示例数据及其转换说明,本文最后一节会专门介绍。

可用的示例项目:Pipeline demos 与 Tutorials

🪐 单组件训练 demo(pipelines)

最简单的入门路径是训练单个流水线组件,官方维护的pipelines分类下包含:

项目训练目标典型用途
pipelines/ner_demo命名实体识别器(NER)从零训练一个实体识别组件
pipelines/textcat_demo文本分类器(textcat)训练一个文本分类组件
pipelines/parser_intent_demo依存句法解析器为自定义语义训练依存解析器

这类 demo 的优点是流程短、依赖少,适合首次接触 spaCy Projects 的用户快速建立"配置 → 训练 → 评估"的整体直觉。

🪐 端到端教程(tutorials)

tutorials分类则面向完整的 NLP 应用场景,在单组件之上叠加了更真实的业务逻辑:

项目核心任务场景亮点
tutorials/textcat_goemotions文本分类对 Reddit 帖子进行情绪分类,体现多标签分类
tutorials/nel_emerson实体链接(NEL)使用实体链接器消歧同名实体指代,涉及知识库(KB)的使用

这两个教程分别对应仓库中textcat(spacy/pipeline/textcat.py)与entity_linker(spacy/pipeline/entity_linker.py)两个可训练组件,适合在跑通 demo 后进阶。

实战:ner_demo 端到端工作流

pipelines/ner_demo是 v2 时代train_ner.py演示脚本在 v3 中的项目化形态。下面按官方文档的五个步骤完整执行一遍。

Step 1:克隆项目模板

python -m spacy project clone pipelines/ner_demo

spacy project clone会从预置的项目仓库中拉取pipelines/ner_demo模板到当前目录(默认生成同名目录ner_demo/)。从源码看,该命令由 spacy/cli/project/clone.py 导出,实际实现来自 spaCy 底层的工作流引擎weaselfrom weasel.cli.clone import *)。如需从私有仓库克隆,可像文档描述的那样追加--repo参数指定仓库地址。

Step 2:安装依赖并下载数据资产

cd ner_demo python -m pip install -r requirements.txt python -m spacy project assets
  • requirements.txt由项目模板自带,声明训练所需依赖(如spacystreamlit等);
  • spacy project assets依据project.ymlassets段的 URL 声明下载原始数据(如 NER 标注的 JSON 语料),并校验文件哈希。实现见 spacy/cli/project/assets.py(同样转发自weasel.cli.assets)。

提示assets段的extra: true字段可把某些数据标记为"可选资源"——它们不会随默认assets下载,只有显式执行python -m spacy project assets --extra才会拉取。这在数据体积大或非必需时会很有用。

Step 3:运行默认工作流(转换、生成配置、训练、评估)

python -m spacy project run all

allproject.ymlworkflows段定义的默认工作流,通常串联了convertcreate-configtrain等命令。命令执行器实现见 spacy/cli/project/run.py。文档给出了真实的运行输出,逐段解读如下:

① convert:将 JSON 训练数据转为二进制.spacy格式

================================== convert ================================== Running command: /home/user/venv/bin/python scripts/convert.py en assets/train.json corpus/train.spacy Running command: /home/user/venv/bin/python scripts/convert.py en assets/dev.json corpus/dev.spacy

.spacy是 v3 训练语料的二进制容器(内部为DocBin),相比 JSON 加载更快、序列化更紧凑。转换逻辑可对应仓库 spacy/cli/convert.py;示例 IOB/JSON 数据及转换命令见 extra/example_data/ner_example_data/README.md。

② create-config:自动生成训练配置

=============================== create-config =============================== Running command: /home/user/venv/bin/python -m spacy init config --lang en --pipeline ner configs/config.cfg --force ℹ Generated config template specific for your use case - Language: en - Pipeline: ner - Optimize for: efficiency - Hardware: CPU - Transformer: None ✔ Auto-filled config with all values ✔ Saved config configs/config.cfg You can now add your data and train your pipeline: python -m spacy train config.cfg --paths.train ./train.spacy --paths.dev ./dev.spacy

spacy init config(实现见 spacy/cli/init_config.py)会根据语言、流水线组件、优化目标(efficiency/accuracy)、硬件(CPU/GPU)等参数渲染一份完整配置。模板源文件是 spacy/cli/templates/quickstart_training.jinja,它编码了多项最佳实践,例如:GPU 场景自动写入gpu_allocator = "pytorch"并使用更大的 batch size(GPU 128 / CPU 1000);含 NER、tagger、parser 等组件时自动前置tok2vec(或 Transformer)作为共享特征提取层;有 textcat 等组件时还会判断其是否需要特征输入。

③ train:训练流水线

=================================== train =================================== Running command: /home/user/venv/bin/python -m spacy train configs/config.cfg --output training/ --paths.train corpus/train.spacy --paths.dev corpus/dev.spacy --training.eval_frequency 10 --training.max_steps 100 --gpu-id -1 ℹ Using CPU =========================== Initializing pipeline =========================== [2021-03-11 19:34:59,101] [INFO] Set up nlp object from config [2021-03-11 19:34:59,109] [INFO] Pipeline: ['tok2vec', 'ner'] [2021-03-11 19:34:59,113] [INFO] Created vocabulary [2021-03-11 19:34:59,113] [INFO] Finished initializing nlp object [2021-03-11 19:34:59,265] [INFO] Initialized pipeline components: ['tok2vec', 'ner'] ✔ Initialized pipeline ============================= Training pipeline ============================= ℹ Pipeline: ['tok2vec', 'ner'] ℹ Initial learn rate: 0.001 E # LOSS TOK2VEC LOSS NER ENTS_F ENTS_P ENTS_R SCORE --- ------ ------------ -------- ------ ------ ------ ------ 0 0 0.00 7.90 0.00 0.00 0.00 0.00 10 10 0.11 71.07 0.00 0.00 0.00 0.00 20 20 0.65 22.44 50.00 50.00 50.00 0.50 30 30 0.22 6.38 80.00 66.67 100.00 0.80 40 40 0.00 0.00 80.00 66.67 100.00 0.80 50 50 0.00 0.00 80.00 66.67 100.00 0.80 60 60 0.00 0.00 100.00 100.00 100.00 1.00 70 70 0.00 0.00 100.00 100.00 100.00 1.00 80 80 0.00 0.00 100.00 100.00 100.00 1.00 90 90 0.00 0.00 100.00 100.00 100.00 1.00 100 100 0.00 0.00 100.00 100.00 100.00 1.00 ✔ Saved pipeline to output directory training/model-last

这段输出信息量很大,值得逐项解读:

  • 流水线构成Pipeline: ['tok2vec', 'ner']——tok2vec负责把词序列编码为上下文相关的向量表示,ner组件在其之上做实体边界与类别预测;
  • 训练参数:demo 项目为了演示速度,把eval_frequency(评估频率,每 10 步评估一次)与max_steps(最大步数 100)调小,gpu-id -1表示强制使用 CPU;
  • 指标含义ENTS_F / ENTS_P / ENTS_R分别是 NER 的 F1、精确率、召回率,SCORE是综合得分(此处等于 ENTS_F)。注意训练日志前 10 步各项为 0,是模型尚未收敛的常见现象;LOSS TOK2VECLOSS NER则反映两个组件的损失下降趋势;
  • 产物位置:训练结束后流水线保存到training/model-last(若中途出现更优模型,还会产出model-best),可用nlp = spacy.load("training/model-best")直接加载。

如果你希望完全掌控训练细节,也可以不依赖create-config,直接参照上文中spacy train的提示命令手动执行训练,训练入口实现见 spacy/cli/train.py。

Step 4:打包模型为 Python 包

python -m spacy project run package

该命令调用spacy package(实现见 spacy/cli/package.py),把training/model-best连同metas/下的元数据模板(meta.json)打包成一个可分发的 Python 包(wheel),产出到packages/目录。打包后的模型即可通过pip install安装并在其他项目中使用。

Step 5:可视化模型输出

python -m spacy project run visualize-model

demo 项目内置了一个基于 Streamlit 的可视化命令:加载训练好的模型,对示例文本进行 NER 预测,并在浏览器中高亮展示实体标注结果。这是快速验收模型效果的最直观方式。

深入:Projects 的底层结构与可扩展机制

一个典型项目目录长什么样

参考 website/docs/usage/projects.mdx 中给出的约定,ner_demo这类项目克隆到本地后通常具备以下布局:

├── project.yml # 项目设置(唯一必需文件) ├── project.lock # 记录命令输入/输出的锁文件,用于跳过未变化的任务 ├── assets/ # 下载的数据资产 ├── configs/ # 训练用 config.cfg ├── corpus/ # 训练语料(.spacy)输出目录 ├── metas/ # 打包用 meta.json 模板 ├── metrics/ # 评估指标输出目录 ├── packages/ # 打包后的模型 Python 包 ├── scripts/ # 自定义脚本(如 convert.py) ├── training/ # 训练产物(model-best / model-last) └── requirements.txt # 项目依赖

其中project.lock是 Projects 实现"增量执行"的关键:命令的deps(依赖文件)与outputs(输出文件)被记录在锁文件中,若输入未变化且输出已存在,命令会被自动跳过,从而避免重复训练。若想强制重跑,可追加--force参数。

project.yml 的四个核心段

  • assets:声明远程数据资源(URL、目标路径、可选的checksum哈希校验与extra标记),由spacy project assets消费;
  • commands:声明可执行命令(namescriptdepsoutputsno_skip)。例如定义一个test命令调用pytest验证训练产物,并把training/model-best设为依赖以保证其在运行前存在;设置no_skip: true可让该命令每次强制执行(测试不应被跳过);
  • workflows:把多个命令编排成一条工作流(如all: [convert, create-config, train]),一次spacy project run all串行执行;
  • vars/env:变量注入机制。vars定义项目内变量(如${vars.batch_size}),命令行可用--vars.batch_size覆盖;env则把系统环境变量(如GPU_IDBATCH_SIZE)透传给命令脚本,例如BATCH_SIZE=128 python -m spacy project run evaluate

实现细节:命令中的python/pip会被 spaCy 自动替换为当前解释器的sys.executable,保证始终使用同一个 Python 环境执行(见 website/docs/usage/projects.mdx 中的说明)。

团队协作:push / pull / document

Projects 还支持把产物托管到远程存储(如云存储桶),便于团队共享已训练模型或中间结果:

  • spacy project push:把命令的outputs上传到远程(见 spacy/cli/project/push.py);
  • spacy project pull:拉取远程产物(见 spacy/cli/project/pull.py),配合锁文件,队友无需重训即可复用模型;
  • spacy project document --output README.md:根据project.yml自动生成项目说明文档(见 spacy/cli/project/document.py),保持项目文档与配置同步;
  • 若项目使用 DVC 管理数据版本,spacy project dvc系列命令可生成对应的 DVC 配置(见 spacy/cli/project/dvc.py)。

从源码结构看,spacy/cli/project/下的每个命令模块(clone.py、assets.py、run.py 等)都只是一行from weasel.cli.* import *,即全部复用 weasel 工作流引擎的实现;同时它们在 spacy/cli/init.py 中被注册为project_assetsproject_cloneproject_runproject_documentproject_update_dvcproject_pullproject_push等 CLI 子命令,统一挂载在python -m spacy入口下。

配套示例数据:快速自测 NER 与 textcat

如果你不想立刻克隆远程项目,仓库 extra/example_data/ 自带了两套可直接用于练习的标注数据:

NER / IOB 数据(extra/example_data/ner_example_data/README.md)——提供ner-token-per-line.iobner-sent-per-line.iobner-token-per-line-conll2003.iob等多种格式的 IOB 文件及对应的 v2 JSON 版本,可用以下命令转换为 v3 的.spacy格式:

python -m spacy convert -c iob -s -n 10 -b en_core_web_sm file.iob . python -m spacy convert file.json .

-c iob指定输入格式为 IOB,-b en_core_web_sm指定用于提供词向量的基础模型,-n 10限制前 10 条示例。)

文本分类数据(extra/example_data/textcat_example_data/README.md)——包含两类典型标注形态:

  • cooking.json:互斥标签(baking/not_baking),对应单标签 textcat;
  • jigsaw-toxic-comment.json:多标签数据(insult/obscene/severe_toxic/toxic),对应textcat_multilabel组件的训练场景(实现见 spacy/pipeline/textcat_multilabel.py)。

这两套数据配合 spacy/cli/convert.py 与spacy train,足以在本地复现 ner_demo / textcat_demo 的核心训练流程。

小结

examples/README.md表面上是示例索引,实际上承载了 spaCy v3 最重要的方法论转变:用声明式、可复现、可共享的 Projects 取代零散的示例脚本。通过 ner_demo 的五步实战(clone → assets → run all → package → visualize-model),你可以完整掌握从数据到打包模型的全部环节;而project.ymlassets / commands / workflows / vars / env分段、push / pull / document协作命令,以及仓库源码中 weasel 引擎与init_config配置模板的支撑,则为你在真实项目中搭建、复用和分发训练流水线提供了坚实基础。

后续若想深入了解,推荐继续阅读仓库内的 website/docs/usage/projects.mdx(Projects 完整文档)、spacy/cli/templates/quickstart_training.jinja(训练配置模板最佳实践)以及 spacy/cli/init_config.py(配置生成实现)。

【免费下载链接】spaCy💫 Industrial-strength Natural Language Processing (NLP) in Python项目地址: https://gitcode.com/GitHub_Trending/sp/spaCy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询