; k2 g/ J1 W: ]/ e训练过程(吉布斯采样) " S/ d. B: `2 G( ?吉布斯采样 (Gibbs Sampling) 首先选取概率向量的一个维度,给定其他维度的变量值当前维度的值,不断收敛来输出待估计的参数。具体地 7 v. \. p+ H9 {9 D" Q & M# j0 e- J: W3 L随机给每一篇文档的每一个词 ww,随机分配主题编号 zz" n U. B( r. J" |& c
统计每个主题 zizi 下出现字 ww 的数量,以及每个文档 nn 中出现主题 zizi 中的词 ww的数量$ z3 J& x3 S+ q6 D1 ?2 }* q& z
每次排除当前词 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 l! K9 d* `5 h& J
最后输出待估计参数,θnθn 和 ϕkϕk ,每个单词的主题 zn,kzn,k 也可以得到。 : }4 U P# x0 T3 m$ K: X D7 J0 Z, n
* M5 ^. V! m- e0 Z( y* d
LDA 对于每个文档的每一个字都有一个主题下标。但从文档聚类的角度来说,LDA 没有一个文档统一的聚类标签,而是每个字都有一个聚类标签,这个就是主题。LDA 每个字都有可能属于不同的类别,每个文档都有可能属于不同的类别。在大量的迭代后,主题分布和字分布都比较稳定也比较好了,LDA 模型收敛。* e, e0 j1 ~9 {1 v/ ?
# ]- l2 z2 W) ~1 p" I
( M; R/ p4 ^; d- Q, Z' U# k* X1 b7 A! T! K9 z2 R) J3 a
三、LDA 的参数 ) ~7 H/ B" a% t' h W* hαα :表示 document-topic 密度, αα 越高,文档包含的主题更多,反之包含的主题更少8 |- E+ ], T, H$ b* N* o* L
, |4 F' M* x, S, f/ p. }3 ]ββ :表示 topic-word 密度, ββ 越高,主题包含的单词更多,反之包含的单词更少# F6 A" _0 z- y( V7 ^. o" w8 _
( t* Z$ A" b5 k( ?& s3 C$ l
主题数量:主题数量从语料中抽取得到,使用 Kullback Leibler Divergence Score 可以获取最好的主题数量。 , f2 w4 q% Q- C4 P9 t5 ]2 S# D; L' p/ D# w" o
主题词数:组成一个主题所需要的词的数量。这些词的数量通常根据需求得到,如果说需求是抽取特征或者关键词,那么主题词数比较少,如果是抽取概念或者论点,那么主题词数比较多。 . E6 e2 g3 t( A; e8 @9 I* I$ J. [2 m; D+ M
迭代次数:使得 LDA 算法收敛的最大迭代次数7 Z9 v# g: T) M5 V1 Z2 ~4 h: Q+ D
p* g+ r4 z2 o7 r; W5 N) H8 t( f- B8 J8 o( c
" R2 s3 R2 ~" Z: k: d. n
四、Running in Python + @6 D. y) }0 A" g. f% s& X准备文档集合 ! I, @3 `8 m& V8 X' Q# Udoc1 = "Sugar is bad to consume. My sister likes to have sugar, but not my father."- ^" @4 h! ~# c/ A8 v& U) \5 w8 I3 D
doc2 = "My father spends a lot of time driving my sister around to dance practice.": o9 q# W e$ b1 F, v: s+ W0 |2 ^
doc3 = "Doctors suggest that driving may cause increased stress and blood pressure." ( ~0 y0 n6 r/ I: \! T0 Gdoc4 = "Sometimes I feel pressure to perform well at school, but my father never seems to drive my sister to do better."" q j# H' ]. T( ~
doc5 = "Health experts say that Sugar is not good for your lifestyle."! e; i5 H3 x; v/ N- T! Z1 _1 Z* p
2 v- d. _) j8 o1 h# 整合文档数据 0 F% G. S* f/ ?3 r$ K& Tdoc_complete = [doc1, doc2, doc3, doc4, doc5] . N Q3 @ U2 O/ d/ r; C& z8 p, B/ W
数据清洗和预处理 1 h; P3 G3 U) K* j, i/ A数据清洗对于任何文本挖掘任务来说都非常重要,在这个任务中,移除标点符号,停用词和标准化语料库(Lemmatizer,对于英文,将词归元)。9 C. t: K; U! Q) @& W- Y$ S8 n: h( k' P
6 U1 N# V L4 k6 k" B" i- E- H
from nltk import stopwords 8 r2 a0 d6 S4 `" V7 cfrom nltk.stem.wordnet import WordNetLemmatizer # f A7 v7 w! d' Vimport string * _% K& s5 J% z' }: ^$ P) w* h0 C" T" k$ {
stop = set(stopwords.words('english'))! U/ a6 P0 C) m e, R. Y
exclude = set(string.punctuation) , T9 M) X. I. K# ~9 k- Vlemma = WordNetLemmatizer()2 q7 Q/ C! D9 S: \
) m0 E+ g9 A$ E9 ddef clean(doc): ( f+ e6 c, v# H. B4 Z6 j! i) G stop_free = " ".join([i for i in doc.lower().split() if i not in stop])( d! d w1 y$ ~
punc_free = ''.join(ch for ch in stop_free if ch not in exclude) - u+ e; O7 Y) M6 d7 B6 ^8 w normalized = " ".join(lemma.lemmatize(word) for word in punc_free.split())/ C1 X4 `. w1 }! j2 O, z* ~
return normalized( U9 k' B- h; b& M4 `8 w& }6 S+ A
% m/ J) O+ k: Rdoc_clean = [clean(doc).split() for doc in doc_complete] $ S" o! x+ G( k4 ?" N6 v' L0 G# }* C3 Q! D/ m; u8 D" m
准备 Document - Term 矩阵 9 z$ k# ^3 a4 Q( p语料是由所有的文档组成的,要运行数学模型,将语料转化为矩阵来表达是比较好的方式。LDA 模型在整个 DT 矩阵中寻找重复的词语模式。Python 提供了许多很好的库来进行文本挖掘任务,“genism” 是处理文本数据比较好的库。下面的代码掩饰如何转换语料为 Document - Term 矩阵: : L+ S L( }% k- X, U6 i. V' X; w2 Q; o3 H- d+ L$ }; N: O# K
import genism ( V1 e/ _& j/ W9 [, R) {: @$ hfrom gensim import corpora ( i1 |& J; P3 f% W, Q5 s6 Q K3 @5 c5 n
# 创建语料的词语词典,每个单独的词语都会被赋予一个索引 " [: [6 F. {! Gdictionary = corpora.Dictionary(doc_clean)# i* {- {4 D0 F- l1 y; V* `
" O8 m, B. W2 F, ?% q& A( I
# 使用上面的词典,将转换文档列表(语料)变成 DT 矩阵& I, d6 |! r4 P
doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean] - {; J) }/ \4 {8 D1 g! X' c4 N, Z' n. R, U( p
构建 LDA 模型 ! S. d& |6 X/ @9 F$ g8 O创建一个 LDA 对象,使用 DT 矩阵进行训练。训练需要上面的一些超参数,gensim 模块允许 LDA 模型从训练语料中进行估计,并且从新的文档中获得对主题分布的推断。& m( ^1 O/ c' s$ f* [
1 \/ u& v% b; I# E. S+ Z
# 使用 gensim 来创建 LDA 模型对象 K4 q9 P! h- `3 o
Lda = genism.models.ldamodel.LdaModel! ` ^! h2 |* f6 n1 b! {& D