我想确保我理解在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)
答案 0 :(得分:4)
use_idf
和sublinear_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
将是一种解决它的方法,因为你正在转换本地组件(每篇文章)。
希望它有所帮助。