我的数据集具有以下类型的数据:
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中编写这个算法,并且可以使我的数据集可以处理结果,或者有人可以给我任何好的想法轻松地做到这一点......可以帮助我的好事。
我将感谢你的帮助。 提前致谢
答案 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)¶
答案 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的作者之一