【问题标题】:Latent Dirichlet Allocation, pitfalls, tips and programs潜在狄利克雷分配、陷阱、技巧和程序
【发布时间】:2010-09-16 12:22:53
【问题描述】:

我正在尝试使用Latent Dirichlet Allocation 进行主题消歧和分配,我正在寻求建议。

  1. 哪个程序是“最好的”,其中最好的是最容易使用、最好的先验估计、快速的组合
  2. 我如何结合我对话题性的直觉。假设我认为我知道语料库中的某些项目确实属于同一类别,就像同一作者的所有文章一样。我可以将其添加到分析中吗?
  3. 在开始之前我应该​​知道哪些意外陷阱或提示?

我希望任何程序都有 R 或 Python 前端,但我希望(并接受)我将处理 C。

【问题讨论】:

    标签: algorithm statistics nlp


    【解决方案1】:

    除了usualsources,似乎最活跃的讨论区是topics-models listserv。从我最初的调查来看,最容易理解的包是LDA Matlab package

    这根本不是轻量级的东西,所以很难在上面找到好的资源我并不感到惊讶。

    【讨论】:

      【解决方案2】:

      对于这种分析,我使用了 LingPipe:http://alias-i.com/lingpipe/index.html。它是一个开源的 Java 库,我直接使用或移植了其中的一部分。要合并您自己的数据,您可以结合使用分类器,例如朴素贝叶斯。我在统计 nlp 方面的经验有限,但它通常遵循设置分类器、训练、查看结果、调整的循环。

      【讨论】:

        【解决方案3】:
        1. http://mallet.cs.umass.edu/ 恕我直言,是目前最棒的即插即用 LDA 包。它使用 Gibbs 采样来估计主题,并具有非常简单的命令行界面和许多额外的铃声-n-口哨(一些更复杂的模型,超参数优化等)

        2. 最好让算法完成它的工作。可能有 LDA(和 pLSI 等)的变体,可以让你做一些半监督的事情。我目前不知道。

        3. 我发现删除停用词和其他非常高频的词似乎大大提高了我的主题的质量(通过查看每个主题的热门词来评估,而不是任何严格的指标)。我猜词干/词形还原也会有所帮助。

        【讨论】:

        【解决方案4】:

        我同意这一点。 Mallet 的 lda 使用稀疏的数据结构和分布式学习,所以它的速度很快。打开超参数优化会得到更好的结果,imo。

        【讨论】:

          【解决方案5】:
          1. 您提到了对 R 的偏好,您可以使用两个包topicmodels(慢)或lda(快)。 Python有deltaLDApyLDAGensim等。

          2. 具有指定主题或单词的主题建模是开箱即用的,David Andrzejewski 有一些 Python 代码似乎可以做到这一点。有监督 LDA here 的 C++ 实现。还有大量关于相关方法的论文(DiscLDALabeled LDA,但对我来说不是易于使用的形式......

          3. 正如@adi92 所说,删除停用词、空格、数字、标点符号和词干都会大大改善问题。一个可能的陷阱是主题数量错误(或不适当)。目前,对于给定大小的 coprus 有多少主题是最佳的等,没有直接的诊断。MALLET 中有一些 measures of topic quality 可用(最快),非常方便。

          【讨论】:

            【解决方案6】:
            def plot_top_words(model, feature_names, n_top_words, title):
            fig, axes = plt.subplots(2, 5, figsize=(30, 15), sharex=True)
            axes = axes.flatten()
            for topic_idx, topic in enumerate(model.components_):
                top_features_ind = topic.argsort()[:-n_top_words - 1:-1]
                top_features = [feature_names[i] for i in top_features_ind]
                weights = topic[top_features_ind]
            
                ax = axes[topic_idx]
                ax.barh(top_features, weights, height=0.7)
                ax.set_title(f'Topic {topic_idx +1}',
                             fontdict={'fontsize': 30})
                ax.invert_yaxis()
                ax.tick_params(axis='both', which='major', labelsize=20)
                for i in 'top right left'.split():
                    ax.spines[i].set_visible(False)
                fig.suptitle(title, fontsize=40)
            
            plt.subplots_adjust(top=0.90, bottom=0.05, wspace=0.90, hspace=0.3)
            plt.show()
            

            【讨论】:

              猜你喜欢
              • 2011-09-08
              • 2020-07-21
              • 2017-08-12
              • 2017-04-01
              • 1970-01-01
              • 1970-01-01
              • 2015-10-07
              • 2016-09-10
              • 1970-01-01
              相关资源
              最近更新 更多