基于卡方统计检验法对文本特征选择的技术实现

2014-11-19 00:39唐勇
电脑知识与技术 2014年30期
关键词:文本分类特征选择

摘要:该文主要探讨如何从技术上实现基于卡方统计检验的文本特征选择,文中提出采用开源的Lucene索引框架对文本分类语料库进行索引,设计了在特征值计算的过程中如何借助语料库索引快速获取卡方统计检验的相关参数,并使用java多线程技术从整体上优化每个分类下文本特征选择的计算效率。

关键词:特征选择;卡方统计;文本分类;JAVA实现

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)30-7103-03

1 文本特征选择的必要性

为了能够有效地对大量文本信息进行自动分类,先要将文本信息模型化表示,典型的文本建模方法就是向量空间模型(VSM),该模型将文本信息抽象表示为若干相互独立的词汇所构成的向量空间,向量空间中每个分量值使用TF*IDF来度量。其中TF是指词汇频率,TF=Nw/N,N表示文本的总词汇数,Nw表示词W在文本中出现的次数,TF的值越大,词W与文本的相关性就越强;IDF是逆文档频率,IDF=log(D/Dw),Dw表示包含词W的文档数,D表示语料库的总文档数目,IDF值越大,该词与文档的相关性就越低。假设有两个文本doc1和doc2,那么它们在共同词汇集合所构成的向量空间中具有不同的向量,这两个文本的相关性可以使用两个向量的夹角余弦值来表示,夹角余弦值越大说明这两个本文越相关。

由于网页文本的词汇相当庞杂,包含大量的口语、广告等噪声信息,造成文本向量空间的维数较为庞大,降低了分本分类的效率。因此有必要降低向量空间的维度,剔除噪声词汇,保留与当前主题相关的词汇来构成向量空间模型。文本特征选择就是要在构建文本的特征向量时从文本的词汇集中选取与主题相关的词汇,尽可能地剔除与主题无关的词汇,从而提高文本分类的效率与准确率。

2 文本特征选择的主要方法

文本特征选择的方法主要包括信息增益法(IG,Information Gain)、互信息(MI,Mutual Information)、卡方统计检验法(CHI,Chi-square Statistic)等,文献[2]和[4]对这几种方法在中文网页的分类效果中进行了综合比较,认为CHI、IG的性能要明显由于MI。

信息增益法(IG)是通过衡量某个词汇在出现和不出现两种情况下对整个分类系统信息熵的影响程度,影响程度大的词汇与分类系统的相关性较大,应给予保留;但是信息增益法只能考察特征词汇对整个系统的贡献,不能具体到某个类别上,这使得该方法只适合做全局的特征选择。

卡方统计检验方法(CHI)是基于数理统计中的联列表检验理论判断某个词汇与特定文本类别的相关性。它先假设特征词汇与特定类别是独立的,通过计算观察值与理论值之间的偏差程度来决定原假设是否成立。在给定词汇t和分类c的条件下,CHI的公式简化如下:

