Scikit-learn:不将某些词作为单一特征,而是作为搭配使用

1 投票
1 回答
721 浏览
提问于 2025-04-18 14:15

我正在用Python和scikit-learn做文本分类。

现在,我使用TfidfVectorizer作为向量化工具(把原始文本转化为特征向量),并用MultinomialNB作为分类器。我设置的参数是ngram_range = (1,2)(可以查看这个链接),也就是说我使用单个词和两个词组合(bigrams)。

在对我的算法进行分类和测试后,我想提高准确率。我查看了最有用的特征(因为有个问题如何获取scikit-learn分类器的最有用特征?)。我发现,在最有用特征的集合中,有些单个词(ngram=1)对分类没有影响,但在两个词组合中,它们会有很大的影响。

所以,我不能使用stop_words(停用词),因为TfidfVectorizer会忽略这些词在组合中的作用,我也不能使用预处理器,原因是一样的。问题是:我该如何在tfidfvectorizer中排除一些词,但又保留这些词在不同的组合中呢?

1 个回答

2

我觉得有几种可能的方法可以做到这一点:

  1. 先创建两个 TfidfVectorizer,都设置 ngram_range=(1,2)。在第一个向量器训练好后,提取特征名称,过滤掉不需要的单个词特征,然后把这个特征列表作为 vocabulary 参数传给第二个向量器。接着用第二个向量器进行转换。

  2. TfidfVectorizeranalyzer 参数设置为一个函数,这个函数可以自定义从每个原始文档中提取特征,比如避免输出一些没用的单个词作为特征(不过这意味着你需要自己生成词的组合)。

  3. 像往常一样训练一个 TfidfVectorizer,这可能会包含一些不需要的单个词。使用 get_feature_names() 获取你想要的特征对应的列索引。当你用向量器进行 transform() 时,额外做一步,根据你感兴趣的索引切片结果稀疏矩阵的列。

撰写回答