我正在尝试使用Spark MLlib实现LDA。
但我很难理解输入格式。我能够运行其示例实现来从一个只包含数字的文件中获取输入,如下所示:
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
我跟着 http://spark.apache.org/docs/latest/mllib-clustering.html#latent-dirichlet-allocation-lda
我理解了here解释的输出格式。
我的用例非常简单,我有一个带有一些句子的数据文件。
我想将此文件转换为语料库,以便将其传递给org.apache.spark.mllib.clustering.LDA.run()
。
我怀疑输入中的那些数字代表哪个是zipWithIndex并传递给LDA?是不是出现在哪里的数字1代表相同的单词或者它是某种计数?
答案 0 :(得分:1)
首先,您需要将句子转换为向量。
val documents: RDD[Seq[String]] = sc.textFile("yourfile").map(_.split(" ").toSeq)
val hashingTF = new HashingTF()
val tf: RDD[Vector] = hashingTF.transform(documents)
val idf = new IDF().fit(tf)
val tfidf: RDD[Vector] = idf.transform(tf)
val corpus = tfidf.zipWithIndex.map(_.swap).cache()
// Cluster the documents into three topics using LDA
val ldaModel = new LDA().setK(3).run(corpus)
详细了解TF_IDF矢量化here