大家好,又见面了,我是你们的朋友全栈君。
1 设计题目
文本分类的算法研究与实现
2 课题背景及研究现状
2.1 课题背景
近年来,随着Internet的迅猛发展,网络信息和数据信息不断扩展,如何有效利用这一丰富的数据信息,己成为广大信息技术工作者所关注的焦点之一。为了快速、准确的从大量的数据信息中找出用户所需要的信息,文本信息的自动分析也成为了当前的迫切需求。对文本信息的分析中的一个主要技术就是文本分类。文本分类问题是自然语言处理的一个基本问题,很多相关的研究都可以归结为分类问题。文本分类是指将文本按一定的规则归于一个或多个类别中的技术。近年来,许多统计的方法和机器学习的方法都应用到文本分类方面,如朴素贝叶斯方法(NB)、K-近邻方法(KNN)、支持向量机方法(SVM)等。
文本分类,从训练文档中推导出分类规则,根据该规则来给未知文档进行分类,可以将其分为人工分类和自动分类两大类。人工分类,耗费大量的人力、物力、财力,效率低下,丰富的资源难以得到有效的利用,已经远远不能满足各种领域获取信息的需要。自动文本分类就是在给定的分类体系下,让计算机根据文本的内容确定与它相关联的类别。它属于人工智能技术,不仅方便快捷,实现简单,节省大量的人力物力,并且可以进一步进行更深层次的信息挖掘处理,以提高信息的利用效率。
中文文本分类问题与英文文本分类问题具有相当大的区别,中文文本的原始特征空间维数比英文文本更大,词性变化更加灵活。因而,在英文文本分类中表现良好的分类方法未必适用于中文文本分类。对中文文本分类方法进行比较研究就显得十分重要。对各种中文文本分类方法进行对比研究,对于中文信息的处理,乃至社会的信息化建设,具有重要的理论意义和良好的应用前景。
总之,在信息服务的过程中,中文文本分类是文本挖掘的核心基础,是自然语言处理的关键技术之一。它为信息检索提供了更为高效的搜索策略和更为准确的查询结果。
2.2 国内研究现状
国内对文本分类的研究稍晚,没有形成整体力量。直到80年代中期开始,我国的一些大学、图书馆和文献工作单位才开展了档案、文献或图书的辅助或自动分类研究,并陆续研制出一批计算机辅助分类系统和自动分类系统,这些技术主要集中在中文处理领域。
在中文文本分类上,香港和台湾的起步较早,水平相对要高一些,国内在这个方面起步较晚,基本上还处于跟踪研究的地步。1981年,侯汉清教授对于计算机在文本分类工作中的应用做了探讨,并介绍了国外计算机管理分类表、计算机分类检索、计算机自动分类、计算机编制分类等方面的概况。此后,我国陆续研制出一批计算机辅助分类系统和自动分类系统。1993年国家自然科学基金首次支持对该领域的研究项目。21世纪初期,文本分类的研究在国内呈现直线上升的趋势,一些著名的学者都在文本分类的研究上取得了相应的学术成果。目前,国内的许多科研单位和高等院校竞相开展中文文本分类的基础理论及其应用研究。主要的研究单位有东北大学、复旦大学、清华大学、哈尔滨工业大学、中科院计算机研究所等。
2.3 国外研究现状
在国际上对于文本自动分类的研究开展得比较早,欧美在这个领域内占有绝对的优势。上世纪50年代末,美国IBM公司的卢恩(H.P.Luhn)在这一领域进行了开创性的研究,提出了词频统计思想用于自动分类。1960年,马仁(Maron)在Journal of ACM上发表了关于自动分类的第一篇论文。随后众多学者K.Spark、G.Salton、R.M.Needham .M.E.Lesk . K.S.Jones等人在这一领域进行了卓有成效的研究工作。国外研究文本分类的组织、机构和大学都很多,比较著名的如卡内基梅隆大学(有机器制造DM、多媒体数据库 DM、互连网DM三个研究中心)、斯坦福大学、麻省理工学院。著名研究机构如:ACM(美国计算机协会,信息领域最为权威的国际学术组织)、KDNet(欧洲顶级的知识发现网络)等。
20世纪90年代后期,计算机技术蓬勃发展,同时网络信息量不断增长,人们对文本分类的需求日益增长。传统的手工分类逐渐被淘汰,基于机器学习的文本分类逐渐被人们所发现并重视,由于此种方法分类的结果更加精准,分类速度更快,很快便替代了原本的手工分类。
3 算法描述
世界上研究出多种具有一定效率的自动分类方法,比如决策树、简单贝叶斯、K-近邻、神经网络、Rocchio、支持向量机、先行最小平方拟合分类方法等等。其中K-最近邻分类法、简单贝叶斯分类法和支持向量机分类法是最常用的分类方法。
3.1 朴素贝叶斯分类法
朴素贝叶斯算法就是根据贝叶斯公式来对未知事物进行分类,通过已知条件(X=x)计算未知事物分别属于各个类别(Y=ck)时对应的概率,然后把未知事物判别为概率最大的那一类。
为了避开类条件概率是所有属性上的联合概率,难以从有限的训练样本直接估计而得,朴素贝叶斯分类器采用了“属性条件独立性假设”:对已知类别,假设所有属性相互独立。
朴素贝叶斯分类器表达式:
朴素贝叶斯分类器训练的过程就是基于训练集D来估计类先验概率,并为每个属性估计条件概率 。
为了避免其他属性携带的信息被训练集中未出现的属性值“抹去”,在估计概率值时通常要进行“平滑”,常用“拉普拉斯修正”。可以一定程度上避免因训练集样本不充分而导致概率估值为零的情况。
3.2 K-最近邻分类法
K-最近邻(K-Nearest Neighbor,简称KNN),是由Cover和 Hart于1968年提出的,是一个理论上比较成熟的方法。即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居),这K个实例的多数属于某个类,就把该输入实例分类到这个类中。
KNN算法的核心在于找到实例点的邻居。特征空间中两个实例点的距离和反应出两个实例点之间的相似性程度。K近邻模型的特征空间一般是n维实数向量空间,使用的距离可以使欧式距离。还有其他的如:曼哈顿距离,切比雪夫距离,闵可夫斯基距离,标准化欧氏距离,马氏距离等可作为距离的衡量方式。其中欧式距离的公式如下:
K值的选择对K近邻算法的结果会产生重大影响,在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法来选择最优的K值。
算法的输入:训练数据集
其中和测试数据x
输出:实例x所属的类别
- 根据给定的距离度量,在训练集T中找到与x距离最近的k个样本,涵盖这k个点的x的邻域记作
- 在中根据分类规则(如多数表决)确定x的类别y:
3.3 AdaBoost 分类器算法
boosting是通过集中关注被已有分类器错分的那些数据来获得新的分类器。由于boosting分类的结果是基于所有分类器的加权求和结果的。
AdaBoost 是 adaptive boosting(自适应boosting) 的缩写,其运行过程如下:训练数据中的每个样本,并赋予其一个权重,这些权重构成了向量D。一开始,这些权重都初始化成相等值。首先在训练数据上训练出一个弱分类器并计算该分类器的错误率,然后在同一数据集上再次训练弱分类器。在分类器的第二次训练当中,将会重新调整每个样本的权重,其中 第一次分对的样本的权重将会降低,而第一次分错的样本的权重将会提高。为了从所有弱分类器中得到最终的分类结果,AdaBoost为每个分类器都分配了一个权重值alpha,这些alpha值是基于每个弱分类器的错误率进行计算的。其中,错误率ε的定义为:
3.4 支持向量机分类法
持向量机(SVM)是一种监督机器学习算法,可用于分类或回归挑战,被认为是文本分类中效果较为优秀的一种方法。它试图找到一个超平面,将空间中的样本分为两类,主要用于分类问题。支持向量机可以对线性可分离的数据进行分类。在二分类任务中表现良好,但是对于多分类问题不是特别擅长。
如果数据不是线性可分离的,那么可以使用松弛变量和核函数来解决这个问题。常用的核函数有:线性核(Linear Kernel),多项式核(Polynomial Kernel),高斯核(Gaussian Kernel),Sigmoid核(Sigmoid Kernel)。
设训练数据集合为,我们假设数据集是线性不可分的,通常情况下,训练数据中有一些outlieroutlier,将这些点去除后,剩下的样本点构成的集合是线性可分的。线性不可分意味这存在某些点不满足,这个时候我们可以给每个样本点引进一个松弛变量使得约束条件
同时目标函数需要最小化
这里的C>0是惩罚因子,CC越大表示对误差的分类增大,CC越小表示对误差的分类乘法越小。最小化目标函数包含两次含义:使12wTw12wTw尽量小(即间隔尽量大),同时使误差分类的个数尽量小,CC是调和二者的系数。新的最优化问题可以表示为
本次实验采用的核函数为高斯核函数
对应的向量机是一个p次多项式分类器,在此情况下分类函数为
3.5 随机森林分类法
随机森林是一种重要的基于Bagging的集成学习方法,可以用来做分类、回归等问题。有许多优点:具有极高的准确率;随机性的引入,使得随机森林不容易过拟合;随机性的引入,使得随机森林有很好的抗噪声能力;能处理很高维度的数据,并且不用做特征选择;既能处理离散型数据,也能处理连续型数据,数据集无需规范化;训练速度快,可以得到变量重要性排序;容易实现并行化
随机森林的缺点:当随机森林中的决策树个数很多时,训练时需要的空间和时间会较大。
随机森林的输入为:训练数据集,样本子集的个数T
输出:最终的强分类器
- 对
- 从原始样本集中随机的抽取m个样本点,得到一个训练集;
- 用训练集,训练一个CART决策树,这里在训练的过程中,对每个节点的切分规则是先从所有特征中随机的选择k个特征,然后在从这k个特征中选择最优的切分点在做左右子树的划分。
- 如果是分类算法,则预测的最终类别为该样本点所到叶节点中投票数最多的类别;如果是回归算法,则最终的类别为该样本点所到叶节点的均值。
4 文本分类算法实验和结果
4.1 数据的预处理
4.1.1数据获取
本次实验采用的sklean库中的fetch_20newsgroups数据集,该数据集是用于文本分类、文本挖据和信息检索研究的国际标准数据集之一。收集了大约20,000左右的新闻组文档,均匀分为20个不同主题的新闻组集合。一些新闻组的主题特别相似,还有一些却完全不相关。共有18846条数据。
数据集形状 (18846,)
================= ==========
Classes 20
Samples total 18846
Dimensionality 1
Features text
================= ==========
数据集标签20类别:
[‘alt.atheism’, ‘comp.graphics’, ‘comp.os.ms-windows.misc’, ‘comp.sys.ibm.pc.hardware’, ‘comp.sys.mac.hardware’, ‘comp.windows.x’, ‘misc.forsale’, ‘rec.autos’, ‘rec.motorcycles’, ‘rec.sport.baseball’, ‘rec.sport.hockey’, ‘sci.crypt’, ‘sci.electronics’, ‘sci.med’, ‘sci.space’, ‘soc.religion.christian’, ‘talk.politics.guns’, ‘talk.politics.mideast’, ‘talk.politics.misc’, ‘talk.religion.misc’]
本次实验选择随机采样75%的数据样本作为训练集,25%的数据样本作为测试集。部分训练样本如下:
部分训练样本中的标签如下:
代码:
#1.数据获取
news = fetch_20newsgroups(subset='all')
print(len(news.data)) # 输出数据的条数:18846
#2.数据预处理:训练集和测试集分割,文本特征向量化
#分割
X_train,X_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25,random_state=33) # 随机采样25%的数据样本作为测试集
print(X_train[0]) #查看训练样本
print(y_test[0:100]) #查看标签
4.1.2 文本向量化
使用CountVectorizer将训练样本进行向量化,转换后的部分词频矩阵如下:
#文本向量化
#文本特征向量化
vec = CountVectorizer()
X_train = vec.fit_transform(X_train)
X_test = vec.transform(X_test)
4.2 利用朴素贝叶斯进行文本分类
选用Python第三方提供的的机器学习库sklean中的多项式朴素贝叶斯分类器MultinomialNB。处理代码如下:
from sklearn.naive_bayes import MultinomialNB # 从sklean.naive_bayes里导入朴素贝叶斯模型
mnb = MultinomialNB() # 使用默认配置初始化朴素贝叶斯
mnb.fit(X_train,y_train) # 利用训练数据对模型参数进行估计
mnb_predict = mnb.predict(X_test) # 对参数进行预测
print('The Accuracy of Naive Bayes Classifier is:', mnb.score(X_test,y_test))
print(classification_report(y_test, mnb_predict, target_names = news.target_names))
多分类问题一般采用macro-F1指标去评判分类的结果,等价于所有类别的F1值重要性相同。若类别中样本数量不一样,对于预测错的样本,出现在样本数少的类别就会使得F1值下降很多;反之,对于样本多的类别此时的F1值下降很小。所以我们不能只关注样本的准确率,而是要关注每个类别的F1表现,此时可以采用多分类的混淆矩阵来可视化各个类别的错分样本数量。
由上图可以很直观的看出,多项式朴素贝叶斯分类器准确度整体还是很高的,但是对于第2类文本和第19类文本的准确度很低,均不超过50%。而对于第10类和第11类文本,分类的准确度很高。
4.3 利用KNN算法进行文本分类
KNN模型是有监督学习中较为通俗易懂的分类算法,在各类分类任务中经常使用。本次实验选用的KNN算法,选用默认的欧氏距离作为距离衡量。将kneighbors查询使用的邻居数设置为5。关键代码如下:
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier(random_state=22)
rfc.fit(X_train, y_train)
rfc_predict = rfc.predict(X_test)
由上图可以得到,KNN模型整体的分类效果并不是很理想,被分错类的文本较多,大部分文本的准确率没有超过60%,仅有第11类和第17类文本准确率达到了70%。在实际应用中应当不考虑该算法。
4.4 利用支持向量机进行文本分类
本次实验中,我们对比支持向量机中的不同核函数,通过最后性能对比,其中高斯核函数表现最优,故作为对照组进行文本分类的性能对比。关键代码如下:
from sklearn.svm import SVC
svc =SVC(kernel='rbf')
svc.fit(X_train, y_train)
svc_predict = svc.predict(X_test)
由上图可以看出svm的整体分类效果也不佳,被分错类的文本类别较多。大部分文本的准确率没有超过60%,仅有第11类和第17类文本准确率达到了70%。在实际应用中同样不应当考虑该算法。
4.5 利用随机森林进行文本分类
随机森林是指通过多个不同的决策树进行预测,最后取多数的预测结果为最终结果。我们选择默认的森林里(决策)树的数目(默认值为10)。设置随机种子为22.关键代码如下:
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier(random_state=22)
rfc.fit(X_train, y_train)
rfc_predict = rfc.predict(X_test)
由上图可以很直观的看出,随机森林分类器准确度整体还是很高的,仅对于第19类文本准确度很低,不超过50%。而对于第10类文本,准确度很高。
4.6文本分类算法性能对比及结论
本次实验选择准确率,精确率,召回率,F1值作为评价上文中分类器的指标。
TP 正类判定为正类,FP 负类判定为正类,FN 正类判定为负类,TN 负类判定为负类.total表示总数
计算准确率公式如下:
精确率(Precision)指的是所有被判定为正类(TP+FP)中,真实的正类(TP)占的比例,计算精确率公式如下:
召回率指的是所有真实为正类(TP+FN)中,被判定为正类(TP)占的比例计算召回率(Recall)公式如下:
由于精确率和召回率两个指标通常是此消彼长的,很难兼得,在大规模数据集合中相互制约,这样就需要综合考虑,最常见的方法就是F-Measure,它是Precision和Recall加权调和平均。计算F1公式如下:
分类器的性能对比见下表:
分类器性能对比表
分类器 |
准确率 |
精确率 |
召回率 |
F1值 |
朴素贝叶斯分类器 |
83.97% |
85.80% |
83.97% |
82.42% |
随机森林分类器 |
84.78% |
85.48% |
84.78% |
84.56% |
KNN分类器 |
50.70% |
57.11% |
50.72% |
51.50% |
支持向量机分类器 |
21.49% |
49.10% |
21.49% |
21.29% |
表5.2 不同算法分类性能对比表
算法分类器 |
准确率 (Accuracy) |
精准率 (Precision) |
召回率 (Recall) |
Fl值 |
朴素贝叶斯 |
85.51% |
87.15% |
85.51% |
84.17% |
K-最近邻 |
49.79% |
56.48% |
49.79% |
50.53% |
AdaBoost |
33.98% |
61.94% |
33.98% |
36.69% |
支持向量机 |
33.49% |
57.60% |
33.49% |
36.51% |
逻辑回归 |
88.54% |
88.64% |
88.54% |
88.54% |
随机森林 |
85.17% |
85.99% |
85.17% |
85.06% |
结论:在文本分类实验中,朴素贝叶斯分类器精确率最高,支持向量机在精确率上最低。在朴素贝叶斯分类器中,对第2类和19类文本的分类效果很差。而随机森林分类器整体上较朴素贝叶斯分类器好一些,在实际生产中可以考虑使用随机森林分类器。随机森林分类器对于第19类文本分类效果同样效果较差,不足50%。后期可以通过遗传算法等模型进行调参优化,达到较为理想的文本分类效果。与其他算法相比,逻辑回归算法是精准度最高的,但逻辑回归算法是最耗时的。
5 文本分类算法应用领域
文本分类的应用十分广泛,可以将其应用在:
- 垃圾邮件的判定:是否为垃圾邮件
- 根据标题为图文视频打标签 :政治、体育、娱乐等
- 根据用户阅读内容建立画像标签:教育、医疗等
- 电商商品评论分析等等类似的应用:消极、积极
- 自动问答系统中的问句分类
6 总结
本文分析了文本分类的一般过程,详细介绍文本分类中的文本表示,文本向量化的计算,特征选择和权重计算,并且讨论几种常见分类算法,如朴素贝叶斯分类法、KNN算法、集成算法AdaBoost、支持向量机(svm)、逻辑回归、随机森林等算法,最后叙述分类器性能评价。
文本分类是NLP的必备入门任务,在搜索、推荐、对话等场景中随处可见,并有情感分析、新闻分类、标签分类等成熟的研究分支和数据集。我也将继续学习各种算法,应用于实践当中。
希望能给该领域感兴趣的读者一些有益的参考。
具体代码可参考以下链接获取资源:
https://download.csdn.net/download/weixin_46474921/69894990
常见文本分类算法.ipynb · 隐辉破芒/文本分类 – Gitee.com
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142855.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...