ValueError: Index length mismatch: 4064 vs. 1

ValueError: Index length mismatch: 4064 vs. 1

我正在研究一个 NLP 问题 https://www.kaggle.com/c/nlp-getting-started。我想在 train_test_split 之后执行矢量化,但是当我这样做时,生成的稀疏矩阵的大小 = 1,这不可能是正确的。

我的 train_x 设置大小是 (4064, 1) 并且在 tfidf.fit_transform 之后我得到 size = 1. 怎么可能??!下面是我的代码:

def clean_text(text):
    tokens = nltk.word_tokenize(text)    #tokenizing the words
    lower = [word.lower() for word in tokens]  #converting words to lowercase
    remove_stopwords = [word for word in lower if word not in set(stopwords.words('english'))]  
    remove_char = [word for word in remove_stopwords if word.isalpha()]
    lemm_text = [ps.stem(word) for word in remove_char]     #lemmatizing the words
    cleaned_data = " ".join([str(word) for word in lemm_text])
    return cleaned_data

x['clean_text']= x["text"].map(clean_text)

x.drop(['text'], axis = 1, inplace = True)

from sklearn.model_selection import train_test_split
train_x, test_x, train_y, test_y = train_test_split(x, y, test_size = 0.2, random_state = 69, 
stratify = y)

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
tfidf = TfidfVectorizer()
train_x_vect = tfidf.fit_transform(train_x)
test_x1 = tfidf.transform(test_x)

pd.DataFrame.sparse.from_spmatrix(train_x_vect,
                              index=train_x.index,
                              columns=tfidf.get_feature_names())    

当我尝试将稀疏矩阵(大小 = 1)转换为数据帧时,出现错误。

数据帧 x 的大小为 4064,而我的稀疏矩阵的大小为 1,这就是它给我错误的原因。任何帮助将不胜感激!

您收到错误的原因是 TfidfVectorizer 只接受 lists 作为输入。您可以从 documentation 本身进行检查。

这里你传递一个 Dataframe 作为输入。因此奇怪的输出。 首先使用以下方法将您的数据框转换为列表:

train_x = train_x['column_name'].to_list()

然后将其传递给向量化器。还有很多方法可以将数据框转换为列表,但所有这些方法的输出可能是不同格式的列表。例如,如果您尝试使用以下方式将数据框转换为列表:

train_x = train_x.values.tolist()

它会将数据帧转换为列表,但此列表的格式不适用于 Tidfvectorizer,并且会为您提供与您之前在问题中获得的相同的输出。我发现上述转换为列表的方式可以与矢量化器一起使用。

要记住的另一件事是,您的 list/dataframe 中只能有 一个 column/variable。如果您的数据框中有多个列,并且将其转换为列表并将其传递给向量化器,它将抛出错误!我不知道这是为什么,但只是抛出以防万一有人遇到这个问题。