spaCy v3.0发布:革新NLP工作流与Transformer集成

Introducing spaCy v3.0

spaCy v3.0 是一次重大发布!它引入了全新的基于 Transformer 的管道,将 spaCy 的准确性提升至当前最先进水平,并配备了新的工作流系统,帮助您将项目从原型推进到生产环境。配置和训练您的管道变得更加容易,并且与 NLP 生态系统的其他部分有了许多新的和改进的集成。

我们开发 spaCy v3.0 已超过一年,如果算上投入 Thinc 的所有工作,则已近两年。本次发布的主要目标是让您更轻松地将自己的模型,特别是像 Transformer 这样的最先进模型,集成到 spaCy 中。您可以使用我们的全新配置系统,在 PyTorch 或 TensorFlow 等框架中编写驱动 spaCy 组件的模型,来描述所有设置。由于现代 NLP 工作流通常包含多个步骤,因此推出了新的工作流系统来帮助您有条理地组织工作。

有关您平台和设置的具体安装说明,请查看安装快速入门部件。

pip install -U spacy

基于 Transformer 的管道

spaCy v3.0 引入了全新的基于 Transformer 的管道,将 spaCy 的准确性提升至当前最先进水平。您可以使用任何预训练的 Transformer 来训练自己的管道,甚至可以通过多任务学习在多个组件之间共享一个 Transformer。spaCy 的 Transformer 支持与 PyTorch 和 HuggingFace transformers 库交互操作,让您能够为管道访问成千上万的预训练模型。请参阅下方新管道概览。

Pipeline Parser Tagger NER

  • en_core_web_trf (spaCy v3) 95.5 98.3 89.4
  • en_core_web_lg (spaCy v3) 92.2 97.4 85.4
  • en_core_web_lg (spaCy v2) 91.9 97.2 85.5

准确性基于 OntoNotes 5.0 语料库(在开发集上报告)。

Named Entity Recognition System OntoNotes CoNLL '03

  • spaCy RoBERTa (2020) 89.7 91.6
  • Stanza (StanfordNLP)¹ 88.8 92.1
  • Flair² 89.7 93.1

在 OntoNotes 5.0 和 CoNLL-2003 语料库上的命名实体识别准确性。更多结果请参见 NLP-progress。项目模板:benchmarks/ner_conll03。
1. Qi 等人 (2020)。2. Akbik 等人 (2018)。

spaCy 允许您在多个组件之间共享单个 Transformer 或其他 token-to-vector(“tok2vec”)嵌入层。您甚至可以更新共享层,执行多任务学习。在组件之间重用嵌入层可以使您的管道运行速度更快,并生成更小的模型。

一个包含共享嵌入层的管道,组件可以通过监听器“连接”到该层

您可以在管道起始位置附近添加一个 Transformer 或 Tok2Vec 组件,从而在多个组件之间共享单个 Transformer 或其他 token-to-vector 模型。管道中靠后的组件可以通过在其模型中包含一个监听器层来“连接”到它。

了解更多
基准测试
下载训练好的管道

新的训练好的管道

spaCy v3.0 为 18 种语言提供了重新训练的模型系列,总共有 59 个训练好的管道,包括 5 个新的基于 Transformer 的管道。您也可以使用自己的数据和选择的 Transformer 权重来训练自己的基于 Transformer 的管道。

Package Language Transformer Tagger Parser NER

  • en_core_web_trf English roberta-base 97.8 95.2 89.9
  • de_dep_news_trf German bert-base-german-cased 99.0 95.8 -
  • es_dep_news_trf Spanish bert-base-spanish-wwm-cased 98.2 94.6 -
  • fr_dep_news_trf French camembert-base 95.7 94.4 -
  • zh_core_web_trf Chinese bert-base-chinese 92.5 76.6 75.4

这些模型每个都使用在整个管道中共享的单个 Transformer 进行训练,这要求必须在单个语料库上进行训练。对于英语和中文,使用了 OntoNotes 5 语料库,它在多个任务上都有标注。对于法语、西班牙语和德语,没有同时包含句法和实体标注的合适语料库,因此这些语言的 Transformer 模型不包括 NER 功能。

下载管道

新的训练工作流和配置系统

spaCy v3.0 引入了一个全面且可扩展的系统来配置训练过程。一个配置文件描述了训练过程的每个细节,没有隐藏的默认值,使得重新运行实验和跟踪变更变得容易。

快速入门部件自动为您的特定用例和设置生成启动配置

可以使用快速入门部件或 init config 命令开始使用。您无需在命令行提供大量参数,只需将 config.cfg 文件传递给 spacy train 即可。

训练配置文件包含训练管道所需的所有设置和超参数。某些设置也可以是注册的函数,您可以进行交换和自定义,从而轻松实现自己的自定义模型和架构。

