【问题标题】:Generate keywords using Apache Spark and mllib使用 Apache Spark 和 mllib 生成关键字
【发布时间】:2015-03-02 02:03:12
【问题描述】:

我写了这样的代码:

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)

如何从每个文章列表项的“rate” RDD 中获取前 5 个关键字?

添加:

articlesList 包含对象:

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

words 包含文章中的所有单词。

我不明白 rate 的结构,在文档中说:

@return an RDD of TF-IDF vectors

【问题讨论】:

  • 我认为您没有提供足够的信息来说明articlesList 中的内容或最终的速率。但是您可能希望 rate.top(5) 进行一些合适的排序?
  • 如果词只包含不同的词条,那么计算出的所有词条的词频将是相同的,因为每个词条在不同的词条列表中只出现一次。
  • 抱歉,并不是所有的词都不同。

标签: scala apache-spark apache-spark-mllib tf-idf keyword-search


【解决方案1】:

我的解决办法是:

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

【讨论】:

    猜你喜欢
    • 2016-03-07
    • 2018-02-17
    • 2015-02-07
    • 1970-01-01
    • 2015-03-31
    • 2014-06-24
    • 2014-09-05
    • 2016-01-02
    • 1970-01-01
    相关资源
    最近更新 更多