基於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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM