我正在使用Python和scikit-learn进行文本分类。
现在,我使用TfidfVectorizer作为矢量化器(用于将原始文本转换为特征向量)和MultinomialNB作为分类器。 我使用参数ngram_range =(1,2)(参见http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html),例如我用一个词和双字母。
在测试集和CV集中对我的算法进行分类和测试后,我想提高准确性。 我看到了最丰富的功能(由于问题How to get most informative features for scikit-learn classifiers?)。而且我看到,在我设置的最具信息性的特征(ngram = 1)中,对分类没有影响,但在bigram(单词搭配)中它们会产生很大的影响。
所以,我不能使用stop_words,因为Tfidfvectorizer不会在搭配中考虑这个词而我也不能以同样的理由使用预处理器。 问题:如何在tfidfvectorizer中排除某些单词,但将这些单词保存在不同的搭配中?
答案 0 :(得分:2)
我认为有几种可能的方法:
使用TfidfVectorizer
两次构建两个ngram_range=(1,2)
。在拟合第一个矢量化器后提取特征名称,过滤掉不需要的unigram特征,并将此特征列表作为第二个矢量化合器的vocabulary
参数提供。使用第二个矢量化器进行转换。
提供analyzer
TfidfVectorizer
参数作为一个函数,该函数执行每个原始文档的功能的自定义提取,例如:避免将一些无用的unigram作为特征吐出(但这意味着你需要自己完成生成单词组合的工作)。
像往常一样安装TfidfVectorizer
,其中可能包含一些不需要的unigrams。使用get_feature_names()
获取与所需功能相对应的列索引。当您使用矢量图执行transform()
时,请根据感兴趣的指标执行额外的步骤,对生成的稀疏矩阵的列进行切片。