• 基于weka的文本分类实现


    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

  • 相关阅读:
    ajax 重复提交
    函数中对象名的传参形式
    传参格式
    字体和排版
    自学设计
    假如java类里的成员变量是自身的对象
    java中的锁之AbstractQueuedSynchronizer源码分析(一)
    java中的锁之Lock接口与Condition接口
    Comparator与Comparable用法与区别
    session与cokkie区别
  • 原文地址:https://www.cnblogs.com/java-wgm/p/4168060.html
Copyright © 2020-2023  润新知