我想确保我了解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_idf
和sublinear_tf
都不处理文档长度。实际上,您对use_idf
的解释“其中X倍频度的术语不应该是X倍重要度”更适合sublinear_tf
的描述,因为sublinear_tf
会导致Tfidf得分与术语频率相比呈对数增长。use_idf
的意思是使用反向文档频率,因此与那些不经常出现但仅在特定文档中出现的词语相比,出现频率最高的词语在大多数文档中出现的程度(即不良指标)的权重较小。一个很好的指标)。
为了减少文档长度偏差,您可以使用归一化(TfidfVectorizer参数中的norm
),然后根据该文档的总得分(norm=l1
的简单平均值,norm=l2
的平方平均值)按比例缩放每个术语的Tfidf得分。
默认情况下,TfidfVectorizer已经使用了norm=l2
,所以我不确定是什么导致了您所面临的问题。也许那些较长的文档确实也包含类似的单词?另外,分类通常取决于数据,很多取决于数据,因此在这里我不能多说来解决您的问题。
引用:
关于python - TfidfVectorizer-标准化偏差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34435484/