2014-09-02 3 views
1

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

ответ

2

Хорошо объясните по строкам, но его довольно легко найти каждый метод в документах Scala API. Кроме того, в конечном итоге вы значительно облегчите свою жизнь, придерживаясь Scala, а не используя ультра verbose 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

спасибо lot samthebest! Это очень помогло. Я пытаюсь преобразовать это в Java и дам вам знать, как это происходит. – jatinpreet