CountVectorizer 删除只出现一次的特征

Posted

技术标签:

【中文标题】CountVectorizer 删除只出现一次的特征【英文标题】:CountVectorizer deleting features that only appear once 【发布时间】:2015-04-23 00:41:51 【问题描述】:

我正在使用 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 正在删除功能,因为它们在我的测试语料库中只出现一次或根本不出现。我需要有相同的词汇表,否则我的分类器将与我的测试数据点的长度不同。

【问题讨论】:

能否提供seup_data 的源代码?我们真的不可能在没有看到的情况下找出问题所在。 CountVectorizer 应该只有一个,而不是两个。 @SlaterTyranus 的回答解释了原因 【参考方案1】:

所以,如果没有实际看到setup_data 的源代码,就不可能说,但我对这里发生的事情有一个相当不错的猜测。 sklearn 遵循fit_transform 格式,表示有两个阶段,具体为fittransform

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

我的猜测是您在两个数据集上调用 fit 而不仅仅是一个,如果您希望结果对齐,您需要在两个数据集上使用相同的“拟合”版本的 CountVectorizer。例如:

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 创建一个新词汇表,不出所料,这两种情况下的词汇表长度不会相同。

【讨论】:

以上是关于CountVectorizer 删除只出现一次的特征的主要内容,如果未能解决你的问题,请参考以下文章

只出现一次的数字

剑指offer:数组中只出现一次的数字

题目----只出现一次的数字 II,只出现一次的数字 III

《剑指Offer——数组中只出现一次的两个数字,数组中唯一只出现一次的数字》代码

数组中只出现一次的数字(数组中唯一只出现一次的数字)

只出现一次的数字