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 @@[email protected]@ {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步骤:

    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)@@[email protected]@ 这个表示分类的标签属性列

点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

 
时间: 2024-10-13 00:21:53

weka 文本分类(1)的相关文章

基于weka的文本分类实现

weka介绍 参见 1)百度百科:http://baike.baidu.com/link?url=V9GKiFxiAoFkaUvPULJ7gK_xoEDnSfUNR1woed0YTmo20Wjo0wYo7uff4mq_wg3WzKhTZx4Ok0JFgtiYY19U4q 2)weka官网: http://www.cs.waikato.ac.nz/ml/weka/ 简单文本分类实现: 此处文本为已处理好的文本向量空间模型,关于文本特征提取主要是基于TF-IDF算法对已分词文档进行特征抽取,然后基于

【搜索引擎(四)】文本分类

Q1. 为什么搜索引擎要用到文本分类? 搜索引擎要处理海量文本,人工分类不现实,机器的自动分类对提高文本的分类效率至少起到了一个基准的效果.另外,文本分类跟搜索引擎系统可以进行信息互通,文本分类的输入是文本,输出可以是标签或者是否从属于某个分类. Q2.文本分类基础算法 文本分类基础算法与机器学习.人工智能.数据挖掘中用到的算法都是联系紧密的,它从属的自然语言处理也正是人工智能的分支.你可能会想到文本分类肯定要用到基础的分类器,而且在更复杂的情况下可能还要用到人工智能的一些学习方法,比如双向LS

文本分类——机器学习常用工具

文本分类现已比较成熟,各类开源工具不少,现推荐几个比较常用简单的工具: 1.scikit-learn:http://scikit-learn.org/stable/index.html python编写调用,里面有各种分类算法svm.随机森林.贝叶斯等,和特征提取,如字.ngram等,几行代码便可以构建一个分类任务. 2.WEKA:http://www.cs.waikato.ac.nz/ml/index.html 具有图形界面,但是感觉速度有点慢 3.libsvm :http://www.csi

Spark ML下实现的多分类adaboost+naivebayes算法在文本分类上的应用

1. Naive Bayes算法 朴素贝叶斯算法算是生成模型中一个最经典的分类算法之一了,常用的有Bernoulli和Multinomial两种.在文本分类上经常会用到这两种方法.在词袋模型中,对于一篇文档$d$中出现的词$w_0,w_1,...,w_n$, 这篇文章被分类为$c$的概率为$$p(c|w_0,w_1,...,w_n) = \frac{p(c,w_0,w_1,...,w_n)}{p(w_0,w_1,...,w_n)} = \frac{p(w_0,w_1,...,w_n|c)*p(c

LingPipe-TextClassification(文本分类)

What is Text Classification? Text classification typically involves assigning a document to a category by automated or human means. LingPipe provides a classification facility that takes examples of text classifications--typically generated by a huma

使用libsvm实现文本分类

文本分类,首先它是分类问题,应该对应着分类过程的两个重要的步骤,一个是使用训练数据集训练分类器,另一个就是使用测试数据集来评价分类器的分类精度.然而,作为文本分类,它还具有文本这样的约束,所以对于文本来说,需要额外的处理过程,我们结合使用libsvm从宏观上总结一下,基于libsvm实现文本分类实现的基本过程,如下所示: 选择文本训练数据集和测试数据集:训练集和测试集都是类标签已知的: 训练集文本预处理:这里主要包括分词.去停用词.建立词袋模型(倒排表): 选择文本分类使用的特征向量(词向量):

文本分类--多分类

文本分类算是自然语言处理领域最最常见的问题了,开源的工具也很好用,但是苦于训练速度缓慢,需要引进多核的版本,开源提供的多核支持参数有限,而同事提供的又有语言障碍,觉得自己探索下多分类器. 分类算法有很多,但是效果较好的基本就是LR和SVM,而这两个算法业内著名的开源代码应该就是liblinear和libsvm,libsvm支不支持多核暂时还未了解,但是liblinear支持的多核版本也就三组(0.2.11),正好避开了我需要用的那组参数,于是就摸索下liblinear的train代码. 一.先说

统计学习方法文本分类

一个文本分类问题就是将一篇文档归入预先定义的几个类别中的一个或几个,而文本的自动分类则是使用计算机程序来实现这样的分类.通俗点说,就好比你拿一篇文章,问计算机这文章要说的究竟是体育,经济还是教育,计算机答不上,说明计算机弱爆了就打它的屁屁. 注意这个定义当中着重强调的两个事实. 第一,用于分类所需要的类别体系是预先确定的.例如新浪新闻的分类体系,Yahoo!网页导航的分类层次.这种分类层次一旦确定,在相当长的时间内都是不可变的,或者即使要变更,也要付出相当大的代价(基本不亚于推倒并重建一个分类系

机器学习经典算法详解及Python实现---朴素贝叶斯分类及其在文本分类、垃圾邮件检测中的应用

摘要: 朴素贝叶斯分类是贝叶斯分类器的一种,贝叶斯分类算法是统计学的一种分类方法,利用概率统计知识进行分类,其分类原理就是利用贝叶斯公式根据某对象的先验概率计算出其后验概率(即该对象属于某一类的概率),然后选择具有最大后验概率的类作为该对象所属的类.总的来说:当样本特征个数较多或者特征之间相关性较大时,朴素贝叶斯分类效率比不上决策树模型:当各特征相关性较小时,朴素贝叶斯分类性能最为良好.另外朴素贝叶斯的计算过程类条件概率等计算彼此是独立的,因此特别适于分布式计算.本文详述了朴素贝叶斯分类的统计学