首页 文章

Java - 在文本挖掘中实现机器学习方法

提问于
浏览
4

我有一些文本,我想通过使用Weka库在Java中实现 Machine Learning 方法来挖掘它们 . 为此目的,我已经做了一些事情,但由于整个代码太长,我只想展示一些关键方法,并了解如何训练和测试我的数据集,并解释结果等 .

仅供参考,我正在使用Twitter4J处理推文 .

首先,我获取了推文并保存在文本文件中(当然是ARFF格式) . 然后我手动标记他们的情绪(积极,中立,消极) . 基于选定的分类器,我通过 cross-validation 从我的训练集创建了测试集 . 最后,我将它们分类并打印摘要和混淆矩阵 .

这是我的一个分类器:朴素贝叶斯代码:

public static void ApplyNaiveBayes(Instances data) throws Exception {

    System.out.println("Applying Naive Bayes \n");
    data.setClassIndex(data.numAttributes() - 1); 
    StringToWordVector swv = new StringToWordVector();
    swv.setInputFormat(data);
    Instances dataFiltered = Filter.useFilter(data, swv);
    //System.out.println("Filtered data " +dataFiltered.toString());

    System.out.println("\n\nFiltered data:\n\n" + dataFiltered);

    Instances[][] split = crossValidationSplit(dataFiltered, 10);
    Instances[] trainingSets = split[0];
    Instances[] testingSets = split[1];


    NaiveBayes classifier = new NaiveBayes(); 

    FastVector predictions = new FastVector();


    classifier.buildClassifier(dataFiltered);
    System.out.println("\n\nClassifier model:\n\n" + classifier);     

    // Test the model
    for (int i = 0; i < trainingSets.length; i++) {
        classifier.buildClassifier(trainingSets[i]);
        // Test the model         
        Evaluation eTest = new Evaluation(trainingSets[i]);
        eTest.evaluateModel(classifier, testingSets[i]);

        // Print the result to the Weka explorer:
        String strSummary = eTest.toSummaryString();
        System.out.println(strSummary);

        // Get the confusion matrix
        double[][] cmMatrix = eTest.confusionMatrix();
        for(int row_i=0; row_i<cmMatrix.length; row_i++){
            for(int col_i=0; col_i<cmMatrix.length; col_i++){
                System.out.print(cmMatrix[row_i][col_i]);
                System.out.print("|");
            }
            System.out.println();
        }
    }
}

而且,仅供参考,crossValidationSplit方法在这里:

public static Instances[][] crossValidationSplit(Instances data, int     
    numberOfFolds) {
        Instances[][] split = new Instances[2][numberOfFolds];

        for (int i = 0; i < numberOfFolds; i++) {
            split[0][i] = data.trainCV(numberOfFolds, i);
            split[1][i] = data.testCV(numberOfFolds, i);
        }

        return split;
    }

最后,我得到了10个不同的结果(因为k = 10) . 其中之一是:

Correctly Classified Instances           4               36.3636 %
  Incorrectly Classified Instances         7               63.6364 %
  Kappa statistic                          0.0723
  Mean absolute error                      0.427 
  Root mean squared error                  0.5922
  Relative absolute error                 93.4946 %
  Root relative squared error            116.5458 %
  Total Number of Instances               11     

  2.0|0.0|1.0|
  1.0|1.0|2.0|
  3.0|0.0|1.0|

那么,我怎么能解释结果呢?你认为我在培训和测试集方面做得对吗?我想获得给定文本文件的情绪百分比(正面,中立,负面) . 如何根据这些结果推断出我的需求?谢谢阅读...

2 回答

  • 1

    不幸的是你的代码有点困惑 .

    首先,您在整套装备上训练模型:

    classifier.buildClassifier(dataFiltered);
    

    然后你在for循环中重新训练你的模型:

    for (int i = 0; i < trainingSets.length; i++) {
        classifier.buildClassifier(trainingSets[i]);
        ...
     }
    

    比你计算混乱mtx还要多 . 我觉得没必要 .

    在我看来,你需要应用 Evaluation.crossValidateModel() 方法如下: //set the class index dataFiltered.setClassIndex(dataFiltered.numAttributes() - 1); //build a model -- choose a classifier as you want classifier.buildClassifier(dataFiltered); Evaluation eval = new Evaluation(dataFiltered); eval.crossValidateModel(classifier, dataFiltered, 10, new Random(1)); //print stats -- do not require to calculate confusion mtx, weka do it! System.out.println(classifier); System.out.println(eval.toSummaryString()); System.out.println(eval.toMatrixString()); System.out.println(eval.toClassDetailsString());

  • 3

    你做了一些分类 . 默认情况下,Weka始终从训练数据集中获取最后一列/属性,并尝试从所有其他属性中预测其值 . (除非你告诉它使用另一个) .

    在这里,我们无法判断这是否对您的案件有意义 . 可能不是 . (您没有向我们展示任何数据) .

    因此,您执行的Naive-Bayes分类仅在最后一列已包含情绪分类器时才有用,该分类器的值为正,中性,负值,由先前预处理步骤中的某些无监督学习方法创建 . Weka的分类算法不会为您推断出这一点 .

    现在你所做的结果与情绪分析无关 . 我也不能为你做这件事 .

    顺便说一下,你只有11个实例 . 你为什么不自己归类?

相关问题