我想确保我了解属性use_idf和subliner_tf在TfidfVectorizer对象中的作用。我已经研究了几天了。我正在尝试对不同长度的文档进行分类,并使用当前的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)
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
,所以我不确定是什么导致了您面临的问题。也许那些较长的文件也确实包含类似的词语?此外,分类通常在很大程度上依赖于数据,所以我不能在这里说太多来解决您的问题。
参考文献:
- Tfidf矢量器文档
- 维基百科
- 斯坦福图书
use_idf=true
(默认情况下)将全局分量引入术语频率分量(局部分量:单个文章)。当考虑两个文本的相似性时,引入idf有助于将这些术语分类为相关或不相关,而不是计算它们各自的术语数量并进行比较。根据齐普夫定律,"任何单词的频率与其等级成反比"。也就是说,最常见的单词出现的次数是第二常见单词的两倍,第三常见单词的三倍等等。即使删除了停止词,所有单词都要遵守齐普夫定律。
从这个意义上讲,假设你有5篇文章描述了一个汽车主题。在本例中,单词"auto"可能会出现在所有5个文本中,因此不会是单个文本的唯一标识符。另一方面,如果只有一篇文章描述汽车"保险",而另一篇文章则描述汽车"机械",那么这两个词("机械"one_answers"保险")将是每个文本的唯一标识符。通过使用idf
,文本中不太常见的单词(例如"机械"one_answers"保险")将获得更高的权重。因此,使用idf
并不能解决文章长度产生的偏差,因为它也是一种全局成分的衡量标准。如果你想减少长度产生的偏差,那么正如你所说,使用sublinear_tf=True
将是一种解决问题的方法,因为你正在转换局部组件(每篇文章)。
希望能有所帮助。