基于Hadoop的文本分类方法及装置
技术领域
本发明涉及文本分类技术。
背景技术
朴素贝叶斯分类算法作为一种优秀的分类算法,因为其准确率高,易于理解,容易实现等特点被广泛应用于各种分类任务中,是目前最广泛使用的文本分类方法之一。
近年来随着信息技术的发展,文档分类任务呈现出新的特点,这些特点主要体现在以下三个方面:一,每天都有海量的新增数据需要进行处理,这些数据通常是TB级以上,同时数据量呈现出快速增长的趋势。二,可用于训练分类器的已有数据往往存在数据不均衡现象,不仅不同类别的训练数据之间存在不均衡现象,而且同一类别的不同文本之间也存在不均衡现象。三,训练数据往往是大量的包含中文文本小文件,这些特点给传统的朴素贝叶斯分类技术带来了挑战。
传统的朴素贝叶斯分类技术主要存在两方面的问题:一方面传统朴素贝叶斯算法往往基于单机计算,无法在可接受的时间内处理海量数据,无法满足当前海量数据的处理要求。另外一方面,由于传统朴素贝叶斯算法的分类准确率完全依赖于训练数据,当训练数据存在不均衡时,分类效果会大打折扣,无法满足很多应用场景的要求,例如在对医院的病例文本进行分类时,采用历史病历作为训练数据时,罕见病的病历会远少于常见病的病历,如果采用传统朴素贝叶斯分类技术,训练的分类器对罕见病的分类效果会非常差,而对常见病的分类效果较好,这与医生更关心罕见病的分类准确率的需求相违背,使分类***的实用性大打折扣。此外,大量的小文件直接上传至集群往往速度较慢,无法在可接受的时间内实现上传。
Hadoop Distributed File System,简称HDFS,是一个分布式文件***。HDFS有着高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高吞吐量来访问应用程序的数据,适合那些有着超大数据集的应用程序。HDFS放宽了POSIX的要求这样可以实现流的形式访问(streaming access)文件***中的数据。HDFS开始是为开源的apache项目nutch的基础结构而创建,HDFS是hadoop项目的一部分,而hadoop又是Iucene的一部分。
随着企业要处理的数据量越来越大,MapReduce思想越来越受到重视。Hadoop是MapReduce的一个开源实现,由于其良好的扩展性和容错性,已得到越来越广泛的应用。MapReduce是Google提出的一种实现分布式并行计算任务的通用软件框架,它简化了由普通计算机组成的超大集群上的并行软件编程模式,可用于大规模数据集的并行计算。
SequenceFile是一个由二进制形式key/value的字节流组成的存储文件,SequenceFile可压缩可切分,非常适合hadoop文件存储特性,SequenceFile的写入由SequenceFile.Writer来实现,根据压缩类型SequenceFile。
发明内容
本发明的目的在于提出一种基于Hadoop的文本分类方法及装置,其能解决训练分类器数据不均衡的问题。
为了达到上述目的,本发明所采用的技术方案如下:
基于Hadoop的文本分类方法,其包括以下步骤:
步骤1、对训练用的文本进行分词处理,将每一个经过分词处理的文本保存至一训练数据集中对应的一个文本文件中;
步骤2、对训练数据集的文本文件的文本进行采样,以使不同类别的文本的数量相等;
步骤3、将训练数据集的文本文件写入SequenceFile文件中,并将SequenceFile文件上传至Hadoop文件***;
步骤4、通过MapReduce模块统计SequenceFile文件的文本文件的文本包含的词条和类别,其中,所述词条和类别分别对应贝叶斯分类器的属性值和类别标签;
步骤5、通过MapReduce模块按照TF-IDF加权模型计算SequenceFile文件的每个文本文件的文本的每个词条的TF-IDF值,根据所述TF-IDF值将文本转换为用于贝叶斯分类器的一维向量;
步骤6、通过MapReduce模块统计每个文本文件的文本的长度,根据所述长度对一维向量进行加权,以使所有文本的权重相等;
步骤7、利用一维向量,根据贝叶斯分类器,统计每个类别的先验概率和每个词条属于每个类别的先验概率,得到分类模型;
步骤8、利用分类模型,对待分类的文本进行分类。
本发明还提出了一种基于Hadoop的文本分类装置,其包括以下模块:
分词模块,用于对训练用的文本进行分词处理,将每一个经过分词处理的文本保存至一训练数据集中对应的一个文本文件中;
采样模块,用于对训练数据集的文本文件的文本进行采样,以使不同类别的文本的数量相等;
上传模块,用于将训练数据集的文本文件写入SequenceFile文件中,并将SequenceFile文件上传至Hadoop文件***;
统计模块,用于通过MapReduce模块统计SequenceFile文件的文本文件的文本包含的词条和类别,其中,所述词条和类别分别对应贝叶斯分类器的属性值和类别标签;
第一加权模块,用于通过MapReduce模块按照TF-IDF加权模型计算SequenceFile文件的每个文本文件的文本的每个词条的TF-IDF值,根据所述TF-IDF值将文本转换为用于贝叶斯分类器的一维向量;
第二加权模块,用于通过MapReduce模块统计每个文本文件的文本的长度,根据所述长度对一维向量进行加权,以使所有文本的权重相等;
模型建立模块,用于利用一维向量,根据贝叶斯分类器,统计每个类别的先验概率和每个词条属于每个类别的先验概率,得到分类模型;
分类模块,用于利用分类模型,对待分类的文本进行分类。
本发明通过采用hadoop集群并对传统朴素贝叶斯分类方法进行改进,具有如下有益效果:
(1)通过将小文件写入sequencefile格式的压缩文件,将sequencefile作为小文件的容器,然后上传sequencefile至集群文件***HDFS,提升数据集上传速度,充分利用sequencefile提供java接口,可多文件,可分割,且无需解压即可作为MapReduce的输入数据的特点,有效克服Hadoop集群不适合处理小文件的缺点。
(2)通过对训练数据进行加权,克服了因为不同文本长度不同带来的不均衡问题,提高了分类准确率。
(3)通过MapReduce并行计算框架对分类模型进行训练,提高了训练效率,适应了新形势下海量数据的处理要求。
(4)通过对训练的文本进行采样处理,克服了训练的文本不同类别训练数据分布不均衡的问题,提高了分类准确率。
附图说明
图1为本发明较佳实施例的基于Hadoop的文本分类方法的流程图。
具体实施方式
下面,结合附图以及具体实施方式,对本发明做进一步描述。
结合图1所示,一种基于Hadoop的文本分类方法,其包括以下步骤:
步骤S1、对训练用的文本进行分词处理,将每一个经过分词处理的文本保存至一训练数据集中对应的一个文本文件中。可使用IK、ICTCLAS等开源分词包,对训练用的文本进行自动的中文分词,将标点及停止词去除,这里的停止词是指出现频率很高但是没有实际意义的词,如“与”、“的”、“得”等。并将分词后得到的词条用空格分隔输出到本地的训练数据集中,例如“阐释机器学习概念”这句话经分词后将变成“阐释”、“机器学习”、“概念”三个词条,训练数据集中每一个文本文件存储一条经过分词的文本。
步骤S2、对训练数据集的文本文件的文本进行采样,以使不同类别的文本的数量相等。由于不同类别的文本数量不一致,所以需要通过采样进行平衡。采样前,首先需要根据实际数据的分布情况设定阈值(即每个类别经过采样后最终包含的文本数量,阈值的选取可以根据实际效果进行调整),然后,根据阈值可以将文本数量大于阈值的类别划分为多数类,将文本数量小于阈值的类别设为少数类,最后,对于多数类的文本,将随机从中抽取等于阈值的n份文本作为训练数据,而对于少数类的文本,则将重复已有文本,使其包含的文本数量等于阈值。
步骤S3、将训练数据集的文本文件写入SequenceFile文件中,并将SequenceFile文件上传至Hadoop文件***。首先,提供Hadoop文件***HDFS的本地文件***接口(getLocalFileSystem)读取本地文件***的训练数据集中的文本文件,然后将文件路径和内容以键值对的形式写入SequenceFile中,并提供将SequenceFile的输出路径设为集群文件***HDFS中的地址,实现文件流式压缩上传,其中每个文件以键值对的形式读取,将该文件在训练数据集内的相对路径(包含文件名)作为键,而该文件的内容作为值,与本领域常用的压缩上传方法相比,充分利用了SequenceFile可分割,支持java接口,可多文件,可被MapReduce直接读取的特点,无需在集群文件***中对压缩文件进行解压,无需生成大量元数据。
步骤S4、通过MapReduce模块统计SequenceFile文件的文本文件的文本包含的词条和类别,其中,所述词条和类别分别对应贝叶斯分类器的属性值(attribute)和类别标签(label)。MapReduce模块统计有哪些不同的类别时,由于原始数据在创建训练数据集时即按照所属类别将不同类别的文本文件存入不同的文件夹下,文件夹名即为文本所属类别,所以在这里只需将SequenceFile中存储文件路径的键取出,并将路径前缀去除,即可得到类别名称(即文件夹名字);MapReduce模块还用于统计有哪些不同的词条,这里的属性值是指经过分词后的词条,如果已经建立了专业词典,则可以根据专业词典对这些词条进行过滤。
步骤S5、通过MapReduce模块按照TF-IDF加权模型计算SequenceFile文件的每个文本文件的文本的每个词条的TF-IDF值,根据所述TF-IDF值将文本转换为用于贝叶斯分类器的一维向量。其中,TF-IDF值的计算包括两个步骤:首先,计算每个词的“词频”(TF)和“逆文档频率”(IDF),然后,通过将TF值与IDF值相乘得到TF-IDF值,一个词的TF-IDF值越大则代表该词的重要性越大,反之则代表该词的重要性越小。
TF计算公式如下:
词频(TF)=某个词在当前文本出现的次数
IDF计算公式如下:
逆文档频率(IDF)=log(数据集的文档总数/(包含该词的文档数+1))
其中,第一次MapReduce用于计算训练数据集的文本总数;
第二次MapReduce用于计算包含每个词条的文本数从而得到IDF值。
第三次MapReduce用于计算每个文档中每个词的TF值,并将TF值与该词条的IDF值相乘得到TF-IDF值,将文本转换为一维向量。
通过计算文本中每个词条的TF-IDF值后,即可将文本转换为各个词条的TF-IDF值组成的一维向量,例如在一个训练数据集中一个文本“中国蜜蜂养殖”经过分词后变成“中国蜜蜂养殖”,然后计算TF-IDF值如下表所示:
然后就可以将文本“中国蜜蜂养殖”转换为一维向量(0.0121,0.0543,0.0482)。
步骤S6、通过MapReduce模块统计每个文本文件的文本的长度(包含词条的数量),根据所述长度对一维向量进行加权,增加长度较短的文本的权重,使其与长度较长文本的权重一致,即使所有文本的权重相等。
具体计算公式如下:
某个词加权后的值=某个词TF-IDF值/该文本的长度。
步骤S7、利用一维向量,根据贝叶斯分类器,统计每个类别的先验概率和每个词条属于每个类别的先验概率,得到分类模型。之所以需要计算先验概率是因为我们可以通过贝叶斯定理以这些先验概率为基础预测未知数据属于每个类别的条件概率。
贝叶斯定理简单来说就是当我们知道P(A|B)的概率时获得P(B|A)的概率的一种方法,贝叶斯公式如下:
根据贝叶斯公式,我们如果计算出P(A|B)、P(B)、P(A)即可通过贝叶斯公式计算得到P(B|A)的值,其中P(A|B)、P(B)、P(A)的概率值我们可以通过对训练数据进行统计得到,在文本分类时,可以假设A代表一个词,而B代表一个类别,所以P(B|A)表示词A属于类别B的条件概率,P(A|B)表示类别B中的文本包含词A的概率(即包含A的文本数量/类别B中文本总数),P(B)代表类别B的文本总数占数据集文本总数的比例(类别B文本数量/数据集文本总数),P(A)代表数据集中包含词A的文本所占比例(包含词A的文本数量/数据集文本总数),从而可以借助训练数据中得到的条件概率值和先验概率预测待预测文本中词的条件概率,然后通过对文本中词的条件概率进行叠加,即可得到文本属于每个类别的条件概率。
具体来说,在进行文本分类时,我们首先计算文本中每个词属于不同类别的条件概率,然后将这些概率相加得到该文本属于每个类别的条件概率。比如说一个文本包含2个词“nba火箭”其中nba有100%概率是属于“体育”类别,而“火箭”有30%概率属于“体育”,70%概率属于“军事”,这时文本属于体育的总条件概率值就是100%+30%=130%,而属于军事的总条件概率值为0%+70%=70%,这时文本属于体育的总条件概率值较大,所以该文本的类别被预测为“体育”。
步骤S8、利用分类模型,对待分类的文本进行分类。待分类文本会经过分词、向量化、加权,生成一维向量,然后使用分类模型计算该一维向量属于每个类别的条件概率,最后将概率最大的类别作为分类结果输出,输出的分类结果为类别名称,例如对于一个新闻数据集,包含军事、财经、体育等20个类别的文本,则输入一个文本后,输出的是该文本所属类别的名称,比如输入一篇NBA相关文本,则输出“体育”。
本发明还提出了一种基于Hadoop的文本分类装置,其包括以下模块:
分词模块,用于对训练用的文本进行分词处理,将每一个经过分词处理的文本保存至一训练数据集中对应的一个文本文件中;
采样模块,用于对训练数据集的文本文件的文本进行采样,以使不同类别的文本的数量相等;
上传模块,用于将训练数据集的文本文件写入SequenceFile文件中,并将SequenceFile文件上传至Hadoop文件***;
统计模块,用于通过MapReduce模块统计SequenceFile文件的文本文件的文本包含的词条和类别,其中,所述词条和类别分别对应贝叶斯分类器的属性值和类别标签;
第一加权模块,用于通过MapReduce模块按照TF-IDF加权模型计算SequenceFile文件的每个文本文件的文本的每个词条的TF-IDF值,根据所述TF-IDF值将文本转换为用于贝叶斯分类器的一维向量;
第二加权模块,用于通过MapReduce模块统计每个文本文件的文本的长度,根据所述长度对一维向量进行加权,以使所有文本的权重相等;
模型建立模块,用于利用一维向量,根据贝叶斯分类器,统计每个类别的先验概率和每个词条属于每个类别的先验概率,得到分类模型;
分类模块,用于利用分类模型,对待分类的文本进行分类。
对于本领域的技术人员来说,可根据以上描述的技术方案以及构思,做出其它各种相应的改变以及变形,而所有的这些改变以及变形都应该属于本发明权利要求的保护范围之内。