, d& {4 y8 B2 Z( m/ m% A" s, N迭代次数:使得 LDA 算法收敛的最大迭代次数 ^3 b2 J) V, c7 N8 l' K( l 6 U- `9 k6 v6 C8 ? . P2 z& M2 W5 X# y0 C 4 a+ p0 b$ z L3 w四、Running in Python 4 T- }) [6 E3 f% z9 x准备文档集合 % h" [/ u& q6 Q4 u, N( `doc1 = "Sugar is bad to consume. My sister likes to have sugar, but not my father."+ F- |2 H- S+ i; R Q$ \6 \2 g
doc2 = "My father spends a lot of time driving my sister around to dance practice." " z( V ?) g5 I7 b- Rdoc3 = "Doctors suggest that driving may cause increased stress and blood pressure." ; i# T5 s5 Q# f k5 ddoc4 = "Sometimes I feel pressure to perform well at school, but my father never seems to drive my sister to do better." 6 h' B/ |) ]$ `5 v8 M! c% Ydoc5 = "Health experts say that Sugar is not good for your lifestyle." 7 c: d W8 z+ H5 C& k z ; ]0 K8 j+ S/ T# H6 O# M# 整合文档数据5 r2 a+ k$ N9 Q/ T) q) Z; t0 P+ E- w
doc_complete = [doc1, doc2, doc3, doc4, doc5]5 n8 M( c# @4 A% I
) c2 D9 s' Y+ p数据清洗和预处理% ~ h# N; t5 W
数据清洗对于任何文本挖掘任务来说都非常重要,在这个任务中,移除标点符号,停用词和标准化语料库(Lemmatizer,对于英文,将词归元)。 # L7 }7 q0 s) O/ l: m" O! a) o' m: T: C0 @
from nltk import stopwords& H5 v5 L% k; k( r5 T6 d8 ^; U$ U
from nltk.stem.wordnet import WordNetLemmatizer + }0 Y5 d" D& k1 Rimport string + {1 ?1 c) P6 T3 }6 S & w# a0 O) C) y8 i1 \: pstop = set(stopwords.words('english')) / P+ U% Z& p( {% c! ?- ?exclude = set(string.punctuation)! B8 O6 q( H1 [; M7 m' U
lemma = WordNetLemmatizer() 4 { d: r1 E# r* N2 r3 t; G$ X% A1 O
def clean(doc):- j- s1 |6 Z2 C0 h0 q
stop_free = " ".join([i for i in doc.lower().split() if i not in stop])% S1 n* S0 J/ H4 Z) k
punc_free = ''.join(ch for ch in stop_free if ch not in exclude) ) L1 T) N, g0 R& A normalized = " ".join(lemma.lemmatize(word) for word in punc_free.split())! P* K0 _* Y1 s9 X3 l
return normalized/ w/ l( ?; u+ o8 P" y' |/ `
0 e% E9 b& |* S! K. D# j) L
doc_clean = [clean(doc).split() for doc in doc_complete] 7 i1 ?' M, }' V* P$ S " |$ x) t6 E- D6 u! t. I) M准备 Document - Term 矩阵 0 ]$ D2 D8 P7 f7 J: S语料是由所有的文档组成的,要运行数学模型,将语料转化为矩阵来表达是比较好的方式。LDA 模型在整个 DT 矩阵中寻找重复的词语模式。Python 提供了许多很好的库来进行文本挖掘任务,“genism” 是处理文本数据比较好的库。下面的代码掩饰如何转换语料为 Document - Term 矩阵: + I9 N8 k, K' x% V6 A) Y # |/ E: M: F1 v0 Ximport genism % P$ l2 v; u9 Xfrom gensim import corpora " L3 i6 F0 j9 x! E6 t' S0 v) H) M# C5 q: A8 {) m8 I- {/ t' A! n
# 创建语料的词语词典,每个单独的词语都会被赋予一个索引 8 N" |- M, b) Z3 ]dictionary = corpora.Dictionary(doc_clean) , L) V, i8 Q/ {7 h+ D 7 M6 i5 |% u: d/ Y1 r* Z2 u( Q# 使用上面的词典,将转换文档列表(语料)变成 DT 矩阵 ' i. t* h: [: [2 q2 `doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean]! }: n1 ~8 N& u- _, `
) C3 i1 [/ G6 i
构建 LDA 模型4 p# a. b9 s% o5 i; j
创建一个 LDA 对象,使用 DT 矩阵进行训练。训练需要上面的一些超参数,gensim 模块允许 LDA 模型从训练语料中进行估计,并且从新的文档中获得对主题分布的推断。4 F, \6 I4 C' O/ C6 M$ a
# I6 B3 |6 J- S9 P
# 使用 gensim 来创建 LDA 模型对象5 L2 O) n: f9 @
Lda = genism.models.ldamodel.LdaModel , W h, L; f0 f A0 P2 }( N3 m2 M2 H( ]# 在 DT 矩阵上运行和训练 LDA 模型; E1 b1 v: H9 [8 I0 }& G
ldamodel = Lda(doc_term_matrix, num_topics=3, id2word = dictionary, passes=50)& _- o( u5 [% N! w1 f
. z+ K4 y8 o: I; S8 O
结果 9 r# B* w5 T) j# h1 ~ a) T# 输出结果5 m5 m0 N2 O9 F$ b. F0 P8 E
print(ldamodel.print_topics(num_topics=3, num_words=3))% W1 \9 |/ {4 |8 Y) V! T# m% Q
+ B5 w% q1 w; \6 K1 `+ z
[' R* J0 g+ n$ Z- B8 ?; q
'0.168*health + 0.083*sugar + 0.072*bad, % y$ e* M+ m/ f/ f1 N '0.061*consume + 0.050*drive + 0.050*sister, 4 l: v ^7 z1 U '0.049*pressur + 0.049*father + 0.049*sister9 T0 G6 q$ N2 @7 Y8 c% |
] ( y% j9 J6 s6 x; ?每一行包含了主题词和主题词的权重,Topic 1 可以看作为“不良健康习惯”,Topic 3 可以看作 “家庭”。- P. z! G. g$ M3 E/ b6 q
& m# s1 U; s: k: d五、提高主题模型结果的一些方法 - y2 |- g3 {7 ]' _主题模型的结果完全取决于特征在语料库中的表示,但是语料通常表示为比较稀疏的文档矩阵,因此减少矩阵的维度可以提升主题模型的结果。 " i5 T/ X% J' V% N3 D k8 o9 D
1. 根据词频调整稀疏矩阵; E7 s5 g k4 i; n4 k+ ]/ c# I
根据频率来分布词,高频词更可能出现在结果中,低频词实际上是语料库中的弱特征,对于词频进行分析,可以决定什么频率的值应该被视为阈值。) u8 P: j; I8 {3 P; Q+ f; ?- \; I 0 f7 G" [( R. r# p, {
2. 根据词性标注 (Part of Speech Tag) 调整稀疏矩阵 2 O# |. |, j' T' N4 i( i. r: {比起频率特征,词性特征更关注于上下文的信息。主题模型尝试去映射相近的词作为主题,但是每个词在上下文上有可能重要性不同,比如说介词 “IN” 包含 “within”,“upon”, “except”,基数词 “CD” 包含:许多(many),若干(several),个把(a,few)等等,情态助动词 “MD” 包含 “may”,“must” 等等,这些词可能只是语言的支撑词,对实际意义影响不大,因此可以通过词性来消除这些词的影响。; Q0 {. t$ A; w2 }! }5 m0 Q : ?' n% X" l8 T/ O) [* K
3. 调整 LDA 的 Batch 大小8 E" X+ X. N F; A1 c; A
为了得到主题中最重要的主题词,语料可以被分为固定大小的 batch,在这些 batch 上运行 LDA 模型会提供不同的结果,但是最佳的主题词会在这些 batch 上有交集。 ' `1 }4 N% m3 o; i + ]$ y5 Q# ^2 C; J0 |) t主题模型用于特征选择 9 p% M, T1 ?# U! ?4 L比如说文本分类任务中,LDA 可以用来选择特征,因为训练数据中含有类别信息,可以在不同类别的结果中,删除相同的、比较常见的主题词,为主题类别提供更好的特征。 0 b8 V) x- U3 q5 _ 4 J5 u* s5 K+ G, K* r3 u' H3 v结语; I6 Y) r; j# M; ^* B4 ], u* Q" N
本文主要参考了[1],没有什么公式,用于对 LDA 有一个大概的了解,后面也会更深入 LDA 模型,可以一边运行上面的代码一边感受 LDA 的作用。 8 m$ W% X1 @- R! G( h' ~- a 6 [0 w+ |, S F0 d' K: ^+ M参考文献* e3 E; l3 q1 g& ?9 |
[1] https://www.analyticsvidhya.com/blog/2016/08/beginners-guide-to-topic-modeling-in-python4 b) ^2 A) H% _
}9 F% j7 m. E
[2] http://link.springer.com/chapter/10.1007%2F978-3-642-13657-3_43( {1 p7 v8 _: G2 p9 _* V
———————————————— # K2 d+ u# e. T" a9 O8 t5 a) I版权声明:本文为CSDN博主「情怀丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 8 [8 W( f2 u3 O# b$ Z原文链接:https://blog.csdn.net/selinda001/article/details/80446766+ o) ]. K4 P5 V ]) {
) S. |+ Q8 n" }( P" r- X2 v- B