摘要:改进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-IDF | 0.8699288361952732 |
手写的TF-IDF | 0.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提供的效果一模一样!