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所示:
图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步骤:
- 进入Weka的Explorer页面,Open file..选中这个e:/data.arff文件
在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输出结果的简单说明
=== 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
weka 文本分类(1)的更多相关文章
- 基于weka的文本分类实现
weka介绍 参见 1)百度百科:http://baike.baidu.com/link?url=V9GKiFxiAoFkaUvPULJ7gK_xoEDnSfUNR1woed0YTmo20Wjo0wY ...
- Tensorflow二分类处理dense或者sparse(文本分类)的输入数据
这里做了一些小的修改,感谢谷歌rd的帮助,使得能够统一处理dense的数据,或者类似文本分类这样sparse的输入数据.后续会做进一步学习优化,比如如何多线程处理. 具体如何处理sparse 主要是使 ...
- Atitti 文本分类 以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案
Atitti 文本分类 以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案 1.1. 七.什么是贝叶斯过滤器?1 1.2. 八.建立历史资料库2 1.3. 十.联合概率的计算3 1.4. 十一. ...
- LingPipe-TextClassification(文本分类)
What is Text Classification? Text classification typically involves assigning a document to a catego ...
- 文本分类之特征描述vsm和bow
当我们尝试使用统计机器学习方法解决文本的有关问题时,第一个需要的解决的问题是,如果在计算机中表示出一个文本样本.一种经典而且被广泛运用的文本表示方法,即向量空间模型(VSM),俗称“词袋模型”. 我们 ...
- R语言做文本挖掘 Part4文本分类
Part4文本分类 Part3文本聚类提到过.与聚类分类的简单差异. 那么,我们需要理清训练集的分类,有明白分类的文本:測试集,能够就用训练集来替代.预測集,就是未分类的文本.是分类方法最后的应用实现 ...
- Spark ML下实现的多分类adaboost+naivebayes算法在文本分类上的应用
1. Naive Bayes算法 朴素贝叶斯算法算是生成模型中一个最经典的分类算法之一了,常用的有Bernoulli和Multinomial两种.在文本分类上经常会用到这两种方法.在词袋模型中,对于一 ...
- 文本分类学习(三) 特征权重(TF/IDF)和特征提取
上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的 ...
- 文本分类学习 (五) 机器学习SVM的前奏-特征提取(卡方检验续集)
前言: 上一篇比较详细的介绍了卡方检验和卡方分布.这篇我们就实际操刀,找到一些训练集,正所谓纸上得来终觉浅,绝知此事要躬行.然而我在躬行的时候,发现了卡方检验对于文本分类来说应该把公式再变形一般,那样 ...
随机推荐
- background和background-size
今天偶遇一个小问题. 添加logo图片时, 由于不需要重新定位图片位置,就准备偷懒在间歇属性中省略background-position的属性,然而很不幸的是,结果却是酱紫的(谷歌浏览器): 不能加载 ...
- Qt窗体内控件自适应调整大小
http://stackoverflow.com/questions/3492739/auto-expanding-layout-with-qt-designer After creating you ...
- JS中注意原型链的“指向”
昨天压缩Js文件时发现了项目中的一个prototype的问题代码如下所示: 1. <script> var XXX = function(){ }; var x1 = new XXX(); ...
- Android笔记:java 中的枚举
部分数据使用枚举比较方便,java中的enmu不如c#中使用方便 记录备忘 以c#中的代码为例 public enum PlayState { /// <summary> /// 关闭 / ...
- SQL Server 2008 R2[ALTER]列属性修改
1:向表中添加字段 Alter table [表名] add [列名] 类型 2: 删除字段 Alter table [表名] drop column [列名] 3: 修改表中字段类型 (可以修 ...
- mysql导入导出
1.导入整个库 进入数据库,source 进去的语句等同于直接连接数据库后数据的语句 >source /var/www/test.sql 或者 sy$ mysql -uroot -p 数据库名( ...
- mongoDB命令
. getLastError db.runCommand({getLastError:}) . buildInfo //返回mongoDB的服务器版本号和操作系统类型 db.runCommand({} ...
- 【转】(转)【Android】Paint的效果研究
转自:http://wpf814533631.iteye.com/blog/1847661 (转)[Android]Paint的效果研究 博客分类: android 在Paint中有很多的属性可以 ...
- 关于action script与js相互调用的Security Error问题
大家都知道,as和js相互调用可以通过ExternalInterface.call和ExternalInterface.addCallback来进行. 比较好的做法是使用之前通过ExternalInt ...
- @MyBatis中的if...else...
<select id="selectSelective" resultMap="xxx" parameterType="xxx"> ...