【问题标题】:Understanding min_df and max_df in scikit CountVectorizer了解 scikit CountVectorizer 中的 min_df 和 max_df
【发布时间】:2015-02-26 03:56:54
【问题描述】:

我有五个文本文件输入到 CountVectorizer。当为 CountVectorizer 实例指定 min_dfmax_df 时,最小/最大文档频率究竟意味着什么?是某个词在其特定文本文件中出现的频率,还是该词在整个语料库(五个文本文件)中出现的频率?

min_dfmax_df 以整数或浮点数形式提供时有什么区别?

The documentation 似乎没有提供详尽的解释,也没有提供示例来演示这两个参数的用法。有人可以提供一个解释或示例来演示min_dfmax_df吗?

【问题讨论】:

    标签: python machine-learning scikit-learn nlp


    【解决方案1】:

    我刚刚查看了 sklearn CountVectorizer 的文档。这就是我的想法。

    常用词的频率值较高,而稀有词的频率值较低。频率值范围在0 - 1 之间,以分数表示。

    max_df 是频率值的上限,而min_df 只是频率值的下限。

    如果我们想删除更多的常用词,我们将max_df设置为0到1之间的较低上限。如果我们想删除更多罕见词,我们将min_df设置为0到1之间的较高截止值. 我们保留max_dfmin_df 之间的所有内容。

    让我知道,不确定这是否有意义。

    【讨论】:

      【解决方案2】:

      MIN_DF 的目标是忽略出现次数很少被认为有意义的单词。例如,在您的文本中,您的人名可能只出现在 1 或 2 个文档中。在某些应用中,这可能属于噪声,可以从进一步分析中消除。同样,您可以忽略MAX_DF 中过于常见的单词。

      MIN_DFMAX_DF 不是使用最小/最大词频(词的总出现次数)来消除词,而是查看有多少文档包含一个词,即众所周知的文档频率。阈值可以是绝对值(例如 1、2、3、4)或代表文档比例的值(例如 0.25 的含义,忽略出现在 25% 文档中的单词)。

      some usage examples here

      【讨论】:

        【解决方案3】:

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

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

        但不应降低聚类的质量。

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

        总而言之,通过min_dfmax_df 修剪术语是为了提高性能,而不是提高集群的质量(例如)。

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

        【讨论】:

        • 谢谢 - 这是我独立得出的相同结论。
        【解决方案4】:

        max_df 用于删除出现过于频繁的术语,也称为“特定于语料库的停用词”。例如:

        • max_df = 0.50 表示“忽略出现在超过 50% 的文档中的术语”。
        • max_df = 25 表示“忽略出现在超过 25 个文档中的术语”。

        默认的max_df1.0,这意味着“忽略出现在超过 100% 的文档中的术语”。因此,默认设置不会忽略任何条款。


        min_df 用于删除出现频率太低的术语。例如:

        • min_df = 0.01 表示“忽略出现在不到 1% 的文档中的术语”。
        • min_df = 5 表示“忽略出现在少于 5 个文档中的术语”。

        默认的min_df1,这意味着“忽略出现在少于1 个文档 中的术语”。因此,默认设置不会忽略任何条款。

        【讨论】:

        • 希望这出现在官方文档中,以避免太多的不明确和混乱。
        【解决方案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_
        

        我们得到:

        [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' 并看到,特别是,除了“七”之外的所有单词都被删除了!包括“无处不在”。

        【讨论】:

          【解决方案6】:

          根据CountVectorizer 文档here

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

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

          考虑您有 5 个文本文件(或文档)的示例。如果您设置max_df = 0.6,那么这将转换为0.6*5=3 文档。如果您设置max_df = 2,那么它只会转换为 2 个文档。

          下面的源代码示例是从 Github here 复制的,并显示了 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_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.
          """
          

          【讨论】:

          • 这令人困惑。 min_df 的文档说“忽略文档频率严格低于低于给定阈值的术语。”因此,频率严格低于默认值 1 意味着忽略从未出现过的术语(!)但保留出现一次的术语。
          • @MonicaHeddneck 是正确的。这个答案误解了min_dfmax_df 的确切含义。我添加了一个答案,准确解释了 CountVectorizer 如何解释这些参数。
          • 是的,正如@MonicaHeddneck 和 kevin 指出的那样,对于 min_df 和 max_df,这个答案有些错误
          猜你喜欢
          • 2019-03-06
          • 2017-02-11
          • 2020-05-05
          • 1970-01-01
          • 2017-02-25
          • 2020-01-15
          • 2019-06-08
          • 2018-03-18
          • 2014-07-23
          相关资源
          最近更新 更多