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

spaCy文本分类器报错:'unicode'对象无'to_array'属性,如何解决?

解决spaCy TextCategorizer训练时的AttributeError问题

你碰到的这个错误核心原因很明确:TextCategorizer.update()方法不接受原始字符串作为输入,它需要的是spaCy通过nlp()处理后生成的Doc对象;同时你的标注数据格式也不对,不能直接传字符串标签,得用spaCy要求的字典格式。

具体修正步骤:

  • 第一步:将原始文本转为Doc对象:用你加载好的nlp实例处理每个文本字符串,生成spaCy能识别的Doc。
  • 第二步:修正标注数据格式:分类任务的标注需要是包含cats键的字典,每个分类标签对应一个0/1的数值(1表示属于该类别,0表示不属于)。
  • 第三步:增加训练迭代次数(可选但推荐):你只有2个样本,多迭代几次才能让模型学到有效特征。

修正后的完整代码:

import spacy
from spacy.pipeline import TextCategorizer

# 加载英文模型
nlp = spacy.load('en')

# 将原始文本转为spaCy Doc对象
doc1 = nlp(u'This is my first document in the dataset.')
doc2 = nlp(u'This is my second document in the dataset.')

# 按照spaCy要求的格式准备标注数据
gold1 = {"cats": {"Category1": 1.0, "Category2": 0.0}}
gold2 = {"cats": {"Category2": 1.0, "Category1": 0.0}}

# 初始化文本分类器
textcat = TextCategorizer(nlp.vocab)
textcat.add_label('Category1')
textcat.add_label('Category2')

# 开始训练
losses = {}
optimizer = textcat.begin_training()

# 多迭代几次训练(示例用10次)
for i in range(10):
    textcat.update([doc1, doc2], [gold1, gold2], losses=losses, sgd=optimizer)
    print(f"迭代{i+1}次后的损失: {losses['textcat']:.4f}")

为什么这样改能解决问题?

  • 原始代码里直接传字符串给update(),spaCy内部会尝试调用to_array()方法处理输入,但字符串没有这个方法,所以抛出AttributeError。转成Doc对象后,就具备了spaCy处理文本所需的所有属性和方法。
  • 标注用字典格式是因为spaCy的文本分类器默认支持多分类任务,通过cats字典可以明确每个样本属于哪些类别,模型能正确计算损失值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:49:13