文本分类基于类信息的TF-IDF权重分析与改进

Posted 征途黯然.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文本分类基于类信息的TF-IDF权重分析与改进相关的知识,希望对你有一定的参考价值。

摘要:改进TFIDF,增加了类间因子、类内因子,应用于文本的特征选择,提高了精度
参考文献:[1]姚严志,李建良.基于类信息的TF-IDF权重分析与改进[J].计算机系统应用,2021,30(09):237-241.

一、引言

  权重计算的方法多种多样, 常用的包括文档频率、信息增益、互信息、卡方分布、TF-IDF 等。


二、基础算法

2.1、TF-IDF算法【词频-逆文档频】

  可以与sklearn中提供的TF-IDF方法TfidfVectorizer结合介绍。
   1、 如上图,TF-IDF的值为TF*IDF。

   1.1、 tf(t, d):tf代表特征词t在文本d中出现的次数,其实就是独热(OneHot)。

    词频标准化:但是有可能d比较长,那么相应的每个特征词t相较于在其他文本di出现的次数就多,可能造成不公平,所以提出tf(t, d):tf代表特征词t在文本d中出现的频率,也就是拿t出现的次数除以d中的所有词出现次数和。

   1.2、 idf(t):idf表示逆文档频率。nd是语料库中所有文档数,df(t, d)是整个语料库中含有特征词t的文本数目。

    idf的多个公式:以上3个公式,第二个是教科书的定义。真正使用起来,使用第一或者第三个,第一个是加了平滑,第三个没有加。当sklearn中方法TfidfVectorizer使用smooth_idf = True时,使用的是第一个公式,smooth_idf = False时,使用的是第三个公式。

   2、 算出来TF-IDF值之后,需要基于每个文本d,来使用归一化。归一化采用L2范数,也就是欧几里得归一化,控制TF-IDF的值到区间[0,1]。

[注一]:上图的两种tf的计算方法,一旦经过欧几里得归一化之后,效果是一样的,代入L2范数很容易消去下面的分母,这也是为什么sklearn直接使用词出现次数而不使用词频的原因。

2.2、改进算法【TF-IDF-CI】

  提出TF-IDF的缺点。

  传统 TF-IDF 并不能很好的区分类间和类内分布所带来的影响.。

  类间分布指的是特征词在不同类别间的分布情况,集中分布于某个类别的特征词,比在各个类别均匀分布的特征词更好;

  类内分布指的是特征词在某类别内的分布情况,在某类别内各文档均普遍出现的特征词,比仅出现于类别内一小部分文档的特征词更好。

  提出两种因子。

  类间离散度因子CIac和类内离散度因子CIic

  这些因子都是比较常规的求解方法,其中思想有借鉴意义。

[注二]:上图标注的1,也是对数据进行归一化,采用arctan,函数图像与sigmoid很像。选取函数是否会有一定的规则?值得思考。

[注三]:上图标注的2,这个公式是非常常规的方差公式,教科书上方差的分母应该是N,本文为N-1。调查后,发现除以N是当样本趋于无穷的时候,我们使用有限个样本时,方差会略小,实验证明分母取N-1效果比较好。

[注四]:上图标注的3,分母n(t, c)为0的情况非常多,论文中没有交代如何平滑。

三、代码实验

3.1、实验思路

  根据以下4种方法:

  (1)sklearn中的TF-IDF
  (2)手写的TF-IDF
  (3)sklearn中的TF-IDF + 论文中的两种因子
  (4)手写的TF-IDF + 论文中的两种因子

  比较不同算法之间,文本分类的准确率。

[注五]:TF-IDF主要是用来表示特征词的权重,基于类信息改进的TF-IDF可以应用于训练集,因为训练集是已知类别标签的;但是无法应用于测试集,因为我们在表示权重的时候不应该去拿测试集的标签,测试集标签只是用来验证结果的。参阅文献后,发现他们是对训练集用交叉验证的,感觉自欺欺人了,难以用到工程实践,求大佬指教。。。
参考了论文:张玉芳, 彭时名, 吕佳. 基于文本分类 TFIDF 方法的改进与应用. 计算机工程, 2006, 32(19): 76–78. [doi: 10.3969/j.issn.1000-3428.2006.19.028]

3.2、数据集

  数据来源于 https://github.com/cystanford/text_classification 。数据集共包含四个类别,分别为“女性”,“体育”,“文学”,“校园”,原始数据集已经划分了测试集和训练集,并给出了停用词文档。

3.3、实验结果

5折交叉检验:

方法准确率
sklearn中的TF-IDF0.8699288361952732
手写的TF-IDF0.8699288361952732
sklearn中的TF-IDF + 论文中的两种因子0.6966538843005425
手写的TF-IDF + 论文中的两种因子0.6966538843005425

[注六]:手写出来的特征矩阵,是3306*24000维的,跑一次SVC需要10分钟,我们需要使用scipy.sparse,把普通二维矩阵,转化为稀疏矩阵csr_matrix,此时算法只需要30秒就可以完成。

  实验结果分析:

  准确率下降了!满脸问号???
  检查了很多遍,2.2节公式平滑那里也调了很多参数,准确率都很低。
  虽然实验结果不如意,但是学到了很多关于TF-IDF的理论。

欣慰的是,从数据中可以发现我手写的TF-IDF算法和sklearn提供的效果一模一样!

获取本项目的源代码

如果需要本项目的源代码,请扫描关注我的公众号,回复“论文源码”即可。

以上是关于文本分类基于类信息的TF-IDF权重分析与改进的主要内容,如果未能解决你的问题,请参考以下文章

文本分类基于改进TF-IDF特征的中文文本分类系统

推荐系统学习——基于TF-IDF的改进

通俗理解TF-IDF

基于文本挖掘技术的理赔原因分类方法(上篇)

TF-IDF介绍

文本分类