weka介绍

参见

1)百度百科:http://baike.baidu.com/link?url=V9GKiFxiAoFkaUvPULJ7gK_xoEDnSfUNR1woed0YTmo20Wjo0wYo7uff4mq_wg3WzKhTZx4Ok0JFgtiYY19U4q

2)weka官网: http://www.cs.waikato.ac.nz/ml/weka/

简单文本分类实现:

此处文本为已处理好的文本向量空间模型,关于文本特征提取主要是基于TF-IDF算法对已分词文档进行特征抽取,然后基于已提取特征将所有文档表示为向量空间模型。

偷个小懒,就用weka自带的*.arff格式文档来做实现。

weka对于文本分类提供两种方式,一种是批量式文本分类,即将所有数据一次性放入内存进行分类处理,这种情况对内存有所要求;为适应大量数据的分类实现,另一种增量式

文本分类,允许分批次导入数据至内存进行分类,这样就避免了因数据集过大而内存不足的问题。具体实现如下:

1)采用增量式朴素贝叶斯算法进行分类

注:weka中所有增量式分类器都实现了UpdateableClassifier接口,该接口位于weka.classifiers包中。

  1. /**
  2. * train a classifier using trainSet,then evaluate the classifier on testSet
  3. * 分类分为两种:增量、批量
  4. * 此处为增量式分类:适用于训练集太大而内存有限的情况
  5. * 加载数据集(训练集or测试集),使用ArffLoader
  6. * @param trainSet:训练集路径
  7. * @param testSet:测试集路径
  8. * @return classifier
  9. *
  10. */
  11. private Classifier trainClassifierIncremental(String trainSet,String testSet){
  12. ArffLoader loader=new ArffLoader();
  13. Instances instances = null;
  14. NaiveBayesUpdateable naiveBayesUpdateable=null;
  15. try {
  16. //load data
  17. loader.setFile(new File(trainSet));
  18. instances=loader.getStructure();
  19. // instances.setClassIndex(classIndex); // 指定分类属性索引
  20. instances.setClassIndex(instances.numAttributes()-1); //默认最后一个属性为分类属性
  21.  
  22. // train NaiveBayes :incremental classifier
  23. naiveBayesUpdateable=new NaiveBayesUpdateable();
  24. naiveBayesUpdateable.buildClassifier(instances);
  25. Instance current;
  26. while((current=loader.getNextInstance(instances))!=null){
  27. naiveBayesUpdateable.updateClassifier(current);
  28. }
  29.  
  30. //evaluate classifier
  31. Instances testInstances=new Instances(new FileReader(testSet));
  32. testInstances.setClassIndex(testInstances.numAttributes()-1);
  33. Evaluation eval=new Evaluation(instances);
  34. eval.evaluateModel(naiveBayesUpdateable, testInstances);
  35. System.out.println(eval.toMatrixString());
  36. System.out.println(eval.toSummaryString());
  37. System.out.println(eval.toClassDetailsString());
  38.  
  39. } catch (Exception e) {
  40. e.printStackTrace();
  41. }
  42. return naiveBayesUpdateable;
  43. }

增量式分类实现

其中,Evaluation类,是weka提供的对分类器分类效率进行评估的模块,通过该模块的调用,可观察分类器的各种性能,如召回率、准确率、F值等等。ArffLoader用来加载指

定路径的数据集,注意该数据集应为.arff格式。

2)采用决策树算法(J48)进行批量式分类

  1. /**
  2. * train a classifier using trainSet,then evaluate the classifier on testSet
  3. * 分类分为两种:增量、批量
  4. * 此处为批量式分类:适用于训练集能够在内存中存放的情况
  5. * 加载数据集(训练集or测试集),使用ArffLoader
  6. * @param trainSet:训练集路径
  7. * @param testSet:测试集路径
  8. * @return classifier
  9. *
  10. */
  11. private Classifier trainClassifierBatch(String trainSet,String testSet){
  12. ArffLoader loader=new ArffLoader();
  13. Instances instances = null;
  14. J48 tree=null;
  15. try {
  16. //load data
  17. loader.setFile(new File(trainSet));
  18. // instances=loader.getStructure();
  19. instances=loader.getDataSet();
  20. // instances.setClassIndex(classIndex); // 指定分类属性索引
  21. instances.setClassIndex(instances.numAttributes()-1); //默认最后一个属性为分类属性
  22.  
  23. // train NaiveBayes :incremental classifier
  24. tree=new J48();
  25. tree.buildClassifier(instances);
  26.  
  27. //evaluate classifier
  28. Instances testInstances=new Instances(new FileReader(testSet));
  29. testInstances.setClassIndex(testInstances.numAttributes()-1);
  30. Evaluation eval=new Evaluation(instances);
  31. eval.evaluateModel(tree, testInstances);
  32. System.out.println(eval.toMatrixString());
  33. System.out.println(eval.toSummaryString());
  34. System.out.println(eval.toClassDetailsString());
  35.  
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. }
  39. return tree;
  40. }

