Классификация с помощью Spark MLlib в Java

Я пытаюсь создать систему классификации с помощью Apache Spark MLlib. Для этого я включил алгоритм Naive Bayes в шорт-лист и буду использовать Java 8 для поддержки лямбда-выражений. Я новичок в лямбда-выражениях и, следовательно, сталкиваюсь с трудностями при реализации того же на 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

Может ли кто-нибудь указать мне правильное направление о том, как создавать векторы TfIdf для образцов текстовых документов при использовании операций RDD Sparks для распределенной обработки?


person jatinpreet    schedule 02.09.2014    source источник


Ответы (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 делает то же самое и гораздо менее запутанно

person samthebest    schedule 03.09.2014
comment
Большое спасибо samthebest! Это очень помогло. Я пытаюсь преобразовать это в Java и дам вам знать, как это происходит. - person jatinpreet; 03.09.2014