主體分析模型主要有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("。。。。。。。。。 我很高興啊 。。。。。。。。。")
}
}
執行結果: