了解scikit CountVectorizer中的min_df和max_df


77

我有五个输入到CountVectorizer的文本文件。为CountVectorizer实例指定min_df和max_df时,最小/最大文档频率到底是什么意思?是某个单词在其特定文本文件中的出现频率,还是整个整体语料库(5个txt文件)中该单词的出现频率?

当min_df和max_df作为整数或浮点数提供时有何不同?

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

Answers:


229

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

  • max_df = 0.50表示“忽略出现在50%以上文档中的术语”。
  • max_df = 25表示“忽略出现在25个以上文档中的术语”。

默认max_df值为1.0,表示“忽略出现在100%以上文档中的术语”。因此,默认设置不会忽略任何术语。


min_df用于删除不太常见的术语。例如:

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

默认min_df值为1,表示“忽略少于1个文档中出现的术语”。因此,默认设置不会忽略任何术语。


答案很明确,谢谢!
kapelnick

11

根据此处CountVectorizer文档。

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

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

考虑具有5个文本文件(或文档)的示例。如果设置max_df = 0.6,则将转换为0.6*5=3文档。如果您进行设置max_df = 2,则将其简单地转换为2个文档。

下面的源代码示例是从Github复制过来的并显示了如何从max_doc_count构造max_df。的代码min_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_df并且min_df都在内部用于计算max_doc_countmin_doc_count,必须找到一个术语的最大和最小文档数。然后将其self._limit_features作为关键字参数传递给,high并且low的文档字符串分别self._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.
"""

6
这很混乱。的文档min_df说“忽略文档频率严格低于给定阈值的术语”。因此,严格低于默认值1的频率意味着将忽略那些从不出现(!)的术语,但保留一次出现的术语。
莫妮卡·赫德内克

1
@MonicaHeddneck是正确的。这个答案曲解了min_df和的确切含义max_df。我添加了一个答案,该答案准确地解释了CountVectorizer如何解释这些参数。
凯文·马克汉姆

是的,正如@MonicaHeddneck和kevin指出的,对于min_df和max_df来说,这是错误的答案
jeremy_rutman

10

我还将补充这一点min_dfmax_df以更好地理解tf-idf。

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

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

有人可能会认为,允许显示所有术语(例如,过于频繁的术语或停用词)可能会降低质量,但在tf-idf中却并非如此。因为tf-idf测量本能地会给这些术语打低分,从而有效地使它们不具有影响力(如在许多文档中所出现的)。

综上所述,通过min_df和修剪术语max_df是为了提高性能,而不是集群的质量(例如)。

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


2
谢谢-这是我独立得出的结论。
等腰振荡

4

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'并发现,除“七个”以外的所有单词都被删除了!包括“无处不在”。


1

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

而不是使用最小/最大词频(一个字的总出现)来消除的话,MIN_DF并且MAX_DF在许多文件如何包含一个术语,更好地称为文档频率的样子。阈值可以是绝对值(例如1、2、3、4)或代表文档比例的值(例如0.25含义,忽略出现在25%的文档中的单词)。

在这里查看一些用法示例

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.