EdmondFrank's 时光足迹

この先は暗い夜道だけかもしれない それでも信じて進むんだ。星がその道を少しでも照らしてくれるのを。
或许前路永夜,即便如此我也要前进,因为星光即使微弱也会我为照亮前途。
——《四月は君の嘘》

文本建模算法入门-1



文本建模算法入门(一)

0x1 文本建模

文本并不像其他数值型的数据一样可以比较轻易的通过运算、函数、方程、矩阵等来表达他们之间的相互关系。

在处理一篇文本的时候,假设每一个文本储存为一篇文档,那么从人的视角来看,这可以说是一段有序的词序列
统计学家将这些序列的生成,生动地描绘成了一个“上帝的游戏”,即人类产生的所有语料的文本都可以看作是:一个伟大的上帝在天堂中掷骰子形成的。我们所看到的文本其实就是这个游戏掷了若干次后产生的序列。

那么,在这个游戏中,我们最需要关注的两个核心问题就出现了:

  1. 上帝有怎样的骰子?
  2. 上帝是怎么掷的骰子?

对应这两个问题,各大学家持着不同的观点,于是便有了以下三种模型:

  1. Unigram Model
  2. Topic Model(PLSA)
  3. LDA

0x11 Unigram Model

Unigram Model是非常简单直接的,它假设

  1. 上帝只有一个V面的骰子,每一个面对应一个词,同时每个面的概率不一样。(这里可以通过“老千骰子”来理解下,有些面因为被做过了“手脚”,所以抛到的几率就大了,那如果没个面都这样,那么每个面抛到的几率也就不一样了)
  2. 每抛一次骰子,抛出的面就对应有一个词,那么抛n次骰子后,按抛掷顺序产生的序列就生成了一篇n个词的文档

enter image description here

那现在我们把上帝这个唯一的骰子各个面的概率记为,然后我们把掷这个V面骰子的实验记作

那么对应一篇文档d,该文档生成的概率就是

而文档和文档之间我们认为是独立的,所以如果语料中有多篇文档,则该语料生成的概率就是

在Unigram Model中,我们又假设了文档之间是独立可交换的。即,词与词之间的顺序对文档表示并不造成影响,一篇文档相当于一个袋子,里面装着一些词。这样的模型也称为词袋模型(Bag-of-words)。

那么,如果语料中的总词频是N,在N个词中,如果我们关注每一个词的发生次数,则正好是一个多项分布

此时,语料的概率是

0x110 贝叶斯Unigram Model假设

在贝叶斯统计学派看来,上帝拥有唯一一个固定的骰子是不合理的。于是他们觉得以上模型的骰子不应该唯一固定,而应该也是一个随机变量。

那这样我们就可以将整个掷骰子的游戏过程更新成以下形式:

  1. 上帝有一个装着无穷多骰子的罐子,里面有各种骰子,每个骰子有V个面。每一个面对应一个词
  2. 上帝从罐子抽出一个骰子,然后用这个骰子不断的抛,每抛一次骰子,抛出的面就对应有一个词,那么抛n次骰子后,按抛掷顺序产生的序列就生成了一篇n个词的文档
    enter image description here

在以上的假设之下,由于我们事先并不知道上帝用了哪个骰子,所以每个骰子都是有可能被使用的,只是使用的概率由先验分布决定,对每一个具体的骰子,由该骰子产生数据的概率是,所以最终数据产生的概率就是对每个骰子上产生的数据概率进行积分累加求和

在贝叶斯分析的框架之下,此处的先验分布概率其实就是一个多项分布的概率,其中一个比较好的选择即多项分布对应的共轭分布:Dirichlet分布

0x12 PLSA Topic Model

再来回顾Unigram Model我们发现:这个模型的假设过于简单,和人类真实的书写有着较大的差距

从人类视角看,我们在日常构思文章中,我们往往要先确定自己文章的主旨,包含了哪些主题,然后再围绕着这些主题展开阐述。

例如,一篇关于现代教育的文章,它可能就包含了这些主题:教育方法、多媒体技术、互联网等。篇幅上可能以教育方法为主,而其他为辅。然后,在不同的主题里面就包含了许多主题领域内常见的关键词。例如,谈到互联网时,我们会提及Web、Tcp等。

这样一种直观的想法就在PLSA模型中进行了明确的体现,如果我们再利用这个想法更新“掷骰子”的游戏就有以下情形:

  1. 上帝有两种类型骰子,一类是doc-topic骰子,骰子共k个面代表了k个主题;一类是topic-word骰子,骰子V个面,每面对应主题内的一个词
  2. 生成文章的时候,首先要先创造一个特定的doc-topic骰子,使得骰子内的主题围绕文章要阐述的主题
  3. 投掷doc-topic骰子,得到一个主题z
  4. 根据得到的主题z,找到对应的topic-word骰子,投掷它得到一个词
  5. 不断重复3,4步,直至文章生成完成

enter image description here

在上面的游戏规则中,文档与文档之间顺序无关,同一个文档内的词的顺序也是无关的。所以还是一个bag-of-words模型。

那么,在第m篇文档Dm中每个词的生成概率为:

:对应游戏中K个topic-word骰子中第z个骰子对应的词列表

:文档对应的第z个主题,即对应的doc-topic

所以整篇文档的生成概率就为:

0x13 LDA(Latent Dirichlet Allocation)

就像Unigram Model 加入贝叶斯框架那样,doc-topic和topic-word都是模型的参数,即随机变量。于是类似对Unigram Model的改造对以上两个骰子模型加入先验分布。然后由于都对应着多项分布,因此先验分布依旧选择Drichlet分布。于是得到的这个新模型就是LDA(Latent Dirichlet Allocation)模型
enter image description here

在LDA模型中,上帝的游戏规则就又被更新成如下情形:

  1. 上帝有两个罐子,第一个装着都哦doc-topic骰子,第二个装着topic-word骰子
  2. 上帝随机的从第二个罐子中独立抽出K个topic-doc骰子,编号1-K
  3. 每次生成新文档时,从第一个罐子随机抽一个doc-topic骰子
  4. 投掷得到的doc-topic骰子。得到一个主题编号z
  5. 在K个主题骰子里面选择编号为z的骰子,投掷骰子,得到一个词
  6. 重复4,5步,直至文档生成完成

0x2 后记

至此,入门篇(一)的内容就写到这了。由于是第一篇,文章中避过了许多较为复杂的数学证明和计算,尤其是关于LDA模型的。这样是为了,先建立对文本建模思路和过程的直观认识,而不是一上来就深究细节。

加上笔者目前也是在学习阶段,后面的细节再慢慢地一一补充,大家共同进步 !!
\(^_^)/