weka 文本分类(1)

一、初始化设置

1 jvm out of memory 解决方案:

在weka SimpleCLI窗口依次输入
java -Xmx 1024m

2 修改配置文件,使其支持中文:

配置文件是在Weka安装后的目录下,比如我的是在C:\Program Files\Weka-3-7\RunWeka.ini,打开这个文件,找到fileEncoding=Cp1252这一行,改成fileEncoding=utf-8即可。如下:

# The file encoding; use "utf-8" instead of "Cp1252" to display UTF-8 characters in the
# GUI, e.g., the Explorer
fileEncoding=utf-8

如果是在C盘,可能会提示没有权限保存,这时可以把这个配置文件复制到桌面,修改完了再替换回去。

有些同学,改完配置文件,中文依然乱码,可能因为源文件不是utf8编码格式的,可以用notepad++把arff文件打开,然后选择格式->转为UTF-8编码格式,保存。

二、数据格式:

Weka使用的数据格式是它自己规定的,arff格式,大概就是这个样子:

@relation F__zle_study_ccf_code_Archive_text3

@attribute text string
@attribute @@class@@ {text006,text010,text013,text014,text015,text016,text020,text023,text024,text026,text100,text103,text104,text105,text106,text110,text113,text114,text115,text116,text120,text121,text122,text123,text124,text125,text126,text200,text203,text204,text205,text206,text210,text211,text212,text213,text214,text215,text216,text220,text222,text223,text224,text225,text226,text300,text302,text303,text304,text305,text306,text310,text311,text312,text313,text314,text315,text316,text320,text321,text322,text323,text324,text325,text326,text400,text403,text404,text405,text406,text410,text411,text412,text413,text414,text415,text416,text420,text421,text422,text423,text424,text425,text426,text500,text510,text511,text512,text513,text514,text515,text520,text521,text522,text523,text524,text525,text526,text600,text610,text612,text613,text614,text616,text620,text623,text624}

@data
'地图 中国 完整版 电影 秘密 官网 乔丹 2016 超载 超限 规定 最高 现在 中国 电影 超轻型',text006

'货运 远洋 秘密 版大图 世界地图 高清 顺德 版大图 高清 唐朝',text014

1 将文件转换成ARFF文件:

TextDirectoryLoader

java weka.core.converters.TextDirectoryLoader -dir text_example > text_example.arff

该方法只能通过命令行实现。如果是在windows下,要首先在环境变量里加入weka.jar的位置,再在cmd里敲入命令行。

该类的作用是把输入目录转化成ARFF文件,但是转化之后的ARFF文件里的属性是string型的,依然是大多数分类器不能处理的,需要做进一步处理。该类的作用相当于把每个文本表示一行的string格式。

输入的文件目录的格式应为图1所示:

weka 文本分类(1)

图1 文件目录格式

一个生成图1格式的代码

import os
re_base='F:\zle\study\ccf\code\Archive\dict_keywords.txt'#文件读取目录
wr_base="F:/zle/study/ccf/code/Archive/text3/text" #文件生成目录
with open(re_base,'r') as f:
line=f.readlines() for x in range(107):#一共有107类
catalog=line.pop(0).split(':')[0]
file_name=wr_base+str(catalog)
if not os.path.exists(file_name):
os.path.join(wr_base,str(catalog))
os.mkdir(file_name)
else:
pass
with open(file_name+'/'+str(catalog)+'.txt','w') as f:
f.write(line.pop(0).replace(',',' '))

2.StringToWordVector

由TextDirectoryLoader转化成的arff还不能直接用来分类,还需StringToWordVector类的进一步处理。这步在命令行和GUI上都能操作,但建议直接转到GUI上来操作更清楚、方便。

在打开的WEKA界面中选择打开已经上一步处理过的文件,然后选择StringToWordVector,该类位于weka.filters.unsupervised.attribute.StringToWordVector中,然后点击可以配置参数。这也是GUI的好处之一,可以配置更加详细的参数。

GUI步骤:

    1. 进入Weka的Explorer页面,Open file..选中这个e:/data.arff文件
    2. 在Filter中点击Choose 
      选择 weka->filters->unsupervised->attribute->StringToWordVector 
      点击Apply之后,Weka将自动统计词频,将词转成特征。

      在StringToWordVector中可以配置是否使用TFIDF特征,词频是否只使用0,1统计(outputWordCounts=false)

参数介绍

这里简要介绍一下StringToWordVector可能需要自己做调整的参数:

-W 需要保留的单词个数,默认为1000。这不是最终的特征维数,但是维数跟此参数是正相关的

-stopwords <file> 输入停词文件,文件格式为每一个词一行。在读文件到转化特征时会自动去掉这些常用词,系统自带有一套停用词。

-tokenizer <spec> 自定义所要去除的符号,一般为标点符号。默认有常用的标点符号,但往往是不够的,所以需自己添加

其他参数只需默认值即可。在GUI当中,还有一些参数设置需要介绍:

lowerCaseTokens 是否区分大小写,默认为false不区分,这里一般要设置为ture,因为同一个词就会有大小写的区别

三.特征选择与训练

提取完ARFF文件之后,可以按上方的按钮保存文件。在Attribute一栏中也会显示所有的特征,此时也可以自己观察一下所提取的单词是否合理,然后再在去停词、符号等等方面做改进,当然若至于少部分的有问题,也可以手动剔除。

此步进行完之后,可以使用降维方法(例如PCA)对特征进行降维,当然这不是必须的。

接下来就可以按照一般ARFF文件进行训练了。

进入Classify面板,在Start按钮上面的下拉框中,选中(Nom)@@class@@ 这个表示分类的标签属性列

点Choose按钮选择trees中的J48,然后点击Start,Weka便开始进行训练。只要数据格式正确了,可以使用这里面的各个分类器进行训练,比如RandomForest,NaiveBayes,比较分类效果。

weka 文本分类(1)

四 Weka输出结果的简单说明

=== Summary ===(总结)

Correctly Classified Instances(正确分类的实例)          45               90      %
Incorrectly Classified Instances (错误分类的实例)        5               10      %
Kappa statistic(Kappa统计量)                               0.792 
Mean absolute error(均值绝对误差)                           0.1   
Root mean squared error(均方根误差)                   0.3162
Relative absolute error(相对绝对误差)                    20.7954 %
Root relative squared error(相对均方根误差)             62.4666 %
Coverage of cases (0.95 level)          90      %
Mean rel. region size (0.95 level)      50      %
Total Number of Instances(实验的实例总数)               50

=== Detailed Accuracy By Class ===

  TP Rate(真阳性率) FP Rate(假阳性率) Precision(查准率)   Recall(查全率)  F-Measure  MCC(Matthews相关系数)    ROC Area  PRC Area  Class(类别)
                     0.773           0                1               0.773       0.872         0.81            0.886      0.873     true
                      1               0.227           0.848            1          0.918         0.81            0.886      0.848     false
Weighted Avg.       0.9            0.127           0.915            0.9       0.898         0.81            0.886      0.859

 
上一篇:maven中指定build一个project中几个特定的子modules


下一篇:高精度 java的一些题