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

Java语言在文本挖掘中实现机器学习方法,java,machine-learning,weka,text-mining,sentiment-analysis,Java,Machine Learning,Weka,Text Mining,Sentiment Analysis,我有一些文本,我想通过使用Weka库在Java中实现机器学习方法来挖掘这些文本。为此,我已经做了一些工作,但由于整个代码太长,我只想展示一些关键方法,了解如何训练和测试我的数据集,以及解释结果等 仅供参考,我正在使用Twitter4J处理推文 首先,我获取推文并保存在文本文件中(当然是ARFF格式)。然后我就他们的情绪(积极、中立、消极)手动给他们贴上标签。基于所选分类器,我通过交叉验证从训练集创建了测试集。最后,我对它们进行了分类,并打印了摘要和混淆矩阵 以下是我的分类器之一:朴素贝叶斯代码:

我有一些文本,我想通过使用Weka库在Java中实现机器学习方法来挖掘这些文本。为此,我已经做了一些工作,但由于整个代码太长,我只想展示一些关键方法,了解如何训练和测试我的数据集,以及解释结果等

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

首先,我获取推文并保存在文本文件中(当然是ARFF格式)。然后我就他们的情绪(积极、中立、消极)手动给他们贴上标签。基于所选分类器,我通过交叉验证从训练集创建了测试集。最后,我对它们进行了分类,并打印了摘要和混淆矩阵

以下是我的分类器之一:朴素贝叶斯代码:

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();
        }
    }
}
那么,我如何解释结果呢?你认为我在训练和测试方面做得对吗? 我想获得给定文本文件的情感百分比(积极、中立、消极)。如何从这些结果推断我的需求?
谢谢你的阅读

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

在这里,我们无法判断这在您的案例中是否有意义。可能不会。(您没有向我们显示任何数据)

因此,您执行的朴素贝叶斯分类只有在最后一列已经包含一个情感分类器时才有用,该分类器的值为正值、中性值和负值,这些值是在前一个预处理步骤中由一些无监督的学习方法创建的。Weka的分类算法不能为您推断出这一点

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


顺便说一下,您只有11个实例。您为什么不自己对它们进行分类呢?

不幸的是,您的代码有点混乱

首先,您需要对您的模特进行全套训练:

classifier.buildClassifier(dataFiltered);
然后在for循环中重新训练模型:

for (int i = 0; i < trainingSets.length; i++) {
    classifier.buildClassifier(trainingSets[i]);
    ...
 }
for(int i=0;i
比你计算的混乱mtx太多。我认为这是没有必要的

我认为您需要应用
Evaluation.crossValidateModel()
方法,如下所示:

//设置类索引
dataFiltered.setClassIndex(dataFiltered.numAttributes()-1);
//构建一个模型——根据需要选择一个分类器
buildClassifier(数据过滤);
评估评估=新评估(数据过滤);
评估交叉验证模型(分类器,数据过滤,10,新随机(1));
//打印统计数据——不需要计算混乱mtx,weka就可以了!
系统输出打印LN(分类器);
System.out.println(eval.toSummaryString());
System.out.println(eval.tomatricxstring());
System.out.println(eval.toClassDetailsString());

那么,我该如何推断这个结果呢?我的数据包括推文(字符串)和手写的情绪。我有100-200条tweet,在这个例子中,我使用了10条交叉验证,这就是为什么它显示了11条实例。它可以改变。它很复杂,推特也很混乱。我想查找一些东西,但找不到我正在查找的链接-也许相反,这有助于感谢代码,我很容易获得类详细信息和类混淆矩阵。然而,我想问,我是否做得对?因为在一开始,我手工将数据集标记为正、负或中性。最后,我想通过图形展示Swing中每个分类器(其他的是KNN和C4.5)的准确度。这取决于您想要什么你的目标是什么?如果您想训练一个ML模型,您需要一个手动标记的数据库。正如你上面提到的,你做到了,但我认为有很多标记的twitter数据库可用,所以我认为这是不必要的。另一方面,要训练ML模型,需要一个更大的数据集。明白了:)另一方面,从结果a b c中,我还想知道您发布的代码是否会自动分离训练集和测试集,并在此之后进行分类?如果是,如何进行?它分为哪一部分?如果你能回答我,我很感激:)是的,它分为测试组和火车组。您可以查看该方法的源代码,并检查它是如何工作的。;)这和你的方法很相似。
classifier.buildClassifier(dataFiltered);
for (int i = 0; i < trainingSets.length; i++) {
    classifier.buildClassifier(trainingSets[i]);
    ...
 }