【问题标题】:Naive Bayes Text Classification Algorithm朴素贝叶斯文本分类算法
【发布时间】:2015-03-06 17:56:51
【问题描述】:

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


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

    Doc  Words   Category

意味着我预先知道每个训练(字符串)的训练词和类别。部分数据集如下:

             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 中实现朴素贝叶斯文本分类算法。

算法应该遵循下面提到的例子hereTable 13.1

来源:Read here


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

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

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

我会感谢你的帮助。 在此先感谢

【问题讨论】:

  • 你在哪里工作?
  • 要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题不属于 Stack Overflow 的主题。

标签: java mysql algorithm text dataset


【解决方案1】:

请查看Bow toolkit

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

根据朴素贝叶斯、TFIDF 和其他几种方法设置词向量权重。

执行测试/训练拆分和自动分类测试。

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

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

【讨论】:

  • 你说,“...或者有人可以给我一些好主意,如何轻松地做到这一点......可以帮助我的好东西。”这两个链接都会给你一个想法,很好,可以帮助你。从 C 或 Perl 移植到 Java 需要一些注意力,但并不难。
【解决方案2】:

您好,我认为 Spark 对您有很大帮助: http://spark.apache.org/docs/1.2.0/mllib-naive-bayes.html 您甚至可以选择您认为最适合您需求的语言 Java / Python / Scala!

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      请使用 python 中的 scipy。已经有你需要的实现:

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

      scipy

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          根据您的要求,您可以使用来自 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。 我会建议你坚持这一点。在选择这个易于使用的库之前,我也已经寻找了多种选择,它无缝支持与其他一些技术的互操作。我会在此处发布完整的代码以完全适合您的答案。但我认为你很好。

          【讨论】:

          • 试过了,得到了相同的答案,但我无法找到可行的解决方案(示例代码文档)开始它,就像训练变量类型应该是什么一样!等等,如果你知道更好的帖子,谢谢
          • 您是否使用 Spark SQL 来包含您的训练数据?由于您在问题中提到培训和测试来自 MySQL,其中包含多个字符串和类别。所以我不明白为什么你发现很难直接在 SQL 本身中实现训练集。我能具体知道你到底在哪里面临问题吗?否则我会为你发布整个代码块。但实际上使用这种方法是完全可行的,只需稍微探索一下,它就在 mllib 和 Spark SQL 文档中。谢谢!
          • 事情是我已经尝试过但我无法通过它我必须使用java并且我无法确定如何开始工作你能指定顺序中的步骤吗!跨度>
          • 现在你已经够清楚了。如果您正在实施这样的事情并且没有任何经验,这可能会有点棘手。让我在这里向您发布解决方案。但是你能否更清楚/更广泛地澄清你的问题,以便我知道我正在追逐正确的鸟。
          • 如果你有解决方案请分享一下
          【解决方案7】:

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

          以下是在您的代码中加入分类器的文档链接: https://weka.wikispaces.com/Use+WEKA+in+your+Java+code

          【讨论】:

            【解决方案8】:

            如果你想在 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);
                }
            

            【讨论】:

              【解决方案9】:

              您可以查看Blayze - 这是一个用 Kotlin 编写的用于 JVM 的非常小的朴素贝叶斯库。应该很容易理解。

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

              【讨论】:

                猜你喜欢
                • 2016-08-02
                • 2018-07-29
                • 2014-09-18
                • 2013-12-24
                • 2015-08-27
                • 2012-07-02
                • 2017-01-10
                • 2014-04-14
                相关资源
                最近更新 更多