为什么在scikit learn中提供自定义词汇时,无法为CountVectorizer指定最小频率?

1 投票
2 回答
1121 浏览
提问于 2025-04-18 06:53

我了解到,在使用Python的Scikit-learn包创建计数向量器时,可以指定一个最小频率。不过,我在想,这个设置是否只有在不提供自定义词典的情况下才有效?当我提供自己的词汇表(一个列表)时,这个参数似乎就不管用了。

为了弄清楚这一点,我重新查看了min_df参数的文档:

Parameters :

min_df : float in range [0.0, 1.0] or int, optional, 1 by default

    When building the vocabulary, ignore terms that have a term frequency strictly lower than the given threshold.  

    This value is also called cut-off in the literature.   

    If float, the parameter represents a proportion of documents, integer absolute counts. This parameter is ignored if vocabulary is not None.

在我的例子中,我给我的CountVectorizer提供了一个由我自己之前获得的术语组成的自定义词汇表。

cv = CountVectorizer(vocabulary=my_own_terms, min_df=3)
X = cv.fit_transform(a_big_corpus)

当我查看输出时,发现有很多词只出现了一次、两次等等。

有没有人遇到过这种情况,如果有的话,有什么解决办法吗?提前谢谢大家。

2 个回答

3

一般来说,使用 vocabulary 的目的是为了确保你只想要那些特定的词汇,所以 min_df 就不适用了。如果你还是想设定一个最小频率,那你需要先进行向量化,看看哪些词的出现次数太少,然后把它们从你自定义的词汇中删掉,再进行一次向量化。(据我所知,已经存在的 CountVectorizer 的词汇表中是无法直接删除词的。)

5

提供词汇集的意思是你想要的就是那一套词汇。其他的词汇无所谓,即使某个词在要转换的文本中只出现一次或者根本没有出现。这是因为你通过提供vocabulary参数,实际上是想要那一套词汇。所以,min_df这个限制可以被忽略,这在文档中也是这么说的。

根据你后面的评论,似乎你想要的是:

我想要的就是我词汇表中的那些词,但如果某个词只出现一次,那我就不想要它。

这基本上意味着你希望在你预先提取的词汇集中,选择那些出现频率足够高的词。换句话说,你其实并不是真的想要那一套词汇。我可能会这样做:

  1. 从头开始在你的数据上创建一个全新的CounterVectorizer
  2. 找出新创建的向量化器的词汇和你原本的词汇集之间的交集。
  3. 用步骤2中交集的词汇来构建实际的CountVectorizer,这个向量化器会进行真正的转换。

你的方法直接跳到了第3步,这就是为什么向量化器没有按你预期的那样工作。

撰写回答