TfidfVectorizer - 正则化偏差

9

我希望确认一下在TfidfVectorizer对象中,属性use_idf和sublinear_tf的作用。我已经研究了几天。我正在尝试对具有不同长度的文档进行分类,并使用tf-idf进行特征选择。

我认为当use_idf=true时,算法会规范化偏差,避免TF中一个词出现X次时,它不应该比出现1次的重要性高X倍这个固有问题。

利用tf*idf公式。然后sublinear_tf=true采取1+log(tf)的形式,以规范化长文档与短文档之间的偏差。

我正在处理一种天生倾向于长文档的偏见(大多数属于一类),这种规范化是否真的减轻了偏见呢?

如何确保语料库中文档的长度没有整合到模型中?

我正在尝试验证规范化是否应用于模型中。我正在尝试提取语料库的规范化向量,所以我假设我可以只是总结Tfidfvectorizer矩阵的每行。然而,总和大于1,我原以为规范化的语料库会将所有文档转换为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个回答

13
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
我并不是说我有问题。我只是想验证由于文档长度而产生的任何偏见未被整合到模型中,因为我认识到这可能是分类本身的属性之一。感谢对这些属性的解释! - OAK

9

use_idf=true(默认情况下)引入了一个全局组件到术语频率组件中(本地组件:单个文章)。在寻找两个文本的相似性时,不是计算每个文本拥有的术语数量并进行比较,而是引入idf来将这些术语分类为相关或不相关。根据齐普夫定律,“任何单词的频率与其排名成反比例”。也就是说,最常见的单词会出现两次,第二个最常见的单词会出现三次等等。即使删除停用词,所有单词都受到齐普夫定律的影响。

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

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接