TfidfVectorizer-标准化偏差

OAK*_*OAK 3 python normalization tf-idf scikit-learn

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

我相信什么时候 use_idf=true算法将针对固有问题(使用TF)的偏见归一化,该术语的频率要高出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)
Run Code Online (Sandbox Code Playgroud)

jus*_*alf 6

既不use_idf也不sublinear_tf与文档长度交易。实际上,您对use_idf“频率高出X倍的术语不应比X倍重要的解释”的解释更适合sublinear_tf作为sublinear_tf在TFIDF原因对数增加得分相比词频。

use_idf 表示使用“反向文档频率”,以便与出现频率较低但仅出现在特定文档中的词语相比,出现频率最高的词语在大多数文档中出现的程度(即不良指标)的权重较小。好指标)。

为了减少文件的长度偏差,使用标准化(norm在TfidfVectorizer参数),你按比例缩放每个词的TFIDF分数基于该文档的总得分(简单平均norm=l1,对平均的平方norm=l2

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

参考文献:


Eco*_*sca 6

use_idf=true(默认情况下)为术语频率分量(局部分量:单个文章)引入了一个全局分量。在考虑两个文本的相似性时,不是计算每个文本的术语数量并进行比较,引入 idf 有助于将这些术语分类为相关或不相关。根据齐夫定律,“任何单词的出现频率与其排名成反比”。也就是说,最常用的词将是第二常用词的两倍,第三常用词的三倍,等等。即使去除了停用词,所有词都服从齐普夫定律。

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

希望能帮助到你。