了解scikit CountVectorizer中的min_df和max_df
machine-learning
nlp
python
scikit-learn
6
0

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

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

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

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

根据CountVectorizer文档在此处

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

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

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

的源代码示例下面从GitHub复制这里和表示如何max_doc_count从构造max_dfmin_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_dfmin_df都在内部用于计算必须在其中找到术语的最大和最小文档数max_doc_countmin_doc_count 。然后将其传递给self._limit_features作为关键字参数highlow分别是self._limit_features的文档字符串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.
"""
收藏
评论

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

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

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

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

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

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

收藏
评论

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

收藏
评论

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号