应用sklearn TFIDF会返回意外的数据框形状

时间:2015-08-05 12:49:12

标签: python pandas scikit-learn

我在尺寸为(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)

我错过了什么?

1 个答案:

答案 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)

希望这有帮助。