0. 前言
对于每个学习数据挖掘的人来说,总会在某个时刻想要自己从头开始一项数据挖掘工程。这不同于用一用搜狗的新闻资料库,或者是kaggle、天池等竞赛的资料库,要自己从头开始收集数据,使用爬虫收集,然后去重,数据清理等等。
使用已有的数据库,好处是省略了自己收集的过程,遇到各种奇奇怪怪的问题,网上也有解答,更重要的是,我们心里有底,知道如果过程不出问题,最后总是能得到一个不错的结果。但是自己收集数据则不是这样,我们收集的数据是独一无二的,可能隐藏许许多多问题,需要我们自己去处理。在一个数据挖掘工程中,这部分要花费80%以上的时间,但是我们所做的实验,由于种种原因,会将这一步简化甚至略过。这不能不说是一种遗憾。这也是我开始自己从头开始的初衷。
1. 准备工作
在本实验中,我选择进行英文文本的分类任务。
在数据预处理中,训练集和测试集均由本人自己编写爬虫获得,数据源为浙江大学图书馆文献资料库。
分词、标记、去停用词:使用Windows下Python 3.7 的nltk包。
所使用的分类算法包括如下几个:自编朴素贝叶斯算法; svm:libsvm和liblinear;lda:Python 3.7 的 lda包。
2. 实验环境介绍
2.1 数据库介绍
浙江大学图书馆的求是学术搜索拥有较为全面的中英文期刊数据。对于每篇文献,拥有对应的文献关键词、文献类别、文献作者、期刊名称等信息。并且期刊的摘要为显式显示。对比其他数据库如社交信息、新闻等数据,该数据库数据较为规范,分类较为准确,具有较高的实验价值。
本次实验爬取了2005-2019年数据库中十余类共约200万篇英文文献(3.51G),类别分别为农学、解剖学、经济学、化学、教育学、地理学、语言学、法学、数学、物理学等。每类文档从四万到十五万不等。
数据来源:http://libweb.zju.edu.cn
2.2 NLTK
NLTK大概是最知名的Python自然语言处理工具了,全称"Natural Language Toolkit", 诞生于宾夕法尼亚大学,以研究和教学为目的而生,因此也特别适合入门学习。NLTK虽然主要面向英文,但是它的很多NLP模型或者模块是语言无关的,因此如果某种语言有了初步的Tokenization或者分词,NLTK的很多工具包是可以复用的。
本次实验使用了NLTK包的WordNetLemmatizer进行词形还原,pos_tag进行词性标注。词形还原是把一个任何形式的语言词汇还原为一般形式(能表达完整语义)。相对而言,词干提取是简单的轻量级的词形归并方式,最后获得的结果为词干,并不一定具有实际意义。词形还原处理相对复杂,获得结果为词的原形,能够承载一定意义,与词干提取相比,更具有研究和应用价值。
详细的介绍参见该网址。
2.3 libsvm
LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。
本次实验首先使用了libsvm进行分类,但是出现了训练时间过长的缺点。因此又选择了liblinear进行尝试。Liblinear是libsvm的特殊实现,其核函数指定为线性核,因此进行了许多优化。另外,libsvm进行n类多分类时,需要训练n(n-1)/2个模型,而liblinear仅需训练n个,这极大缩短了训练和分类时间。
2.4 lda包
LDA(Latent dirichlet allocation)是由Blei于2003年提出的三层贝叶斯主题模型,通过无监督的学习方法发现文本中隐含的主题信息,目的是要以无指导学习的方法从文本中发现隐含的语义维度-即“Topic”或者“Concept”。隐性语义分析的实质是要利用文本中词项(term)的共现特征来发现文本的Topic