APP下载

基于大数据分析的文本智能识别系统的研究

2018-10-17杨明芬吴旭阚瑷珂常康

西藏科技 2018年9期
关键词:分词贝叶斯分类

杨明芬 吴旭 阚瑷珂 常康

(1.西藏自治区科技信息研究所,西藏 拉萨 850008;2.成都理工大学,四川 成都 610059)

随着社会信息技术的发展,人们希望计算机拥有像人一样的智力和能力,可以代替人类实现识别、认知、分类和决策等多种功能。人工智能不断的发展,由于人工智能主要是利用智能学习算法,从大量的数据中学习经验来改善系统自身的性能,从而实现人类智慧所能做的事情[1]。其中文本分类是人工智能应用的一个重要方向,在现实生活中应用广泛,比如新闻按栏目分类、网页分类、个性化新闻、垃圾邮件过滤、情感分析等。文本分类问题属于自然语言处理领域,现在自然语言处理算法是基于机器学习,更多的是统计机器学习。合适的机器学习方法结合大数据处理平台,可以更好的进行文本分类,文本分类的发展使得计算机可以代替人类进行某些脑力和体力劳动,在当下如此注重效率的时代,文本分类发挥着重要作用[2]。单从经济而言,借助文本识别可以实现自动化,提高生产率,节约劳动成本。随着现代科学技术的发展,文本识别将向更高的水平发展,随之推动科学技术、生产力和人类智慧向更高的水平发展,对人类的社会进步起着巨大的推动作用。

大数据在国外发展较早,在上个世纪1980年,美国的阿尔文·托夫勒就提出了大数据的概念(WANG,Qiao,2014)。2008年经由科学杂志发表相关文章,大数据概念才被广泛传播。美国政府将大数据视为强化国家竞争力的关键性因素之一,除了在概念上研究外,在技术方面也重点钻研。谷歌公司在2003年,2004年分别提出了分布式文件系统和分布式计算模型等大数据解决方案(Doug Eadline,2013)43-44。解决了大数据存储和计算问题[3]。国内对于文本分类的研究相对于国外较晚,相比于国外的英文文本分类,中文文本分类具有更大的挑战。英文单词可以通过空格来区分,而中文是以字为单位,通过字组成词语,词语连成句子,才能表述一个完整的意思。最初通过词匹配进行文本分类,这种方式主要寻找文章内容与分类标签的共同词来进行分类,机械的方法无法达到良好的分类效果。后来利用统计学方法,在大量中文文本库挖掘有效分类规则,再使用这些训练好的分类器进行新文档的归类。利用统计学方法进行文本分类相比于传统的词匹配方法,效果良好。随着不断的发展,我国的分词技术和文本分类都逐渐趋于成熟。

1 研究内容

基于统计学进行文本分类,需要在大量的数据集上进行训练,来寻找有效的分类规则,本文利用Hadoop和Spark,通过对大量的中文文本数据进行处理,结合有效的分类算法,构建一个基于大数据的智能文本分类平台。文章主要研究基于大数据的文本识别系统,实验所用到的一些大数据处理技术和算法。其中包括分布式系统架构Hadoop、分布式文件系统HDFS、分布式计算模型MapReduce和分布式计算框架Spark,以及文本分类预处理所需要的分词工具Ansj。采用以上技术,设计开发基于网络服务器和浏览器架构的文本识别系统。文章开展的研究工作涉及的几项大数据技术如下:

1.1 Hadoop

2003年,谷歌发表论文首先提出了分布式文件系统的概念,允许文件通过网络访问多台主机的文件系统,解决了大数据存储的问题。之后,2004年,谷歌又发表了分布式计算框架MapReduce的论文,解决了大数据计算的问题。2006年3月,Hadoop项目正式启动,将NDFS和MapReduce被纳入其中。顺应时代的发展,Hadoop已经成为了当下最流行的大数据分析平台[4]。

1.2 MapReduce

MapReduce是一种分布式并行计算模型,其主要思想是采用“分而治之”的程序处理理念。能将复杂的,大规模的数据处理任务分解并同时运行在多个节点上处理,MapRedue将这个复杂的过程抽象为Map和Reduce。将分布式文件系统中的大规模数据集切分成许多独立的分片,这些分片可以被多个Map任务并行处理。然后利用Reduce任务将结果进行总和[5]。

1.3 HDFS

