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:值的长度与索引的长度不匹配 - 创建新列