0. 引言 各种介绍材料告诉我们:“LDA 是一种生成式概率模型,能够从大量文本中发现隐藏的主题”。也就是说,每个文档是由多个主题混合构成的;而每个主题表示成所有词的概率分布。 但是,要理解LDA主题分析模型到底是什么,并不是件容易的事。我们期望用一种直观的方法讲解LDA主题分析模型的原理。 下面我们结合实际数据和分析结果讲解生成原理和过程。 1. 预备知识:观察 文档-词 矩阵 GooSeeker分词和情感分析软件可以导出选词矩阵,让我们先观察一下这个矩阵 【注意】以下几点:
我们打开选词矩阵表和选词矩阵TFIDF表观察一下 可以看到确实是矩阵,每一行是一条文本内容,我们称之为“文档”,每一列是一个词。 所有列的词放在一起,称为这个被分析语料的词典。 但是,一个文档含有词典中少量的词,总体看起来这个矩阵很稀疏,有值的单元格很少。 选词矩阵里面的值是这个词在这个文档中出现的次数。还可以导出 选词矩阵TFIDF表,矩阵里面的值是这个词在某个文档中的tf-idf值。 可以看到有几个特征:
这也是“词袋”模型 概念的要点。跟词袋模型相对的是GooSeeker扩展模块上的top2vec话题发现(检测)模型,采用了doc2vec技术,使用了上下文信息。可以分别实际操作一下以作对比。 2. LDA主题分析原理 2.1 主题分析模型的共通原理 我们已经观察了 文档-词 矩阵,用这个 文档-词 矩阵就能代表一个语料的词袋模型。我们用字母A代表这个矩阵。那么主题分析模型的目的是找到两个矩阵B和C,B和C相乘能“生成”A,如公式: A = BC 这就是常常出现在介绍LDA的文章中的“生成模型”的含义。跟当今AI时代说的“生成式”大语言模型是两个不同的概念。 上面的公式,A是 文档-主题 矩阵,C是 主题-关键词 矩阵。 光看这个公式,自然我们更推荐用NMF模型做主题分析,其原理特别容易理解,上面的公式完全刻画了NMF原理,就这么简单。其实推荐NMF还有一个很大的工程方面的原因:分析短文本的时候,其结果特别容易解读。而相比之下,LDA模型分析短文本是不稳定的,解释其结果就会比较勉强。 2.2 观察 LDA主题分析的结果文件 我们先观察LDA主题分析的结果,基于这些结果再解释其原理。 2.2.1 文档-主题 矩阵 在GooSeeker分词软件的LDA分析界面上可以观察文本话题矩阵,可以看到每条文档所属的显著话题是什么,也可以按照话题进行排序,查看哪些文档具有更大的概率隶属于该主题。如下图: 导出的数据见下图,把每个文档在每个主题上的打分加在一起等于1,可见,这是文档在主题上的概率分布。后面我们会讲到这是一个Dirichlet(狄利克雷)分布。 2.2.2 主题-关键词 矩阵 在GooSeeker分词软件的LDA分析界面上可以直观观察一个主题由哪些词构成的,如下图 对应导出的矩阵如下图,把每个主题的每个关键词的打分加在一起也等于1,可见,这是主题在关键词上的概率分布。后面我们会讲到这是另一个Dirichlet(狄利克雷)分布。 2.3 LDA的原理 这是LDA的概率图模型。灰色圆盘表示显变量,就是可以观察的变量;其他是隐变量。这是变量分别是:
前面我们观察了原始的 文档-词 矩阵。矩阵的值是在某个文档中某个词出现的次数。可以想象成把矩阵清空,让LDA算法填写恢复这个矩阵。所以,上面那个概率图模型中外层方框表示在文档层面循环M次(M个文档);而内层方框表示在一个文档的词层面循环N次(一个文档有N个词)。w是一个显变量,就是我们可以观察的填在文档中的每个词。 2.4 LDA的计算过程 维基百科词条Latent Direchlet Allocation介绍了LDA的生成过程(参看Generative process一章),目标就是生成θ和φ,从而也就生成了w(和w)。在具体实现这个算法的时候,可以采用多种统计推断或者贝叶斯推断,比如Gibbs采样是一种数值计算方法,就是一轮轮多层循环更新每个词所属的主题,直到收敛。也就是计算下面的概率值, 可见就是计算这个词属于每个主题的概率,上面的公式中:
然后根据这个值随机采样一个主题赋给这个词。所谓随机采样,举个例子,假设有3个主题,为某个词做的某一轮计算得到下面的概率
那么,我们生成一个取值在0到1之间的随机数,如果落在0~0.1之间就把主题1赋给这个词,如果落在0.1~0.7之间就把主题2赋给这个词,否则把主题2赋给这个词。可见,并不是选择概率最大的那个主题赋给这个词,而是做了一次随机采样。 3. 怎样设置α和β的值 我们称α和β是超参数,也就是可以通过选用不同的值来影响计算结果。GooSeeker分词扩展功能的界面上,可以为LDA模型执行模型搜索,但是,并不为α和β搜索合适的值,而是在程序中预先设定好。这两个参数可以控制稀疏性,值越小越稀疏 α控制每篇文档分布在多个主题上还是集中在几个主题上。GooSeeker的LDA主题分析只对sklearn的LDA模型做了特殊设置,对gensim的LDA模型却采用了缺省值。设置如下:
β控制每个主题分布在更多词上还是集中在少量词上。GooSeeker的LDA主题分析只对sklearn的LDA模型做了特殊设置,对gensim的LDA模型却采用了缺省值。设置如下
4. 对短文本进行LDA主题分析 我们常常要分析微博、评论等的主题分布,但是,由于文档中的文字比较少,会有这样的影响
从工程上角度,可以把多条短文档合并成一个文档再进行分析。合并的依据可以是同用户、或者多个时间段、或者相同话题等等。 |