config.cfg
[training]
accumulate_gradient = 3

[training.optimizer]
@optimizers = "Adam.v1"

[training.optimizer.learn_rate]
@schedules = "warmup_linear.v1"
warmup_steps = 250
total_steps = 20000
initial_rate = 0.01

spaCy 训练配置的主要优势和特点包括:

  • 结构化部分:配置按部分分组,嵌套部分使用 . 符号定义。例如,[components.ner] 定义了管道的命名实体识别器设置。配置可以加载为 Python 字典。
  • 对注册函数的引用:部分可以引用注册函数,如模型架构、优化器或调度程序,并定义传递给它们的参数。您也可以注册自己的函数来定义自定义架构或方法,在配置中引用它们并调整其参数。
  • 插值:如果有多个组件使用的超参数或其他设置,可以定义一次,并将其作为变量引用。
  • 无隐藏默认值的可重复性:配置文件是“唯一的真相来源”,包含所有设置。
  • 自动检查和验证:加载配置时,spaCy 会检查设置是否完整以及所有值是否具有正确的类型。这有助于及早发现潜在的错误。在自定义架构中,可以使用 Python 类型提示来告诉配置期望的数据类型。

了解更多

使用任何框架的自定义模型

spaCy 的新配置系统使得自定义不同管道组件使用的神经网络模型变得容易。您还可以通过 spaCy 的机器学习库 Thinc 实现自己的架构,该库提供了各种层、实用程序以及对 PyTorch、TensorFlow 和 MXNet 等框架的轻量级包装。组件模型都遵循统一模型 API,每个模型也可以用作更大网络的子层,允许您将来自不同框架的实现自由组合到单个模型中。

包装 PyTorch 模型

from torch import nn
from thinc.api import PyTorchWrapper

torch_model = nn.Sequential(
    nn.Linear(32, 32),
    nn.ReLU(),
    nn.Softmax(dim=1)
)
model = PyTorchWrapper(torch_model)

了解更多

使用项目管理端到端工作流

spaCy 项目让您能够管理和共享针对不同用例和领域的端到端 spaCy 工作流,并编排自定义管道的训练、打包和服务。您可以从克隆预定义的项目模板开始,调整以适应需求,加载数据,训练管道,将其导出为 Python 包,将输出上传到远程存储,并与团队共享结果。

spaCy 项目还使得与数据科学和机器学习生态系统中的其他工具集成变得容易,包括用于数据版本控制的 DVC,用于创建标记数据的 Prodigy,用于构建交互式应用程序的 Streamlit,用于在生产中服务模型的 FastAPI,用于并行训练的 Ray,用于实验跟踪的 Weights & Biases 等等!

使用 spaCy 项目

# 克隆项目模板
python -m spacy project clone pipelines/tagger_parser_ud
cd tagger_parser_ud

# 下载数据资产
python -m spacy project assets

# 运行工作流
python -m spacy project run all

选定的示例模板
要克隆模板,可以运行 spacy project clone 命令及其相对路径,例如 python -m spacy project clone pipelines/ner_wikiner。

  • pipelines/tagger_parser_ud:在通用依赖树库上训练标记器和解析器。
  • pipelines/ner_wikiner:在 WikiNER 语料库上训练命名实体识别模型。
  • tutorials/textcat_goemotions:对 Reddit 帖子中的情绪进行文本分类。
  • integrations/fastapi:使用 FastAPI 服务训练好的管道。
  • integrations/streamlit:使用 Streamlit 可视化和探索训练好的管道。

了解更多
项目模板

使用 Weights & Biases 跟踪结果

Weights & Biases 是一个流行的实验跟踪平台。spaCy 通过 WandbLogger 与其开箱即用地集成,您可以将其作为 training.logger 块添加到训练配置中。

使用 config.cfg 中定义的所有配置值(包括注册函数)的参数重要性

然后,每个步骤的结果都会与完整的训练配置一起记录在您的项目中。这意味着每个超参数、注册函数名和参数都将被跟踪,您将能够看到它对结果的影响。

config.cfg
[training.logger]
@loggers = "spacy.WandbLogger.v1"
project_name = "monitor_spacy_training"
remove_config_values = ["paths.train", "paths.dev", "training.dev_corpus.path", "training.train_corpus.path"]

使用 Ray 进行并行和分布式训练

Ray 是一个用于构建和运行分布式应用程序的快速且简单的框架。您可以使用 Ray 在一台或多台远程机器上训练 spaCy,从而可能加快训练过程。

该集成由一个轻量级扩展包 spacy-ray 提供支持,如果它与 spaCy 安装在同一个环境中,它会自动将 ray 命令添加到 spaCy CLI。然后您可以运行 spacy ray train 进行并行训练。

