Python 在应用gensim LDA主题建模后,如何获得每个主题概率最高的文档并将其保存在csv文件中?

Python 在应用gensim LDA主题建模后,如何获得每个主题概率最高的文档并将其保存在csv文件中?,python,csv,gensim,lda,topic-modeling,Python,Csv,Gensim,Lda,Topic Modeling,我使用gensim LDA主题建模从语料库中获取相关主题。现在我想得到代表每个主题的前20个文档:在一个主题中概率最高的文档。我想用这种格式将它们保存在CSV文件中:主题ID、主题词、主题中每个词的概率、每个主题的前20个文档共4列 我尝试过获取文档主题,我认为这是完成此任务的最佳方法: 所有主题=lda\U模型。获取文档主题(语料库,最小概率=0.0,每个单词主题=False) 但我不知道如何获得最能代表主题的前20个文档,并将它们添加到CSV文件中 data\u words\u nostop

我使用gensim LDA主题建模从语料库中获取相关主题。现在我想得到代表每个主题的前20个文档:在一个主题中概率最高的文档。我想用这种格式将它们保存在CSV文件中:主题ID、主题词、主题中每个词的概率、每个主题的前20个文档共4列

我尝试过获取文档主题,我认为这是完成此任务的最佳方法:

所有主题=lda\U模型。获取文档主题(语料库,最小概率=0.0,每个单词主题=False)

但我不知道如何获得最能代表主题的前20个文档,并将它们添加到CSV文件中

data\u words\u nostops=remove\u stopwords(已处理的文档)
#创建字典
id2word=语料库词典(数据词)
#创建语料库
文本=数据\u单词\u鼻孔
#术语文档频率
语料库=[id2word.doc2bow(文本)表示文本中的文本]
#建立LDA模型
lda_model=gensim.models.ldamodel.ldamodel(语料库=语料库,
id2word=id2word,
num_主题=20,
随机_状态=100,
更新_every=1,
chunksize=100,
通过率=10,
alpha='auto',
每字(主题=真)
pprint(lda_model.print_topics())
#保存csv
fn=“主题\术语5.csv”
如果(os.path.isfile(fn)):
m=“a”
其他:
m=“w”
数量=20
#在文件中保存主题、术语、问题数据
将open(fn,m,encoding=“utf8”,newline=”)作为csvfile:
字段名=[“主题id”、“术语”、“问题”]
writer=csv.DictWriter(csvfile,fieldnames=fieldnames)
如果(m=“w”):
writer.writeheader()
对于范围内的主题id(数量主题):
术语\u probs=lda\u model.show\u topic(topic\u id,topn=6)
对于术语,术语中的prob\u probs:
行={}
行['topic\u id']=topic\u id
行['prob']=prob
行['term']=术语
writer.writerow(行)

预期结果:此格式的CSV文件:主题ID、主题词、每个词的概率、每个主题的前20个文档共4列。

首先,每个文档都有一个主题向量,一个元组列表,如下所示:

[(0, 3.0161273e-05), (1, 3.0161273e-05), (2, 3.0161273e-05), (3, 3.0161273e-05), (4, 
3.0161273e-05), (5, 0.06556476), (6, 0.14744747), (7, 3.0161273e-05), (8, 3.0161273e- 
05), (9, 3.0161273e-05), (10, 3.0161273e-05), (11, 0.011416071), (12, 3.0161273e-05), 
(13, 3.0161273e-05), (14, 3.0161273e-05), (15, 0.057074558), (16, 3.0161273e-05), 
(17, 3.0161273e-05), (18, 3.0161273e-05), (19, 3.0161273e-05), (20, 0.7178939), (21, 
 3.0161273e-05), (22, 3.0161273e-05), (23, 3.0161273e-05), (24, 3.0161273e-05)]
其中,例如,(0,3.0161273e-05),0是主题ID,3.0161273e-05是概率

您需要将此数据结构重新排列为表单,以便可以跨文档进行比较

Here is what you can do: 

#Create a dictionary, with topic ID as the key, and the value is a list of tuples 
(docID, probability of this particular topic for the doc) 

topic_dict = {i: [] for i in range(20)}  # Assuming you have 20 topics. 

#Loop over all the documents to group the probability of each topic

for docID in range(num_docs):
    topic_vector = lda_model[corpus[docID]]
    for topicID, prob in topic_vector:
        topic_dict[topicID].append(docID, prob)

Then, you can sort the dictionary to find the top 20 documents:

for topicID, doc_probs in topic_dict.items():
    doc_probs = sorted(probs, key = lambda x: x[1], reverse = True)
    docs_top_20 = [dp[0] for dp in doc_probs[:20]]  

每个主题可以得到20个文档。您可以在列表(这将是列表列表)或字典中进行收集,以便输出它们

括号缺失,对于范围(20)内的i,它必须是topic_dict={i:[]