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

我相信,当使用use_idf=true时,算法会针对固有问题(使用TF)规范化偏见,因为固有问题的使用频率要高出X倍,所以它的重要性不应该是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)

最佳答案

use_idfsublinear_tf都不处理文档长度。实际上,您对use_idf的解释“其中X倍频度的术语不应该是X倍重要度”更适合sublinear_tf的描述,因为sublinear_tf会导致Tfidf得分与术语频率相比呈对数增长。
use_idf的意思是使用反向文档频率,因此与那些不经常出现但仅在特定文档中出现的词语相比,出现频率最高的词语在大多数文档中出现的程度(即不良指标)的权重较小。一个很好的指标)。

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

默认情况下,TfidfVectorizer已经使用了norm=l2,所以我不确定是什么导致了您所面临的问题。也许那些较长的文档确实也包含类似的单词?另外,分类通常取决于数据,很多取决于数据,因此在这里我不能多说来解决您的问题。

引用:

  • TfidfVectorizer documentation
  • Wikipedia
  • Stanford Book
  • 关于python - TfidfVectorizer-标准化偏差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34435484/

    10-15 10:53