2

我寫了這樣的代碼:生成關鍵字和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) 

如何從「速度」 RDD每個articlesList項目獲得前5名的關鍵字?

地址:

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) 
}