ValueError:索引长度不匹配:4064 与 1

Posted

技术标签:

【中文标题】ValueError:索引长度不匹配:4064 与 1【英文标题】:ValueError: Index length mismatch: 4064 vs. 1 【发布时间】:2021-10-23 15:23:27 【问题描述】:

我正在处理一个 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,这就是它给我错误的原因。任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

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

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

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

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

train_x = train_x.values.tolist()

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

要记住的另一件事是,您的列表/数据框中只能有 一个 列/变量。如果您的数据框中有多个列,并将其转换为列表并将其传递给矢量化器,它会抛出一个错误!我不知道为什么会这样,但只是把它扔在那里以防有人遇到这个问题。

【讨论】:

以上是关于ValueError:索引长度不匹配:4064 与 1的主要内容,如果未能解决你的问题,请参考以下文章

Pandas ValueError:值的长度与索引的长度不匹配 - 创建新列

ValueError:长度不匹配:在熊猫数据框中创建分层列时,预期的轴有 0 个元素

ValueError:数据(3)的长度和错误5不匹配

Python中的ValueError,数组中的索引数不匹配

隔离林值的长度与索引的长度不匹配

ValueError:使用字典时无法将不匹配长度分配给掩码数组