HDFS是Hadoop的核心设计之一,和传统的文件系统不同,HDFS把文件存储在多个计算机节点上。这些计算机节点可以有普通的硬件构成,这大大降低了硬件开销。HDFS有着高容错性,大数据集,简单的文件模型和强大的跨平台兼容性等特点。HDFS采用了Master/Slave结构模型,HDFS有两个关键的组件,NameNode(名称结点)和DataNode(数据结点)。名称结点负责管理文件系统的命名空间及客户端对文件的访问;数据结点负责处理客户端的读写请求;DataNode会通过心跳机制和NameNode保持通信。为了保证分布式文件系统的容错性和可用性,HDFS采用了多副本方式对数据进行冗余存储,并以流式的形式访问写入的大型文件[6]。

1.4 Spark

Spark是Apache软件基金会下的基于内存的分布式计算框架,Spark的计算模式借鉴了MapReduce的优点,同时很好的解决了MapReduce表达能力有限,磁盘IO开销大和延迟高等缺点[7]。相比于MapReduce的计算模式,Spark提供了内存计算,即把中间结果放到内存中,而不是频繁的读写磁盘。Spark是基于有向无环图的任务调度执行机制,基于内存的执行速度较MapReduce快上百倍。且Spark提供了完整而强大的技术栈、更多的语言支持、更多的运行模式。Spark相对于Hadoop具有较大的优势,但并不能取代Hadoop,实际上,Spark已经很好的融入了Hadoop生态圈。

1.5 Ansj

Ansj是一个开源的纯Java中文分词库,基于中科院的ictclas中文分词算法,主要应用于自然语言处理、高精度的中文分词场景,底层利用高度优化的Trie树,TF/IDF词袋模型等数据结构和算法来实现。支持用户自定义词典、定制CRF模型、停用词过滤、书名发现、电子邮箱发现、身份证账号发现、词性标注、关键字提取等诸多强大的功能。

1.6 Web相关技术

网页是经常用来展示和获取信息的方式,主要有前台网页,后台业务逻辑和服务器组成。Tomcat是一款非常流行的Web应用服务器,是Apache软件基金会下的开源项目,实现了Servlet和JSP规范,拥有良好的性能。Servlet是基于Java技术的组件,定义了处理网络请求的规范。而JSP是通过在HTML中内嵌Java代码的服务器页面,在服务端执行,返回HTML文本给客户端[8]。

1.7 TF-IDF算法

TF-IDF是一种统计方法,常用于评估字词对于一个文件集或者语料库的重要程度,词语的重要性并不是出现的越多越重要。TF-IDF的思想是一个词语在文章中出现的次数越多,而同时在所有文档中出现的次数越少,即字词的重要性与它出现在文件中的次数成正比,与出现在所有档或语料库的次数成反比。经常出现在中文中的词并不代表实际信息,但是这些词在文档中出现的频率较高。TF-IDF通过数值化文档信息,来衡量词语的重要程度。其中TF值的计算方法如公式(1)

tfi,j是 j此篇文档中 i词语的词频,ni,j是 i在 j文档中出现的次数,Tj代表j文档中每个词语。IDF定义如公式(2)

其中,idfi代表i词语的逆向文件频率,d代表文档集,D代表文档的个数,ti代表i词汇。TF-IDF的值计算公式如(3)所示:

通过对每个词语进行TF-IDF的计算,然后根据值的大小降序排列,就可以对文章进行特征抽取和关键字提取。

1.8 Naive Bayes算法

朴素贝叶斯是基于贝叶斯定理与特征条件独立假设的分类方法,而贝叶斯定理是关于随机事件和条件概率的(周志华,2016)147-150。贝叶斯定理如公式(4):

P(A|B)表示在事件B发生的条件下事件A发生的概率,也等于A和B同时发生的概率处理B发生的概率。贝叶斯推断是贝叶斯定理的一种应用。贝叶斯推断建立在主观的判断基础上,然后根据大量实验数据进行不断的修正[9],因此贝叶斯推断需要大量的数据计算。朴素贝叶斯以贝叶斯定理为基础,假定属性值之间相互独立,这也是朴素一词的来历,朴素贝叶斯分类器的核心思想基于公式(5)所示。

可以根据样本的特征推断样本的类型。因此朴素贝叶斯分类器也常用于文本分类,通过对训练文本的学习,得到分类器参数,进而使用该网络对文本进行分类[10]。

