Apache Spark Naive Bayes基于文本分类

时间:2014-06-03 09:19:58

标签: apache-spark text-mining

我试图使用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执行此操作?

4 个答案:

答案 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)

希望这有帮助