2

Я написал такой код:Генерирование ключевых слов с помощью Apache Спарк и mllib

val hashingTF = new HashingTF() 

val tfv: RDD[Vector] = sparkContext.parallelize(articlesList.map { t => hashingTF.transform(t.words) }) 
tfv.cache() 

val idf = new IDF().fit(tfv) 
val rate: RDD[Vector] = idf.transform(tfv) 

Как получить топ-5 ключевых слов из «скорости» RDD для каждого элемента articlesList?

ADD:

articlesList содержит объекты:

case class ArticleInfo (val url: String, val author: String, val date: String, val keyWords: List[String], val words: List[String]) 

слов содержит все слова из статьи.

Я не понимаю структуру курса, в документации говорит:

@return an RDD of TF-IDF vectors 
+0

Я не думаю, что вы предоставили достаточно информации о том, что в articlesList, или что заканчивается темпом. Но, возможно, вам нужен rate.top (5) для подходящего заказа? –

+0

Если слова содержат только определенные термины, то частота вычисляемых членов всех членов будет одинаковой, так как каждый член встречается только один раз в списке разных членов. –

+0

Извините, все слова не отличаются. – BiTOk

ответ

2

Мое решение:

(articlesList, rate.collect()).zipped.foreach { (art,tfidf) => 
    val keywords = new mutable.TreeSet[(String, Double)] 
    art.words.foreach { word => 
     val wordHash = hashingTF.indexOf(word) 
     val wordTFIDF = tfidf.apply(wordHash) 

     if (keywords.size == KEYWORD_COUNT) { 
     val minimum = keywords.minBy(_._2) 
     if (minimum._2 < wordHash) { 
      keywords.remove(minimum) 
      keywords.add((word,wordTFIDF)) 
     } 
     } else { 
     keywords.add((word,wordTFIDF)) 
     } 
    } 

    art.keyWords = keywords.toList.map(_._1) 
} 
Смежные вопросы