首页 > 代码库 > 基于weka的文本分类实现
基于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 data17 loader.setFile(new File(trainSet));18 instances=loader.getStructure();19 // instances.setClassIndex(classIndex); // 指定分类属性索引20 instances.setClassIndex(instances.numAttributes()-1); //默认最后一个属性为分类属性21 22 // train NaiveBayes :incremental classifier23 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 classifier31 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 data17 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 classifier24 tree=new J48();25 tree.buildClassifier(instances);26 27 //evaluate classifier28 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 attribute10 Instances unlabeled=new Instances(new FileReader(dataSet));11 unlabeled.setClassIndex(unlabeled.numAttributes()-1);12 // create copy13 Instances labeled = new Instances(unlabeled);14 // label instances15 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 data20 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的文本分类实现