# M; V2 u$ t `4 h5 ^! x( \主题词数:组成一个主题所需要的词的数量。这些词的数量通常根据需求得到,如果说需求是抽取特征或者关键词,那么主题词数比较少,如果是抽取概念或者论点,那么主题词数比较多。 5 n; B% {; l/ s 6 Y, M; h% D/ }$ ?- r' j5 U迭代次数:使得 LDA 算法收敛的最大迭代次数 & m2 d( q, t1 u8 k% Q - e( J! \; m+ e) A; p/ H. \) u9 A- O) M( o' N3 @3 f! ?9 z* t
% G' n( L# o0 G0 n; F四、Running in Python ) t' o0 e/ n4 U/ x- r% |; i准备文档集合 & F# b- _$ _8 T7 ?; tdoc1 = "Sugar is bad to consume. My sister likes to have sugar, but not my father." 9 j) v9 H: y$ `2 D' S; E3 S( Mdoc2 = "My father spends a lot of time driving my sister around to dance practice."- Y( c( o4 l; D4 b; X
doc3 = "Doctors suggest that driving may cause increased stress and blood pressure." / m% @' N K8 A% W3 p3 Ddoc4 = "Sometimes I feel pressure to perform well at school, but my father never seems to drive my sister to do better." & f1 Y- E0 ~& _8 i. q4 {4 D3 [doc5 = "Health experts say that Sugar is not good for your lifestyle."6 l+ A: n% w5 s' {0 l
" d! w7 B g6 W6 \" g* p# 整合文档数据 # R, F( w3 B" \$ Q3 H# X9 s8 `8 mdoc_complete = [doc1, doc2, doc3, doc4, doc5] 6 X# e7 P% R/ r2 m+ i: v, b; B* ? " m7 u: `; n- G数据清洗和预处理9 x5 j/ ~. }+ J% ?
数据清洗对于任何文本挖掘任务来说都非常重要,在这个任务中,移除标点符号,停用词和标准化语料库(Lemmatizer,对于英文,将词归元)。 $ K- V3 b+ U! V& ]' I- x" p% S8 ?1 f6 a
from nltk import stopwords" b9 B" e" z6 s3 [: ]
from nltk.stem.wordnet import WordNetLemmatizer7 a# g/ p* ^! ^9 W& ?, z! d1 Z% w0 J
import string 7 N0 p+ ]* z5 B# E; j% Y / { m- @7 f K* u$ r* ^% Bstop = set(stopwords.words('english'))8 m) H) A9 B% q0 B p
exclude = set(string.punctuation) 8 S2 N' V" Y+ F4 `* \; ~$ W# Plemma = WordNetLemmatizer() 2 ~% ^4 t7 x9 O# A. m. w- T) H. p8 y+ h6 L& [# v
def clean(doc):. K4 ^" H, {& H% \
stop_free = " ".join([i for i in doc.lower().split() if i not in stop]) 1 [; U2 c5 }9 T8 s6 O$ P& M punc_free = ''.join(ch for ch in stop_free if ch not in exclude), T1 d" r4 A# R; k; m
normalized = " ".join(lemma.lemmatize(word) for word in punc_free.split()) ) c$ j/ q$ \' V' n1 j return normalized) w! P; L3 ~- b
7 [$ q, }, O& k" Ndoc_clean = [clean(doc).split() for doc in doc_complete]9 T; K" Q) ]) m8 x3 P7 E R
, F3 @7 b- l- J( Y
准备 Document - Term 矩阵7 G z: I6 P( G5 b
语料是由所有的文档组成的,要运行数学模型,将语料转化为矩阵来表达是比较好的方式。LDA 模型在整个 DT 矩阵中寻找重复的词语模式。Python 提供了许多很好的库来进行文本挖掘任务,“genism” 是处理文本数据比较好的库。下面的代码掩饰如何转换语料为 Document - Term 矩阵: + M2 N4 N6 k+ H2 ?0 D" } f+ e: i$ E" D. M& I$ L+ r! G
import genism' F& d2 D& T& O* r6 y6 N6 Q
from gensim import corpora+ x1 D! |! d( A; |( A
8 P# f/ @) T4 X( E6 E) T6 S: r
# 创建语料的词语词典,每个单独的词语都会被赋予一个索引! G6 U7 a* h2 u8 u& x
dictionary = corpora.Dictionary(doc_clean)0 \6 W" q) `5 B2 t2 F
1 f5 u# o ]& I k* n5 L) X
# 使用上面的词典,将转换文档列表(语料)变成 DT 矩阵; ?3 h- ~6 I8 g5 ~2 c& C s. R* H6 |
doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean] 6 }( Q s* Q# K7 O/ u* g& x/ y1 T6 v: I6 }* j! b0 S5 C5 |
构建 LDA 模型 8 l; ?& X' w8 p" B$ K* X1 B' Q" {创建一个 LDA 对象,使用 DT 矩阵进行训练。训练需要上面的一些超参数,gensim 模块允许 LDA 模型从训练语料中进行估计,并且从新的文档中获得对主题分布的推断。 * |% E3 f* F7 G( c" v* ]8 r * Y1 a2 q4 |1 u( [! g# 使用 gensim 来创建 LDA 模型对象 0 \7 M5 Z( _# wLda = genism.models.ldamodel.LdaModel& N) P; h P: Z/ B
* S7 d# E7 D* N, V$ ^" l$ x# 在 DT 矩阵上运行和训练 LDA 模型9 l& B* n+ L, w) ~* C$ l* s
ldamodel = Lda(doc_term_matrix, num_topics=3, id2word = dictionary, passes=50)2 u7 ?2 E/ }' q6 E9 l
1 P/ w, ^# ?: N1 `- E; b# j% t
结果5 F! R* e9 C; E
# 输出结果- r' q+ K% u' A I( v2 O& L9 y
print(ldamodel.print_topics(num_topics=3, num_words=3)) 6 C6 `6 X% M0 |6 s6 o3 j 5 ~3 q4 U+ }: B% }[: ^ w6 Z; F) e' o0 L$ \4 q! B
'0.168*health + 0.083*sugar + 0.072*bad, ) q+ s0 M7 {, |$ E F4 P '0.061*consume + 0.050*drive + 0.050*sister,9 O# Z# u3 r) a
'0.049*pressur + 0.049*father + 0.049*sister 5 U7 d. L3 S, B- k5 g] 1 l( j) ^& B8 x& d每一行包含了主题词和主题词的权重,Topic 1 可以看作为“不良健康习惯”,Topic 3 可以看作 “家庭”。# Q; }% b& Z3 ^0 m3 b3 f4 o; g
% F+ x, G& f6 [; H+ N' {
五、提高主题模型结果的一些方法 - w, T- w/ }% [8 H b7 q+ {主题模型的结果完全取决于特征在语料库中的表示,但是语料通常表示为比较稀疏的文档矩阵,因此减少矩阵的维度可以提升主题模型的结果。 . l+ r1 B0 ]' w. h% d 9 o$ O5 ]& j+ U, F l% J4 B, i1. 根据词频调整稀疏矩阵 $ i! m* @! E$ |$ T; ~6 u" h9 S根据频率来分布词,高频词更可能出现在结果中,低频词实际上是语料库中的弱特征,对于词频进行分析,可以决定什么频率的值应该被视为阈值。/ L L" q; |# }9 E 6 z, p# ~1 R9 J, I9 b% m; k
2. 根据词性标注 (Part of Speech Tag) 调整稀疏矩阵 ( u3 l8 }$ x' P( G6 L$ o比起频率特征,词性特征更关注于上下文的信息。主题模型尝试去映射相近的词作为主题,但是每个词在上下文上有可能重要性不同,比如说介词 “IN” 包含 “within”,“upon”, “except”,基数词 “CD” 包含:许多(many),若干(several),个把(a,few)等等,情态助动词 “MD” 包含 “may”,“must” 等等,这些词可能只是语言的支撑词,对实际意义影响不大,因此可以通过词性来消除这些词的影响。 3 R# ~, r% q7 v4 ?% X 2 T3 w5 Q# N) w8 C& K! i3. 调整 LDA 的 Batch 大小 8 ~! `! l" a3 F. u4 e. t9 h为了得到主题中最重要的主题词,语料可以被分为固定大小的 batch,在这些 batch 上运行 LDA 模型会提供不同的结果,但是最佳的主题词会在这些 batch 上有交集。1 ~- ]$ i0 W, A. M8 {7 E
9 G N" ]1 q. ~4 X5 r, v% J
主题模型用于特征选择 0 [3 w0 C2 r1 f( V$ B比如说文本分类任务中,LDA 可以用来选择特征,因为训练数据中含有类别信息,可以在不同类别的结果中,删除相同的、比较常见的主题词,为主题类别提供更好的特征。* O$ j$ ~. \4 D* h7 z