试验机器是i686平台32位ubuntu系统,500G ROM,4G RAM,1.46GHZ 双核CPU
1.下载weka数据挖掘软件,安装到系统,将weka.jar添加到classpath环境变量当中
2.下载文本数据集
使用的是路透新闻语料Reuters21578,直接下载的数据集不适合weka处理,需要转换成arff格式。可以从此处下载厦门大学邹博士已经处理好的数据 Reuters21578-Apte-90Cat。
3.数据预处理
Reuters21578-Apte-90Cat数据集解压后,训练数据和测试数据分别放在不同的目录下,并且还有下一级的子目录,在子目录中每个类别与一个文件夹对应,这个文件夹下放的就是对应类别的文本文档。
(1)将所有训练目录下的文本文档转换为一个arff文件:
java weka.core.converters.TextDirectoryLoader -dir my_data_folder > my_arff_save _path/data.arff
其中,my_data_folder是包含样本txt的文件夹,如果是二值化的分类问题,则该文件夹应该包含两个子文件夹,每个子文件夹装每个类的样本,多类的分类问题就是多个子文件夹,类同。子文件夹的名字就是该类的类标签,在生成的arff文件可以看到这一点。 my_arff_save _path是想要保存文件的目录,data.arff是生成的数据文件,也可以是自己想要的任何名字。
e.g:
java weka.core.converters.TextDirectoryLoader -dir ./training/ > text_example.arff
(2)使用过滤器将文本转换为矢量(以下获取的是TF-IDF特征)
java weka.filters.unsupervised.attribute.StringToWordVector -I -C -i my_arff_save _path/data.arff -o my_arff_save_path/data_vsm.arff -c last
可以在weka的StringToWordVector类说明里面看到如下选项的意义:
-C 对word进行词频计数而不是二值化表示
-I 将词频转化为fij*log(文档数目/包含词i的文档数目)(即TF-IDF特征),fij是词i出现在文档j里面的频率
后面的选项是通用的选项:
-i 输入
-o 输出
-c 指明类标签的位置,last表明标签为最后一个属性,first表明标签为第一个属性。
e.g:
java weka.filters.unsupervised.attribute.StringToWordVector -I -C -i ./text_example.arff -o ./text_example_wordvector_vsm.arff -c last
(3)数据离散化
转化后的数据还不能直接用来分类,需要进行离散化:
java weka.filters.supervised.attribute.Discretize -i my_arff_save_path/data_vsm.arff -o my_arff_save_path/data_D_vsm.arff -c first
(4)数据分为训练集和测试集
将数据分成训练集和测试集:
java weka.filters.supervised.instance.StratifiedRemoveFolds -i my_arff_save_path/data_D_vsm.arff -o my_arff_save_path/data_vsm_train.arff -c first -N 4 -F 1 –V
同样可以参见StratifiedRemoveFolds类说明:
-N 4 指定将数据集分成的折数为4
-F 1 指定第1折被选中
-V 取反,设置-V将导致剩下没被选中的作为输出
可以加个-S的选项在分折的时候随机选择样本
测试集:
java weka.filters.supervised.instance.StratifiedRemoveFolds -i my_arff_save_path/data_D_vsm.arff -o my_arff_save_path/data_vsm_test.arff -c first -N 4 -F 1
经过上述操作后,数据被分成了4折,其中3折作为训练集,还有1折数据作为测试集。
4.模型训练
训练模型:
java weka.classifiers.bayes.NaiveBayes -t my_arff_save_path/data_D_vsm.arff -i -k -d my_arff_save_path/data_vsm_nb.model -c first > my_arff_save_path/data_vsm_nb.model
在测试集上检验效果:
java weka.classifiers.bayes.NaiveBayes -l my_arff_save_path/data_vsm_nb.model -T my_arff_save_path/data_vsm_test.arff –c first > my_arff_save_path/data_vsm_NB_r.txt
5.模型使用
训练好的模型已经序列化保存,后面可以直接使用
PS: 1.以上记录都是在bash命令行下
2.可以使用weka GUI图形界面去操作,也可在simple CLI下输入以上命令去试验