如何在scikit中计算术语频率 - 学习CountVectorizer

时间:2014-05-24 07:44:50

标签: python scikit-learn tf-idf

我不明白CountVectorizer如何计算术语频率。我需要知道这一点,以便在从语料库中过滤掉术语时,我可以为max_df参数做出明智的选择。以下是示例代码:

    import pandas as pd
    import numpy as np
    from sklearn.feature_extraction.text import CountVectorizer

    vectorizer = CountVectorizer(min_df = 1, max_df = 0.9)
    X = vectorizer.fit_transform(['afr bdf dssd','afr bdf c','afr'])
    word_freq_df = pd.DataFrame({'term': vectorizer.get_feature_names(), 'occurrences':np.asarray(X.sum(axis=0)).ravel().tolist()})
    word_freq_df['frequency'] = word_freq_df['occurrences']/np.sum(word_freq_df['occurrences'])
    print word_freq_df.sort('occurrences',ascending = False).head()

       occurrences  term  frequency
    0            3   afr   0.500000
    1            2   bdf   0.333333
    2            1  dssd   0.166667

似乎'afr'出现在我的语料库中的一半术语中,正如我期望通过查看语料库。但是,当我在max_df = 0.8中设置CountVectorizer时,术语'afr'就会从我的语料库中过滤掉。到处玩,我发现在我的例子中使用coprus,CountVectorizer为'afr'分配了一个~0.833的频率。有人可以提供关于如何计算en max_df的术语频率的公式吗?

由于

1 个答案:

答案 0 :(得分:5)

问题显然不在于频率的计算方式,而在于如何应用max_df阈值。 CountVectorizer的代码执行此操作:

max_doc_count = (max_df
    if isinstance(max_df, numbers.Integral)
    else int(round(max_df * n_doc))
)

即,通过舍入文档比例乘以文档数来获得最大文档数。这意味着,在3个文档的语料库中,任何等于2.5个以上文档的max_df阈值实际上与3个文档的阈值相同。您看到“频率”为2.5 / 3 = 0.8333 ---也就是说,在3个文档中约有83.3%出现的术语出现在其中的2.5个中,它被四舍五入为3,这意味着它出现在所有这些文档中

简而言之,“afr”被正确认为文档频率为3,但最大文档频率被错误地认为是3(0.9 * 3 = 2.7,四舍五入为3)。

我认为这是scikit中的一个错误。最大文档频率应该 down ,而不是向上。如果阈值为0.9,则所有文档中出现的术语都超过阈值,应排除。