了解scikit CountVectorizer中的min_df和max_df

moe*_*dol 62 python nlp machine-learning scikit-learn

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

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

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

Kev*_*ham 166

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

  • 希望这出现在官方文档中以避免太多的不清楚和混乱。 (10认同)
  • 非常明确的答案,谢谢! (2认同)

Ffi*_*ydd 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)
Run Code Online (Sandbox Code Playgroud)

为默认值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

"""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.
"""
Run Code Online (Sandbox Code Playgroud)

  • 这令人困惑.`min_df`的文档说'忽略文档频率**严格低于给定阈值**的术语.' 因此,严格低于默认值1的频率将意味着忽略从未出现的术语(!),但保留出现一次的术语. (5认同)

小智 10

我也会添加这一点以更好地理解min_dfmax_df在 tf-idf 中。

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

但不应降低聚类的质量。

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

所以总结一下,通过min_df和修剪术语max_df是为了提高性能,而不是集群的质量(例如)。

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

  • 谢谢 - 这与我独立得出的结论相同。 (3认同)

Mon*_*eck 5

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_
Run Code Online (Sandbox Code Playgroud)

我们得到:

[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([])
Run Code Online (Sandbox Code Playgroud)

所有令牌均被保留。没有停用词。

进一步搞乱这些参数将澄清其他配置。

为了获得乐趣和洞察力,我还建议您尝试一下,stop_words = 'english'看看,特别的是,除了“七”之外的所有单词都被删除了!包括“无处不在”。