Python Gensim:为每个主题提取100个最具代表性的文档

Python Gensim:为每个主题提取100个最具代表性的文档,python,tuples,gensim,lda,Python,Tuples,Gensim,Lda,我有几个gensim模型,可容纳约500万个文档。我想从每个主题的每个模型中抽取前100个最具代表性的文档,以帮助我选择最佳模型 假设我有一个模型lda和语料库corpus,我可以得到以下形式的主题概率: topic_probs = lda[corpus] 其中topic\u probs是元组列表:(topic\u num,topic\u prob) 我如何按主题对这个元组列表排序,然后按概率排序,然后从语料库中检索前100个文档?我猜答案看起来有点像,但我正在努力解决如何在维护文档索引的同时

我有几个gensim模型,可容纳约500万个文档。我想从每个主题的每个模型中抽取前100个最具代表性的文档,以帮助我选择最佳模型

假设我有一个模型
lda
和语料库
corpus
,我可以得到以下形式的主题概率:

topic_probs = lda[corpus]
其中
topic\u probs
是元组列表:
(topic\u num,topic\u prob)

我如何按主题对这个元组列表排序,然后按概率排序,然后从语料库中检索前100个文档?我猜答案看起来有点像,但我正在努力解决如何在维护文档索引的同时使用元组列表的问题


(这有点复杂,因为我不知道
gensim.LdaModel
minimum\u probability
参数,所以概率<0.01的主题被抑制了。这些模型每次运行需要2-3天,所以如果可能的话,我想避免重新运行它们)。

我已经设法解决了这个问题,虽然可能不是以最有效的方式,而且我没有时间让它完全便携

  • 我提取了文档主题概率,并将其转储到csv(我的语料库很大,需要花费很长时间来处理,所以我想保存这些文档)。您可以轻松地在多个模型上循环此操作
  • def lda_to_csv(model, outfile, corpus):
        '''This function takes a gensim lda model as input, and outputs a csv with topics probs by document'''
        topic_probs = model.get_document_topics(corpus) #get the list of topic probabilities by doc
        topic_dict = [dict(x) for x in topic_probs] #convert to dictionary to convert to data frame
        df = pd.DataFrame(topic_dict).fillna(0) #convert to data frame, fill topics < 0.01 as 0
        df.to_csv(outfile)
    
    def get_best_docs(df, n, k, texts):
        '''Return the index of the n most representative documents from a list of topic responsibilities for each topic'''
        '''n is the number of douments you want, k is the number of topics in the model, the texts are the FULL texts used to fit the model'''
        #create column list to iterate over
        k_cols = range(0, k)
    
        #intialize empty list to hold results
        n_rep_docs = []
    
        #loop to extract documents for each topic
        for i in k_cols:
            inds = df.nlargest(n = n, columns = str(i))['docs'].astype(int).tolist()
            #use list comprehension to extract documents
            n_rep_docs.append([texts[ind] for ind in inds])
    
        return n_rep_docs