我有一个LDA模型,运行在12,054个文档的语料库大小上,词汇大小为9,681个单词和60个集群 . 我试图通过调用.topicDistributions()或.javaTopicDistributions()来获取文档上的主题分布 . 这两种方法都会在文档上返回主题分布的rdd . 因此,根据我的理解,行数应该是文档数量,列数应该是主题数量 . 但是,当我在调用topicDistributions()之后获取rdd的计数时,我得到11,665的计数(少于传递给模型的文档数)?每个文档都有正确的主题数(60) . 为什么是这样?
这是演示:http://spark.apache.org/docs/latest/mllib-clustering.html
这是代码:
enter code here
//parse tf vectors from corpus
JavaRDD<Vector> parsedData = data.map(
new Function<String, Vector>() {
public Vector call(String s) {
s = s.substring(1, s.length()-1);
String[] sarray = s.trim().split(",");
double[] values = new double[sarray.length];
for (int i = 0; i < sarray.length; i++)
{
values[i] = Double.parseDouble(sarray[i]);
}
return Vectors.dense(values);
}
);
System.out.println(parsedData.count()) //prints 12,054
// Index documents with unique IDs
JavaPairRDD<Long, Vector> corpus = JavaPairRDD.fromJavaRDD(parsedData.zipWithIndex().map(
new Function<Tuple2<Vector, Long>, Tuple2<Long, Vector>>() {
public Tuple2<Long, Vector> call(Tuple2<Vector, Long> doc_id) {
return doc_id.swap();
}
}
));
System.out.println(corpus.count()) //prints 12,054
LDA lda = new LDA()
LDAModel ldaModel = lda.setK(k.intValue()).run(corpus);
RDD<scala.Tuple2<Object,Vector>> topic_dist_over_docs = ((DistributedLDAModel) ldaModel).topicDistributions();
System.out.println(topic_dist_over_docs.count()) //prints 11,655 ???
JavaPairRDD<Long,Vector> topic_dist_over_docs2 = ((DistributedLDAModel) ldaModel).javaTopicDistributions();
System.out.println(topic_dist_over_docs2.count()) //also prints 11,655 ???
1 回答
Spark 1.4中似乎存在使用topicDistributions的错误 . 在更新到Spark 1.5的实验版本后,我能够解决此问题 .