使用Spark LDA可视化主题

时间:2017-05-29 02:25:30

标签: apache-spark lda apache-spark-ml

我正在使用pySpark ML LDA库来配合来自sklearn的20个新闻组数据集的主题模型。我在训练语料库中进行标准标记化,停止词删除和tf-idf转换。最后,我可以得到主题并打印出单词索引及其权重:

topics = model.describeTopics()
topics.show()
+-----+--------------------+--------------------+
|topic|         termIndices|         termWeights|
+-----+--------------------+--------------------+
|    0|[5456, 6894, 7878...|[0.03716766297248...|
|    1|[5179, 3810, 1545...|[0.12236370744240...|
|    2|[5653, 4248, 3655...|[1.90742686393836...|
...

但是,如何将术语索引映射到实际单词以显示主题? 我正在使用应用于标记化字符串列表的HashingTF来派生术语索引。如何生成字典(从索引到单词的映射)以显示主题?

2 个答案:

答案 0 :(得分:3)

HashingTF的替代方案是生成词汇表的CountVectorizer:

count_vec = CountVectorizer(inputCol="tokens_filtered", outputCol="tf_features", vocabSize=num_features, minDF=2.0)
count_vec_model = count_vec.fit(newsgroups)  
newsgroups = count_vec_model.transform(newsgroups)
vocab = count_vec_model.vocabulary

将词汇表作为单词列表,我们可以将其编入索引以显示主题:

topics = model.describeTopics()   
topics_rdd = topics.rdd

topics_words = topics_rdd\
       .map(lambda row: row['termIndices'])\
       .map(lambda idx_list: [vocab[idx] for idx in idx_list])\
       .collect()

for idx, topic in enumerate(topics_words):
    print "topic: ", idx
    print "----------"
    for word in topic:
       print word
    print "----------"

答案 1 :(得分:0)

HashingTF是不可逆的,也就是说,从单词的输出索引中,您无法获得输入单词。多个单词migth映射到相同的输出索引。您可以使用CountVectorizer,这是一个类似但可逆的过程。