批量式分类实现

3)关于分类器的评估

weka对于分类器的评估,除了上述明确划分训练集和测试集,然后以测试集来评估分类性能的方式,还提供了交叉验证方式,该方式适用于数据集只有一个(即没有明确划分出训练集和测试集)的情况,weka在Evaluation类中提供了一个crossValidateModel方法来实现交叉验证,该方法要求提供一个未训练的分类器,数据集,交叉验证折数,一个随机化种子。

  1. public void crossValidate(String dataSet){
  2. try {
  3. // load data
  4. Instances instances=new Instances(new FileReader(dataSet));
  5. //evaluate
  6. Evaluation eval=new Evaluation(instances);
  7. J48 tree=new J48();
  8. eval.crossValidateModel(tree, instances, 10, new Random(1));
  9. System.out.println(eval.toMatrixString());
  10. System.out.println(eval.toSummaryString());
  11. System.out.println(eval.toClassDetailsString());
  12. } catch (FileNotFoundException e) {
  13. System.out.println("dataSet not found...");
  14. e.printStackTrace();
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20.  
  21. }

交叉验证实现

此处实现采用10折交叉验证,随机化种子选取1.

4)对未分类实例进行分类

  1. /**
  2. * 利用已训练的分类模型对未分类数据集进行分类
  3. * @param dataSet:未分类数据集
  4. * @param cls:已训练好的分类模型
  5. * @param labeledSet:分类后数据存放路径
  6. */
  7. public void classifyInstances(String dataSet,Classifier cls,String labeledSet){
  8. try {
  9. // load unlabeled data and set class attribute
  10. Instances unlabeled=new Instances(new FileReader(dataSet));
  11. unlabeled.setClassIndex(unlabeled.numAttributes()-1);
  12. // create copy
  13. Instances labeled = new Instances(unlabeled);
  14. // label instances
  15. for (int i = 0; i < unlabeled.numInstances(); i++) {
  16. double clsLabel = cls.classifyInstance(unlabeled.instance(i));
  17. labeled.instance(i).setClassValue(clsLabel);
  18. }
  19. // save newly labeled data
  20. DataSink.write(labeledSet, labeled);
  21.  
  22. } catch (FileNotFoundException e) {
  23. System.out.println("DataSet,File Not Found...");
  24. e.printStackTrace();
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. }

未分类实例分类实现

相关方法简介:

<--instances.setClassIndex(instances.numAttributes()-1); //默认最后一个属性为分类属性 -->

Instances类方法:setClassIndex(int classIndex) 用于设置分类属性索引, numAttributes()返回instance实例中属性(特征)个数,即特征向量维度

<--eval.toMatrixString());

eval.toSummaryString();
eval.toClassDetailsString();

-->

• toMatrixString – outputs the confusion matrix.

• toClassDetailsString – outputs TP/FP rates, precision, recall, F-measure,AUC (per class).

输出结果展示:

=== Confusion Matrix ===

a b c <-- classified as
50 0 0 | a = Iris-setosa
0 47 3 | b = Iris-versicolor
0 3 47 | c = Iris-virginica

Correctly Classified Instances 144 96 %
Incorrectly Classified Instances 6 4 %
Kappa statistic 0.94
Mean absolute error 0.035
Root mean squared error 0.1486
Relative absolute error 7.8697 %
Root relative squared error 31.5185 %
Coverage of cases (0.95 level) 98.6667 %
Mean rel. region size (0.95 level) 37.3333 %
Total Number of Instances 150

=== Detailed Accuracy By Class ===

TP Rate FP Rate Precision Recall F-Measure ROC Area Class
1       0       1      1     1      1     Iris-setosa
0.94 0.03 0.94 0.94 0.94 0.992 Iris-versicolor
0.94 0.03 0.94 0.94 0.94 0.992 Iris-virginica
Weighted Avg. 0.96 0.02 0.96 0.96 0.96 0.995

