您有一个工具/API (Gensim LDA),当给定文档时,它会为您提供主题列表。
但您想要相反的情况:一个主题的文档列表。
本质上,您需要自己构建反向映射。
幸运的是,Python 用于处理映射的本机字典和习惯用法使这变得非常简单 - 只需几行代码 - 只要您正在处理完全适合内存的数据。
大致的方法是:
- 创建一个新结构(
dict
or list
) 用于将主题映射到文档列表
- 迭代所有文档,将它们(可能带有分数)添加到主题到文档的映射中
- 最后,针对每个感兴趣的主题查找(或许排序)文档列表
如果可以编辑您的问题以包含有关文档/主题的格式/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))
之后,您可以看到所有的列表(doc_id, score)
某个主题的值如下(主题 0):
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])
请注意,这使用全内存列表来完成所有操作,这对于非常大的语料库可能变得不切实际。在某些情况下,您可能需要将每个主题的列表编译为磁盘支持的结构,例如文件或数据库。