【问题标题】:Classification with Spark MLlib in Java在 Java 中使用 Spark MLlib 进行分类
【发布时间】:2014-10-27 00:07:32
【问题描述】:

我正在尝试使用 Apache Spark 的 MLlib 构建分类系统。我已经将朴素贝叶斯算法列入候选名单,并将使用 Java 8 来支持 Lambda 表达式。我是 lambda 表达式的新手,因此在 Java 中实现同样的表达式时遇到困难。

我指的是以下链接,其中包含用 Scala 编写的示例,但很难将其转换为 Java 8。

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

由于我不熟悉 Scala,我被困在下面的操作中,无法理解它,

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

在利用 Sparks RDD 操作进行分布式处理的同时,有人可以为我指出如何为文本文档样本构建 TfIdf 向量的正确方向吗?

【问题讨论】:

    标签: apache-spark java-8 apache-spark-mllib tf-idf


    【解决方案1】:

    好吧,我逐行解释,但是在 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 做同样的事情并且更容易混淆

    【讨论】:

    • 非常感谢 samthebest!这有很大帮助。我正在尝试将其转换为 Java,并会告诉你它是如何进行的。
    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 2017-11-15
    • 2017-03-07
    • 2016-04-22
    • 2018-02-17
    • 2017-10-11
    • 2017-03-24
    • 2017-03-30
    相关资源
    最近更新 更多