LDA(Latent Dirichlet Allocation)
LDA包含隐藏的主题。但是我们为什么要用隐藏主题,自己定义主题不好吗?有两方面原因:
1.我们不知道自己的定义的主题是否符合规模。如果对每个单词都定以个主题,粒度就太细,没有多样性。如果以大方向(如NBA)为一个主题,那么就太大太空,用户很难一下找到自己喜欢的东西。
2.基于上述理由,我们就想:那么定义个适中的主题粒度不就行了?但是,人怎么定义这些不大不小粒度的主题?而且有些抽象主题是融合了人类主观上的多个主题的加权联合主题,人类很难进行语言描述(比如可能是个50%的苹果+50%的科技的联合抽象主题)。就算我们给定了主题的数量(比如1000),人很难合理恰当地分出1000个主题来。
而LDA就能对给定的主题数量,学习出恰当地隐藏主题。虽然说主题是隐藏的,但是我们可以根据主题-单词分布,找出概率较高的单词,给这个主题加一些标签,相当于对这个主题进行了可视化。
重要数学公式:
伽马函数:
二项分布:
beta分布:
Beta分布的期望:
Dirichlet分布的期望:
多项式分布:
dirichlet distribution:
LDA的应用:
(1)Peacock:大规模主题模型及其在腾讯业务中的应用
(2)文档匹配
就是给你两篇文档,你计算出它门的文档-主题概率分布,然后计算距离:
(3)自动文档加标签
计算文档的文档-主题概率分布,找出最大概率的主题,从该概率主题中找出概率最大的几个单词,就是该文档的标签
(4)文档推荐系统
分为两种方法:
(a)收集用户喜欢的文档,对文档-topic矩阵按列求和,得到各个topic的权重,然后用这个权重点乘上每个文档的文档-topic向量,得到对这篇文档的打分,选择打分高的文档推荐给用户。可能单个用户喜欢的文档较少,需要把用户分组,增加文档数。
(b)上面的那个方法不便于动态更新,这里举个可以动态更新的方法。首先初始化用户对各个topic的喜爱程度为0,然后每当用户浏览一篇文档,计算得到文档主要的几个topic,然后在把用户喜爱的topic向量中相应的值加1。这样,我们就存储好了用户对各个topic的喜爱程度,并且能够不断更新。推荐的时候可以按照上一条方法。
(5)主题排序
主题排序可以算是热门主题推荐。如果一个topic是随机的,那么它在每个文档中出现的概率会差不多,而且每个词出现在该主题的概率也差不多,所以可以计算主题-文档分布和主题-单词分布和平均分布之间的欧几里得距离,然后对两个距离加权求和。距离越近说明主题越没有特色。
(6)单词排序
原理和上条一样,可以得到特色鲜明的词语。主要应用场景是:我们想给用户推荐关键词,那么像"我""你"这种词就没有特色,在排序中会被排在比较靠后的位置,我们更想推荐更有特色的词,比如当前实时的关键词,那么排序靠前的词更符合要求。这里我们主要计算单词-主题分布和平均分布的距离,不考虑单词-文档分布和平局分布的距离。
(7)word embedding
把单词表示为单词-topic分布,也就是每个单词可以表示为给定单词上topic概率分布的向量。纯属脑洞。