0 k& J# G. I3 N: }, i1 S0 w$ x1 r $ c) }5 u/ ]+ c 2 K8 P. w9 H& k7 I三、LDA 的参数1 f# `1 t5 w U. }$ A. g0 L
αα :表示 document-topic 密度, αα 越高,文档包含的主题更多,反之包含的主题更少0 S& z, y4 t" c- n
, |: h. b) l7 p3 ?
ββ :表示 topic-word 密度, ββ 越高,主题包含的单词更多,反之包含的单词更少 5 o4 W: t' s( A . L% y, _5 n$ B1 t* L主题数量:主题数量从语料中抽取得到,使用 Kullback Leibler Divergence Score 可以获取最好的主题数量。 % n( g! D& M/ T }# T7 J6 N! T5 r3 v) }- _- a
主题词数:组成一个主题所需要的词的数量。这些词的数量通常根据需求得到,如果说需求是抽取特征或者关键词,那么主题词数比较少,如果是抽取概念或者论点,那么主题词数比较多。+ K! v) @; m# G! x' o
& s/ G1 |. W- |; {7 ]( \
迭代次数:使得 LDA 算法收敛的最大迭代次数" n1 C2 A' o0 t0 f$ Q
2 A/ [8 y/ }6 I2 ?- n. v
1 B& ~8 }5 Z! L$ |' L3 m$ u0 X. M
四、Running in Python : O( k3 Q, b( o2 h; ~准备文档集合 ; C, c5 K& d9 q8 s" a4 |doc1 = "Sugar is bad to consume. My sister likes to have sugar, but not my father." 5 N2 u& ]7 E) p+ x2 q- Jdoc2 = "My father spends a lot of time driving my sister around to dance practice.": f( p: E, M( ^
doc3 = "Doctors suggest that driving may cause increased stress and blood pressure."* x/ ?9 f* d9 o5 H5 `2 {
doc4 = "Sometimes I feel pressure to perform well at school, but my father never seems to drive my sister to do better." - `* }$ u) `$ Cdoc5 = "Health experts say that Sugar is not good for your lifestyle." 5 Z0 i- J" U3 _5 g3 H4 b9 a7 [2 Y" y$ z8 X# I j9 k
# 整合文档数据 $ K4 R" B/ m6 r% h1 Hdoc_complete = [doc1, doc2, doc3, doc4, doc5]0 I" N) b8 j1 W9 ]% h, a% ~4 r
9 P% j4 h4 d9 c' R/ ]* g, F+ a3 M
数据清洗和预处理 8 H4 r7 o5 J, x3 z; u4 M2 _6 O7 R数据清洗对于任何文本挖掘任务来说都非常重要,在这个任务中,移除标点符号,停用词和标准化语料库(Lemmatizer,对于英文,将词归元)。% c6 }. G7 Q' U; m7 s
& n6 G! S, j( Yfrom nltk import stopwords$ A1 q8 O2 s2 a7 s6 _/ f
from nltk.stem.wordnet import WordNetLemmatizer* Z# Q9 n) ]' \3 K! R9 S
import string $ b7 T) j' O" W; y# T6 {% S3 e A
stop = set(stopwords.words('english')) 7 j1 J* D( i0 K% L( w [; Uexclude = set(string.punctuation)! h9 X: Q$ T+ D
lemma = WordNetLemmatizer() 0 t: C$ Q1 P, U% L) `' n8 }, r4 n: Q
def clean(doc):9 t4 R1 l; n5 G9 V( X
stop_free = " ".join([i for i in doc.lower().split() if i not in stop]) ! B; P9 N2 o) c punc_free = ''.join(ch for ch in stop_free if ch not in exclude) ) \0 x/ ^7 [# C" l- d* s normalized = " ".join(lemma.lemmatize(word) for word in punc_free.split()) 7 u. j# C! ]. }3 ]6 c3 x2 I return normalized 7 C0 e4 T1 I/ j3 K. k: r2 U" J# `1 ?/ H0 g3 U5 M5 j+ H6 E7 F
doc_clean = [clean(doc).split() for doc in doc_complete]* y" C. D! F$ f: ?% c5 r7 L) j
! B/ ~; K( k' T/ v$ ~. s3 M
准备 Document - Term 矩阵 & L) o/ s3 e9 }' |: Y$ i5 K语料是由所有的文档组成的,要运行数学模型,将语料转化为矩阵来表达是比较好的方式。LDA 模型在整个 DT 矩阵中寻找重复的词语模式。Python 提供了许多很好的库来进行文本挖掘任务,“genism” 是处理文本数据比较好的库。下面的代码掩饰如何转换语料为 Document - Term 矩阵:' w% @# X# A' [6 Z
4 K+ D; V3 q0 M! Y- i+ |& C* Y Jimport genism) x3 n! S# H9 d' |
from gensim import corpora0 n6 V$ b! I" I" B! a W1 y. s
1 G- v, |. x7 U1 t; f1 ^, n
# 创建语料的词语词典,每个单独的词语都会被赋予一个索引/ r0 i! }3 {7 v. z9 v
dictionary = corpora.Dictionary(doc_clean); ?; |4 i Y; K$ s7 W! _$ _
9 u" s7 U1 H( ]# 使用上面的词典,将转换文档列表(语料)变成 DT 矩阵) u0 B& F) ]2 V2 X, e+ F) h
doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean] , A. z7 T. v/ Q: C# B* ] ) n2 r( _2 N- V1 g3 m3 H" z构建 LDA 模型* |) {: |% D5 {! J3 X6 u. E
创建一个 LDA 对象,使用 DT 矩阵进行训练。训练需要上面的一些超参数,gensim 模块允许 LDA 模型从训练语料中进行估计,并且从新的文档中获得对主题分布的推断。 & Y5 c3 V9 `; i0 h$ ]! h 7 u& |! @1 H9 Y0 b# v; G$ @# 使用 gensim 来创建 LDA 模型对象 ' h% Y8 d. I; q v; K% t, r, bLda = genism.models.ldamodel.LdaModel + n' n0 K# K2 C/ T$ d & D; i9 H K5 \, F! Y) V) Z( q- m" B8 z# 在 DT 矩阵上运行和训练 LDA 模型* f; J! F' a1 |& l! ]5 q$ M
ldamodel = Lda(doc_term_matrix, num_topics=3, id2word = dictionary, passes=50)8 p: \+ \4 L+ c3 H" @ o
[4 o" a& T8 Q0 s/ @( n/ `( [9 W
结果 + U: B) S7 {+ k6 K( M# 输出结果0 s) E$ [5 o' d: j
print(ldamodel.print_topics(num_topics=3, num_words=3)) j- N9 d( R) X- ]* B1 N
* ^9 R( @3 j. B2 o/ F" h
[ $ A* O/ W. {$ M/ n( D6 q n '0.168*health + 0.083*sugar + 0.072*bad,4 K. U6 J/ {# Y
'0.061*consume + 0.050*drive + 0.050*sister, . E v9 V2 g% Z5 Q) b '0.049*pressur + 0.049*father + 0.049*sister ! ` n, r9 s% {. ~/ S$ _]2 I% J; U+ N. m; ]5 z4 k) E: \
每一行包含了主题词和主题词的权重,Topic 1 可以看作为“不良健康习惯”,Topic 3 可以看作 “家庭”。! w$ B+ f0 `. N0 [# j9 u
3 x1 ~, o$ q9 ]
五、提高主题模型结果的一些方法 3 b3 @9 |6 O8 u% h: P主题模型的结果完全取决于特征在语料库中的表示,但是语料通常表示为比较稀疏的文档矩阵,因此减少矩阵的维度可以提升主题模型的结果。5 n2 |6 m7 i5 g6 y
o. @: I- i' u) Z# N/ J1 `
1. 根据词频调整稀疏矩阵 9 I5 }4 F$ v2 ^, H( s+ N& d0 C6 b根据频率来分布词,高频词更可能出现在结果中,低频词实际上是语料库中的弱特征,对于词频进行分析,可以决定什么频率的值应该被视为阈值。5 s) m) L" I8 s0 K& T5 i0 s4 T 7 r6 n4 b9 G }! e2. 根据词性标注 (Part of Speech Tag) 调整稀疏矩阵 . p$ b4 J3 y N, ~( u; r比起频率特征,词性特征更关注于上下文的信息。主题模型尝试去映射相近的词作为主题,但是每个词在上下文上有可能重要性不同,比如说介词 “IN” 包含 “within”,“upon”, “except”,基数词 “CD” 包含:许多(many),若干(several),个把(a,few)等等,情态助动词 “MD” 包含 “may”,“must” 等等,这些词可能只是语言的支撑词,对实际意义影响不大,因此可以通过词性来消除这些词的影响。 # e _7 L5 i4 K! s" [6 `1 M9 l' q, |* a) W' K' ~
3. 调整 LDA 的 Batch 大小 2 \2 k; V- P& m" \9 U7 T为了得到主题中最重要的主题词,语料可以被分为固定大小的 batch,在这些 batch 上运行 LDA 模型会提供不同的结果,但是最佳的主题词会在这些 batch 上有交集。 4 J/ ?# \, B. i4 G: B/ U0 @/ P9 M* s! N0 L2 E8 }/ ^. P- T
主题模型用于特征选择 e5 S2 t2 E* G比如说文本分类任务中,LDA 可以用来选择特征,因为训练数据中含有类别信息,可以在不同类别的结果中,删除相同的、比较常见的主题词,为主题类别提供更好的特征。2 F' }# w# f6 b0 q, \7 d' a
' X/ p w+ b$ q0 A$ I3 G( p, {
结语 0 l9 E# R9 ~( A5 A9 D本文主要参考了[1],没有什么公式,用于对 LDA 有一个大概的了解,后面也会更深入 LDA 模型,可以一边运行上面的代码一边感受 LDA 的作用。 8 f6 D x$ w0 `" ^' r3 e9 y( `9 c B' a& s
参考文献3 l5 Z6 ]; |# g6 F4 m) M' u/ A
[1] https://www.analyticsvidhya.com/blog/2016/08/beginners-guide-to-topic-modeling-in-python2 [; s, x! W3 h, [' b
, \) A" `, a5 B6 u' \[2] http://link.springer.com/chapter/10.1007%2F978-3-642-13657-3_437 |* j' Y5 ^+ a8 ]1 D+ r B/ I
————————————————3 T4 k+ a: X5 \* o
版权声明:本文为CSDN博主「情怀丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 $ u9 V8 h. e: z2 M- g. u原文链接:https://blog.csdn.net/selinda001/article/details/804467666 {9 k. X( w- x$ G9 B+ A% u+ r
, z4 Z# p- z7 Q* g- a9 q' h