CountVectorizer删除仅出现一次的功能

时间:2015-02-21 09:26:14

标签: python machine-learning scikit-learn text-classification

我正在使用sklearn python包,而我在使用预先创建的词典创建CountVectorizer时遇到问题,CountVectorizer不会删除仅出现的功能曾经或根本不会出现。

以下是我的示例代码:

train_count_vect, training_matrix, train_labels = setup_data(train_corpus, query, vocabulary=None)
test_count_vect, test_matrix, test_labels = setup_data(test_corpus, query, vocabulary=train_count_vect.get_feature_names())

print(len(train_count_vect.get_feature_names()))
print(len(test_count_vect.get_feature_names()))

len(train_count_vect.get_feature_names())输出89967 len(test_count_vect.get_feature_names())输出9833

setup_data()函数中,我只是初始化CountVectorizer。对于训练数据,我在没有预设词汇的情况下初始化它。然后,对于测试数据,我用我从训练数据中检索到的词汇初始化CountVectorizer。

如何让词汇表具有相同的长度?我认为sklearn正在删除功能,因为它们只出现一次或者在我的测试语料库中根本不出现。我需要使用相同的词汇表,否则,我的分类器与测试数据点的长度会有所不同。

1 个答案:

答案 0 :(得分:4)

所以,如果没有真正看到setup_data的源代码,就不可能说,但我对这里发生的事情有一个相当不错的猜测。 sklearn遵循fit_transform格式,这意味着有两个阶段,特别是fittransform

CountVectorizer的示例中,fit阶段有效地创建了词汇表,transform步骤将输入文本转换为该词汇空间。

我的猜测是你在两个数据集上调用fit而不只是一个,你需要使用相同的"拟合"如果您希望结果排成一行,则CountVectorizer的版本。 e.g:

model = CountVectorizer()
transformed_train = model.fit_transform(train_corpus)
transformed_test = model.transform(test_corpus)

同样,这只能是一个猜测,直到你发布setup_data函数,但在我猜到你做了更像这样的事情之前看过这个:

model = CountVectorizer()
transformed_train = model.fit_transform(train_corpus)
transformed_test = model.fit_transform(test_corpus)

这将有效地为test_corpus创建一个新的词汇表,毫无疑问,在这两种情况下都不会给你相同的词汇长度。