Python 了解scikit CountVectorizer中的最小和最大df

Python 了解scikit CountVectorizer中的最小和最大df,python,machine-learning,scikit-learn,nlp,Python,Machine Learning,Scikit Learn,Nlp,我有五个文本文件输入到CountVectorizer。当为CountVectorizer实例指定最小和最大文档频率时,最小/最大文档频率的确切含义是什么?它是一个单词在其特定文本文件中的频率,还是该单词在整个语料库(5个txt文件)中的频率 当min_df和max_df作为整数或浮点数提供时有什么不同 该文档似乎没有提供全面的解释,也没有提供一个示例来演示min_df和/或max_df的使用。是否有人可以根据CountVectorizer文档提供一个解释或示例来演示min_df或max_df.

我有五个文本文件输入到CountVectorizer。当为CountVectorizer实例指定最小和最大文档频率时,最小/最大文档频率的确切含义是什么?它是一个单词在其特定文本文件中的频率,还是该单词在整个语料库(5个txt文件)中的频率

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


该文档似乎没有提供全面的解释,也没有提供一个示例来演示min_df和/或max_df的使用。是否有人可以根据
CountVectorizer
文档提供一个解释或示例来演示min_df或max_df.

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

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

考虑一个示例,其中有5个文本文件(或文档)。如果将
max_df=0.6
设置为
0.6*5=3
文档。如果设置
max_df=2
,则只需转换为2个文档即可

下面的源代码示例是从Github复制的,它显示了如何从
max\u df
构造
max\u doc\u count
min_df
的代码类似,可在GH页面上找到

max_doc_count = (max_df
                 if isinstance(max_df, numbers.Integral)
                 else max_df * n_doc)
min_df
max_df
的默认值分别为1和1.0。这基本上是说“如果我的术语只在一个文档中找到,那么它将被忽略。同样,如果它在所有文档(100%或1.0)中找到,那么它将被忽略。”

max\u df
min\u df
都在内部用于计算
max\u doc\u count
min\u doc\u count
,即必须在其中找到术语的文档的最大和最小数量。然后将其作为关键字参数分别传递给
high
low
,则
self.\u limit\u 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.
"""

min_df和max_df的默认值分别为1和1.0。这些默认值实际上什么都不起作用

尽管如此,我相信@Ffisegydd-answer目前接受的答案并不完全正确

例如,使用默认值运行此命令,查看当
min_df=1
max_df=1.0

1) 使用至少一个文档中出现的所有令牌(例如,所有令牌!)

2) 使用所有文档中出现的所有标记(我们将使用一个候选标记进行测试:everywhere)

我们得到:

[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\u words='english'
,特别是要注意,除了'seven'之外,所有的单词都被删除了!包括“无处不在”。

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

为了更好地理解tf idf中的
min_-df
max_-df
,我还要添加这一点

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

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

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

总之,通过
min_-df
max_-df
修剪术语是为了提高性能,而不是集群的质量(例如)


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

min\u DF的目标是忽略出现次数很少且被认为有意义的单词。例如,在您的文本中,可能只有一两个文档中出现人名。在某些应用中,这可能被视为噪声,可以从进一步分析中消除。类似地,您可以忽略在
MAX_DF
中太常见的单词

不要使用最小/最大词频(一个单词的总出现次数)来消除单词,
MIN_-DF
MAX_-DF
查看ho
[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([])