应用 sklearn TFIDF returns 意外的数据帧形状
Applying sklearn TFIDF returns an unexpected dataframe shape
我将 TFIDF 应用于维度为 (590295, 6) 的特征矩阵,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 文件数据的数据框。我正在使用以下代码将此数据框的几列提取到 cleaned_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)
我错过了什么?
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 对象,可以将其视为具有字符串元素的列向量。这是 TfidfVectorizer
.
的正确输入
您可以按照以下方式做一些事情:
cleaned_data_set = data_set.apply(lambda x: " ".join([str(el) for el in x[["ColumnName1", "ColumnName2", "ColumnName3"]]]), axis=1)
希望对您有所帮助。
我将 TFIDF 应用于维度为 (590295, 6) 的特征矩阵,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 文件数据的数据框。我正在使用以下代码将此数据框的几列提取到 cleaned_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)
我错过了什么?
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 对象,可以将其视为具有字符串元素的列向量。这是 TfidfVectorizer
.
您可以按照以下方式做一些事情:
cleaned_data_set = data_set.apply(lambda x: " ".join([str(el) for el in x[["ColumnName1", "ColumnName2", "ColumnName3"]]]), axis=1)
希望对您有所帮助。