TfidfVectorizer - 归一化偏差

时间:2015-12-23 12:13:53

标签: python scikit-learn normalization tf-idf

我想确保我理解在TfidfVectorizer对象中use_idf和sublinear_tf属性的作用。我已经研究了几天了。我试图对不同长度的文档进行分类,并使用当前的tf-idf进行特征选择。

我相信当use_idf=true时算法将偏差归为固有问题(使用TF),其中X倍频率的术语不应该是X倍重要。

使用tf*idf公式。然后sublinear_tf = true填充1+log(tf),使其针对冗长文档与短文档的偏差进行标准化。

我正在处理对冗长文档的固有偏见(大多数属于一个类),这种规范化是否真的减少了偏见?

如何确保语料库中文档的长度未集成到模型中?

我试图验证模型中是否正在应用规范化。我试图提取语料库的标准化向量,所以我假设我只能总结Tfidfvectorizer矩阵的每一行。然而总和大于1,我认为标准化的copora会将所有文档转换为0-1之间的范围。

vect = TfidfVectorizer(max_features=20000, strip_accents='unicode',
stop_words=stopwords,analyzer='word', use_idf=True, tokenizer=tokenizer, ngram_range=(1,2),sublinear_tf= True , norm='l2')

tfidf = vect.fit_transform(X_train)
# sum norm l2 documents
vect_sum = tfidf.sum(axis=1)

2 个答案:

答案 0 :(得分:4)

use_idfsublinear_tf都不处理文档长度。实际上你对use_idf"的解释,其中一个X倍频的术语不应该是X倍重要的"作为对sublinear_tf的描述更合适,因为sublinear_tf导致Tfidf得分与术语频率相比呈对数增加。

use_idf表示使用反向文档频率,因此与出现频率较低但出现频率较低的字词相比,出现在大多数文档中出现频率非常频繁的字词(即不良指标)的权重较小仅在特定文件中(即一个好的指标)。

为了减少文档长度偏差,您可以使用标准化(TfidfVectorizer参数中的norm),因为您会根据该文档的总得分按比例缩放每个术语的Tfidf分数(norm=l1的简单平均值平均norm=l2

默认情况下,TfidfVectorizer已经使用norm=l2,所以我不确定是什么原因导致您遇到的问题。也许那些较长的文件确实也含有相似的单词?分类通常依赖于很多的数据,所以我不能在这里说太多来解决你的问题。

参考文献:

答案 1 :(得分:2)

use_idf=true(默认情况下)将全局组件引入术语频率组件(本地组件:单篇文章)。在查看两个文本的相似性时,不是计算每个文本的每个术语的数量并进行比较,而是引入idf有助于将这些术语分类为相关或不相关。根据Zipf定律,“任何单词的频率与其排名成反比”。也就是说,最常见的单词出现次数是第二个最常见的单词的两倍,是第三个最常见的单词等的三倍。即使在删除单词后,所有单词都受Zipf定律的约束。

从这个意义上说,想象一下你有5篇描述汽车主题的文章。在此示例中,单词“auto”可能会出现在所有5个文本中,因此不会是单个文本的唯一标识符。另一方面,如果只有一篇文章描述了自动“保险”,而另一篇文章描述了自动“机制”,则这两个词(“机制”和“保险”)将是每个文本的唯一标识符。通过使用idf,在文本中显得不太常见的单词(例如“机制”和“保险”)将获得更高的权重。因此,使用idf并不能解决文章长度产生的偏差,因为这又是衡量全局成分的一种方法。如果你想减少长度产生的偏差然后如你所说,使用sublinear_tf=True将是一种解决它的方法,因为你正在转换本地组件(每篇文章)。

希望它有所帮助。