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

使用Spacy 3.4.1训练SVC时遇ValueError:特征数组维度为0

问题:使用Spacy 3.4.1和Python 3.8.10训练SVM分类器时触发ValueError

训练SVM的SVC分类器时出现如下错误:

Found array with 0 feature(s) (shape=(7, 0)) while a minimum of 1 is required by SVC

已确认训练集和标签的长度正常,但仍报错,请问问题出在哪里?

复现代码

import spacy
from sklearn import svm

nlp = spacy.load("en_core_web_trf")

train_x = [
        "good characters and plot progression", 
        "check out the book", 
        "good story. would recommend", 
        "novel recommendation", 
        "need to make a deposit to the bank", 
        "balance inquiry savings", 
        "save money"
        ]


train_y = [
            "BOOKS", 
            "BOOKS", 
            "BOOKS", 
            "BOOKS", 
            "BANK", 
            "BANK", 
            "BANK", 
            ]


docs = [nlp(text) for text in train_x]
train_x_vectors = [doc.vector for doc in docs]

print (len(train_x_vectors))
print (len(train_y))

clf_svm = svm.SVC(kernel='linear')
clf_svm.fit(train_x_vectors, train_y)

问题原因

你使用的en_core_web_trf是Transformer架构的预训练模型,这类模型在Spacy中默认不会生成doc.vector(文档级固定向量)。Transformer模型更侧重上下文相关的token级向量,而非传统的全局文档向量,因此你生成的train_x_vectors中每个元素都是空数组,导致SVC训练时拿到的特征维度为0,触发错误。

解决方法

有两种可行的修复方案:

方案1:换用非Transformer类Spacy模型

改用预训练了静态词向量的模型(如en_core_web_md或en_core_web_lg),这类模型可以正常生成doc.vector:

# 替换模型加载代码
nlp = spacy.load("en_core_web_md")  # 或 en_core_web_lg

若未安装对应模型,需先执行命令安装:python -m spacy download en_core_web_md

方案2:手动聚合Transformer的token向量生成文档向量

如果必须使用en_core_web_trf,可以对文档内所有token的Transformer向量做聚合(如取平均值),得到有效维度的文档向量:

# 修改向量生成代码
train_x_vectors = [doc.tensor.mean(axis=0) for doc in docs]

doc.tensor是Transformer输出的每个token的向量(形状为[token数, 768]),取平均值后会得到一个768维的文档向量,满足SVC对特征维度的要求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:45:41