Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 基于apachespark朴素贝叶斯的文本分类_Apache Spark_Text Mining - Fatal编程技术网

Apache spark 基于apachespark朴素贝叶斯的文本分类

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实现这一点?

我正在尝试使用ApacheSpark进行文档分类

例如,我有两种类型的类(C和J)

列车数据为:

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)并将其用于预测。