$ K: r0 c3 y" R0 a3 y% o, y8 {6 n. o - Z: y* s: h7 C* M四、Running in Python X$ {" G8 ?# R+ ?
准备文档集合% ^/ V) p4 E1 M& B6 U% G9 ^8 A
doc1 = "Sugar is bad to consume. My sister likes to have sugar, but not my father." & Z6 i* H" J# g& u! f, a# A- x0 }2 ?doc2 = "My father spends a lot of time driving my sister around to dance practice.") G- Q& x* O! C) q: v0 M3 y$ j
doc3 = "Doctors suggest that driving may cause increased stress and blood pressure." 2 r/ m: V# |7 n% udoc4 = "Sometimes I feel pressure to perform well at school, but my father never seems to drive my sister to do better.", N' z0 z- n* l# q! O6 \! Y
doc5 = "Health experts say that Sugar is not good for your lifestyle." & l0 E5 ~2 A( d. k" n+ X/ v- u) }) V. c C5 Z9 e
# 整合文档数据5 d# D* c3 Z- A3 m* U6 N: \
doc_complete = [doc1, doc2, doc3, doc4, doc5]( Y4 c4 Z$ q) x: M2 B& X' O
! r% g- C: l. p8 g) D! M) `; z数据清洗和预处理5 H+ F" Y' o# o" d& b/ r
数据清洗对于任何文本挖掘任务来说都非常重要,在这个任务中,移除标点符号,停用词和标准化语料库(Lemmatizer,对于英文,将词归元)。( {- U& u7 z0 Y, l
8 f0 M& i2 N# r; T! m4 W
from nltk import stopwords 9 R3 X( J* s( q# c; M; q& zfrom nltk.stem.wordnet import WordNetLemmatizer 1 E' R! i) x" G& p# Iimport string ; b7 X4 T: u4 Y8 ]3 H) a8 y9 y, g; y
stop = set(stopwords.words('english')) / {* i, K; E: Eexclude = set(string.punctuation) 1 S# _3 z- \* P" Z6 \4 Jlemma = WordNetLemmatizer()+ R2 M" N) q4 s1 n
! }4 ~* E! r8 ?2 C( @
def clean(doc):" w) z6 G: w9 r
stop_free = " ".join([i for i in doc.lower().split() if i not in stop]) % Z- A' i2 L" e' D: U" M punc_free = ''.join(ch for ch in stop_free if ch not in exclude) / s3 A& e$ E: K* m2 o normalized = " ".join(lemma.lemmatize(word) for word in punc_free.split()) / Y5 U3 y3 T- g( t+ R return normalized! R: k1 v) l E; j" {# G4 H
4 I6 w' t" f3 B/ cdoc_clean = [clean(doc).split() for doc in doc_complete]# H* s, @) e! D6 K7 d, I
2 H2 l# `6 d7 U: Z* F$ L4 F# v
准备 Document - Term 矩阵9 V; t" z, S+ ]- a, v: {
语料是由所有的文档组成的,要运行数学模型,将语料转化为矩阵来表达是比较好的方式。LDA 模型在整个 DT 矩阵中寻找重复的词语模式。Python 提供了许多很好的库来进行文本挖掘任务,“genism” 是处理文本数据比较好的库。下面的代码掩饰如何转换语料为 Document - Term 矩阵:7 J2 G( Q3 i* [. {) @
7 o$ R8 x$ j& Jimport genism - |0 f2 r d& Bfrom gensim import corpora 1 Q5 ]* w/ d D% o5 u& a2 ~! [ r' d- p
# 创建语料的词语词典,每个单独的词语都会被赋予一个索引6 i! D3 T! ]# I( |6 \% I1 o0 G
dictionary = corpora.Dictionary(doc_clean)# Z8 C, o0 o8 v8 K. m) G- G, w
: [2 H( q4 A% C
# 使用上面的词典,将转换文档列表(语料)变成 DT 矩阵, a7 A2 Q; Y7 c" j$ L
doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean] 3 |0 r8 ?0 H$ |+ E7 [3 e , ~- a. v _& y a构建 LDA 模型 4 x4 I$ ~9 ~9 y& m6 f0 M4 T: D( t创建一个 LDA 对象,使用 DT 矩阵进行训练。训练需要上面的一些超参数,gensim 模块允许 LDA 模型从训练语料中进行估计,并且从新的文档中获得对主题分布的推断。 + ^" a5 a" n, ~1 U: k3 N3 @! Y2 N* g) |0 X j: _7 S7 _: T
# 使用 gensim 来创建 LDA 模型对象 , n1 L: w5 Z7 j5 ULda = genism.models.ldamodel.LdaModel 4 ^, T( R% G" F: g- X0 Q \; k & [& m, Z+ d9 L# 在 DT 矩阵上运行和训练 LDA 模型, p# `0 y: T3 p7 q# G) n, Z, {/ l
ldamodel = Lda(doc_term_matrix, num_topics=3, id2word = dictionary, passes=50)4 n' o" E4 _5 j* b, {
* D r T0 _; b) Z1 Y3 Y结果/ C; w8 a( |. I" ?! S+ q( X
# 输出结果/ |- H: h0 m2 {, a7 w
print(ldamodel.print_topics(num_topics=3, num_words=3)) : U) K1 x& c& e- S2 H2 k# J. k$ E2 E |# a
[! L% n: L, r8 Q: J& V9 j
'0.168*health + 0.083*sugar + 0.072*bad,9 J$ e/ C% I" p* n, A& c, u
'0.061*consume + 0.050*drive + 0.050*sister, 7 \6 j1 h* b) _) ? '0.049*pressur + 0.049*father + 0.049*sister ! ~. W5 O4 Z. x1 F: h) S, Q] ) c5 p' Q+ A' w2 X" { o每一行包含了主题词和主题词的权重,Topic 1 可以看作为“不良健康习惯”,Topic 3 可以看作 “家庭”。 H* w5 G- r/ q3 [6 ~
. C7 V' o H9 O6 \1 b4 I: Z五、提高主题模型结果的一些方法 ( f. X5 m7 B# b9 I/ l主题模型的结果完全取决于特征在语料库中的表示,但是语料通常表示为比较稀疏的文档矩阵,因此减少矩阵的维度可以提升主题模型的结果。% @, `$ W* `7 Q9 w
3 H6 T: h! j, Y( w. B
1. 根据词频调整稀疏矩阵1 D5 I: E. Q- w
根据频率来分布词,高频词更可能出现在结果中,低频词实际上是语料库中的弱特征,对于词频进行分析,可以决定什么频率的值应该被视为阈值。8 ~5 |) `/ [# A" A! ?" \8 t) M ! @) Q( Z: n6 s9 }0 Y* }7 J3 N
2. 根据词性标注 (Part of Speech Tag) 调整稀疏矩阵9 V6 a: {& \( T# r1 P- d
比起频率特征,词性特征更关注于上下文的信息。主题模型尝试去映射相近的词作为主题,但是每个词在上下文上有可能重要性不同,比如说介词 “IN” 包含 “within”,“upon”, “except”,基数词 “CD” 包含:许多(many),若干(several),个把(a,few)等等,情态助动词 “MD” 包含 “may”,“must” 等等,这些词可能只是语言的支撑词,对实际意义影响不大,因此可以通过词性来消除这些词的影响。5 |* B+ i# O% l' ~ C' Q @ 6 s9 n1 `0 N6 `& ]
3. 调整 LDA 的 Batch 大小- I* F! C7 U& e
为了得到主题中最重要的主题词,语料可以被分为固定大小的 batch,在这些 batch 上运行 LDA 模型会提供不同的结果,但是最佳的主题词会在这些 batch 上有交集。 ; ?. c4 M' M* W $ ?( `/ ~: a ]+ F8 i主题模型用于特征选择) r2 l9 x9 d, v9 N/ {
比如说文本分类任务中,LDA 可以用来选择特征,因为训练数据中含有类别信息,可以在不同类别的结果中,删除相同的、比较常见的主题词,为主题类别提供更好的特征。1 l* r4 o/ J8 e- P7 m# [ N
# Z( t5 X$ T3 e1 c0 b, {: y
结语 2 k8 n' z0 i# O% d, `" t本文主要参考了[1],没有什么公式,用于对 LDA 有一个大概的了解,后面也会更深入 LDA 模型,可以一边运行上面的代码一边感受 LDA 的作用。: Z2 j' }8 ?5 U, b
" i! W. X9 a" X& T: l3 K/ f1 l8 S
参考文献 ( X1 D6 u( E6 i/ q! p+ [# c" M[1] https://www.analyticsvidhya.com/blog/2016/08/beginners-guide-to-topic-modeling-in-python * ~0 k9 o2 y- p1 i6 F, P, O3 X7 x, [ 9 F, I. w# M1 B$ R2 V8 A& s* H[2] http://link.springer.com/chapter/10.1007%2F978-3-642-13657-3_43 : P" ?$ ~4 e+ |% \/ t———————————————— . d/ l5 C+ u# Z4 g* U版权声明:本文为CSDN博主「情怀丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 6 c) D u) [, |) q1 O原文链接:https://blog.csdn.net/selinda001/article/details/80446766( `1 Z" B7 d {9 ^4 d