2014-09-02 65 views
1

我想用Apache Spark的MLlib建立一个分类系统。我有入围的朴素贝叶斯算法来做到这一点,并将使用Java 8来支持Lambda表达式。在lambda表达式方面,我是一个新手,因此在Java中实现它们时遇到困难。Java中Spark MLlib的分类

我指的是下面的链接,其具有用Scala编写的样本,但我有一个很难将其转换成Java 8

http://chimpler.wordpress.com/2014/06/11/classifiying-documents-using-naive-bayes-on-apache-spark-mllib/

我被困在下面的操作,不能让我周围的头,由于我不熟悉斯卡拉,

val idfs = (termDocsRdd.flatMap(termDoc => termDoc.terms.map((termDoc.doc, _))).distinct().groupBy(_._2) collect { 
    // if term is present in less than 3 documents then remove it 
    case (term, docs) if docs.size > 3 => 
    term -> (numDocs.toDouble/docs.size.toDouble) 
}).collect.toMap 

可有人请点我有关如何同时利用火花RDD操作的DIS建立TFIDF向量文本文档样本的正确方向贡献处理?

回答

2

好吧不好解释逐行,但它很容易查找Scala API文档中的每个方法。另外从长远来看,通过坚持使用Scala而不是使用超详细的Java,您将使您的生活变得更加轻松。

第一行可以写成

val idfs = (termDocsRdd.flatMap(termDoc => termDoc.terms.map(term => (termDoc.doc, term))) 

因此,它只是把每个文档的条款,串联它们放在一起,并添加termDoc.doc作为重点。

.distinct() 

^^明显

.groupBy(_._2) 

我们组的术语,所以现在每学期是一个键和值是文档的Seq

collect { 
    case (term, docs) if docs.size > 3 => 
term -> (numDocs.toDouble/docs.size.toDouble) 
}) 

collect是聪明的功能就像filter后面跟着一个map,我们先按模式过滤,所以... if docs.size > 3,然后映射到term -> (numDocs.toDouble/docs.size.toDouble)

所以我们现在有一个关键字和一个Double作为值。最后的最后一行刚刚转这个RDD到常规的Scala Map

.collect.toMap 

collect这里是一个愚蠢的名字,我想可能最终被弃用,toArray做同样的事情,远不如混乱

+0

谢谢很多samthebest!这有很大帮助。我试图将其转换成Java,并会让你知道它是如何发生的。 – jatinpreet 2014-09-03 08:02:49