潜在的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