[χ2(t,c=(AD-BC)2(A+B)(C+D)]

其中,A表示包含词汇t且属于分类c的文档数目,B表示包含词汇t但不属于分类c的文档数目,C表示不包含词汇t且属于分类c的文档数目,D表示不包含词汇t且不属于分类c的文档数目。

从CHI的计算公式可以看出它能够检验特定词汇与特定类别之间的相关度,但是CHI方法忽略了词汇出现的频率,这使得它对低频词有所偏袒,比如分类c的所有文档都包含了词A,但是在每篇文档中词A只出现1次,而分类c的99%文档都包含了词B,并且在每篇文档中词B都出现了10次以上。相对于词A,词B与分类c相关性更大,但是由于CHI的计算公式忽略了词汇出现的频率,导致词汇A比词汇B具有更大相关性。

3 文本特征选择的技术实现

3.1 文本语料库及索引库

为了进行文本特征的选择,要预先准备好中文文本语料库。搜狗实验室提供的中文分类语料库包含环境、IT、交通、教育、经济、军事、体育、医药、艺术、政治共十个分类,每个分类下包含若干相关文本,共计八万篇。该文以搜狗实验室提供的中文语料库作为文本特征提取的资料库,基于卡方统计检验方法(CHI)来计算语料库中每个类别所对应的特征词列表,这些不同分类的特征词列表将作为后续文本分类的特征向量。

CHI公式的关键是要针对不同的词汇t和类别c分别计算出A、B、C、D的值。这里的词汇需要通过分词技术从中文文本中进行提取。该文采用了IKAnalyzer开源分词器,该分词器使用了正向迭代最细粒度切分算法,具有60万字/秒的高速处理能力。文本经过分词器分割后将形成大量的词汇,直接使用这些词汇作为CHI的计算对象将极大的降低计算效率。为此应定义一个中文停用词集合,它包含了常用的中文语气词、助词、虚词等与文本内容无关的词汇,使用中文停用词集合对分词器分割后的词汇进行过滤,同时过滤掉所有的单字词汇。

本文采用Lucene工具对文本语料库中的所有中文文本预先进行索引,Lucene是apache软件基金会提供的开源全文索引工具包,对文本语料库建立索引后,借助Lucene提供的API接口可以极大的加快查询诸如“语料库中包含某词汇的文档数”的速度。建立的索引记录结构如下表所示,其中filename表示文本路径名,该字段被作为一个整体保留在索引库中,但不参与索引;content表示该文本的具体内容,该字段不仅需要保留文本内容,还需要对其进行分词并在索引库中保存分词后的词汇向量,classname表示该文本所属的分类,该字段作为整体保留在索引库中参与索引但是不对它进行分词。

表1 文本语料库的索引结构

[字段名\&字段值\&存储状态\&索引状态\&词汇向量\&filename\&文本的具体路径\&Field.Store.YES\&Field.Index.NO\&\&content\&文本的具体内容\&Field.Store.YES\&Field.Index.ANALYZED\&Field.TermVector.YES\&classname\&文本所属的分类名\&Field.Store.YES\&Field.Index.NOT_ANALYZED\&\&]endprint

3.2 卡方统计中四个参数的计算

本文使用Java语言来实现卡方统计检验的计算公式,建立了DataManager类和IndexManager类。DataManager类根据指定的语料库存放路径获取语料库的主要状态信息,如语料库的文档总数、类别总数、某个类别下的文档数。IndexManager类根据指定的语料库来生成对应的索引库,索引库的结构如表1所示,并且提供一个getIndexReader()方法返回Lucene框架中的IndexReader对象。使用IndexReader对象的方法可以快速的读取卡方统计检验中所需的相关值。

计算“整个语料库中包含词w的文档数”,记作Nw ,可以直接使用IndexReader的docFreq(new term(“content”,word))方法来获取;计算“类别c中包含单词w的文档数”即卡方统计中的参数A,可以采用如图1所示的算法,IndexReader的termDocs方法可以返回包含词w的文档集合,该集合的每一项都包含一个文档编号docId,通过IndexrReader的document(int docId)方法可以获取当前项所对应的文档。那么卡方统计检验中的参数B=Nw-A。 计算“类别c中不包含单词w的文档总数”,即卡方统计中的参数C,可直接使用类别c的总文档数NC-A,这里NC在给定语料库路径情况下可以很方便的获得。在计算完参数A、B、C的值之后,D=N-A-B-C,其中N代表整个语料库的文档数,在给定的语料库中N的值是个常量。至此卡方统计检验的参数已经计算完毕,可以看出这里的关键是借助事先准备好的索引库快速计算出Nw和A的值。

3.3 文本特征选择计算的优化

当文本的词汇表较大时采用上述算法其效率依然不能令人满意。java的多线程技术可使上述算法获得更好的效率。首先使用Lucene来获取类别c下的词汇表并暂存于LinkedList集合中,这里的词汇表应该是过滤掉了停用词和单字词后的词汇集合。创建一个实现了Runnable接口的CHIWorker类,该类具有实例属性ThreadPool(线程池),调用CHIWorker类的start()方法时将对线程池进行初始化。该类的run()方法作为线程体被多个线程调用。run()方法也是CHIWorker类的核心,决定了文本特征计算的效率,具体算法如图所示。CHIWorker类拥有一个名为resultMap的HashMap,用于存储词汇及其CHI值存储。采用java的多线程技术将类别c下所有词汇的卡方统计检验值计算完毕,并存储在resultMap中,主程序将在多线程运行完毕后获取到resultMap中存储的值。

图2 CHIWorker类的run方法

在获取了存储于resultMap中的CHI值之后可以进一步按照CHI值的大小进行排序,为CHI值确定一个最低阀值,保留大于阀值的词汇作为类别c的特征词汇集合,记为wordList1。借鉴文献[3]中提出的CHI改进算法,在获取了词汇集合wordList1之后,再进一步计算每个词的频度、集中度和分散度,其中频度是用语料索引库中词汇w出现的次数来表示;集中度=A/(A+C);分散度=A/(A+B) 。对wordList1中每个词汇按照频度、集中度和分散度的乘积进行计算并降序排序,通过设定一个阀值来选区若干词汇作为类别c的最终特征词汇集合。至此,完成了对类别c的文本特征选择,对其他类别也采用相同的计算过程,即可得到每个类别下的特征词汇向量。

4 结束语

本文分析了文本特征选择的重要性并比较了文本特征选择的主要方法,深入探讨了卡方统计检验法(CHI)的特点,提出了采用Lucene索引工具和Java多线程技术来优化CHI计算方法的思路。

参考文献:

[1] 王光.集合CHI与IG的特征选择方法[J].计算机应用,2012(7).

[2] 单松巍.几种典型特征选取方法在中文网页分类上的效果比较[J].计算机工程与应用,2003(22).

[3] 熊忠阳.基于卡方统计的文本分类特征选择方法的研究[J].计算机应用,2008(2).

[4] 崔爱国.文本分类中特征提取方法的比较与分析[J].电脑知识与技术,2009(7).

3.2 卡方统计中四个参数的计算

本文使用Java语言来实现卡方统计检验的计算公式,建立了DataManager类和IndexManager类。DataManager类根据指定的语料库存放路径获取语料库的主要状态信息,如语料库的文档总数、类别总数、某个类别下的文档数。IndexManager类根据指定的语料库来生成对应的索引库,索引库的结构如表1所示,并且提供一个getIndexReader()方法返回Lucene框架中的IndexReader对象。使用IndexReader对象的方法可以快速的读取卡方统计检验中所需的相关值。

计算“整个语料库中包含词w的文档数”,记作Nw ,可以直接使用IndexReader的docFreq(new term(“content”,word))方法来获取;计算“类别c中包含单词w的文档数”即卡方统计中的参数A,可以采用如图1所示的算法,IndexReader的termDocs方法可以返回包含词w的文档集合,该集合的每一项都包含一个文档编号docId,通过IndexrReader的document(int docId)方法可以获取当前项所对应的文档。那么卡方统计检验中的参数B=Nw-A。 计算“类别c中不包含单词w的文档总数”,即卡方统计中的参数C,可直接使用类别c的总文档数NC-A,这里NC在给定语料库路径情况下可以很方便的获得。在计算完参数A、B、C的值之后,D=N-A-B-C,其中N代表整个语料库的文档数,在给定的语料库中N的值是个常量。至此卡方统计检验的参数已经计算完毕,可以看出这里的关键是借助事先准备好的索引库快速计算出Nw和A的值。

3.3 文本特征选择计算的优化

当文本的词汇表较大时采用上述算法其效率依然不能令人满意。java的多线程技术可使上述算法获得更好的效率。首先使用Lucene来获取类别c下的词汇表并暂存于LinkedList集合中,这里的词汇表应该是过滤掉了停用词和单字词后的词汇集合。创建一个实现了Runnable接口的CHIWorker类,该类具有实例属性ThreadPool(线程池),调用CHIWorker类的start()方法时将对线程池进行初始化。该类的run()方法作为线程体被多个线程调用。run()方法也是CHIWorker类的核心,决定了文本特征计算的效率,具体算法如图所示。CHIWorker类拥有一个名为resultMap的HashMap,用于存储词汇及其CHI值存储。采用java的多线程技术将类别c下所有词汇的卡方统计检验值计算完毕,并存储在resultMap中,主程序将在多线程运行完毕后获取到resultMap中存储的值。

图2 CHIWorker类的run方法

在获取了存储于resultMap中的CHI值之后可以进一步按照CHI值的大小进行排序,为CHI值确定一个最低阀值,保留大于阀值的词汇作为类别c的特征词汇集合,记为wordList1。借鉴文献[3]中提出的CHI改进算法,在获取了词汇集合wordList1之后,再进一步计算每个词的频度、集中度和分散度,其中频度是用语料索引库中词汇w出现的次数来表示;集中度=A/(A+C);分散度=A/(A+B) 。对wordList1中每个词汇按照频度、集中度和分散度的乘积进行计算并降序排序,通过设定一个阀值来选区若干词汇作为类别c的最终特征词汇集合。至此,完成了对类别c的文本特征选择,对其他类别也采用相同的计算过程,即可得到每个类别下的特征词汇向量。

4 结束语

本文分析了文本特征选择的重要性并比较了文本特征选择的主要方法,深入探讨了卡方统计检验法(CHI)的特点,提出了采用Lucene索引工具和Java多线程技术来优化CHI计算方法的思路。

参考文献:

[1] 王光.集合CHI与IG的特征选择方法[J].计算机应用,2012(7).

[2] 单松巍.几种典型特征选取方法在中文网页分类上的效果比较[J].计算机工程与应用,2003(22).

[3] 熊忠阳.基于卡方统计的文本分类特征选择方法的研究[J].计算机应用,2008(2).

[4] 崔爱国.文本分类中特征提取方法的比较与分析[J].电脑知识与技术,2009(7).

3.2 卡方统计中四个参数的计算

本文使用Java语言来实现卡方统计检验的计算公式,建立了DataManager类和IndexManager类。DataManager类根据指定的语料库存放路径获取语料库的主要状态信息,如语料库的文档总数、类别总数、某个类别下的文档数。IndexManager类根据指定的语料库来生成对应的索引库,索引库的结构如表1所示,并且提供一个getIndexReader()方法返回Lucene框架中的IndexReader对象。使用IndexReader对象的方法可以快速的读取卡方统计检验中所需的相关值。

计算“整个语料库中包含词w的文档数”,记作Nw ,可以直接使用IndexReader的docFreq(new term(“content”,word))方法来获取;计算“类别c中包含单词w的文档数”即卡方统计中的参数A,可以采用如图1所示的算法,IndexReader的termDocs方法可以返回包含词w的文档集合,该集合的每一项都包含一个文档编号docId,通过IndexrReader的document(int docId)方法可以获取当前项所对应的文档。那么卡方统计检验中的参数B=Nw-A。 计算“类别c中不包含单词w的文档总数”,即卡方统计中的参数C,可直接使用类别c的总文档数NC-A,这里NC在给定语料库路径情况下可以很方便的获得。在计算完参数A、B、C的值之后,D=N-A-B-C,其中N代表整个语料库的文档数,在给定的语料库中N的值是个常量。至此卡方统计检验的参数已经计算完毕,可以看出这里的关键是借助事先准备好的索引库快速计算出Nw和A的值。

3.3 文本特征选择计算的优化

当文本的词汇表较大时采用上述算法其效率依然不能令人满意。java的多线程技术可使上述算法获得更好的效率。首先使用Lucene来获取类别c下的词汇表并暂存于LinkedList集合中,这里的词汇表应该是过滤掉了停用词和单字词后的词汇集合。创建一个实现了Runnable接口的CHIWorker类,该类具有实例属性ThreadPool(线程池),调用CHIWorker类的start()方法时将对线程池进行初始化。该类的run()方法作为线程体被多个线程调用。run()方法也是CHIWorker类的核心,决定了文本特征计算的效率,具体算法如图所示。CHIWorker类拥有一个名为resultMap的HashMap,用于存储词汇及其CHI值存储。采用java的多线程技术将类别c下所有词汇的卡方统计检验值计算完毕,并存储在resultMap中,主程序将在多线程运行完毕后获取到resultMap中存储的值。

图2 CHIWorker类的run方法

在获取了存储于resultMap中的CHI值之后可以进一步按照CHI值的大小进行排序,为CHI值确定一个最低阀值,保留大于阀值的词汇作为类别c的特征词汇集合,记为wordList1。借鉴文献[3]中提出的CHI改进算法,在获取了词汇集合wordList1之后,再进一步计算每个词的频度、集中度和分散度,其中频度是用语料索引库中词汇w出现的次数来表示;集中度=A/(A+C);分散度=A/(A+B) 。对wordList1中每个词汇按照频度、集中度和分散度的乘积进行计算并降序排序,通过设定一个阀值来选区若干词汇作为类别c的最终特征词汇集合。至此,完成了对类别c的文本特征选择,对其他类别也采用相同的计算过程,即可得到每个类别下的特征词汇向量。

4 结束语

本文分析了文本特征选择的重要性并比较了文本特征选择的主要方法,深入探讨了卡方统计检验法(CHI)的特点,提出了采用Lucene索引工具和Java多线程技术来优化CHI计算方法的思路。

参考文献:

[1] 王光.集合CHI与IG的特征选择方法[J].计算机应用,2012(7).

[2] 单松巍.几种典型特征选取方法在中文网页分类上的效果比较[J].计算机工程与应用,2003(22).

[3] 熊忠阳.基于卡方统计的文本分类特征选择方法的研究[J].计算机应用,2008(2).

[4] 崔爱国.文本分类中特征提取方法的比较与分析[J].电脑知识与技术,2009(7).

猜你喜欢
文本分类特征选择
Kmeans 应用与特征选择
基于组合分类算法的源代码注释质量评估方法
基于GA和ELM的电能质量扰动识别特征选择方法
联合互信息水下目标特征选择算法
基于特征选择聚类方法的稀疏TSK模糊系统
基于特征选择和RRVPMCD的滚动轴承故障诊断方法
基于二元搭配词的微博情感特征选择