使用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
相关产品推荐
相关产品推荐