基于weka的文本分类实现的更多相关文章

  1. tensorflow实现基于LSTM的文本分类方法

    tensorflow实现基于LSTM的文本分类方法 作者:u010223750 引言 学习一段时间的tensor flow之后,想找个项目试试手,然后想起了之前在看Theano教程中的一个文本分类的实 ...

  2. 一文详解如何用 TensorFlow 实现基于 LSTM 的文本分类(附源码)

    雷锋网按:本文作者陆池,原文载于作者个人博客,雷锋网已获授权. 引言 学习一段时间的tensor flow之后,想找个项目试试手,然后想起了之前在看Theano教程中的一个文本分类的实例,这个星期就用 ...

  3. 基于SVMLight的文本分类

    支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本 .非线性及高维模式识别 中表现出许多特有的优势,并能够推广应用到函数拟合等 ...

  4. 基于tensorflow的文本分类总结(数据集是复旦中文语料)

    代码已上传到github:https://github.com/taishan1994/tensorflow-text-classification 往期精彩: 利用TfidfVectorizer进行 ...

  5. Python 基于 NLP 的文本分类

    这是前一段时间在做的事情,有些python库需要python3.5以上,所以mac请先升级 brew安装以下就好,然后Preference(comm+',')->Project: Text-Cl ...

  6. NLP第9章 NLP 中用到的机器学习算法——基于统计学(文本分类和文本聚类)

  7. 基于Text-CNN模型的中文文本分类实战 流川枫 发表于AI星球订阅

    Text-CNN 1.文本分类 转眼学生生涯就结束了,在家待就业期间正好有一段空闲期,可以对曾经感兴趣的一些知识点进行总结. 本文介绍NLP中文本分类任务中核心流程进行了系统的介绍,文末给出一个基于T ...

  8. 基于Text-CNN模型的中文文本分类实战

    Text-CNN 1.文本分类 转眼学生生涯就结束了,在家待就业期间正好有一段空闲期,可以对曾经感兴趣的一些知识点进行总结. 本文介绍NLP中文本分类任务中核心流程进行了系统的介绍,文末给出一个基于T ...

  9. 使用libsvm实现文本分类

    @Hcy(黄灿奕) 文本分类,首先它是分类问题,应该对应着分类过程的两个重要的步骤,一个是使用训练数据集训练分类器,另一个就是使用测试数据集来评价分类器的分类精度.然而,作为文本分类,它还具有文本这样 ...

随机推荐

  1. input file上传文件扩展名限制

    方法一(不推荐使用):用jS获获取扩展名进行验证: <script type="text/javascript" charset="utf-8"> ...

  2. Docker 安装及命令

    CentOS 安装 通过脚本安装:curl -sSL https://get.docker.com/ | sh通过yum安装:yum install docker-engine============ ...

  3. 如何正确做 Web端压力测试?

    ​    ​一个完整的压力测试需要关注三个方面:如何正确产生压力.如何定位瓶颈.如何预估系统的承载能力. ​    ​(1) 如何产生压力:产生压力的方法有很多,通常可以写脚本产生压力机器人对服务器进 ...

  4. SpringMVC访问静态资源

    SpringMVC访问静态资源 在SpringMVC中常用的就是Controller与View.但是我们常常会需要访问静态资源,如html,js,css,image等. 默认的访问的URL都会被Dis ...

  5. BeanFactory 和ApplicationContext(Bean工厂和应用上下文)

    Bean工厂(BeanFactory接口),提供了基础的依赖注入支持. 应用上下文(ApplicationContext接口),建立在Bean工厂基础之上,提供了系统架构服务. Application ...

  6. MRD

    搜索 复制

  7. (gridcontrol等)通用导出excel z

    关于DevExpress Winform 的所有可打印控件的导出excel 的通用方法,并且解决DevExpress控件自带的方法存在的缺陷问题 1.解决GridControl自带方法不能导出图片: ...

  8. python 简单爬虫diy

    简单爬虫直接diy, 复杂的用scrapy import urllib2 import re from bs4 import BeautifulSoap req = urllib2.Request(u ...

  9. css学习笔记(6)

    +++++++++++++++++ CSS HACK+++++++++++++++++IE6.0 能识别 _background:#ff00ff; *background:#ff00ff; +back ...

  10. work flow