了解scikit CountVectorizer中的min_df和max_df

问题描述 投票:44回答:4

我有五个文本文件,我输入到CountVectorizer。将min_df和max_df指定给CountVectorizer实例时,min / max文档频率的确切含义是什么?它是特定文本文件中单词的频率,还是整个语料库中单词的频率(5个txt文件)?

当min_df和max_df以整数或浮点数形式提供时,它有何不同?

该文档似乎没有提供详尽的解释,也没有提供示例来演示min_df和/或max_df的使用。有人可以提供演示min_df或max_df的解释或示例。

python machine-learning scikit-learn nlp
4个回答
137
投票

max_df用于删除过于频繁出现的术语,也称为“语料库特定的停用词”。例如:

  • max_df = 0.50的意思是“忽略超过50%的文件中出现的条款”。
  • max_df = 25的意思是“忽略出现在25个以上文档中的术语”。

默认的max_df1.0,意思是“忽略出现在100%以上文档中的术语”。因此,默认设置不会忽略任何术语。


min_df用于删除看似很少出现的术语。例如:

  • min_df = 0.01的意思是“忽略出现在不到1%的文件中的条款”。
  • min_df = 5的意思是“忽略少于5个文档中出现的术语”。

默认的min_df1,意思是“忽略出现在少于1个文档中的术语”。因此,默认设置不会忽略任何术语。


11
投票

根据CountVectorizer文档here

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

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

考虑一下您有5个文本文件(或文档)的示例。如果你设置max_df = 0.6那么那将转换为0.6*5=3文件。如果你设置max_df = 2然后那将简单地转换为2个文档。

下面的源代码示例是从Github here复制的,并展示了如何从max_doc_count构造max_dfmin_df的代码类似,可以在GH页面上找到。

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

min_dfmax_df的默认值分别为1和1.0。这基本上说“如果我的术语仅在1个文档中找到,则忽略它。同样,如果它在所有文档中找到(100%或1.0),则忽略它。”

max_dfmin_df都在内部用于计算max_doc_countmin_doc_count,这是一个术语必须找到的最大和最小文档数。然后分别作为关键字参数self._limit_featureshigh传递给lowself._limit_features的文档字符串是

"""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.
"""

3
投票

min_df和max_df的默认值分别为1和1.0。这些默认设置实际上根本不起作用。

话虽如此,我相信@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',特别是除了'七'之外的所有单词都被删除了!包括“无处不在”。


2
投票

我还要补充这一点,以便更好地理解tf-idf中的min_dfmax_df

如果你使用默认值,意味着考虑所有术语,你已经生成了更多的令牌。因此,您的群集过程(或您稍后要对这些术语执行的任何其他操作)将花费更长的时间。

但是不应该降低聚类的质量。

人们可能会认为允许所有术语(例如过于频繁的术语或停止词)可能会降低质量,但在tf-idf中则不然。因为tf-idf测量本能地对这些术语给出低分,所以有效地使它们没有影响力(因为它们出现在许多文档中)。

总而言之,通过min_dfmax_df修剪术语是为了提高性能,而不是提高簇的质量(作为一个例子)。

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

© www.soinside.com 2019 - 2024. All rights reserved.