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

spaCy自定义文本分类模型训练报错:ValueError: [E143] Labels for component 'textcat' not initialized

解决spaCy文本分类模型标签未初始化的错误 [E143]

这个错误的根源很明确:你虽然创建了带标签的textcat组件,但最后添加到管道里的是一个全新的、没配置标签的textcat实例,等于之前加标签的操作白做了。

问题出在哪?

看你创建管道的代码:

# Create a new pipeline
category = nlp.create_pipe('textcat')
#Add our two labels
category.add_label("POSITIVE")
category.add_label("NEGATIVE")
nlp.add_pipe('textcat')  # 这里是坑!

当你调用nlp.add_pipe('textcat')时,spaCy会重新创建一个全新的textcat组件,完全忽略你之前创建并添加了标签的category对象。这就导致训练时组件根本不知道有POSITIVE和NEGATIVE这两个标签,触发[E143]错误。

修复方案

把你已经配置好标签的组件实例添加到管道里,而不是用字符串'textcat'新建:

修正后的完整代码

import spacy
import random

# 1. 训练数据
train_data = [
    ('Some great text here.', {'cats': {'POSITIVE': True, 'NEGATIVE': False}}),
    ('Terrible experience, never again.', {'cats': {'POSITIVE': False, 'NEGATIVE': True}}),
    ('Another positive example!', {'cats': {'POSITIVE': True, 'NEGATIVE': False}})
]

# 2. 创建带标签的文本分类模型
nlp = spacy.blank("en")
# 创建textcat组件实例并添加标签
textcat = nlp.create_pipe('textcat')
textcat.add_label("POSITIVE")
textcat.add_label("NEGATIVE")
# 将配置好的组件添加到管道(关键!用实例,不是字符串)
nlp.add_pipe(textcat)

# 3. 训练函数(同时优化了一些细节)
def train_model(nlp, TRAINING_DATA, output_dir='C:\\Users\\Oliver\\Documents\\PythonAPI\\'):
    # 初始化训练,获取优化器
    optimizer = nlp.begin_training()
    # 迭代训练10轮
    for iteration in range(10):
        # 打乱数据保证训练效果
        random.shuffle(TRAINING_DATA)
        losses = {}
        # 批量处理数据(调整batch size到8更高效)
        for batch in spacy.util.minibatch(TRAINING_DATA, size=8):
            # 拆分文本和标注
            texts, annotations = zip(*batch)
            # 用make_doc创建文档,避免提前运行整个管道,提升效率
            docs = [nlp.make_doc(text) for text in texts]
            # 更新模型
            nlp.update(docs, annotations, sgd=optimizer, losses=losses)
        print(f"Iteration {iteration+1} - Textcat loss: {losses['textcat']:.4f}")
    # 保存模型到本地
    nlp.to_disk(output_dir)
    print(f"模型已保存到: {output_dir}")

# 启动训练
train_model(nlp, train_data)

额外优化说明

  1. 用nlp.make_doc代替nlp(text):nlp(text)会运行整个管道(虽然现在只有textcat,但好习惯),而make_doc只创建基础文档对象,训练时更高效。
  2. 传入优化器sgd=optimizer:nlp.begin_training()返回的优化器需要在update时传入,确保训练过程中参数正确更新。
  3. 调整batch size:原代码用size=1的batch太小,训练效率极低,改成8左右是更合理的选择。

这样修改后,组件会正确识别你添加的标签,训练就能正常运行了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 08:32:29