Scikit-learn:不将某些词作为单一特征,而是作为搭配使用
我正在用Python和scikit-learn做文本分类。
现在,我使用TfidfVectorizer作为向量化工具(把原始文本转化为特征向量),并用MultinomialNB作为分类器。我设置的参数是ngram_range = (1,2)(可以查看这个链接),也就是说我使用单个词和两个词组合(bigrams)。
在对我的算法进行分类和测试后,我想提高准确率。我查看了最有用的特征(因为有个问题如何获取scikit-learn分类器的最有用特征?)。我发现,在最有用特征的集合中,有些单个词(ngram=1)对分类没有影响,但在两个词组合中,它们会有很大的影响。
所以,我不能使用stop_words(停用词),因为TfidfVectorizer会忽略这些词在组合中的作用,我也不能使用预处理器,原因是一样的。问题是:我该如何在tfidfvectorizer中排除一些词,但又保留这些词在不同的组合中呢?
1 个回答
我觉得有几种可能的方法可以做到这一点:
先创建两个
TfidfVectorizer
,都设置ngram_range=(1,2)
。在第一个向量器训练好后,提取特征名称,过滤掉不需要的单个词特征,然后把这个特征列表作为vocabulary
参数传给第二个向量器。接着用第二个向量器进行转换。把
TfidfVectorizer
的analyzer
参数设置为一个函数,这个函数可以自定义从每个原始文档中提取特征,比如避免输出一些没用的单个词作为特征(不过这意味着你需要自己生成词的组合)。像往常一样训练一个
TfidfVectorizer
,这可能会包含一些不需要的单个词。使用get_feature_names()
获取你想要的特征对应的列索引。当你用向量器进行transform()
时,额外做一步,根据你感兴趣的索引切片结果稀疏矩阵的列。