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

TfidfVectorizer转DataFrame时Shape不匹配报错求助

解决TF-IDF结果转DataFrame时的形状不匹配错误

错误原因

你触发的ValueError: Shape of passed values is (3900, 7098), indices imply (7098, 1),核心问题是矩阵形状不匹配:

  • tfidf_vectorizer_vectors.todense()生成的是[样本数 × 特征词数]的矩阵(这里是3900个训练样本×7098个特征词)。
  • 你构建DataFrame时,把feature_names(7098个词)作为行索引,同时只指定1列["tfidf"],两者维度完全不兼容。

解决方案

要生成你期望的「每个token对应一个TF-IDF值」的表格,需要先对TF-IDF矩阵按特征词维度做聚合计算(比如取所有样本的平均值、求和),再构建DataFrame。

修改后的完整代码(替换原代码最后构建df的部分):

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer

file_name = '../../data/spam.csv'
spam_data_df = pd.read_csv(file_name)

spam_data_df['target'] = np.where(spam_data_df['target']=='spam',1,0)
X_train, X_test, y_train, y_test = train_test_split(spam_data_df['text'], 
                                                      spam_data_df['target'],
                                                      test_size=0.3, 
                                                      random_state=0)

X_train_list = X_train.tolist()

tfidf_vectorizer = TfidfVectorizer() 

tfidf_vectorizer_fit = tfidf_vectorizer.fit(X_train_list)
tfidf_vectorizer_vectors = tfidf_vectorizer.transform(X_train_list)

feature_names = tfidf_vectorizer.get_feature_names_out()

# 计算每个特征词在所有训练样本中的平均TF-IDF值
tfidf_avg = tfidf_vectorizer_vectors.mean(axis=0).tolist()[0]

# 构建符合期望格式的DataFrame
df = pd.DataFrame({
    "token": feature_names,
    "tfidf": tfidf_avg
})

# 可选:按TF-IDF值降序排序,方便查看重要性高的词
df = df.sort_values(by="tfidf", ascending=False).reset_index(drop=True)
print(df.head())

代码说明

  • mean(axis=0):对TF-IDF矩阵的每一列(对应一个特征词)计算所有样本的平均值,得到1×7098的结果,和feature_names的长度完全匹配。
  • 用字典直接构建DataFrame,确保token列对应特征词,tfidf列对应聚合后的数值,完全符合你想要的表格格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:31:08