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个文档中出现的术语".因此,默认设置不会忽略任何术语.
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_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.
"""
Run Code Online (Sandbox Code Playgroud)
小智 10
我也会添加这一点以更好地理解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_
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'
看看,特别的是,除了“七”之外的所有单词都被删除了!包括“无处不在”。
归档时间: |
|
查看次数: |
39730 次 |
最近记录: |