前言:
上一篇比较详细的介绍了卡方检验和卡方分布。这篇我们就实际操刀,找到一些训练集,正所谓纸上得来终觉浅,绝知此事要躬行。然而我在躬行的时候,发现了卡方检验对于文本分类来说应该把公式再变形一般,那样就完美了。
目录:
文本分类学习(一)开篇
文本分类学习(二)文本表示
文本分类学习(三)特征权重(TF/IDF)和特征提取
文本分类学习(四)特征选择之卡方检验
文本分类学习(五)机器学习SVM的前奏-特征提取(卡方检验续集)
一,回顾卡方检验
1.公式一:
先回顾一下卡方检验:
卡方检验:事先做一个假设,计算由有假设得来的理论值于实际观察值之间的偏差来推断这个假设是否成立,公式:
2.四表格的卡方检验公式:
卡方检验对于文本分类:每个词对于每个类别,使用四表格的形式,计算该词对于该类是否有较大的影响,公式:
二,训练集的准备
我选择了复旦语料库中的历史篇:469篇
每篇的格式大多如下:
历史类文档
自己爬了博客园的博客:420篇
选择一篇贴出来:
计算机类博客
这里就要抛出一个问题来:机器学习:你到底需要多少训练数据,尤其是SVM?
我这里训练集加起来才889篇,可以明确的是这些训练集是肯定不够的,理论上来说训练集应该越多越好,但是其分类想过应该是一个越来越平缓的曲线,这个貌似应该研究起来也是一个不少篇幅的内容。
三,开始特征提取吧!
接下来就开始机器学习第一步也是最重要的一步,也是最麻烦的一步吧,事实上自己要做的工作就是这一步。毕竟后面的训练只要用前辈们已经不断完善的分类算法和工具了,我选择的是SVM算法和libsvm工具包。
再声明一下,我是利用卡方检验对需要进行二分类的文本进行特征选择,已达到降维的目的,最终要得到的是能够代表每个类别的特征集合,和一个总的特征词典。当然在这个工程中,我们也会看到每个词对于一个文本重要性的规律。
1.分词工具
第一步:选择分词工具对训练集进行分词
我选择的分词工具是JIEba分词,而我使用的语言是C# ,关于.net core版本的JIEba分词可以在这篇博文里面找到:
http://www.cnblogs.com/dacc123/p/8431369.html
利用JIEba分词工具,我们才能进行后面的计算词频,词的文档频率,词的四表格值,词的卡方值χ2 。这里还是把自己的代码贴出来吧,如果有需要的话我会整理在GitHub上。
2.计算词频
第二步:计算词频
相信大家都会写,我把自己代码贴出来以供参考,代码中多用了Dictionary 数据结构,对了分词之前,咱们应该有一份比较全的停用词表。插一句:对于文本分类来说停用词越多越好,对于搜索引擎来说就不是这样了。
1800多个停用词
停用词表
计算词频代码:
public void ReadText()
{
rd = File.OpenText("./stopwords.txt");
string s = "";
while ((s = rd.