Nlp LDA如何给出一致的结果?

Nlp LDA如何给出一致的结果?,nlp,lda,topic-modeling,latent-semantic-indexing,Nlp,Lda,Topic Modeling,Latent Semantic Indexing,流行的主题模型,潜在Dirichlet分配(LDA),当用于从语料库中提取主题时,会返回不同的主题,这些主题在字典单词上具有不同的概率分布 而潜在语义索引(LSI)在每次迭代后给出相同的主题和相同的分布 实际上,LDA被广泛用于提取主题。 如果LDA在每次分类时返回不同的主题分布,它如何保持一致性 考虑这个简单的例子。 在D代表文件的情况下,采集文件样本: D1: Linear Algebra techniques for dimensionality reduction D2: dimensi

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

而潜在语义索引(LSI)在每次迭代后给出相同的主题和相同的分布

实际上,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,在选择的主题数为4,通过数为20的情况下执行批量LDA

现在在原始语料库上执行批量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
在这两种情况下,每个主题中的单词分布并不相同。 事实上,单词的分布是不同的


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

我认为这里有两个问题。首先,LDA训练不像LSI那样具有确定性;LDA的常用训练算法是抽样法。如果多次训练的结果相差悬殊,那要么是错误,要么是你使用了错误的设置,要么就是运气不好。如果您试图优化某些功能,可以尝试多次运行LDA培训


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

我认为这里有两个问题。首先,LDA训练不像LSI那样具有确定性;LDA的常用训练算法是抽样法。如果多次训练的结果相差悬殊,那要么是错误,要么是你使用了错误的设置,要么就是运气不好。如果您试图优化某些功能,可以尝试多次运行LDA培训


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

如果LDA在训练和推理步骤中都使用随机性,它每次都会生成不同的主题。请参阅此链接:

如果LDA在训练和推理步骤中使用随机性,则每次都会生成不同的主题。请参阅此链接:

此问题有三种解决方案:

  • 设置一个随机种子=123
  • pickle-您可以将经过培训的模型保存为文件,并根据需要重新访问,而无需更改主题。您甚至可以将此文件传输到另一台计算机,并通过调用来实现它。我们为预先训练好的模型创建一个文件名,打开文件保存为pickle。关闭pickle实例。加载保存的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)
    
    查看文档:

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

  • joblib-与pickle相同,更好地使用数组


  • 我希望这有帮助:)

    有三种解决方案:

  • 设置一个随机种子=123
  • pickle-您可以将经过培训的模型保存为文件,并根据需要重新访问,而无需更改主题。您甚至可以将此文件传输到另一台计算机,并通过调用来实现它。我们为预先训练好的模型创建一个文件名,打开文件保存为pickle。关闭pickle实例。加载保存的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)
    
    查看文档:

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

  • joblib-与pickle相同,更好地使用数组


  • 我希望这能有所帮助:)

    我不能完全确定我是否理解这个问题,但为了准确起见,您是说LDA在同一组数据的不同运行中产生不同的主题分布

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

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

    您可以看到
    随机状态的用法
    如果您修正这个数字,您可以轻松地再现输出。

    我不完全确定是否理解这个问题,但为了准确起见,您是说LDA在同一组数据的不同运行中产生不同的主题分布

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

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

    您可以看到
    random_state
    的用法,如果您修复了这个数字,您可以轻松地重现输出。

    我不确定是否理解这个问题。你担心两次运行LDA训练算法可能会返回不同的模型吗?@larsmans补充了一些更多的信息来阐明我的观点。希望你也明白这个问题:我不确定我是否理解这个问题。你担心两次运行LDA训练算法可能会返回不同的模型吗?@larsmans补充了一些更多的信息来阐明我的观点。希望你也明白这个问题:我在问题中添加了一个小例子来支持我的观点。金弗利,坐一会儿look@Shockeduser:是的,我见过LDA在玩具示例上给出类似的结果。但是试着把它放在类似数据集的东西上;如果您的实现是正确的,那么应该会给出更一致的结果。我在问题中添加了一个小示例信息来支持我的主张。金弗利,坐一会儿look@Shockeduser:是的,我去过