一、主题模型2 D [5 S# ] D S
在文本挖掘领域,大量的数据都是非结构化的,很难从信息中直接获取相关和期望的信息,一种文本挖掘的方法:主题模型(Topic Model)能够识别在文档里的主题,并且挖掘语料里隐藏信息,并且在主题聚合、从非结构化文本中提取信息、特征选择等场景有广泛的用途。 : z2 N% i& i/ L4 y1 M- U# i4 V$ M |: S; m4 B9 ?$ [% l' A' W7 P
9 f2 Z) A' n3 ?" _+ V, @4 r
主题可以被定义为“语料库中具有相同词境的词的集合模式”,比如说,主题模型可以& w9 M) ?7 e- l( t2 _9 o
' A) G9 c3 O: _! K9 U- b$ U/ `9 L1 b
四、Running in Python 6 L: V1 q1 Q5 g# b) g$ j准备文档集合3 S7 j5 [% ^7 ]/ e) ?
doc1 = "Sugar is bad to consume. My sister likes to have sugar, but not my father."* z A! l L2 W
doc2 = "My father spends a lot of time driving my sister around to dance practice." $ V1 S/ R8 r. C2 v" v6 p, Rdoc3 = "Doctors suggest that driving may cause increased stress and blood pressure."! a7 l$ C7 s' \2 B
doc4 = "Sometimes I feel pressure to perform well at school, but my father never seems to drive my sister to do better."3 n: c' y0 Q4 W9 d: \5 {8 [0 ~% ^
doc5 = "Health experts say that Sugar is not good for your lifestyle." 5 F* @: e3 S2 v2 p . i8 Y! _! L3 q# 整合文档数据 ; r/ `/ v! ~- h8 S1 y T6 U, Gdoc_complete = [doc1, doc2, doc3, doc4, doc5] . g' b+ z: J8 ^! q6 [) d( |- I$ F4 e6 u9 T- o# w# C
数据清洗和预处理 ( w+ b7 u" U6 F2 k9 C0 N数据清洗对于任何文本挖掘任务来说都非常重要,在这个任务中,移除标点符号,停用词和标准化语料库(Lemmatizer,对于英文,将词归元)。5 t$ ~' }8 t- g( ^
! r; b' t' A8 `$ @from nltk import stopwords/ E- T3 C! z5 F2 y
from nltk.stem.wordnet import WordNetLemmatizer 3 t4 g5 A9 Y/ Q& M' t5 cimport string $ d1 w1 j2 Q8 C" h+ K9 Z1 s4 K( Z" P+ u( e
stop = set(stopwords.words('english')) 8 L2 m. e& t: v. `. qexclude = set(string.punctuation) ( f. f* b9 A8 a. X ^; p% Mlemma = WordNetLemmatizer(): c4 f/ ?! x Y0 W+ S9 n5 N& N+ o
* T, |( g- T6 F+ c6 u* f' i( _
def clean(doc): / s# ]2 ?) ~- _ stop_free = " ".join([i for i in doc.lower().split() if i not in stop]) " W; W. ^ \/ X, _2 G9 G punc_free = ''.join(ch for ch in stop_free if ch not in exclude) 3 h* Y7 e" j$ X; _0 J5 l+ ~$ O normalized = " ".join(lemma.lemmatize(word) for word in punc_free.split()) # @( Q2 O p& [9 M0 @1 ?( y return normalized # c5 O; N" X0 k1 y; _2 Z2 c 2 E! p8 U1 n8 g+ pdoc_clean = [clean(doc).split() for doc in doc_complete] : O9 Q4 W4 m1 A! i # b6 j) m3 I" z$ k- s; w准备 Document - Term 矩阵 2 B- m! A$ x5 D5 T语料是由所有的文档组成的,要运行数学模型,将语料转化为矩阵来表达是比较好的方式。LDA 模型在整个 DT 矩阵中寻找重复的词语模式。Python 提供了许多很好的库来进行文本挖掘任务,“genism” 是处理文本数据比较好的库。下面的代码掩饰如何转换语料为 Document - Term 矩阵: + F$ J) c8 C2 E+ L6 M 5 d% S$ A; @/ P; J. Z0 q Gimport genism 6 I2 w7 ~- w& v) s0 D7 `5 A" `from gensim import corpora : b2 W/ g! D! ~, S1 B" o1 e% a. Z0 S3 D' L
# 创建语料的词语词典,每个单独的词语都会被赋予一个索引( p$ p0 i- D0 x$ R( D
dictionary = corpora.Dictionary(doc_clean)/ Z1 C( q! R$ O9 N
7 d8 x+ r) H5 B& t F0 r$ S/ H) h
# 使用上面的词典,将转换文档列表(语料)变成 DT 矩阵. _! |+ w. G9 L, t# T7 A5 ^
doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean]$ `2 r- @" b$ s- f
' T# F6 x' }( k1 o0 S) O
构建 LDA 模型; F1 D; `( `' V$ E7 z3 w1 O
创建一个 LDA 对象,使用 DT 矩阵进行训练。训练需要上面的一些超参数,gensim 模块允许 LDA 模型从训练语料中进行估计,并且从新的文档中获得对主题分布的推断。5 O S, M0 m* D, ]
5 c2 e& c; ]" h' r5 T* k
# 使用 gensim 来创建 LDA 模型对象0 N: g: k! O) O9 p2 O+ G1 Y
Lda = genism.models.ldamodel.LdaModel 7 u* u4 i& O+ X# m' @; v 0 t; S( ^5 h( V4 H) F% }, P( o6 f$ g# 在 DT 矩阵上运行和训练 LDA 模型 , s4 k% M6 T5 F% Fldamodel = Lda(doc_term_matrix, num_topics=3, id2word = dictionary, passes=50)& i& h7 ^) n9 y! ~% H& _; t* M
; G1 L- ]6 W/ O: ^% V2 U结果 ; i- z6 g1 [9 O+ \1 K# 输出结果 5 l& A% }. m, r3 u& l' mprint(ldamodel.print_topics(num_topics=3, num_words=3)) 0 l; r4 @5 r b* Y3 r/ y: w2 H5 L2 J
[ * v7 M8 \0 r0 G N1 M) U7 i '0.168*health + 0.083*sugar + 0.072*bad, 0 |- D9 o) F R9 A% K, E '0.061*consume + 0.050*drive + 0.050*sister, [2 t. ~2 ? t7 ~2 N
'0.049*pressur + 0.049*father + 0.049*sister @* P" I6 I# \. Z8 \; k]0 k$ b5 g+ I% u" \$ |$ i4 F
每一行包含了主题词和主题词的权重,Topic 1 可以看作为“不良健康习惯”,Topic 3 可以看作 “家庭”。: }3 y- k0 s I
* D& Z. a M2 S6 g
五、提高主题模型结果的一些方法3 A; {* } K0 D* v; M
主题模型的结果完全取决于特征在语料库中的表示,但是语料通常表示为比较稀疏的文档矩阵,因此减少矩阵的维度可以提升主题模型的结果。' {3 C {8 Z# ^# O
& v6 ]3 I: W9 _3 Z) o. \1. 根据词频调整稀疏矩阵 ! H# |/ \6 ]+ z5 A# Z2 X: Y根据频率来分布词,高频词更可能出现在结果中,低频词实际上是语料库中的弱特征,对于词频进行分析,可以决定什么频率的值应该被视为阈值。 - ~+ c u, P. y% |! o* K 2 } |3 @9 A5 Q0 E2. 根据词性标注 (Part of Speech Tag) 调整稀疏矩阵 2 ?8 y5 M! D1 r+ ~. B比起频率特征,词性特征更关注于上下文的信息。主题模型尝试去映射相近的词作为主题,但是每个词在上下文上有可能重要性不同,比如说介词 “IN” 包含 “within”,“upon”, “except”,基数词 “CD” 包含:许多(many),若干(several),个把(a,few)等等,情态助动词 “MD” 包含 “may”,“must” 等等,这些词可能只是语言的支撑词,对实际意义影响不大,因此可以通过词性来消除这些词的影响。 ) ^9 C, u% t, W. u$ s1 v9 c3 x( t- G" D
3. 调整 LDA 的 Batch 大小- P4 a9 l# Q; N1 A0 f2 C
为了得到主题中最重要的主题词,语料可以被分为固定大小的 batch,在这些 batch 上运行 LDA 模型会提供不同的结果,但是最佳的主题词会在这些 batch 上有交集。 4 y+ x3 ^# r& o; S/ B ) v. c6 I9 ?+ }! S# z/ ~主题模型用于特征选择; q) t' J% y2 b' U5 }9 M) Z8 h
比如说文本分类任务中,LDA 可以用来选择特征,因为训练数据中含有类别信息,可以在不同类别的结果中,删除相同的、比较常见的主题词,为主题类别提供更好的特征。. f! ?# @' C* k7 Q