了解scikit CountVectorizer中的min_df和max_df

时间:2014-12-29 23:57:13

标签: python machine-learning scikit-learn nlp

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

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

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

6 个答案:

答案 0 :(得分:139)

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个文档”中显示的字词。因此,默认设置不会忽略任何术语。

答案 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,即必须找到术语的最大和最小文档数。这是分别作为关键字参数highlow传递给self._limit_featuresself._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.
"""

答案 2 :(得分: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'并特别注意除了'七'以外的所有单词!包括“无处不在”。

答案 3 :(得分:2)

我还想补充一点,以便更好地理解tf-idf中的var nestedArr = [[1,2,3],[4,5,6],[7,8],[9,10,11,12]]; function printEvens() { for(var i = 0; i < nestedArr.length; i++) { for(var j = 0; j < nestedArr[i].length;j++){ if(i % 2 == 0){ var arr = nestedArr.toString().split(','); console.log(arr[i][j]); } } } } printEvens(); min_df

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

但不应降低群集的质量。

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

总而言之,通过max_dfmin_df修剪条款是为了提高效果,而不是群集的质量(例如)。

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

答案 4 :(得分:0)

MIN_DF的目标是忽略那些很少出现的被认为有意义的单词。例如,在您的文本中,您的名字可能仅出现在一个或两个文档中。在某些应用中,这可能被视为噪声,可以从进一步的分析中消除。同样,您可以忽略MAX_DF中太常见的单词。

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

请参见some usage examples here

答案 5 :(得分:0)

我刚刚看了 sklearn CountVectorizer 的文档。这就是我的想法。

常用词的频率值较高,而生僻词的频率值较低。频率值范围在 0 - 1 之间,作为分数。

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

如果我们想移除更多的常见词,我们将 max_df 设置为 0 到 1 之间的较低的上限值。如果我们想移除更多的罕见词,我们将 min_df 设置为更高的截止值介于 0 和 1 之间。我们将所有内容保留在 max_dfmin_df 之间。

让我知道,不确定这是否有意义。