: O5 P9 c8 V7 `6 R; A* x \, q; n- j0 ^
四、Running in Python # ^1 T) K. b. H' V准备文档集合) B) @( p$ X1 V+ k5 ?& D
doc1 = "Sugar is bad to consume. My sister likes to have sugar, but not my father."" u% g4 O% g; U- F$ N9 d- D) R7 m* j; T
doc2 = "My father spends a lot of time driving my sister around to dance practice."; Q/ N3 L; E5 h
doc3 = "Doctors suggest that driving may cause increased stress and blood pressure." ' w6 j3 n$ ^5 fdoc4 = "Sometimes I feel pressure to perform well at school, but my father never seems to drive my sister to do better." ( t0 s6 m5 K" b: vdoc5 = "Health experts say that Sugar is not good for your lifestyle." , T+ D w6 C+ n6 A3 m " R1 U, z+ J8 [) t$ T5 _# 整合文档数据 f6 O9 A+ [/ n* bdoc_complete = [doc1, doc2, doc3, doc4, doc5] * I: M, t9 o m* X' ]3 d 2 B2 O$ {1 E! Y2 V- |! i数据清洗和预处理5 c5 p1 ? L, A M1 X4 b' `" B
数据清洗对于任何文本挖掘任务来说都非常重要,在这个任务中,移除标点符号,停用词和标准化语料库(Lemmatizer,对于英文,将词归元)。 + L. }2 S+ s2 y7 [ 9 B5 ]1 u$ l! D bfrom nltk import stopwords/ \& o. I* x. j7 |/ L K$ E
from nltk.stem.wordnet import WordNetLemmatizer 2 B9 ]0 U4 F/ E% m) y, P0 ]* u9 wimport string* i/ c! w% ?/ k* w$ D) d% ?7 Y4 ^
3 R5 ?/ [0 P- c5 [stop = set(stopwords.words('english'))2 k/ r4 ]; Z5 \; c7 Q6 s
exclude = set(string.punctuation)( Y+ P0 C) ~. G. B
lemma = WordNetLemmatizer() V% Y* G% ~6 u- B; H1 P) U
! S" C3 C* u5 W- v- O+ M
def clean(doc):( A' v* w2 V; x4 {
stop_free = " ".join([i for i in doc.lower().split() if i not in stop])- r4 c& Y9 u M( Q( ]* d8 w+ E
punc_free = ''.join(ch for ch in stop_free if ch not in exclude)8 A; _) A u4 U+ H0 k! L
normalized = " ".join(lemma.lemmatize(word) for word in punc_free.split())6 g% A* y) _ R
return normalized 1 S' T5 ?8 F; ?* y2 {; `# x& c' M! f6 d/ d4 z7 p: p
doc_clean = [clean(doc).split() for doc in doc_complete]6 A P0 B0 }# C6 O# S. q: T% w M
6 P, @* ]% h( F: a/ \0 {3 `+ g
准备 Document - Term 矩阵 / K5 F( R8 E$ k* j6 `2 p$ g6 v语料是由所有的文档组成的,要运行数学模型,将语料转化为矩阵来表达是比较好的方式。LDA 模型在整个 DT 矩阵中寻找重复的词语模式。Python 提供了许多很好的库来进行文本挖掘任务,“genism” 是处理文本数据比较好的库。下面的代码掩饰如何转换语料为 Document - Term 矩阵:$ M2 `( ]2 W( g2 ` ]- M
9 u; v7 F0 c+ B3 k+ dimport genism4 K9 y6 V5 @, R* R$ O& `
from gensim import corpora9 W. [: J b+ w7 M+ O
( |; }% z+ n J9 U2 X/ K S( d* S# 创建语料的词语词典,每个单独的词语都会被赋予一个索引0 g% C( l' f( ^
dictionary = corpora.Dictionary(doc_clean) 5 p. a' ]. u3 @; G; h! ?4 t: _- ? T P
# 使用上面的词典,将转换文档列表(语料)变成 DT 矩阵, i0 E( F3 Z5 P0 z8 H
doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean] 0 N/ E, b3 v+ y# v, B1 y- \. p 5 a# J ^8 Q1 P8 v6 V1 \# _- r构建 LDA 模型5 F2 K& E) f6 h( Z3 ^/ H" z% z
创建一个 LDA 对象,使用 DT 矩阵进行训练。训练需要上面的一些超参数,gensim 模块允许 LDA 模型从训练语料中进行估计,并且从新的文档中获得对主题分布的推断。 # ~8 h; q8 h: S+ v/ m* _5 B6 @/ n1 T
# 使用 gensim 来创建 LDA 模型对象. r" {* R: k( Z) Z9 B. K: _
Lda = genism.models.ldamodel.LdaModel0 \1 j% l7 w- f& C
, P2 y9 w* s: q' G d* W1 G {# 在 DT 矩阵上运行和训练 LDA 模型 ' l; O8 m, q* f& A) c: G; aldamodel = Lda(doc_term_matrix, num_topics=3, id2word = dictionary, passes=50) 2 y0 S( h; W; O- _) y( Y5 W' g9 n8 `, q# C6 u9 Z9 ^1 A
结果5 P. P# d' `- w7 \. i$ B2 ?5 S
# 输出结果 # W! q8 |, U/ y- i1 Oprint(ldamodel.print_topics(num_topics=3, num_words=3)) F8 \& m t3 H. K l; a ; s. U" G! w, T& J8 S/ ~[% o5 ~- D1 N8 `: h0 B: ]
'0.168*health + 0.083*sugar + 0.072*bad,* P# U9 B: z; K
'0.061*consume + 0.050*drive + 0.050*sister,: N8 ]' j6 @5 a' N' d8 x
'0.049*pressur + 0.049*father + 0.049*sister) ~; E' n$ F1 f. `7 r6 N% E
] ) O3 w8 F/ H1 _# m每一行包含了主题词和主题词的权重,Topic 1 可以看作为“不良健康习惯”,Topic 3 可以看作 “家庭”。4 R0 Q, T1 U0 A z/ J1 X0 p