Apache spark 基于apachespark朴素贝叶斯的文本分类
我正在尝试使用ApacheSpark进行文档分类 例如,我有两种类型的类(C和J) 列车数据为:Apache spark 基于apachespark朴素贝叶斯的文本分类,apache-spark,text-mining,Apache Spark,Text Mining,我正在尝试使用ApacheSpark进行文档分类 例如,我有两种类型的类(C和J) 列车数据为: C, Chinese Beijing Chinese C, Chinese Chinese Shanghai C, Chinese Macao J, Tokyo Japan Chinese 试验数据为: 中国东京日本//什么是J或C 我如何训练和预测上述数据。我使用ApacheMahout进行了朴素的Bayes文本分类,但是没有使用ApacheSpark 如何使用ApacheSpark实现这一点?
C, Chinese Beijing Chinese
C, Chinese Chinese Shanghai
C, Chinese Macao
J, Tokyo Japan Chinese
试验数据为:
中国东京日本//什么是J或C
我如何训练和预测上述数据。我使用ApacheMahout进行了朴素的Bayes文本分类,但是没有使用ApacheSpark
如何使用ApacheSpark实现这一点?您可以使用mlib的朴素贝叶斯分类器来实现这一点。链接中给出了一个示例。
是的,在Spark中似乎还没有任何简单的工具可以做到这一点。但是您可以通过首先创建术语词典来手动完成。然后计算每个术语的IDF,然后使用TF-IDF分数将每个文档转换为向量
上有一篇文章解释了如何做(还有一些代码)。有很多分类方法(逻辑回归、支持向量机、神经网络、LDA、QDA…),您可以实现您的分类方法,也可以使用MLlib分类方法(实际上,在MLlib中实现了逻辑回归和支持向量机) 您需要做的是将要素转换为向量,并将标签加倍 例如,您的数据集如下所示:
1, (2,1,0,0,0,0)
1, (2,0,1,0,0,0)
0, (1,0,0,1,0,0)
0, (1,0,0,0,1,1)
和巡回测试向量:
(3,0,0,0,1,1)
希望这有帮助Spark可以用非常简单的方式完成这项工作。关键步骤是:1使用HashingTF获取项目频率。2将数据转换为所需的贝叶斯模型形式
def testBayesClassifier(hiveCnt:SQLContext){
val trainData = hiveCnt.createDataFrame(Seq((0,"aa bb aa cc"),(1,"aa dd ee"))).toDF("category","text")
val tokenizer = new Tokenizer().setInputCol("text").setOutputCol("words")
val wordsData = tokenizer.transform(trainData)
val hashTF = new HashingTF().setInputCol("words").setOutputCol("features").setNumFeatures(20)
val featureData = hashTF.transform(wordsData) //key step 1
val trainDataRdd = featureData.select("category","features").map {
case Row(label: Int, features: Vector) => //key step 2
LabeledPoint(label.toDouble, Vectors.dense(features.toArray))
}
//train the model
val model = NaiveBayes.train(trainDataRdd, lambda = 1.0, modelType = "multinomial")
//same for the test data
val testData = hiveCnt.createDataFrame(Seq((-1,"aa bb"),(-1,"cc ee ff"))).toDF("category","text")
val testWordData = tokenizer.transform(testData)
val testFeatureData = hashTF.transform(testWordData)
val testDataRdd = testFeatureData.select("category","features").map {
case Row(label: Int, features: Vector) =>
LabeledPoint(label.toDouble, Vectors.dense(features.toArray))
}
val testpredictionAndLabel = testDataRdd.map(p => (model.predict(p.features), p.label))
}您在spark中检查过ML lib吗?我想它已经支持NaiveBayes了。我已经检查过了,但是我做不到。注释//训练集是什么?它是如何计算的?只有评论。如何将文本数据转换为稀疏格式以用于训练和测试数据?谢谢,我是按自己的方式完成的。我用Spark做了NaiveBayes,这个应用怎么能用SVM呢?您可以使用Spark MLlib库如何在Spark中将数据转换为svm格式?我知道Spark支持它。这里的结帐示例非常好…上面的代码对我们帮助很大!!!我在上面的代码中有一个查询。测试集中标签的用途是什么?如果您有正确的标签,您可以使用它们来获得分类结果的准确率。如果您没有正确的标签,您可以在此处输入任何数字。模型需要这种格式的输入数据。谢谢你的好例子。运行测试后,我可以比较标签和预测值。如果我想根据测试数据中的“文本”来验证预测值,那么在测试中也需要“文本”列。如何实现这一点?我们能否避免创建测试数据的标记点。例如,我可以直接构建Vectors.dense(features.toArray)并将其用于预测。