( l% D+ \+ d t7 ?9 l6 M四、Running in Python 5 \/ B0 i8 A9 z0 T- g准备文档集合9 X. O! X2 N: o3 R
doc1 = "Sugar is bad to consume. My sister likes to have sugar, but not my father." , v7 V( v% }6 S9 j" b; r* Kdoc2 = "My father spends a lot of time driving my sister around to dance practice." : [9 V% `. s' S" u. u) R' hdoc3 = "Doctors suggest that driving may cause increased stress and blood pressure." 5 [6 o* T7 i# S% l: p' adoc4 = "Sometimes I feel pressure to perform well at school, but my father never seems to drive my sister to do better." ! B+ X* Q/ I. }doc5 = "Health experts say that Sugar is not good for your lifestyle." 4 d- A+ p. f1 j' t: e) ?3 B- _5 L1 L2 M2 Y' h/ R8 }
# 整合文档数据* G. O8 y+ n% T+ i+ E0 r
doc_complete = [doc1, doc2, doc3, doc4, doc5]4 b$ }( }. Y1 Q, d4 ^* _1 }7 p
7 [% E6 N9 D0 Y1 T" Y: s2 l' [: Wfrom nltk import stopwords, c% U& _0 P) s2 {, A/ u/ \' c
from nltk.stem.wordnet import WordNetLemmatizer. x( V4 O1 v/ ~5 o# Y5 N% i
import string4 j9 q. [2 y: I; K
7 d8 e* l5 Z. s: b; }
stop = set(stopwords.words('english')) - D2 `3 G I8 D/ ?8 P% sexclude = set(string.punctuation)2 t5 v0 s9 ?# _, N9 h) f
lemma = WordNetLemmatizer()" ?: [6 T1 Y( I3 N( q) k
9 I% x. ~8 A, [" H+ j& [def clean(doc): 2 l& y, r/ h9 F( ~3 d! J4 K. O stop_free = " ".join([i for i in doc.lower().split() if i not in stop]) . n: n3 ]5 U( M6 K' s! S9 B punc_free = ''.join(ch for ch in stop_free if ch not in exclude) , a3 R! ]1 H7 A4 U$ _* D6 N/ t normalized = " ".join(lemma.lemmatize(word) for word in punc_free.split()) I" [, G/ ]; c. N return normalized5 E: K) z) R R! }
: ?3 [1 [" Y) k' G
doc_clean = [clean(doc).split() for doc in doc_complete] ) K$ K' K9 c2 J: ` $ B' B/ |% u+ _3 n* O _; Z准备 Document - Term 矩阵4 f1 g" b7 f! m% D4 V% V9 b
语料是由所有的文档组成的,要运行数学模型,将语料转化为矩阵来表达是比较好的方式。LDA 模型在整个 DT 矩阵中寻找重复的词语模式。Python 提供了许多很好的库来进行文本挖掘任务,“genism” 是处理文本数据比较好的库。下面的代码掩饰如何转换语料为 Document - Term 矩阵:, R/ @/ V/ B4 H3 {6 N1 e) x/ f
) }8 x& S; `% l7 \) qimport genism' R5 c* M" m0 c4 P* J) Q
from gensim import corpora , s7 `7 f9 e3 }1 s- v0 o# _4 b( M3 G: D6 d7 w; c! r' b( ^# _9 P
# 创建语料的词语词典,每个单独的词语都会被赋予一个索引: U _; G& ~1 m# g( v, f: z
dictionary = corpora.Dictionary(doc_clean) $ s* S6 B4 _- I" E S; E( q2 R9 s" h1 l" w% E
# 使用上面的词典,将转换文档列表(语料)变成 DT 矩阵: J3 c" r; z9 l5 Q2 h
doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean]% u2 |' l/ s9 W5 f* ^, b
) C, G" {* n) i. Y构建 LDA 模型3 V/ s5 w" Q R5 x( \8 V6 o
创建一个 LDA 对象,使用 DT 矩阵进行训练。训练需要上面的一些超参数,gensim 模块允许 LDA 模型从训练语料中进行估计,并且从新的文档中获得对主题分布的推断。' w ^: o g3 A. F: b
: [( ^% o( Z' }3 O/ O1 ?* b
# 使用 gensim 来创建 LDA 模型对象 9 n4 [8 l) I3 l) NLda = genism.models.ldamodel.LdaModel 1 Y3 J, W( R( C1 L! T0 c+ g ' a U- q% M' v4 o: @& }' @$ k y) e# 在 DT 矩阵上运行和训练 LDA 模型/ M }) `3 W! i3 w
ldamodel = Lda(doc_term_matrix, num_topics=3, id2word = dictionary, passes=50)0 N5 [( U( V& f3 H A
5 ], a+ ?8 M: \8 P0 w
结果 0 m4 ]2 Q( ^; p' F3 D2 y2 [# 输出结果 * s) ?8 g% l, A( g2 Hprint(ldamodel.print_topics(num_topics=3, num_words=3))# N( s% Z0 i; \# n; S- V
8 g I+ ^1 p/ F2 C t[ ( |: }; K, V# r/ j* n L '0.168*health + 0.083*sugar + 0.072*bad, e6 @ u( M- ]7 _ '0.061*consume + 0.050*drive + 0.050*sister,5 K8 j) B- W) z2 @) I" e; e
'0.049*pressur + 0.049*father + 0.049*sister & c& S3 r0 D" z V% X7 ^]- C2 y2 M5 z, E( A
每一行包含了主题词和主题词的权重,Topic 1 可以看作为“不良健康习惯”,Topic 3 可以看作 “家庭”。* p' f2 r; L+ {
& {% t# V3 m9 q, ^$ u! t五、提高主题模型结果的一些方法 N+ L: \3 Z' x0 P6 t* J) E
主题模型的结果完全取决于特征在语料库中的表示,但是语料通常表示为比较稀疏的文档矩阵,因此减少矩阵的维度可以提升主题模型的结果。 x, i; ?1 s9 H" N( w' S# i* W