Understanding min_df and max_df in scikit CountVectorizer

I have five text files that I input to a CountVectorizer. When specifying min_df and max_df to the CountVectorizer instance what does the min/max document frequency exactly mean? Is it the frequency of a word in its particular text file or is it the frequency of the word in the entire overall corpus (five text files)?

What are the differences when min_df and max_df are provided as integers or as floats?

The documentation doesn't seem to provide a thorough explanation nor does it supply an example to demonstrate the use of these two parameters. Could someone provide an explanation or example demonstrating min_df and max_df?

92010 次浏览

As per the CountVectorizer documentation 给你.

[0.0, 1.0]范围内使用浮点时,它们指的是 文件频率。这是包含该术语的文档的百分比。

当使用 int 时,它指的是包含这个术语的文档的绝对数量。

考虑这个示例,其中有5个文本文件(或文档)。如果您设置 max_df = 0.6,那么这将转换为 0.6*5=3文档。如果您设置 max_df = 2,那么这将简单地转换为2个文档。

下面的源代码示例是从 Github给你复制的,并显示了如何从 max_df构造 max_doc_countmin_df的代码类似,可以在 GH 页面上找到。

max_doc_count = (max_df
if isinstance(max_df, numbers.Integral)
else max_df * n_doc)

min_dfmax_df的默认值分别是1和1.0,基本上就是 "If my term is found in only 1 document, then it's ignored. Similarly if it's found in all documents (100% or 1.0) then it's ignored."

max_dfmin_df都在内部用于计算 max_doc_countmin_doc_count,即一个术语必须包含在内的最大和最小文档数。然后分别作为关键字参数 highlow传递给 self._limit_featuresself._limit_features的 docstring 是

"""Remove too rare or too common features.


Prune features that are non zero in more samples than high or less
documents than low, modifying the vocabulary, and restricting it to
at most the limit most frequent.


This does not prune samples with zero features.
"""

The defaults for min_df and max_df are 1 and 1.0, respectively. These defaults really don't do anything at all.

话虽如此,我认为目前被@Ffisegydd 接受的答案并不完全正确。

例如,使用默认值运行此命令,以查看当 min_df=1max_df=1.0时,然后

1)使用出现在至少一个文档中的所有令牌(例如,所有令牌!)

2)使用出现在所有文档中的所有令牌(我们将使用一个候选者进行测试: 处处)。

cv = CountVectorizer(min_df=1, max_df=1.0, lowercase=True)
# here is just a simple list of 3 documents.
corpus = ['one two three everywhere', 'four five six everywhere', 'seven eight nine everywhere']
# below we call fit_transform on the corpus and get the feature names.
X = cv.fit_transform(corpus)
vocab = cv.get_feature_names()
print vocab
print X.toarray()
print cv.stop_words_

我们得到:

[u'eight', u'everywhere', u'five', u'four', u'nine', u'one', u'seven', u'six', u'three', u'two']
[[0 1 0 0 0 1 0 0 1 1]
[0 1 1 1 0 0 0 1 0 0]
[1 1 0 0 1 0 1 0 0 0]]
set([])

所有的代币都保留了,没有停顿词。

进一步扰乱争论将澄清其他配置。

为了有趣和洞察力,我还推荐使用 stop_words = 'english',并且看到,特别是,除了“七”之外的所有单词都被删除了!包括“所有地方”。

max_df is used for removing terms that appear 太频繁了, also known as "corpus-specific stop words". For example:

  • max_df = 0.50表示“忽略出现在 超过50% 的文件中的术语”。
  • max_df = 25表示“忽略出现在 more than 25 documents中的术语”。

默认的 max_df1.0,意思是“忽略出现在 more than 100% of the documents中的术语”。因此,默认设置不会忽略任何术语。


min_df用于删除出现在 太少了中的术语,例如:

  • min_df = 0.01表示“忽略出现在 少于1% 的文件中的术语”。
  • min_df = 5表示“忽略出现在 少于5份文件中的术语”。

The default min_df is 1, which means "ignore terms that appear in 少于1份文件". Thus, the default setting does not ignore any terms.

为了更好地理解 tf-idf 中的 min_dfmax_df,我还要添加这一点。

如果使用默认值,这意味着考虑到所有术语,肯定会生成更多的令牌。因此您的集群过程(或者稍后您想用这些术语做的任何其他事情)将花费更长的时间。

但是集群的质量不应该降低。

人们可能会认为,允许所有术语(例如太频繁的术语或停止词)出现可能会降低质量,但在 tf-idf 中不会。因为 tf-idf 测量本能地给这些术语打低分,实际上使它们不具有影响力(正如它们在许多文档中出现的那样)。

所以总的来说,通过 min_dfmax_df修剪术语是为了提高性能,而不是集群的质量(例如)。

关键的一点是,如果你设置的 minmax错误,你会失去一些重要的条款,从而降低质量。因此,如果您不确定正确的阈值(这取决于您的文档集) ,或者如果您确定您的机器的处理能力,那么保持 minmax参数不变。

MIN_DF的目标是忽略那些很少出现的、被认为有意义的单词。例如,在您的文本中,您可能只有可能出现在1或2个文档中的人的姓名。在某些应用中,这可能属于噪声,可以从进一步的分析中消除。类似地,您可以忽略 MAX_DF中太常见的单词。

MIN_DFMAX_DF不使用最小/最大术语频率(单词的总出现次数)来消除单词,而是查看有多少文档包含一个术语,更好地称为文档频率。阈值可以是绝对值(例如1、2、3、4) ,也可以是代表文档比例的值(例如0.25表示忽略出现在25% 文档中的单词)。

参见 这里有一些用法示例

我刚刚看了 sklearn CountVectorizer 的文档,我是这样想的。

Common words have higher frequency values, while rare words have lower frequency values. The frequency values range between 0 - 1 as fractions.

max_df是频率值的上限值,而 min_df是频率值的下限值。

如果我们想删除更多的常用单词,我们将 max_df设置为0到1之间的较低上限值。如果我们想删除更多的罕见单词,我们将 min_df设置为0到1之间的一个更高的截止值。我们保持 max_dfmin_df之间的一切。

Let me know, not sure if this makes sense.