LDA如何提供一致的结果?

时间:2012-02-27 19:20:45

标签: nlp lda topic-modeling latent-semantic-indexing

流行的主题模型Latent Dirichlet Allocation(LDA),当用于从语料库中提取主题时,返回不同的主题,在词典单词上具有不同的概率分布。

而潜在语义索引(LSI)在每次迭代后都会提供相同的主题和相同的分布。

实际上,LDA被广泛用于提取主题。 如果每次进行分类时LDA返回不同的主题分布,LDA如何保持一致性?

考虑这个简单的例子。 获取文档样本,其中D代表文档:

D1: Linear Algebra techniques for dimensionality reduction
D2: dimensionality reduction of a sample database
D3: An introduction to linear algebra
D4: Measure of similarity and dissimilarity of different web documents
D5: Classification of data using database sample
D6: overfitting due lack of representative samples
D7: handling overfitting in descision tree
D8: proximity measure for web documents
D9: introduction to web query classification
D10: classification using LSI 

每一行代表一份文件。 在上述语料库中,LDA模型用于从文档生成主题。 Gensim用于LDA,批量LDA执行,其中选择的主题数为4,通过次数为20。

现在在原始语料库中执行批量LDA,并且在20次传递后生成的主题是:

topic #0: 0.045*query + 0.043*introduction + 0.042*similarity + 0.042*different + 0.041*reduction + 0.040*handling + 0.039*techniques + 0.039*dimensionality + 0.039*web + 0.039*using

topic #1: 0.043*tree + 0.042*lack + 0.041*reduction + 0.040*measure + 0.040*descision + 0.039*documents + 0.039*overfitting + 0.038*algebra + 0.038*proximity + 0.038*query

topic #2: 0.043*reduction + 0.043*data + 0.042*proximity + 0.041*linear + 0.040*database + 0.040*samples + 0.040*overfitting + 0.039*lsi + 0.039*introduction + 0.039*using

topic #3: 0.046*lsi + 0.045*query + 0.043*samples + 0.040*linear + 0.040*similarity + 0.039*classification + 0.039*algebra + 0.039*documents + 0.038*handling + 0.037*sample

现在批量LDA再次在同一原始语料库上执行,在这种情况下生成的主题是:

topic #0: 0.041*data + 0.041*descision + 0.041*linear + 0.041*techniques + 0.040*dimensionality + 0.040*dissimilarity + 0.040*database + 0.040*reduction + 0.039*documents + 0.038*proximity

topic #1: 0.042*dissimilarity + 0.041*documents + 0.041*dimensionality + 0.040*tree + 0.040*proximity + 0.040*different + 0.038*descision + 0.038*algebra + 0.038*similarity + 0.038*techniques

topic #2: 0.043*proximity + 0.042*data + 0.041*database + 0.041*different + 0.041*tree + 0.040*techniques + 0.040*linear + 0.039*classification + 0.038*measure + 0.038*representative

topic #3: 0.043*similarity + 0.042*documents + 0.041*algebra + 0.041*web + 0.040*proximity + 0.040*handling + 0.039*dissimilarity + 0.038*representative + 0.038*tree + 0.038*measure

在两种情况下,每个主题中的单词分布都不相同。 事实上,单词分配从来都不一样。

那么,如果LDA在LSI这样的主题中没有相同的字分布,LDA如何有效地工作?

4 个答案:

答案 0 :(得分:3)

我认为这里有两个问题。首先,LDA 训练不像LSI那样是确定性的; LDA的常用训练算法是采样方法。如果多次训练的结果差别很大,那就是一个bug,或者你使用了错误的设置,或者说运气不好。如果您正在尝试优化某些功能,可以尝试多次运行LDA培训。

然后,对于群集,查询和分类:一旦您拥有经过培训的LDA模型,您就可以以确定的方式将该模型应用于其他文档。不同的LDA模型会给你不同的结果,但是从你标记为最终模型的一个LDA模型中,你总会得到相同的结果。

答案 1 :(得分:0)

如果LDA在训练和推理步骤中使用随机性,则每次都会生成不同的主题。请看这个链接:LDA model generates different topics everytime i train on the same corpus

答案 2 :(得分:0)

此问题有三种解决方案:

  1. 设置random_seed = 123
  2. 棘手-您可以将训练有素的模型另存为文件,然后根据需要重新访问而无需更改主题。您甚至可以将该文件传输到另一台计算机上,并通过调用来实现它。我们为预训练的模型创建一个文件名,打开文件另存为泡菜。关闭泡菜实例。加载保存的LDA木槌包裹的泡菜:

    LDAMallet_file = 'Your Model'
    
    LDAMallet_pkl = open(LDAMallet_file, 'wb')
    pickle.dump(ldamallet, LDAMallet_pkl)
    
    LDAMallet_pkl_15.close()
    
    LDAMallet_file = 'Your Model'
    LDAMallet_pkl = open(LDAMallet_file, 'rb')
    ldamallet = pickle.load(LDAMallet_pkl)
    
    print("Loaded LDA Mallet wrap --", ldamallet)
    

    查看文档:{​​{3}}

    明白吗?腌制,因为它可以保存;)

  3. joblib-与使用数组的泡菜相同

我希望这会有所帮助:)

答案 3 :(得分:0)

我不确定我是否理解问题,但确切地说,您是说LDA在同一数据集的不同运行中会产生不同的主题分布。

首先,LDA使用随机性获得那些概率分布,因此对于每次运行,您将获得不同的主题权重和单词,但是您可以控制这种随机性。

gensim.models.ldamodel.LdaModel(
    corpus, num_topics=number_of_topics, id2word=dictionary, passes=15, random_state=1)

使用random_state即可解决此问题,如果您更正此数字,则可以轻松重现输出。