我试图使用Apache Spark进行文档分类。
例如,我有两种类型的Class(C和J)
列车数据是:
C, Chinese Beijing Chinese
C, Chinese Chinese Shanghai
C, Chinese Macao
J, Tokyo Japan Chinese
测试数据是: Chinese Chinese Chinese Tokyo Tokyo //什么是J或C?
我如何训练和预测上述数据。我使用Apache Mahout进行了Naive Bayes文本分类,但没有使用Apache Spark。
如何使用Apache Spark执行此操作?
答案 0 :(得分:4)
是的,看起来在Spark中没有任何简单的工具可以做到这一点。但您可以通过首先创建术语词典来手动完成。然后计算每个术语的IDF,然后使用TF-IDF分数将每个文档转换为矢量。
http://chimpler.wordpress.com/2014/06/11/classifiying-documents-using-naive-bayes-on-apache-spark-mllib/上有一篇帖子解释了如何做到这一点(也有一些代码)。
答案 1 :(得分:3)
Spark可以非常简单的方式完成此任务。关键步骤是:1使用HashingTF获取项目频率。 2将数据转换为所需的bayes模型的形式。
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))
}
答案 2 :(得分:1)
你可以使用mlib的朴素贝叶斯分类器。链接中给出了一个示例。 http://spark.apache.org/docs/latest/mllib-naive-bayes.html
答案 3 :(得分:1)
有许多分类方法(逻辑回归,SVM,神经网络,LDA,QDA ......),你可以实现你的或使用MLlib分类方法(实际上,在MLlib中实现了逻辑回归和SVM)
您需要做的是将您的功能转换为矢量,并将标签转换为双倍。
例如,您的数据集将如下所示:
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)
希望这有帮助