如何在scikit中计算术语频率 – 学习CountVectorizer
作者:互联网
我不明白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’出现在我的语料库中的一半术语中,正如我期望通过查看语料库.但是,当我在CountVectorizer中设置max_df = 0.8时,术语’afr’将从我的语料库中过滤掉.到处玩,我发现在我的例子中使用coprus,CountVectorizer为’afr’分配了一个~0.833的频率.有人可以提供一个关于如何计算enterts max_df的术语频率的公式吗?
谢谢
解决方法:
问题显然不在于如何计算频率,而在于如何应用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中的一个错误.最大文档频率应向下舍入,而不是向上舍入.如果阈值为0.9,则所有文档中出现的术语都超过阈值,应排除.
标签:python,scikit-learn,tf-idf 来源: https://codeday.me/bug/20190830/1770613.html