我有五个文本文件输入到CountVectorizer中。在指定CountVectorizer实例的min_df
和max_df
时,最小/最大文档频率是什么意思?它是单词在其特定文本文件中的频率还是在整个语料库(五个文本文件)中的频率?
当提供整数或浮点数作为min_df
和max_df
时有什么区别?
文档似乎没有提供详细的解释,也没有提供演示这两个参数用法的示例。是否可以提供一个解释或演示min_df
和max_df
的示例呢?
我有五个文本文件输入到CountVectorizer中。在指定CountVectorizer实例的min_df
和max_df
时,最小/最大文档频率是什么意思?它是单词在其特定文本文件中的频率还是在整个语料库(五个文本文件)中的频率?
当提供整数或浮点数作为min_df
和max_df
时有什么区别?
文档似乎没有提供详细的解释,也没有提供演示这两个参数用法的示例。是否可以提供一个解释或演示min_df
和max_df
的示例呢?
max_df
被用于删除出现过于频繁的术语,也称为“特定语料库停用词”。例如:
max_df = 0.50
表示“忽略在50%以上的文档中出现的术语”。max_df = 25
表示“忽略在25个文档以上中出现的术语”。默认值为1.0
,意味着“忽略出现在100%以上的文档中的术语”。因此,默认设置不会忽略任何术语。
min_df
被用于删除出现过于稀少的术语。例如:
min_df = 0.01
表示“忽略在少于1%的文档中出现的术语”。min_df = 5
表示“忽略在少于5个文档中出现的术语”。默认值为1
,意味着“忽略出现在少于1个文档中的术语”。因此,默认设置不会忽略任何术语。
CountVectorizer
文档这里的说明:[0.0, 1.0]
的浮点数时,它们指的是文档频率。即包含该项的文件百分比。max_df = 0.6
,那将转化为0.6*5=3
个文档。如果你设置max_df = 2
,那就是2个文档。max_df
中构建max_doc_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_df
和 min_df
都在内部用于计算max_doc_count
和min_doc_count
,即每个术语必须在其中找到的最大和最小文档数。然后将此传递给self._limit_features
作为关键字参数high
和low
,self._limit_features
的docstring如下:"""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,则意味着忽略从未出现过的项,但保留出现一次的项。 - Monica Heddneckmin_df
和max_df
的确切含义。我添加了一个答案,详细解释了CountVectorizer如何解释这些参数。 - Kevin Markhamcv = 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'
并注意到奇怪的是,除了“seven”以外的所有单词都被删除了! 包括 `everywhere'。
MIN_DF
的目标是忽略出现次数很少的单词,以便被认为具有意义。例如,在您的文本中,可能会出现仅在1或2个文档中出现的人名。在某些应用程序中,这可能被视为噪音,并且可以从进一步分析中消除。类似地,您可以使用MAX_DF
忽略太常见的单词。
MIN_DF
和MAX_DF
不是使用最小/最大出现频率(单词的总出现次数)来消除单词,而是查看包含术语的文档数量,更好地称为文档频率。阈值可以是绝对值(例如1、2、3、4)或表示文件比例的值(例如0.25,表示忽略已出现在25%的文件中的单词)。我刚刚查看了sklearn CountVectorizer的文档,这是我的理解。
常见单词具有较高的频率值,而罕见单词具有较低的频率值。频率值在0-1之间作为分数。
max_df
是频率值的上限值,而min_df
只是频率值的下限值。
如果我们想要删除更多的常见单词,我们将max_df
设置为介于0和1之间的较低上限值。如果我们想要删除更多的罕见单词,我们将min_df
设置为介于0和1之间的较高下限值。我们保留max_df
和min_df
之间的所有内容。
让我知道,不确定这是否有意义。