如何设置时间片-动态主题模型

时间:2019-07-05 21:14:14

标签: python-3.x nlp gensim lda topic-modeling

我正在努力弄清楚如何为动态主题模型设置时间片。我正在使用gensims LdaSeqModel,它需要一个整数时间片。任何帮助将不胜感激。

ldaseq = LdaSeqModel(corpus=bow_corpus, time_slice=[], num_topics=15, chunksize=1)

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-5-e58059a7fb6f> in <module>
----> 1 ldaseq = LdaSeqModel(corpus=bow_corpus, time_slice=[], num_topics=15, chunksize=1)

~\AppData\Local\Continuum\anaconda3\lib\site-packages\gensim\models\ldaseqmodel.py in __init__(self, corpus, time_slice, id2word, alphas, num_topics, initialize, sstats, lda_model, obs_variance, chain_variance, passes, random_state, lda_inference_max_iter, em_min_iter, em_max_iter, chunksize)
    186 
    187             # fit DTM
--> 188             self.fit_lda_seq(corpus, lda_inference_max_iter, em_min_iter, em_max_iter, chunksize)
    189 
    190     def init_ldaseq_ss(self, topic_chain_variance, topic_obs_variance, alpha, init_suffstats):

~\AppData\Local\Continuum\anaconda3\lib\site-packages\gensim\models\ldaseqmodel.py in fit_lda_seq(self, corpus, lda_inference_max_iter, em_min_iter, em_max_iter, chunksize)
    275             # seq model and find the evidence lower bound. This is the E - Step
    276             bound, gammas = \
--> 277                 self.lda_seq_infer(corpus, topic_suffstats, gammas, lhoods, iter_, lda_inference_max_iter, chunksize)
    278             self.gammas = gammas
    279 

~\AppData\Local\Continuum\anaconda3\lib\site-packages\gensim\models\ldaseqmodel.py in lda_seq_infer(self, corpus, topic_suffstats, gammas, lhoods, iter_, lda_inference_max_iter, chunksize)
    351             bound, gammas = self.inferDTMseq(
    352                 corpus, topic_suffstats, gammas, lhoods, lda,
--> 353                 ldapost, iter_, bound, lda_inference_max_iter, chunksize
    354             )
    355         elif model == "DIM":

~\AppData\Local\Continuum\anaconda3\lib\site-packages\gensim\models\ldaseqmodel.py in inferDTMseq(self, corpus, topic_suffstats, gammas, lhoods, lda, ldapost, iter_, bound, lda_inference_max_iter, chunksize)
    401         time = 0  # current time-slice
    402         doc_num = 0  # doc-index in current time-slice
--> 403         lda = self.make_lda_seq_slice(lda, time)  # create lda_seq slice
    404 
    405         time_slice = np.cumsum(np.array(self.time_slice))

~\AppData\Local\Continuum\anaconda3\lib\site-packages\gensim\models\ldaseqmodel.py in make_lda_seq_slice(self, lda, time)
    459         """
    460         for k in range(self.num_topics):
--> 461             lda.topics[:, k] = self.topic_chains[k].e_log_prob[:, time]
    462 
    463         lda.alpha = np.copy(self.alphas)

IndexError: index 0 is out of bounds for axis 1 with size 0

2 个答案:

答案 0 :(得分:1)

  

time_slice (整数列表,可选) –每个时间片中的文档数。每个时间片都可以代表一年的时间   出版的论文,以防语料库来自期刊出版   多年。假设sum(time_slice)==   num_documents。   gensimdocs

在您的代码中,时间片参数作为一个空列表输入

time_slice=[]

哪个抛出了您的问题中列出的追溯。

我对您的数据不太熟悉,因此我无法告诉您在时间片参数中输入什么内容。

不过,这是文档中的示例。

假设您的语料库有30个文档,第一个时间片有5个,第二个时间片有10个,第三个时间片有15个。

您的time_slice参数为time_slice=[5,10,15]

根据您的数据,您可能希望直接从数据中生成time_slice列表。

这完全清除了吗?

答案 1 :(得分:1)

我将假设您正在单个数据帧中工作。假设您要使用年作为时间单位。

  1. 要使time_sliceldaseqmodel一起正常工作,您需要 首先将您的数据框升序(即从最早到最新)。
  2. 创建一个time_slice变量,以便稍后将其反馈到模型中
import numpy as np
uniqueyears, time_slices = np.unique(data.Year, return_counts=True) 
#takes all unique values in data.Year as well as how often they occur and returns them as an array.

print(np.asarray((uniqueyears, time_slices)).T) 
#see what youve made, technically you dont need this

返回(使用示例数据)

[[1992   28]
 [1993   18]
 [1994   25]
 [1995   18]
 [1996   44]
 [1997   38]
 [1998   30]]

这可以工作很多年,如果您想要更细粒度,只要您对文档进行排序(gensim将它们连接到时间片的方式)正确无误,就可以采用相同的概念。因此,例如,如果您要每月进行一次切片,则可以将日期分别重写为2017年3月的20173和2014年4月的20174。实际上,只要您可以识别出属于同一切片的文档,任何粒度都可以。