最近需要做一些和垃圾短信过滤相关的研究工作,因此有幸开始接触文本分类,在本篇文章中将对文本分类的一些工作做一些简单的介绍,有一些想法和理解可能不会很成熟,请大家谅解和指出。

文本分类的目的是将某个文本进行归类,假设我们有多个文本类c1,c2,...,cn。文本分类的目的是,给定了一个文本t,我们要判别文本t属于c1,c2,..,cn中的那一类。文本通常是指一段文字,可能是一个短信,一封邮件,一个Hml文件。比如,有短信"中天花园即将盛大开盘,单价8000元/平方米,前50名订购者将优惠5000元,欢迎致电13915222354咨询"(记为t),我们设定了文本类{非垃圾短信(c1), 房产广告(c2),诈骗短信(c3),....,cn},我们的目的是通过一系列技术手段来判别t是哪种类别的短信。

文本分类的步骤如下:1.分词预处理;2.文本分词处理;3.特征词选取;4.构造文本向量;5.根据构造的文本向量来进行分类。

分词预处理步骤的目的是将文本中一些无意义的字符去除。通常在短信中,将一些敏感词用多个无意义的字符进行了分隔。前述短信很可能实际是“中天花园即将盛大开????盘,单@@@@@@价8000元/平方米,前50名订购者将优惠5000元,欢迎致电13915222354咨询”,由于“开盘”和“单价”中间用无意义的符号进行了分隔,我们需要将其还原为原来的短信文本。这一步骤通过简单的非法字符过滤就可以完成。

文本分词步骤的目的是将一个文本表示为一个词集合{w1,w2,...,wk}。这一步骤目前的研究工作已经取得了很好的效果,具体可以见百度的介绍http://baike.baidu.com/view/19109.htm。由于在实际使用过程中笔者采用了.net开发平台,因此采用了盘古开源分词系统,实践证明,该分词系统从速度和分词准确率上已经基本满足分词需要。盘古分词对上述短信的分词结果为“中天/花园/即将/盛大/开盘/单价/8000/元/平方米/前/50/名/订购/者/将/优惠/5000/元/欢迎/致电/13915222354/咨询/”

特征词选取步骤的目的是对分词步骤中得到的分词集合进行筛选以得到一个子集。在该步骤中,定义了一下筛选规则,比如虚词全部忽略,因此上面的短信分词结果中的{将,即将,前}将被忽略。另外将一些数字用一些词来进行替换,比如上述{8000,50,5000,13915222354}被词{价格,数量,价格,电话号码}替换。同时对一些词进行合并,比如将{中天,花园}用一个词{楼盘名}来进行替换。这一步骤通常对我们的分类结果起到非常重要的作用。假设在这一步我们得到结果{楼盘名,开盘,单价,价格,数量,欢迎,致电,手机,咨询}。该步骤可以总结为:筛选和合并。

构造文本向量步骤。给定了一个文本我们通常用一个文本向量来表示,每个词代表了向量的一个维度。举例来说,假设在我们的文本分类算法中我们一个选取了1500个词作为候选特征词。那么任意的文本我们都可以用这1500个特征词所构成的1500维度的向量来表达。在此次我们简单的定义如果某个词在文本中出现该词对应的值1,否则为0。因此上面的结果{楼盘名,开盘,单价,价格,数量,欢迎,致电,手机,咨询}可以表示为向量V:

{0,0,..,1,...,1,...,1,...,1,...,1,...,1,...,1,...,1,...,1}。解释如下:V是一个1500维的向量,因此一共有1500个分量,由于分词结果中一共出现了9个词,因此这9个词对应的分量值为1。例如,假设“开盘”这个词在第300维,那么向量V的第300维值应该为1。

可以看到,对于短信来说,由于出现的词较少。因此一个短信文本表示为一个向量时,多数维度的值为0,只有极少数的维数的值为1。当然,向量维度的值仅仅为1或者0是对问题的简化。通常还要考虑其他因素,例如词的权重问题(反映了词的重要程度),词频问题(反映了词在文本中出现了多数次),词和文本主题的相关度问题等等。因此这个值的选取通常极大的影响了最终的分类结果。

分类步骤。通常我们预定义了(可以人工去完成,也可以先由计算机初步处理,然后人工纠正)样本分类库,每一类短信中都预存放了多个样本短信。例如,我们在房产广告类下放入100个房产广告的样本短信,在诈骗类中也放入100个诈骗的样本短信。根据我们前面的介绍,每个样本短信都可以表示为一个文本向量。因此房产广告类的100个样本短信就表示成了100个1500维的向量(记为A类向量),而诈骗类的100个样本短信也表示成了100个1500维的向量(记为B类向量)。显然,每一类向量之间的距离应该较小,而一类和另外一类向量之间的距离应该较大。距离可以有多种表示方式,最简单的方式就是物理意义上的距离,也可以用向量的夹角余弦等表示。假设我们的样本库中存放了1000个样本短信,那么在我们的1500维的空间中,就有1000个向量。我们的目的是,给定了文本t,我们将t表示成了一个文本向量v,我们现在需要根据该向量v和1000个样本短信向量的距离来进行判断v属于哪一类。这一类算法目前有很多,比如knn算法,支持向量机算法等。有兴趣的朋友可以看看这一类算法。

下一篇将详细的去讨论将文本表示为向量步骤中一些值得反思和进一步研究的问题。

posted on 2011-12-03 20:13  寂寞清风  阅读(839)  评论(0编辑  收藏  举报