主题模型

:》很早就想整理这个话题的,但是一直拖到现在,因为最近刚好有和别人聊到LDA相关的话题就下定决心整理一下。(当然主题词模型不只LDA这一种)

主题以及主题词模型

在NLP领域,主题topic一般是通过关键词的形式描述的,一类主题就可以有一个关键词所组成的set来表示,例如体育相关的主题所对应的主题词可以是「足球,篮球,乒乓球,武术,相扑,跆拳道,操场,姚明……」,主题的划分也是可以有大主题和细分主题的

wiki

那么什么是主题词模型呢?

其实我们之前就有遇到过,SVD+Truncate就可以构成一个主题词模型,也叫LSA。如下图所示,当我们对一篇文章做SVD分解后,得到U和V矩阵,其实就有了这篇文档的主旨概括。以矩阵U为例,他的维度是|V| * m的,他的每一行是每个词的词向量,而他的每一列则可以描述一个topic,这样我们就得到了这篇文档的m个主题。However,这种主题词模型是有弊端的,例如解释性很差,矩阵内存在正负值等。

SVD

这里再简单提一下另一种提取文章主题的方法pLSA( Prob Latent Semantic Analysis),他的核心公式为 \(P(w,d) = P(w|d)P(d) = P(d) \sum_T P(w|t)P(t|d)\),但这种模型也有弊端,如无法推断新的文本的主题。

下面进入正题LDA模型

LDA(Latent Dirichlet Allocation)

LDA是一种无监督的贝叶斯模型,作为主题模型他可以将文档的主题以概率的形式给出,训练时不需要手动标记主题。同时,他也是一种词袋模型,他认为每一篇文档都是由一组词构成的(无顺序关系),一篇文档是有多个主题构成,每个主题也是由多个词表示的。他的latent体现在topic是隐藏属性,能够观察到的是词和文档。LDA的核心公式为:\(P(w|d) = P(w|t) * P(t|d)\)

LDA

目前有两类常用的学习算法:1. Sampling-based methods 2. Variational methods。下面只介绍sampling的具体操作过程。

Sampling-based methods

训练过程:

第一步:随机对所有文本的每个词进行主题分配

s1

第二步:构建两个表topic-word和doc-topic,根据前面的赋值关系更新这两个表

s2

第三步:现在根据这两个表,我们可以对每一个词得到一个topic的分布,然后依据这个分布对词的topic进行采样 \(P(t_i) \propto P(t_i|w) * P(t_i|d)\),从而决定新一轮中每个词的topic。

第四步:重复以上操作直到分布收敛(概率稳定)。\(logP(w_1,w_2,…,w_m) = log \sum_{j=0}^T P(w_1|t_j)P(t_j|d_{w_1}) + … + log \sum_{j=0}^T P(w_m|t_j)P(t_j|d_{w_m})\)

预测过程(寻找新的文本的主题):

第一步:随机对所有文本的每个词进行主题分配(同训练时一样操作)

第二步:只更新doc-topic表(直接使用topic-word表)

第三步:同训练一样,利用两个表sample新的topic给每个词

第四步:repeat

注意

  1. 模型中需要多少个topic,也就是主题的数量T是可以自己定义的,T越大模型得到的主题更精细,T越小主题越泛。
  2. 针对两部分概率P(w|t)和P(t|d),我们分别引入b和a两个超参数并使用add-k来做smoothing。举个栗子,上面图示doc-topic表中,给定d1,得到t1的概率原本是2/5,那么现在则是(2 + a)/(5 + a*T),这有什么作用呢?通过a和b的取值,可以控制分布的形状,a和b越大分布越平坦,a和b越小分布越陡峭。实际中,我们希望b取值要较小,这样可以为每个topic得到更精准的一些描述词,我们希望a取值较大,这样一篇文档倾向于有更多的主题。
    ab

模型评估

A. 计算测试集混乱度

ppl

这种方法有明显的弊端,如topic越多或是词典越小则ppl越小(模型越好)。

B. 下游任务检验

推荐!

C. 人为推断方法

大致原理就是在一个topic的词堆中人为加入一个新的词,让用户来判断哪个词是不属于这个topic的

D. PMI

推荐!也就是计算topic词堆中每一对词(或是取topN个词)的互信息(MI)做加和。公式如下

PMI

模型改进

使用词组或是n-gram模型而不是单个的词;学习层级结构的topic;引入文档的label信息……

posted @ 2021-04-15 23:43  MrDoghead  阅读(241)  评论(0编辑  收藏  举报