2 系统设计与实现

2.1 需求分析

随着互联网的发展,大数据时代逐渐到来,互联网上各类信息充斥在我们的身边,这些资源大部分都是以本文的形式出现,如何有效的处理,组织这些信息变得尤为重要。文本分类是处理大量信息的有效手段之一,人们对于文本分类的研究起步很早,但由于时代环境的影响,分类结果差强人意,随着时代的发展,机器学习逐渐兴起,同时作为机器学习的基础大数据以及大数据相关的技术同步发展,大数据的核心是数据的价值,而机器学习是利用数据价值的关键技术。大量的数据能够提升模型的精确性,复杂的机器学习算法需要耗费大量的时间,因此迫切的需要分布式和并行计算这样关键的技术。大数据和机器学习的结合为文本分类开辟了一条新的道路,因此基于大数据的文本分类系统就变得十分有意义。

2.2 处理流程

系统流程如图1所示,将收集到的大数据存储在HDFS系统的分布式文件系统中,通过MapReduce批量数据预处理,再Spark强大的计算能力根据文本分类算法训练数据,生成文本分类模型,最后将文本分类模型封装成服务,提供给用户。

图1 系统流程图

2.3 系统结构

基于大数据的文本系统主要分为模型应用层、数据挖掘层、数据预处理层、数据存储层和数据采集层。模型应用层调用数据处理层提供的接口,实现文本分类,为用户提供服务。整个系统中,下层应用为上层应用提供服务。其主要的处理流程为数据采集层采集数据,利用数据存储层提供的服务存储数据,由数据预处理层对存储的数据进行预处理。数据处理层主要利用Spark强大的计算能力和Naive Bayesian算法对符合算法数据格式的数据挖掘计算,得到数据分类模型,最后应用数据模型,为用户提供服务。系统架构如图2所示。

图2 系统架构

2.4 系统各模块设计

2.4.1 模型应用层。该层主要功能是利用已经训练好的文本分类模型为用户提供文本分类服务。

2.4.2 数据挖掘层。该层主要功能主要是通过Spark中实现的Naive Bayesian算法,在现有的数据上进行模型训练。该层的主要挑战是挖掘算法复杂,并且计算量很大。

2.4.3 数据预处理层。该层的功能主要是利用MapReduce批量处理文本数据的优势和Ansj分词工具对大量的中文文本进行分词。

2.4.4 数据存储层。该层的主要功能是利用分布文件系统HDFS存储来自数据采集的大量数据。

2.4.5 数据采集层。该层的主要功能是利用爬虫,第三方数据采集平台或多个数据库等获取主题数据。

2.5 数据库设计

此系统主要处理文本数据分类问题,其主要目标是大量文本数据的处理,但所选择的数据中每个目录下有许多的小文件,这些小文件会单独的切片,交由map结点进行处理,造成效率低下。为了避免该类问题,根据MapReduce机制,将采用不切片的方式,所以对数据表设计两个字段,用label字段代表文本分类,text字段代表文本。这样在一个label下,会有多个小文件的内容,对提升这个系统的性能有着很大的作用。

2.6 基于Ansj的中文分词

分词主要是将语句分割成单个词语,此次实验主要利用了Ansj工具进行分词,主要代码如下所示。该段代码显示了如何利用Ansj进行中文分词,首先读取默认的停用词,然后去除空字符串,标点符号等对文本分类模型贡献不大的数据。

2.7 基于MapReduce的分词操作

通过MapReduce分布式处理框架,能够高效的处理基于键值对的大量数据,更加适合批处理业务。MapReduce默认的输入格式FileInputStream默认为为一个文件生成一个切片,每个切片产生一个map任务,如果map数过多,则会增加调度开销。本次实验的中文数据集分类文件夹下有许多小文件,为提高分词效率,应该将多个小文件合并,不进行分片。具体方法是实现FileInputFormat的抽象子类Combine-FileInputFormat的createRecordReder方法,并且禁止分片。具体代码如下所示。

通过自定义InputStream,将多个文件合并为一个分片,接下来需要自定义读取分片的方式MyRecordReader类。该类中的重要方法nextKeyValue定义了读取分片的方式,即将文件的类别作为Key,文件的整个内容作为Value。主要代码如下所示。

