You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SpaCy config.cfg中注册自定义组件?解决[E002]报错

解决SpaCy自定义无状态组件sentence_splitter找不到工厂的问题

问题场景

我基于SpaCy实现了两个自定义组件:

  • sentence_splitter:通过@Language.component装饰的无状态组件
  • matcher:通过@Language.factory装饰的有状态组件

已在config.cfg中完成两个组件的配置,但执行以下命令时均触发错误:

spacy debug config config.cfg
spacy train config.cfg --output ./output

错误信息:

ValueError: [E002] Can't find factory for 'sentence_splitter'

原因分析

SpaCy的配置加载逻辑对两种组件的处理方式不同:

  • 用@Language.factory注册的有状态组件,会自动关联工厂函数,因此可以直接在config中用factory = "组件名"配置
  • 用@Language.component注册的无状态组件,没有对应的工厂函数,无法通过factory字段加载,必须明确指定组件的来源路径或提前加载组件代码

解决方案

以下两种方法任选其一即可解决问题:

方法1:训练时通过--code参数加载组件代码

执行命令时,通过--code指定包含自定义组件的Python文件路径,让SpaCy在加载配置前先注册组件:

# 验证配置
spacy debug config config.cfg --code your_components.py

# 启动训练
spacy train config.cfg --output ./output --code your_components.py

替换your_components.py为你实际存放组件代码的文件名。

方法2:修改config.cfg指定组件来源

假设你的组件代码在my_components.py文件中,且sentence_splitter注册时指定了明确名称:

import spacy
from spacy.language import Language

@Language.component("sentence_splitter")
def sentence_splitter(doc):
    # 组件逻辑
    return doc

修改config.cfg,在组件配置块中用source字段指定组件的模块路径:

# 首先在nlp.pipeline中添加组件顺序
[nlp]
pipeline = ["sentence_splitter", "matcher"]
lang = "zh"  # 替换为你的目标语言
...

# 配置无状态组件sentence_splitter
[components.sentence_splitter]
source = "my_components.sentence_splitter"

# 有状态组件matcher的配置保持不变(用factory字段)
[components.matcher]
factory = "matcher"
# 这里添加matcher需要的自定义参数,例如:
# pattern_path = "./patterns.json"

注意事项

  • 确保组件代码所在目录处于Python的sys.path中,或者在该目录下执行训练/验证命令
  • 组件注册时的名称(@Language.component("xxx")中的字符串)必须和config.cfg中组件块的名称完全一致

验证

执行spacy debug config命令确认配置无错误后,再启动训练即可正常加载组件。

内容的提问来源于stack exchange,提问作者dingoyum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:00:54