第 6 章 主题模型

在文本挖掘中,我们经常有多个包含多个文档的集合,如博客或新闻文章,我们想将其自然分组,以便分开阅读。主题模型是对这样的文档进行无监督分类的一种方法,类似于数字型数据的聚类,即使不知道需要寻找什么也可以找到自然的组别。

隐含狄利克雷分布(Latent Dirichlet allocation,LDA)是一种特别流行的拟合主题模型的方法。它将每个文档视为多个主题的混合,而每个主题又是多个词的混合。LDA 允许文档在内容层面互有重合,而不是被分成离散的多个组,这在某种意义上体现了自然语言的典型用法。

图 6.1: 应用主题模型进行文本分析的流程图。

如图 6.1 所示,我们可以使用 tidy 文本原则得到主题模型,通过在全书中使用的同一套 tidy 工具。在本章中,我们将学习 topicmodels 包 ( Grün and Hornik 2021 ) 中的 LDA 对象,特别是将这些模型 tidy 化,以便在 ggplot2 和 dplyr 中加以操作。我们还将探索一个多本书籍章节聚类的例子,从中可以看到主题模型能基于文本内容“学习”到不同的书有何不同。

6.1 隐含狄利克雷分布

隐含狄利克雷分布是主题模型最通行的算法之一。无需触及其模型背后的数学,我们可以从两个原则出发理解 LDA。

  • 每个文档都是主题的混合 设想每个文档可能含有的词来自特定比例的几个主题。比如,针对一个双主题的模型,我们可以说“文档 1 是 90% 主题 A 和 10% 主题 B,而文档 2 是 30% 主题 A 和 70% 主题 B。”
  • 每个主题都是词的混合 比如,可以设想一个美国新闻的双主题模型,一个主题是“政治”,一个是“娱乐”。政治主题中最常见的词可能是“总统”“议院”“政府”,而组成娱乐主题的词如“电影”“电视”“演员”。重要的是,词可以被主题共用,比如“预算”就可能同等地出现在两个主题中。
  • LDA 是同时估算这两件事的数学方法:找到与每个主题相关联的词的混合,同时确定描述每个文档的主题的混合。这个算法的实现已经有很多种,我们将深度探索其中之一。

    在章 5 中我们简要地介绍了 topicmodels 包提供的 AssociatedPress 数据集作为 DocumentTermMatrix 的一个例子。这是一个2246篇新闻文章的集合,来自美国的一个通讯社,主要发表于1988年前后。

    5 中我们介绍了 tidy() 方法,最初来自 broom 包 ( Robinson, Hayes, and Couch 2021 ) ,可以将模型对象 tidy 化。tidytext 包提供这个方法从模型中提取每主题每词的概率,称为 \(\beta\) (beta)。

    6.2 )。

    6.3

    我们可以看到,主题2的常见词包括政党如“democratic”和“republican”,以及政治家的名字如“dukakis”和“gorbachev”。主题1的特征词更多的是货币如“yen”和“dollar”,还有金融术语如“index”“prices”和“rates”。这帮助我们进一步确认算法识别出的两个主题是政治和金融新闻。

    6.1.2 文档-主题概率

    除了按词的混合估计每个主题,LDA 也建立了作为主题混合的文档模型。我们检查一下每文档每主题的概率,称作 \(\gamma\) (gamma),作为 matrix = "gamma" 参数传给 tidy()

    5.1 )并检查该文档中最常见的词。

    3 中介绍的 gutenbergr 包获取文本。

    5.2 中所叙述的,我们可以用 tidytext 的 cast_dtm() 把一个每行一个符号的表格映射为 DocumentTermMatrix

    6.4 )。

    6.5

    6.6

    mallet ( Mimno 2013 ) 就实现了对 MALLET Java 文本分类工具包的包装,tidytext 包也提供了对这种模型的输出的 tidy 化工具。如果无法正常调用 library(mallet) (主要原因是其 rJava 依赖),可以尝试在终端中运行 R CMD javareconf ,成功后重新打开 RStudio。

    mallet 包采用了不太一样的输入格式。比如输入未经符号化的文档并自行符号化,且需要一个单独的停止词文件。这意味着我们在运行 LDA 之前需要把每个文档的文本都合并成一个字符串。

    https://CRAN.R-project.org/package=topicmodels . Mimno, David. 2013. Mallet: A Wrapper Around the Java Machine Learning Tool MALLET . https://CRAN.R-project.org/package=mallet . Robinson, David, Alex Hayes, and Simon Couch. 2021. Broom: Convert Statistical Objects into Tidy Tibbles . https://CRAN.R-project.org/package=broom .