Spark中的潜在Dirichlet分配(LDA)

时间:2017-02-05 10:54:19

标签: python pyspark lda

我正在尝试在Spark中编写一个用于执行Latent Dirichlet分配(LDA)的程序。 Spark文档page提供了一个很好的示例,用于在示例数据上执行LDA。以下是程序

from pyspark.mllib.clustering import LDA, LDAModel
from pyspark.mllib.linalg import Vectors

# Load and parse the data
data = sc.textFile("data/mllib/sample_lda_data.txt")
parsedData = data.map(lambda line: Vectors.dense([float(x) for x in line.strip().split(' ')]))
# Index documents with unique IDs
corpus = parsedData.zipWithIndex().map(lambda x: [x[1], x[0]]).cache()

# Cluster the documents into three topics using LDA
ldaModel = LDA.train(corpus, k=3)

# Output topics. Each is a distribution over words (matching word count vectors)
print("Learned topics (as distributions over vocab of " + str(ldaModel.vocabSize())
      + " words):")
topics = ldaModel.topicsMatrix()
for topic in range(3):
    print("Topic " + str(topic) + ":")
    for word in range(0, ldaModel.vocabSize()):
        print(" " + str(topics[word][topic]))

# Save and load model
ldaModel.save(sc, "target/org/apache/spark/PythonLatentDirichletAllocationExample/LDAModel")
sameModel = LDAModel\
    .load(sc, "target/org/apache/spark/PythonLatentDirichletAllocationExample/LDAModel")

使用的样本输入(sample_lda_data.txt)如下

1 2 6 0 2 3 1 1 0 0 3
1 3 0 1 3 0 0 2 0 0 1
1 4 1 0 0 4 9 0 1 2 0
2 1 0 3 0 0 5 0 2 3 9
3 1 1 9 3 0 2 0 0 1 3
4 2 0 3 4 5 1 1 1 4 0
2 1 0 3 0 0 5 0 2 2 9
1 1 1 9 2 1 2 0 0 1 3
4 4 0 3 4 2 1 3 0 0 0
2 8 2 0 3 0 2 0 2 7 2
1 1 1 9 0 2 2 0 0 3 3
4 1 0 0 4 5 1 3 0 1 0

如何修改程序以在包含文本数据而不是数字的文本数据文件中运行?让示例文件包含以下文本。

  

潜在Dirichlet分配(LDA)是推断的主题模型   来自一组文本文档的主题。 LDA可以被认为是一种   聚类算法如下:

     

主题对应于群集中心,文档对应于   数据集中的示例(行)。主题和文档都存在于   特征空间,其中特征向量是单词计数的向量(包   的话)。而不是使用传统的估计聚类   距离,LDA使用基于文本的统计模型的函数   文件生成。

1 个答案:

答案 0 :(得分:10)

在做了一些研究后,我试图回答这个问题。下面是使用Spark在具有真实文本数据的文本文档上执行LDA的示例代码。

/Users/.ejabberd-modules/sources/mod_push/ebin/mod_push_gcm.bea#: error writing file: no such file or directory
/Users/.ejabberd-modules/sources/mod_push/ebin/mod_push_mozilla.bea#: error writing file: no such file or directory
/Users/.ejabberd-modules/sources/mod_push/src/mod_push_mozilla.erl:74: Warning: variable 'DisableArgs' is unused
/Users/.ejabberd-modules/sources/mod_push/ebin/mod_push_ubuntu.bea#: error writing file: no such file or directory
/Users/.ejabberd-modules/sources/mod_push/src/mod_push_ubuntu.erl:74: Warning: variable 'DisableArgs' is unused
/Users/.ejabberd-modules/sources/mod_push/src/mod_push_ubuntu.erl:139: Warning: erlang:now/0: Deprecated BIF. See the "Time and Time Correction in Erlang" chapter of the ERTS User's Guide for more information.
/Users/.ejabberd-modules/sources/mod_push/ebin/mod_push_wns.bea#: error writing file: no such file or directory
/Users/.ejabberd-modules/sources/mod_push/src/mod_push_wns.erl:84: Warning: variable 'DisableArgs' is unused
/Users/.ejabberd-modules/sources/mod_push/src/mod_push_wns.erl:160: Warning: variable 'ReplyHead' is unused
/Users/.ejabberd-modules/sources/mod_push/ebin/node_push.bea#: error writing file: no such file or directory
Error: {compilation_failed,"/Users/.ejabberd-modules/sources/mod_push/src/mochijson2.erl"}

问题中提到的文本数据中提取的主题如下:

enter image description here