我在尺寸为(590295,6)的特征矩阵上应用TFIDF,其中max_features配置为10000但输出数据帧形状为(6,6),而我期望它为(590295,10000)。这发生在以下方法中。请注意,以前,代码在方法之外工作:
def ApplyTFIDF(self,cleaned_data_set, max_features):
print "in TFIDF", max_features
vectorizer = TfidfVectorizer(analyzer = "word", tokenizer = None, preprocessor = None, stop_words = None, max_features = max_features)
print "in TFIDF cleaned_data_set", cleaned_data_set.shape
dataset_features = vectorizer.fit_transform(cleaned_data_set)
print "in TFIDF, after fit_transform", dataset_features.shape
return dataset_features
输出:
cleaned_data_set shape (590295, 6)
in TFIDF 10000
in TFIDF cleaned_data_set (590295, 6)
in TFIDF, after fit_transform (6, 6)
after TFIDF (6, 6)
更多信息:
我正在处理一个包含csv文件数据的数据框。我使用以下代码将此数据帧的几列提取到cleaning_data_set变量中:
cleaned_data_set = data_set[listOfAttributeColumnNames]
其中listOfAttributeColumnNames是列名列表。以前,我使用以下硬编码命令执行此操作:
cleaned_data_set = data_set.ColumnName1.map(str)+" "+data_set.ColumnName2.map(str)+ " " + data_set.ColumnName3.map(str)+" " + data_set.ColumnName4.map(str) + " " + data_set.ColumnName5.map(str)+ " " + data_set.ColumnName6.map(str)
我错过了什么?
答案 0 :(得分:2)
TfidfVectorizer
将 text 内容作为输入。
因此,对于您的用例,您需要传递一个包含590295个元素的向量:您想要向量化的文本(字符串)。
你给它一个6列的数据帧:它应该向量化的文本在哪里或是什么?我很惊讶你没有收到错误。
您用于预处理的这两个命令非常不同:
cleaned_data_set = data_set[listOfAttributeColumnNames]
这为您提供了一个包含len(listOfAttributeColumnNames)
(显然为6)列的数据框。如上所述,这不是矢量化器的正确输入。
cleaned_data_set = data_set.ColumnName1.map(str)+" "+data_set.ColumnName2.map(str)+ " " + data_set.ColumnName3.map(str)
这为您提供了一个Series对象,可以将其视为带有String元素的列向量。这是TfidfVectorizer
的正确输入。
您可以采取以下措施:
cleaned_data_set = data_set.apply(lambda x: " ".join([str(el) for el in x[["ColumnName1", "ColumnName2", "ColumnName3"]]]), axis=1)
希望这有帮助。