( p9 l2 |7 J3 g! x" ~主题数量:主题数量从语料中抽取得到,使用 Kullback Leibler Divergence Score 可以获取最好的主题数量。 2 `+ A1 x/ ^8 m# } " ~# e J$ R* u5 ?主题词数:组成一个主题所需要的词的数量。这些词的数量通常根据需求得到,如果说需求是抽取特征或者关键词,那么主题词数比较少,如果是抽取概念或者论点,那么主题词数比较多。3 {& N" B: R |: ^) T1 S+ q2 e) a
; M7 n2 L+ k7 F. l, W7 x! }5 @* ^5 S
迭代次数:使得 LDA 算法收敛的最大迭代次数; x `3 }7 q# v8 f
; w: t7 C$ W: S$ f( I
! _2 y% O" t. G1 H$ m" h2 K. E
0 f1 A) A: F3 C! R7 C3 f8 y
四、Running in Python 4 g. c, O1 U& I7 ^9 K$ S% j准备文档集合5 a$ b. W' S6 x( i& P. J
doc1 = "Sugar is bad to consume. My sister likes to have sugar, but not my father." 9 u8 L& _( p4 Rdoc2 = "My father spends a lot of time driving my sister around to dance practice."; C0 j7 A+ x! ?# b' x% m* o0 i1 C
doc3 = "Doctors suggest that driving may cause increased stress and blood pressure." : ?+ O: F9 x8 A: w9 L# E/ ddoc4 = "Sometimes I feel pressure to perform well at school, but my father never seems to drive my sister to do better."; C1 p6 P' T _! ?9 s
doc5 = "Health experts say that Sugar is not good for your lifestyle."% c' L( n% ^3 m! Q0 }. \
, |4 L/ E3 Z2 L$ {7 k$ f2 P0 u# 整合文档数据( s/ a$ _1 M7 w3 r+ N9 K
doc_complete = [doc1, doc2, doc3, doc4, doc5]( M) ^& Q* l1 _; k6 W6 u
7 Q, z' F; e# U/ N# f
数据清洗和预处理6 K) k$ ]/ F' V' F* ^
数据清洗对于任何文本挖掘任务来说都非常重要,在这个任务中,移除标点符号,停用词和标准化语料库(Lemmatizer,对于英文,将词归元)。0 T6 _$ F6 O. B3 l5 `
; b& R4 f u G H+ f
from nltk import stopwords 8 r, _7 ]# o) m: o* cfrom nltk.stem.wordnet import WordNetLemmatizer& Z3 b8 v' S8 ] }6 U
import string. c2 p3 F8 f, c0 P7 G
# }' Z J4 B a1 k
stop = set(stopwords.words('english'))7 y5 D ]/ S J0 o6 L, m
exclude = set(string.punctuation)/ s/ ~$ b' ~$ X/ ]0 P
lemma = WordNetLemmatizer() 0 W# N7 f3 \5 K l0 t % O* W5 J/ Z [/ T, V5 Idef clean(doc): + T, \5 s% Z$ i+ w/ h stop_free = " ".join([i for i in doc.lower().split() if i not in stop]) 8 ]3 z! K+ s( ~6 @2 Q9 e punc_free = ''.join(ch for ch in stop_free if ch not in exclude): p) m2 F4 v) N
normalized = " ".join(lemma.lemmatize(word) for word in punc_free.split())7 T8 q4 i) q2 ^2 g+ {! ]- v8 l
return normalized 3 e2 A7 K( T2 Q- w# U! c' O$ s+ p7 Q$ L' Z S
doc_clean = [clean(doc).split() for doc in doc_complete] ; l& U! A; m( b ?$ v- W# ^' R
准备 Document - Term 矩阵5 a2 k5 A3 V8 i) {9 B
语料是由所有的文档组成的,要运行数学模型,将语料转化为矩阵来表达是比较好的方式。LDA 模型在整个 DT 矩阵中寻找重复的词语模式。Python 提供了许多很好的库来进行文本挖掘任务,“genism” 是处理文本数据比较好的库。下面的代码掩饰如何转换语料为 Document - Term 矩阵: 0 J [, k r1 ], ^' `, E0 l, `" U- J1 n7 m' E
import genism% S9 ~7 T% l0 N
from gensim import corpora * t0 S- j- p4 ]4 K& W5 A! H/ w( G 1 l5 J+ o# P( f0 U- N# 创建语料的词语词典,每个单独的词语都会被赋予一个索引 4 O/ o5 E, S6 y: l5 Rdictionary = corpora.Dictionary(doc_clean)- q: I/ a. J* }/ e1 G
9 `6 |4 X% D3 m3 F
# 使用上面的词典,将转换文档列表(语料)变成 DT 矩阵 . |3 n$ D3 A& `+ w8 O5 v6 M* Rdoc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean]! D; z; M9 x6 b% R9 N* V0 k' [( f
& C! x+ F- W2 W. R0 M$ @6 ` N
构建 LDA 模型/ `+ m7 a9 Q% v, N3 Y [; A
创建一个 LDA 对象,使用 DT 矩阵进行训练。训练需要上面的一些超参数,gensim 模块允许 LDA 模型从训练语料中进行估计,并且从新的文档中获得对主题分布的推断。" m% _* k) h B: `
7 x J& R/ x, Y' ?8 @1 e
# 使用 gensim 来创建 LDA 模型对象, z- p& l, ?! ?+ x
Lda = genism.models.ldamodel.LdaModel& ?" W% i1 g) d5 s
! q7 P; j0 K1 s% v5 ~
# 在 DT 矩阵上运行和训练 LDA 模型2 O; N- @2 u3 Z
ldamodel = Lda(doc_term_matrix, num_topics=3, id2word = dictionary, passes=50) / T1 p# d' L7 L* ^, H " g; \) D7 C: D结果( t# |) k3 H" {3 Z( Z; l
# 输出结果 4 {( k" ^ E0 ~: @print(ldamodel.print_topics(num_topics=3, num_words=3)) , g' A5 Z. L% C3 |( z( D$ P 2 d# e3 V" P) K* t; x* ?, f[( x6 ]2 i1 W% c/ R8 a' I9 N
'0.168*health + 0.083*sugar + 0.072*bad, ( v: B. U" S- x. t- l '0.061*consume + 0.050*drive + 0.050*sister, % [% Y+ x# `& M9 U '0.049*pressur + 0.049*father + 0.049*sister 9 l1 _8 H2 H, L]- {, `" W, z7 i; p0 L+ v
每一行包含了主题词和主题词的权重,Topic 1 可以看作为“不良健康习惯”,Topic 3 可以看作 “家庭”。0 y9 a6 U/ `1 [& q
( A0 Q. r# x1 U& ]. I
五、提高主题模型结果的一些方法 # M) l" q* m2 w; D4 [5 S) A- f主题模型的结果完全取决于特征在语料库中的表示,但是语料通常表示为比较稀疏的文档矩阵,因此减少矩阵的维度可以提升主题模型的结果。7 D# I: m u* E8 l8 ]. s, q2 g
|. P$ G9 v+ l7 p8 M' [% r8 l# B @
1. 根据词频调整稀疏矩阵8 W4 Q, `5 _" F+ b; l ~( k
根据频率来分布词,高频词更可能出现在结果中,低频词实际上是语料库中的弱特征,对于词频进行分析,可以决定什么频率的值应该被视为阈值。 1 `- b, r9 X% @+ N$ `4 { 5 C4 M9 X% l& D0 V" t0 a/ A* ~, Y2. 根据词性标注 (Part of Speech Tag) 调整稀疏矩阵 , `& M0 V3 I9 ~/ S& H) t% F* d比起频率特征,词性特征更关注于上下文的信息。主题模型尝试去映射相近的词作为主题,但是每个词在上下文上有可能重要性不同,比如说介词 “IN” 包含 “within”,“upon”, “except”,基数词 “CD” 包含:许多(many),若干(several),个把(a,few)等等,情态助动词 “MD” 包含 “may”,“must” 等等,这些词可能只是语言的支撑词,对实际意义影响不大,因此可以通过词性来消除这些词的影响。1 s9 g, H" Q* P$ `" y , S1 l# C" g$ l
3. 调整 LDA 的 Batch 大小& O5 l3 w3 ^" l- Q/ c
为了得到主题中最重要的主题词,语料可以被分为固定大小的 batch,在这些 batch 上运行 LDA 模型会提供不同的结果,但是最佳的主题词会在这些 batch 上有交集。 ! }( K1 u2 s3 I# y: B, O# Q+ {7 C X5 n* B& O
主题模型用于特征选择 E. }7 J* k0 U+ E* K0 a
比如说文本分类任务中,LDA 可以用来选择特征,因为训练数据中含有类别信息,可以在不同类别的结果中,删除相同的、比较常见的主题词,为主题类别提供更好的特征。; w4 B3 `: t! a. u0 f3 @9 H
( f" N, A4 y @2 p* B0 p) D结语 7 ]8 U2 o4 S1 z3 _ E- r本文主要参考了[1],没有什么公式,用于对 LDA 有一个大概的了解,后面也会更深入 LDA 模型,可以一边运行上面的代码一边感受 LDA 的作用。+ J) ]8 ]% y) i* ]2 {' [5 h
5 X2 ^6 I D5 ?/ p) H4 G参考文献 0 t8 p0 Y. Z) p/ d0 P9 g p* b h[1] https://www.analyticsvidhya.com/blog/2016/08/beginners-guide-to-topic-modeling-in-python $ T* Y" R$ Q% p/ \ ) Q/ n2 U+ ]$ [, v' `% V# _( d* C% `[2] http://link.springer.com/chapter/10.1007%2F978-3-642-13657-3_43. ~: S8 x3 D+ P6 C. Y# D1 N( {
————————————————( g* o1 w2 ^4 n- B. t
版权声明:本文为CSDN博主「情怀丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 # n% W8 z7 q8 T7 x: H原文链接:https://blog.csdn.net/selinda001/article/details/80446766 9 V% O* U7 j) I2 N5 s/ N, Q 0 z5 W" f ], ]( N8 |- O' b' Q; L1 g1 R3 ?, C# x4 N' X# @3 c; i