主題分析模型LDA的spark實現

主體分析模型主要有PLSA(Probabilistic Latent Semantic Anlysis,概率引語義分析)和LDA(Latent Dirichlet Allocation,隱含狄利克雷分佈),在此暫時介紹LDA的spark實現。

    * 主題分析模型自動分析每個文檔,統計文檔內的詞語,根據統計的信息來判斷當前文檔含有
    * 哪些主題,以及每個主題所佔的比例格式多少。
    * 可將LDA的主題分析結果進一步用在數據挖掘任務中的,其任務大概有:
    * 1、主題推斷。給定一篇新的文檔x,利用已有的主題模型訓練的結果,計算出文檔x所包含的主題,
    * 以及各個主題的比重。
    * 2、文檔聚類。主題可看作是聚類中心,而文檔可看作是多個聚類中心相關聯的數據樣本,
    * 利用主題模型做文檔聚類,可用於重新組織文檔數據集。
    * 3、特徵選擇。由於主題模型可推斷出每個文檔在不同主題上的分佈,因此這個分佈可看作文檔的一個新特徵,
    * 該特徵可用於其他的機器學習模型中。
    * 4、降維。主題模型得到的主題分佈特徵,可看作將原來的高緯度文檔向量投影到低緯度主題空間中。

import org.apache.spark.ml.clustering.{LDA, LDAModel}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.ml.feature.{CountVectorizer, CountVectorizerModel, HashingTF, Tokenizer}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, SQLContext}

/**
  * author: [email protected]  朱海川
  * date_time: 2017/10/13 14:31
  * illustration: 
  */
class LDAThemeAnalysis {

  private def data(sparkContext: SparkContext): DataFrame ={

    val sqlContext = new SQLContext(sparkContext)
    import sqlContext.implicits._
    val data = sparkContext.parallelize(Seq(
      (1,Array("祖國","萬歲")),
      (2,Array("中華人民共和國","雄起")),
      (3,Array("萬歲","中國")),
      (4,Array("祖國","雄起")),
      (5,Array("中華","雄起")),
      (6,Array("雄起")))).map{x =>
      (x._1,x._2)
    }.toDF("id","context")
    data
  }

  private def valueCompute(dataFrame: DataFrame): Unit ={

    val cv = new CountVectorizer()
      .setInputCol("context").setOutputCol("features")
    val cvmodel: CountVectorizerModel = cv.fit(dataFrame)
    val cvResult: DataFrame = cvmodel.transform(dataFrame)
    /**獲得轉成向量時詞表*/
    val vocabulary = cvmodel.vocabulary

    /**setK:主題(聚類中心)個數
      * setMaxIter:最大迭代次數
      * setOptimizer:優化計算方法,支持”em“和”online“
      * setDocConcentration:文檔-主題分佈的堆成先驗Dirichlet參數,值越大,分佈越平滑,值>1.0
      * setTopicConcentration:文檔-詞語分佈的先驗Dirichlet參數,值越大,分佈越平滑,值>1.0
      *setCheckpointInterval:checkpoint的檢查間隔
      * */
    val lda = new LDA()
      .setK(3)
      .setMaxIter(20)
        .setOptimizer("em")
      .setDocConcentration(2.2)
      .setTopicConcentration(1.5)

    val ldamodel: LDAModel = lda.fit(cvResult)
    /**可能度*/
    ldamodel.logLikelihood(cvResult)
    /**困惑度,困惑度越小,模型訓練越好*/
    ldamodel.logPerplexity(cvResult)

    val ladmodel: DataFrame = ldamodel.transform(cvResult)
    ladmodel.foreach(println)

  }

}

object LDAThemeAnalysis {
  def main(args: Array[String]): Unit = {

    val sparkConf = new SparkConf().setAppName("lda theme analysis")
    val sparkContext = SparkContext.getOrCreate(sparkConf)

    val lDAThemeAnalysis = new LDAThemeAnalysis
    val dataFrame = lDAThemeAnalysis.data(sparkContext)
    lDAThemeAnalysis.valueCompute(dataFrame)
    println("。。。。。。。。。 我很高興啊 。。。。。。。。。")
  }
}

執行結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章