文本数据预处理,包括文档切分、文本分词、去停用词(包括标点、数字、单字和其它一些无意义的词)、文本特征提取、词频统计、文本向量化等操作。
1.文档切分
文档切分这个操作是可选的,取决于你获取到的文档集合的形式。如果你得到的文档集合本身就是一篇一篇文章分开的,那么这一步就可以省略了。反之,如果文档集合是一个单一的文件,所有的文章都存储在这个文件中,那么你就要将其中的文章提取出来单独存放在一个文件中,从而便于以后的操作。
一般来说,单一文件的文档集合中文章与文章之间都会使用一些标记来区分,比如用空行、特定符号等等。我做的课程作业中有一个人民日报语料库,语料库中文章与文章之间就是用空行来分隔的。
2.文本分词
文本分词是预处理过程中必不可少的一个操作,因为后续的分类操作需要使用文本中的单词来表征文本。目前文本分词已经有很多比较成熟的算法和工具,在网上搜索一下就会发现很多。
文本分词包括两个主要步骤,第一个是词典的构造,第二个是分词算法的操作。
词典的构造目前比较流行的有字典树即标准trie树,字典树的构造有很多方法,本人博客中也有一篇用java实现字典树的博文,但是空间利用率和效率可能不是很高。目前比较不错(节约空间和效率)的构造方法有双数组trie树等。
分词算法有简单的有复杂的,常见的主要有正向最大匹配、反向最大匹配、双向最大匹配、语言模型方法、最短路径算法等等,这些算法在网上都可以找到详细的资料。
3.去停用词
去停用词也是预处理过程中不可缺少的一部分,因为并不是文本中每一个单词或字符都能够表征这个文本,比如说“这个”、“的”、“一二三四”、“我 你 他”、“0 1 2 ……9”等等,那么这些词就应当从文本中清除掉。可以在网上下载一份中文的停用词表来作为去停用词的参考。
4.文本特征提取
这个是文本分类过程中很重要的一部分,但是并不是必要的,当然最好有这一部分。我们不能肯定的说文本中的某一个单词就能100%表征这篇文档,只能说这个单词能以某种程度来表征这篇文档,这个程度具体衡量的标准就是概率。概率越大,说明这个单词越能表征这篇文档;反之则越不能表征这篇文档,当概率小到一个阀值(人为设定)的时候,这个单词就可以舍弃了(不能表征,要你何用呢)。
表征的概率目前有两种使用比较广泛的方法,一种是差方统计(这个概率越小越好),另一种是信息增益(这个概率越大越好)。两种方法都比较晦涩难懂,但是网上资料很多,多看看相关资料就会明白了。如果嫌这一步麻烦,大不了不做这一步了(摆平不了,咱撤还不行吗),当然这就要牺牲一点分类的准确率了,有时候可不是一点点哦。
5.词频统计
这一步是必不可少的一个步骤。去停用词和文本特征提取之后,剩下的词是文本的精华所在了,这时就要涉及到另一个表征标准了—词频。显然,如果一个单词在文本中出现的频率很高,那么这个单词就越有可能(记住,只是可能而已,并不能肯定,这其中还涉及到一个反文档频率)表征这个文本。同时词频也是构造文本空间向量模型的必要元素,因此这一步至关重要。
词频统计方法也有很多成熟的方法,比如hash、改造的trie树等方法,搜搜更明白!
6.文本向量化
进行如上操作以后,还差一步就会达到胜利的彼岸了,这个彼岸可不是分类完成,而是可以运用分类算法了。大都数分类算法都只适用于离散的数值类型,因此到目前为止预处理还差的最后一步就是将文本进行空间向量化,也就是用数学上的多维特征向量来表示一个文本。比如有如下两个文档:
d1 (A, B, C, D, E, F, G)
d2(C, E, F, G, A, B)
就已经表示成向量模型了,只不过括号内的每一维的值暂时用文档的特征词来表示了。那么我们应该将特征词转换成数值表示,这个数值就可以用概率来表示了。
概率的计算涉及两个方面,前面也说过,即特征单词在文档中出现的频率p(通常由该词在所属文档中出现的词频除以全部文档的特征词数),还有该词的反文档频率q(表示该词出现在多少个文本中的频率,如果一个单词在很多文档中出现的频率都很高,那么这个单词就太普遍了,不足以用来表征一篇文档)。那么某一维的表征概率值就是p和q的一个因式乘积,当然根据需要还有可能乘上另外一些影响因子。下面都简单介绍一下这两个概率是如何计算的:
特征词集合/文档 d1 d2 单词出现总数
A 2 1 3
B 2 2 4
C 2 1 3
D 1 0 1
E 4 3 7
F 2 1 3
G 2 2 4
文档单词总数 15 10 25
其中表格内面的数字表示特征单词在对应文档中出现的次数,下一步计算p并标准化(将数值映射到-1到1之间,以防止大值特征词对文本特征的控制,当然也可以便于后续的计算):
计算p值 d1 d2
A 0.08(2 / 25) 0.04
B 0.08 0.08
C 0.08 0.04
D 0.04 0.00
E 0.16 0.12
F 0.08 0.04
G 0.08 0.08
q的计算需要利用公式log((1+|D|)/|Dt|)(这是前人总结出来的,咱只是站在了他们的肩膀上),其中其中|D|表示文档总数,|Dt|表示包含特征词t的文档数量。例子的q值计算结果如下:
计算q值 ln
A 0.4
B 0.4
C 0.4
D 1.1
E 0.4
F 0.4
G 0.4
最后将p、q相乘得到每个文档的最终向量表示:
计算p值 d1 d2
A 0.032 0.016
B 0.032 0.032
C 0.032 0.016
D 0.044 0.000
E 0.064 0.048
F 0.032 0.016
G 0.032 0.032
那么最终就可以将d1和d2表示成如下的空间向量:
d1 = (0.032, 0.032, 0.032, 0.044, 0.064, 0.032, 0.032)
d2 = (0.016, 0.032, 0.016, 0.000, 0.048, 0.016, 0.032)
其中向量对应的维度特征变量为A,B,C,D,E,F,G