使用 Ray 进行并行训练

pip install spacy-ray --pre
# 检查 CLI 是否已注册
python -m spacy ray --help
# 训练管道
python -m spacy ray train config.cfg --n-workers 2

了解更多
spacy-ray

新的内置管道组件

spaCy v3.0 包含了几个新的可训练和基于规则的组件,您可以将其添加到管道中并为您的用例进行自定义:

  • SentenceRecognizer:用于句子分割的可训练组件。
  • Morphologizer:用于预测形态特征的可训练组件。
  • Lemmatizer:用于基于规则和查找词形还原的独立组件。
  • AttributeRuler:用于使用匹配模式设置 token 属性的组件。
  • Transformer:用于在管道中使用 Transformer 模型、访问输出和对齐 token 的组件。通过 spacy-transformers 提供。

新的和改进的管道组件 API

现在定义、配置、重用、训练和分析管道组件变得更加容易和方便。@Language.component 和 @Language.factory 装饰器允许您注册组件并定义其默认配置和元数据,例如它分配和需要的属性值。任何自定义组件都可以在训练期间包含在内,并且从现有训练好的管道中获取组件可以让您混合搭配自定义管道。nlp.analyze_pipes 方法输出有关当前管道及其组件的结构化信息,包括它们分配的属性、在训练期间计算的分数以及是否有任何必需属性未设置。

import spacy
from spacy.language import Language

@Language.component("my_component")
def my_component(doc):
    return doc

nlp = spacy.blank("en")
# 使用字符串名称添加组件
nlp.add_pipe("my_component")
# 从其他管道获取组件
other_nlp = spacy.load("en_core_web_sm")
nlp.add_pipe("ner", source=other_nlp)
# 分析组件及其属性
nlp.analyze_pipes(pretty=True)

了解更多

依赖匹配

新的 DependencyMatcher 允许您使用 Semgrex 运算符在依存解析树中匹配模式。它遵循与基于 token 的 Matcher 相同的 API。添加到依赖匹配器的模式由字典列表组成,每个字典描述一个要匹配的 token 及其与模式中现有 token 的关系。

import spacy
from spacy.matcher import DependencyMatcher

nlp = spacy.load("en_core_web_sm")
matcher = DependencyMatcher(nlp.vocab)
pattern = [
    {"RIGHT_ID": "anchor_founded", "RIGHT_ATTRS": {"ORTH": "founded"}},
    {"LEFT_ID": "anchor_founded", "REL_OP": ">", "RIGHT_ID": "subject", "RIGHT_ATTRS": {"DEP": "nsubj"}},
    {"LEFT_ID": "anchor_founded", "REL_OP": ">", "RIGHT_ID": "founded_object", "RIGHT_ATTRS": {"DEP": "dobj"}},
    {"LEFT_ID": "founded_object", "REL_OP": ">", "RIGHT_ID": "founded_object_modifier", "RIGHT_ATTRS": {"DEP": {"IN": ["amod", "compound"]}}}
]
matcher.add("FOUNDED", [pattern])
doc = nlp("Lee, an experienced CEO, has founded two AI startups.")
matches = matcher(doc)

了解更多

类型提示和基于类型的数据验证

spaCy v3.0 正式放弃对 Python 2 的支持,现在需要 Python 3.6+。这也意味着代码库可以充分利用类型提示。spaCy 面向用户的纯 Python 实现 API(相对于 Cython)现在配备了类型提示。spaCy 机器学习库 Thinc 的新版本也提供了广泛的类型支持,包括用于模型和数组的自定义类型,以及可用于类型检查模型定义的自定义 mypy 插件。

对于数据验证,spaCy v3.0 采用了 pydantic。它还支持 Thinc 配置系统的数据验证,允许您注册带有类型参数的自定义函数,在配置中引用它们,并在参数值不匹配时查看验证错误。

使用类型提示进行参数验证

from spacy.language import Language
from pydantic import StrictBool

@Language.factory("my_component")
def create_component(nlp: Language, name: str, custom: StrictBool):
   ...

了解更多

资源

  • 发布说明:官方 GitHub 发布
  • spaCy v3.0:使用文档和 API 参考
  • spaCy v3.0 的新功能:新功能和所有变更
  • GitHub 上的 spaCy:存储库和问题跟踪器
  • 从 v2.x 迁移到 v3.x 的指南:如何更新代码
  • spaCy 模型目录:下载训练好的管道
  • spaCy 项目模板:端到端 NLP 工作流
  • 视频教程:YouTube 上更深入的 spaCy 内容
    更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
    对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

posted @ 2026-01-08 07:59  CodeShare  阅读(2)  评论(0)    收藏  举报