潛在的Dirichlet分配(LDA),是專為文本文檔設計的主題模型。
術語說明:
- “word”=“term”:詞匯表的元素。
- “token”:出現在文檔中的term的實例。
- “topic”:主題,表示某種概念的詞的多項分布。
- “document”: 文檔,一段文本。
參考文獻:原始LDA論文 (journal version): Blei, Ng, and Jordan. “Latent Dirichlet Allocation.” JMLR, 2003。
pyspark LDA
要在pyspark中應用LDA主題模型(spark python版LDA),可以使用pyspark.mllib.clustering.LDA
類的方法train
, 該方法的聲明如下:
train(rdd, k=10, maxIterations=20, docConcentration=-1.0, topicConcentration=-1.0, seed=None, checkpointInterval=10, optimizer='em')
LDA.train方法的參數說明
- rdd – 文檔的RDD,它們是文檔ID和單詞(word)計數向量的元組。單詞計數向量是具有固定大小詞匯(其中詞匯大小是向量的長度)的“詞袋”。文檔ID必須是唯一的並且 >= 0。
- k – 推斷的主題數量,即軟聚類中心數。 (默認值:10)
- maxIterations – 允許的最大迭代次數。 (默認值:20)
- docConcentration – 文檔集中度參數(通常稱為“alpha”),用於文檔在主題上分布(“theta”)的先驗。 (默認值:-1.0)
- topicConcentration – 主題集中度參數(通常稱為“beta”或“eta”),用於主題在單詞分布上的先驗。 (默認值:-1.0)
- seed – 用於聚類初始化的隨機種子。根據係統時間設置為無生成種子。 (默認值:無)
- checkpointInterval – 檢查點之間的周期(迭代)。 (默認值:10)
- optimizer – 用於執行實際計算的LDAOptimizer。目前支持“em”,“online”。 (默認:“em”)
LDA建模示例
訓練LDA模型並輸出模型內容
>>> from pyspark.mllib.linalg import Vectors
>>> from numpy.testing import assert_almost_equal, assert_equal
>>> data = [
... [1, Vectors.dense([0.0, 1.0])],
... [2, SparseVector(2, {0: 1.0})],
... ]
>>> rdd = sc.parallelize(data)
>>> model = LDA.train(rdd, k=2, seed=1)
>>> model.vocabSize()
2
>>> model.describeTopics()
[([1, 0], [0.5..., 0.49...]), ([0, 1], [0.5..., 0.49...])]
>>> model.describeTopics(1)
[([1], [0.5...]), ([0], [0.5...])]
LDA模型效果驗證
>>> topics = model.topicsMatrix()
>>> topics_expect = array([[0.5, 0.5], [0.5, 0.5]])
>>> assert_almost_equal(topics, topics_expect, 1)
LDA模型文件的保存和讀取
>>> import os, tempfile
>>> from shutil import rmtree
>>> path = tempfile.mkdtemp()
### 保存LDA模型
>>> model.save(sc, path)
#### 加載LDA模型
>>> sameModel = LDAModel.load(sc, path)
>>> assert_equal(sameModel.topicsMatrix(), model.topicsMatrix())
>>> sameModel.vocabSize() == model.vocabSize()
True
>>> try:
... rmtree(path)
... except OSError:
... pass
pyspark LDA模型的最新介紹參考:LDA