定义好文件的输入和读取方式,接下来需要书写Map任务类,在Map任务类中,调用Ansj分词方法并行的处理文本分词任务,并将分词后的字符串作为Value值,Key值为文件类别。具体代码实现如下所示。

最后,定义分词驱动类SplitTextDriver,配置相关参数,设置数据的读取和输出路径为HDFS,然后执行分词任务。相关代码如下所示。

2.8 利用Spark计算TF-IDF

在开始计算TF-IDF前,需要对得到的分词结果进行预处理,将分类标签数值化,并且将逗号分隔符转变为空格分隔符,因为Spark默认以逗号分割。具体每个分类标签代表的数值如表1所示。

表1 分类标签对应值

具体实现代码如下所示。该段代码首先将分词结果集读入Spark内置的数据结构RDD,调用自定义工具类SplitTextUtil中的CategoryToIndex方法将分类标签对应的值数值化。RecordBean为记录实体类,定义了两个字段label和text,分别代表分类标签和对应分词后的文本值。

接下来利用Spark计算TF-IDF。首先将字符串按空格分词,然后创建Spark的HashingTF对象并调用setInputCol方法设置输入的列为words,输出的列外rawFeatures具体代码如下所示。

输入为分词结果,输出为词语对应的TF-IDF值,计算结果如图3所示。为了便于输出,仅仅选取了100维特征向量。其下标范围为0-99,紧接在后面的表示对应的值。

图3 TF-IDF执行结果

2.9 根据NaiveBayes算法训练模型

Spark是基于分布式内存通用型计算框架,善于处理大规模数据的复杂运算。此次实验利用Spark进行文本分类模型的训练。在Spark中,已经提供了关于机器学习的包SparkML。此次实验直接使用Spark内置的NaiveBayes实现。首先配置SparkConf,设置为本地模式。将计算TF-IDF后文本向量数据集进行分割,60%当做训练数据集,40%当做测试数据集。调用NaiveBayes的fit方法进行训练,最后将模型保存在HDFS上。进行模型训练的代码已经完成,接下来需要考量模型训练结果的准确度,对模型测试的准确率accuracy进行统计。即预测准确的数除以总的测试集数量。并将模型存储在HDFS中target目录下。具体代码如下所示。

运行上述代码,该段代码的输入为5.5.1小写计算的TF-IDF值,输出为经过NaiveBayes算法训练后,模型对训练集进行预测,并预测正确的概率。控制台输出如图4所示结果。

图4 模型训练结果

由控制台输出的结果来看,模型的准确率达到85%。基本效果不错。

3 实验结果

3.1 实验环境

测试环境是软件测试的一个重要阶段,测试环境的适合与否严重影响测试结果的真实性,是系统安全可靠性,易用性等大多数指标的主要环境。本次测试并不在同一个操作系统下测试。

表2 测试结果

3.2 实验测试分析

功能测试覆盖整个系统的功能模块,为用户提供综合服务的能力。测试整个系统是否能达到需求分析的功能。具体测试场景如图5所示。

图5 测试结果图1

从上述结果可以看出,系统基本能够实现正确的分类。但分类结果的可信度还不是很高,初步估计这可能是基于现实环境的原因,训练的数据集还不是很大。导致模型不是很成熟,同时也可能是中文分词的结果不理想造成。

4 结论

大数据与机器学习算法的结合才能使人们的生活变得越来越高效。通过对大数据的文本分类系统的设计与实现,学习了很多关于大数据和机器学习方面的知识。实现了一个基于Hadoop和Spark,利用NaiveBayes算法的文本分类系统。文章研究、设计的系统能够将大量的数据存储在HDFS上,通过MapReduce阶段进行中文分词,然后将分词结果传给更高效,计算更快速的Spark阶段进行训练模型,最后利用模型,基本能够达到对输入文本数据进行类别判断。不足之处表现在对文本识别的正确率和可信度还有待提高,初步估计是因为文章开展的实验导致训练的数据量不是很大,从而使模型参数有偏差。

猜你喜欢

分词贝叶斯分类
分类算一算
基于贝叶斯解释回应被告人讲述的故事
分词在英语教学中的妙用
结巴分词在词云中的应用
结巴分词在词云中的应用
分类讨论求坐标
数据分析中的分类讨论
教你一招:数的分类
基于贝叶斯估计的轨道占用识别方法
基于互信息的贝叶斯网络结构学习