我有五个输入到CountVectorizer的文本文件。为CountVectorizer实例指定min_df和max_df时,最小/最大文档频率到底是什么意思?是某个单词在其特定文本文件中的出现频率,还是整个整体语料库(5个txt文件)中该单词的出现频率?
当min_df和max_df作为整数或浮点数提供时有何不同?
该文档似乎没有提供详尽的解释,也没有提供示例来演示min_df和/或max_df的用法。有人可以提供说明min_df或max_df的说明或示例。
Answers:
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个文档中出现的术语”。因此,默认设置不会忽略任何术语。
根据此处的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_df
和max_df
分别为1和1.0。这基本上表示“如果仅在1个文档中找到我的术语,则将其忽略。同样,如果在所有文档中(100%或1.0)都找到了我的术语,则将其忽略。”
max_df
并且min_df
都在内部用于计算max_doc_count
和min_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.
"""
min_df
说“忽略文档频率严格低于给定阈值的术语”。因此,严格低于默认值1的频率意味着将忽略那些从不出现(!)的术语,但保留一次出现的术语。
min_df
和的确切含义max_df
。我添加了一个答案,该答案准确地解释了CountVectorizer如何解释这些参数。
我还将补充这一点min_df
,max_df
以更好地理解tf-idf。
如果使用默认值(意味着考虑所有术语),则肯定会生成更多的令牌。因此,您的群集过程(或以后要使用这些术语执行的其他任何操作)将花费更长的时间。
但是群集的质量不应降低。
有人可能会认为,允许显示所有术语(例如,过于频繁的术语或停用词)可能会降低质量,但在tf-idf中却并非如此。因为tf-idf测量本能地会给这些术语打低分,从而有效地使它们不具有影响力(如在许多文档中所出现的)。
综上所述,通过min_df
和修剪术语max_df
是为了提高性能,而不是集群的质量(例如)。
而关键的一点是,如果你设置的min
和max
错误的,你会失去一些重要的条款,从而降低了质量。因此,如果不确定阈值的正确性(取决于文档集),或者不确定机器的处理能力,请保持min
,max
参数不变。
min_df和max_df的默认值分别为1和1.0。这些默认设置实际上根本不执行任何操作。
话虽如此,我相信@Ffisegydd答案当前接受的答案不是很正确。
例如,使用默认值运行此命令,以查看何时min_df=1
和max_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'
并发现,除“七个”以外的所有单词都被删除了!包括“无处不在”。