weka_统一header小技巧

今天用weka进行文本分类,有两个语料库(类别都是 IT/体育/健康/军事/教育/经济),我想使用一个语料库作训练集,另一个作测试集。当分别处理好两个arff进行实验的时候,就会发现两个arff的header不同,无法将第二个语料库作为测试集。header指的是@attribute那部分。怎么合并呢? 我尝试过用java读进来重新构造Instances,但是太麻烦了。如果说要header一样,那就是把两个语料库的文本合在一起生成arff,但是这样就分不出哪个instance是哪个语料库的了,如果说能合在一起生成,又能区分出属于的语料库就好了。据此想到一个还算简便的方法。

weka的arff格式如下:

@relation 'xxx'

@attribute @@class@@ {class1,class2,class3}
@attribute attr1 numeric
@attribute attr2 numeric
...
@attribute attrn numeric

@data
{0 class1,12 1, ...... }
{0 class3,13 1, ...... }
...

 

(1)语料库_1文件夹类别不变,语料库_2文件夹类别后面全部加上"1"(加其他也行,区分而已),最后放在同一个文件夹中,如下

weka_统一header小技巧_第1张图片

(2)使用weka.core.converters.TextDirectoryLoader生成arff文件,再使用StringToWordVector转换成vsm模型,这时候会有12个类。

(3)用java读入arff中instances(dataset),新建两个instances(set1,set2)分别装两个语料库的实例,遍历一遍dataset,根据类别名放入不同instances,然后将set2中的类别改成不加"1"的类别。 最后使用DataSource把两个set以arff形式输出。

(4)在两个arff中,class属性其实还是有12个值的,但是因为(3)的处理,里面实例的类别其实只有6个,我们直接sublime打开arff,把@attribute @@class@@ {IT,IT1,体育,体育1,.....} 中有加1的删掉即可,这时候两个arff就是相同header的了。

 

这么一写出来好像还挺麻烦的说...不过实际操作代码量很少的,个人感觉还是比较方便的吧!

感觉讲的不是很清楚啊 =-=  

 

你可能感兴趣的:(weka_统一header小技巧)