一、主题模型8 f ^) ?7 m/ N U4 b
在文本挖掘领域,大量的数据都是非结构化的,很难从信息中直接获取相关和期望的信息,一种文本挖掘的方法:主题模型(Topic Model)能够识别在文档里的主题,并且挖掘语料里隐藏信息,并且在主题聚合、从非结构化文本中提取信息、特征选择等场景有广泛的用途。: z4 P/ I! S8 f: l" D, w" b
" l( T2 d( D/ C& \7 o. \% m7 s! @# r
主题可以被定义为“语料库中具有相同词境的词的集合模式”,比如说,主题模型可以 0 r* f* Y& ?- ]) G) q1 M: I$ K, u# f4 v ) q2 _- A; d l/ g+ h将“健康”,“医生”,“病人”,“医院” 集合成 “医疗保健” 主题2 b, ?! U$ b% k" r+ K0 t( U
将 “农场”,“玉米”,“小麦” 集合成 “农业”主题9 Y0 ]( o- K9 r; ^# T! f+ d# h/ r- h
; W- X! Y0 q% t$ U. z
$ Z# t$ G: ^+ E& C9 \2 o+ ~) U: u- J& X0 {* b
( B0 ]6 ~9 t6 [+ W8 L
上面显示了 M2M2 矩阵的情况,它是一个 K∗VK∗V 维的 topic - term矩阵,KK 指主题的数量,VV 指词汇表的大小。M2M2 中每一行都是一个 ϕϕ 分布,也就是主题 ϕkϕk 在 mm 个词上的多项式分布情况,可以通过学习得到。1 I: X; M" ^; `/ c
6 N6 R) Y* X. l2 g7 F
LDA 文档生成流程! Y6 b0 {# _+ B) p* n7 ?8 C' k
LDA 假设文档是由多个主题的混合来产生的,每个文档的生成过程如下:6 R+ B. n. [ s; _4 ]
+ `4 @6 ^0 p1 G* X. D4 Z, D" R
从全局的泊松分布参数为 ββ 的分布中生成一个文档的长度 NN 8 B/ x9 { K) v7 d从全局的狄利克雷参数为 alphaalpha 的分布中生成一个当前文档的 θθ6 q5 K. e: w$ R
对当前文档长度 NN 的每一个字都有/ ~3 b0 Y+ z7 v( o
从 θθ 为参数的多项式分布生成一个主题的下标 znzn7 e+ @: M: A$ y$ x; ]- Z
从 θθ 和 zz 共同为参数的多项式分布中,产生一个字 wnwn9 d* s' R6 y9 }+ ~% Y6 B
这些主题基于词的概率分布来产生词,给定文档数据集,LDA 可以学习出,是哪些主题产生了这些文档。 ( `/ n: f' [4 a; W0 z5 I . a) e! x$ F1 R对于文档生成过程,则有,首先对于文档 nn 中的每一个字,都先从文档矩阵 M1M1 中的 θiθi 中产生一个下标,告诉我们现在要从主题矩阵 M2M2 中的哪一行 ϕmϕm生成当前的字。$ [+ G* t6 t% f: M
' @- t! |4 `& e( V2 E+ s
' q1 P R) T- R* c
训练过程(吉布斯采样) 1 P/ b- T9 V% v" N7 }吉布斯采样 (Gibbs Sampling) 首先选取概率向量的一个维度,给定其他维度的变量值当前维度的值,不断收敛来输出待估计的参数。具体地3 [3 Z2 F2 C6 }' D6 L6 l R
& t' T! @9 g' D$ _3 p
随机给每一篇文档的每一个词 ww,随机分配主题编号 zz 1 \ j9 e5 C, l! V: w6 P2 P. v统计每个主题 zizi 下出现字 ww 的数量,以及每个文档 nn 中出现主题 zizi 中的词 ww的数量( s7 e8 |2 Q: K: R- j" |
每次排除当前词 ww 的主题分布 zizi,根据其他所有词的主题分类,来估计当前词 ww 分配到各个主题 z1,z2,…,zkz1,z2,…,zk 的概率,即计算 p(zi|z−i,d,w)p(zi|z−i,d,w) (Gibbs updating rule))。得到当前词属于所有主题z1,z2,…,zkz1,z2,…,zk 的概率分布后,重新为词采样一个新的主题 z1z1。用同样的方法不断更新的下一个词的主题,直到每个文档下的主题分布θnθn 和每个主题下的词分布 ϕkϕk 收敛。9 H' ?+ [( K3 p
最后输出待估计参数,θnθn 和 ϕkϕk ,每个单词的主题 zn,kzn,k 也可以得到。 " I: }. P4 M5 \; R. ~# Z) R( E# u* B1 c6 ^/ z$ `
* I$ I: ` |# K8 A- X4 j
LDA 对于每个文档的每一个字都有一个主题下标。但从文档聚类的角度来说,LDA 没有一个文档统一的聚类标签,而是每个字都有一个聚类标签,这个就是主题。LDA 每个字都有可能属于不同的类别,每个文档都有可能属于不同的类别。在大量的迭代后,主题分布和字分布都比较稳定也比较好了,LDA 模型收敛。! D3 I- b/ a) v& z+ D
" R! N2 b) ?2 X" n4 [( j3 Q
- ?+ E0 k- F4 {1 y C$ R 6 h3 K8 s$ G5 A三、LDA 的参数3 y- t7 `8 ^0 C( E1 X6 O C7 S
αα :表示 document-topic 密度, αα 越高,文档包含的主题更多,反之包含的主题更少+ g8 E# c, \9 N: e' n. ?
' b* s) d* a1 y$ Z. I$ _' dββ :表示 topic-word 密度, ββ 越高,主题包含的单词更多,反之包含的单词更少# ?. a7 \* F1 J0 a
% K& i7 I4 b$ A; A+ z" \* p
主题数量:主题数量从语料中抽取得到,使用 Kullback Leibler Divergence Score 可以获取最好的主题数量。( l8 Z% t. Q; [3 g# O1 Q
" {- s2 V& w4 r: d
主题词数:组成一个主题所需要的词的数量。这些词的数量通常根据需求得到,如果说需求是抽取特征或者关键词,那么主题词数比较少,如果是抽取概念或者论点,那么主题词数比较多。 % |0 k* W' w2 Y. ^" b# G" E* `5 _3 N' t1 i3 y
迭代次数:使得 LDA 算法收敛的最大迭代次数 t6 z4 Y! |* y& U1 e4 C ( P2 f+ z, n* E X7 @7 R2 X) @ 4 ~' {- Z B' h+ O6 S/ z! L5 p! U2 b- B
四、Running in Python0 D6 }# _. N$ o0 c& e
准备文档集合 & E3 {1 d" Y B8 y5 ~9 S: Ndoc1 = "Sugar is bad to consume. My sister likes to have sugar, but not my father."9 l5 K8 ?$ U" O' ^% K( G
doc2 = "My father spends a lot of time driving my sister around to dance practice." - z7 S# L# q' C. Q1 K! S. k0 qdoc3 = "Doctors suggest that driving may cause increased stress and blood pressure."3 n7 y! o& b1 |% I& N
doc4 = "Sometimes I feel pressure to perform well at school, but my father never seems to drive my sister to do better." ' G" T; ^+ G& Q3 D$ ]& `3 N& W/ ?doc5 = "Health experts say that Sugar is not good for your lifestyle." 1 u( B& o% z4 ~* o! w0 v: f/ b6 v* `0 r5 z2 F2 Y
# 整合文档数据 " W; u# E i+ odoc_complete = [doc1, doc2, doc3, doc4, doc5]# {2 F2 C7 W9 y. F