Gensim LDA中的主题明智文档分发

问题描述

python中是否有一种方法可以映射属于某个主题的文档。例如,主要是“主题0”的文档列表。我知道有一些方法可以列出每个文档的主题,但是我该如何做呢?

编辑:

我将以下脚本用于LDA:

Template format error: DependsOn must be a string or list of strings.

解决方法

您有一个工具/ API(Gensim LDA),当获得文档时,它会为您提供主题列表。

但是您想要相反:主题的文档列表。

本质上,您将需要自己构建反向映射。

幸运的是,只要您要处理完全适合内存的数据,Python的用于处理映射的本机字典和习惯用法就使这变得非常简单-只需几行代码。

大致的方法是:

  • 创建用于将主题映射到文档列表的新结构(dictlist
  • 迭代所有文档,将它们(可能带有分数)添加到主题到文档的映射中
  • 最后,针对每个感兴趣的主题查找(或排序)这些文档列表

如果可以对您的问题进行编辑以包含有关文档/主题的格式/ ID以及您如何训练LDA模型的更多信息,则可以使用更具体的示例代码扩展此答案,以建立相反的类型-映射您所需的内容。

更新以更新代码:

好的,如果您的模型位于ldamodel中,而BOW格式的文档位于corpus中,则您将执行以下操作:

# setup: get the model's topics in their native ordering...
all_topics = ldamodel.print_topics()
# ...then create a empty list per topic to collect the docs:
docs_per_topic = [[] for _ in all_topics]

# now,for every doc...
for doc_id,doc_bow in enumerate(corpus):
    # ...get its topics...
    doc_topics = ldamodel.get_document_topics(doc_bow)
    # ...& for each of its topics...
    for topic_id,score in doc_topics:
        # ...add the doc_id & its score to the topic's doc list
        docs_per_topic[topic_id].append((doc_id,score))

此后,您可以看到像这样的特定主题(对于主题0)的所有(doc_id,score)值的列表:

print(docs_per_topic[0])

如果您对每个主题的热门文档感兴趣,则可以按得分对每个列表对进行进一步排序:

for doc_list in docs_per_topic:
    doc_list.sort(key=lambda id_and_score: id_and_score[1],reverse=True)

然后,您可以获取主题0的前10个文档,例如:

print(docs_per_topic[0][:10])

请注意,这使用内存中的列表来完成所有操作,这对于超大型的语料库可能不切实际。在某些情况下,您可能需要将按主题列出的内容编译为磁盘支持的结构,例如文件或数据库。