朴素贝叶斯文本分类算法

时间:2015-01-08 15:05:30

标签: java mysql algorithm text dataset

谢谢那里!我只需要帮助在Java中实现朴素贝叶斯文本分类算法来测试我的数据集用于研究目的。在Java中实现算法是必须的;而是使用Weka或Rapid Miner工具来获得结果!


我的数据集具有以下类型的数据:

    Doc  Words   Category

意味着我预先知道每次训练(String)的训练单词和类别。下面给出了一些数据集:

             Doc      Words                                                              Category        
    Training
               1      Integration Communities Process Oriented Structures...(more string)       A
               2      Integration Communities Process Oriented Structures...(more string)       A
               3      Theory Upper Bound Routing Estimate global routing...(more string)        B
               4      Hardware Design Functional Programming Perfect Match...(more string)      C
               .
               .
               .
    Test
               5      Methodology Toolkit Integrate Technological  Organisational
               6      This test contain string naive bayes test text text test

所以数据集来自MySQL数据库,它可能包含多个训练字符串和测试字符串!问题是我只需要用Java实现朴素贝叶斯文本分类算法。

该算法应遵循以下提及的示例here 表13.1

来源:Read here


问题是我可以自己在Java代码中实现该算法,但我只需要知道是否有可能存在某种带有源代码文档的Java库,以便我只测试结果。

问题是我只需要一次结果只意味着它只是对结果的测试。

所以,有人可以告诉我任何一个好的java库,它可以帮助我在Java中编写这个算法,并且可以使我的数据集可以处理结果,或者有人可以给我任何好的想法轻松地做到这一点......可以帮助我的好事。

我将感谢你的帮助。 提前致谢

9 个答案:

答案 0 :(得分:2)

根据您的要求,您可以使用apache中的机器学习库MLlib。 MLlib是Spark的可扩展机器学习库,由通用学习算法和实用程序组成。还有一个java代码模板来实现利用该库的算法。首先,你可以:

site提供的朴素贝叶斯实施java骨架,如下所示。

import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.mllib.classification.NaiveBayes;
import org.apache.spark.mllib.classification.NaiveBayesModel;
import org.apache.spark.mllib.regression.LabeledPoint;
import scala.Tuple2;

JavaRDD<LabeledPoint> training = ... // training set
JavaRDD<LabeledPoint> test = ... // test set

final NaiveBayesModel model = NaiveBayes.train(training.rdd(), 1.0);

JavaPairRDD<Double, Double> predictionAndLabel = 
  test.mapToPair(new PairFunction<LabeledPoint, Double, Double>() {
    @Override public Tuple2<Double, Double> call(LabeledPoint p) {
      return new Tuple2<Double, Double>(model.predict(p.features()), p.label());
    }
  });
double accuracy = predictionAndLabel.filter(new Function<Tuple2<Double, Double>, Boolean>() {
    @Override public Boolean call(Tuple2<Double, Double> pl) {
      return pl._1().equals(pl._2());
    }
  }).count() / (double) test.count();

为了测试您的数据集,此处没有最佳解决方案,而是使用Spark SQL。 MLlib非常适合Spark的API。要开始使用它,我建议您首先浏览MLlib API,根据您的需要实现算法。使用该库非常容易。 有关允许处理数据集的下一步,请使用Spark SQL。 我会建议你坚持这个。在确定这个易于使用的库之前,我也已经找到了多个选项,并且它与其他一些技术的互操作无缝支持。我会在这里发布完整的代码,以完全符合您的答案。但我觉得你很高兴。

答案 1 :(得分:1)

如果您不想使用GUI,可以使用Weka Java API并将其包含在项目中。

这是指向您的代码中合并分类器的文档的链接: https://weka.wikispaces.com/Use+WEKA+in+your+Java+code

答案 2 :(得分:0)

请查看Bow toolkit

它有一个Gnu许可证和源代码。它的一些代码包括

  

根据Naive Bayes,TFIDF和其他几种方法设置单词矢量权重。

     

执行测试/火车拆分和自动分类测试。

它不是Java库,但您可以编译C代码以确保Java对于给定的语料库具有类似的结果。

我还发现了一个在Perl中实现的体面Dr. Dobbs article。再一次,不是所需的Java,而是为您提供您要求的一次性结果。

答案 3 :(得分:0)

嗨,我认为Spark会帮助你很多: http://spark.apache.org/docs/1.2.0/mllib-naive-bayes.html 你甚至可以选择你认为最适合你需要的语言Java / Python / Scala!

答案 4 :(得分:0)

答案 5 :(得分:0)

请使用python中的scipy。已经实现了您的需求:

class sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)¶

scipy

答案 6 :(得分:0)

您可以使用像KNIME这样的算法平台,它有各种分类算法(包括Naive bayed)。您可以使用GUI或Java API运行它。

答案 7 :(得分:0)

如果要在Java中实现朴素贝叶斯文本分类算法,那么WEKA Java API将是更好的解决方案。数据集必须采用.arff格式。从mySql数据库创建.arff文件非常简单。以下是分类器的java代码附件,示例.arff文件的链接。

创建一个新的文本文档。用记事本打开它。复制并粘贴链接下方的所有文本。将其另存为DataSet.arff。 http://storm.cis.fordham.edu/~gweiss/data-mining/weka-data/weather.arff

下载Weka Java API:http://www.java2s.com/Code/Jar/w/weka.htm

分类器的代码:

public static void main(String[] args) {

    try {
        StringBuilder txtAreaShow = new StringBuilder();

        //reads the arff file
        BufferedReader breader = null;
        breader = new BufferedReader(new FileReader("DataSet.arff"));

        //if 40 attributes availabe then  39 will be the class index/attribuites(yes/no)
        Instances train = new Instances(breader);
        train.setClassIndex(train.numAttributes() - 1);
        breader.close();

        //
        NaiveBayes nB = new NaiveBayes();
        nB.buildClassifier(train);

        Evaluation eval = new Evaluation(train);
        eval.crossValidateModel(nB, train, 10, new Random(1));

        System.out.println("Run Information\n=====================");
        System.out.println("Scheme: " + train.getClass().getName());
        System.out.println("Relation: ");

        System.out.println("\nClassifier Model(full training set)\n===============================");
        System.out.println(nB);

        System.out.println(eval.toSummaryString("\nSummary Results\n==================", true));
        System.out.println(eval.toClassDetailsString());
        System.out.println(eval.toMatrixString());


        //txtArea output 
        txtAreaShow.append("\n\n\n");
        txtAreaShow.append("Run Information\n===================\n");
        txtAreaShow.append("Scheme: " + train.getClass().getName());

        txtAreaShow.append("\n\nClassifier Model(full training set)"
                + "\n======================================\n");
        txtAreaShow.append("" + nB);

        txtAreaShow.append(eval.toSummaryString("\n\nSummary Results\n==================\n", true));
        txtAreaShow.append(eval.toClassDetailsString());
        txtAreaShow.append(eval.toMatrixString());
        txtAreaShow.append("\n\n\n");

        System.out.println(txtAreaShow.toString());

    } catch (FileNotFoundException ex) {
        System.err.println("File not found");
        System.exit(1);
    } catch (IOException ex) {
        System.err.println("Invalid input or output.");
        System.exit(1);
    } catch (Exception ex) {
        System.err.println("Exception occured!");
        System.exit(1);
    }

答案 8 :(得分:0)

你可以看一下Blayze - 它是用Kotlin编写的JVM的极小Naive Bayes库。应该很容易理解。

完全披露:我是Blayze的作者之一