7 D# e' ?$ }( B1 @; ^, I. A主题数量:主题数量从语料中抽取得到,使用 Kullback Leibler Divergence Score 可以获取最好的主题数量。; Z$ N j8 q) U2 \0 A- t# J
8 d( w5 L1 ~- m" I0 }9 G7 a主题词数:组成一个主题所需要的词的数量。这些词的数量通常根据需求得到,如果说需求是抽取特征或者关键词,那么主题词数比较少,如果是抽取概念或者论点,那么主题词数比较多。& Q8 r5 N. P3 [7 t/ y/ r
n( @# t: g+ \- Z) f1 v迭代次数:使得 LDA 算法收敛的最大迭代次数' |) O: g# o" `1 T
) @8 J9 G7 _7 k0 W: z4 @' D " a# b3 J4 t& b9 ]5 h+ {* E p1 v
四、Running in Python5 U: C0 Y/ @3 k% x
准备文档集合 U- A) O, V" J0 }
doc1 = "Sugar is bad to consume. My sister likes to have sugar, but not my father." - ?4 E# d1 N; i) K% hdoc2 = "My father spends a lot of time driving my sister around to dance practice."3 A" Y; G8 V! D! N L: ?: l
doc3 = "Doctors suggest that driving may cause increased stress and blood pressure." 1 e" Q" A+ f7 o1 i& g, m' n: tdoc4 = "Sometimes I feel pressure to perform well at school, but my father never seems to drive my sister to do better." - T: C1 ^& q% |' S: u+ B8 |4 |doc5 = "Health experts say that Sugar is not good for your lifestyle." ; A% I2 n) v4 b' L3 h; `, z' V) M) f: [& [ {
# 整合文档数据 , H* A/ d' W3 Hdoc_complete = [doc1, doc2, doc3, doc4, doc5] 5 b4 ^9 ~. L+ ?6 a" d' e! d6 S ^; U5 i5 K
数据清洗和预处理 # P" I2 C. o* W9 K, T. r9 m* L4 ^数据清洗对于任何文本挖掘任务来说都非常重要,在这个任务中,移除标点符号,停用词和标准化语料库(Lemmatizer,对于英文,将词归元)。 3 M+ k# g7 J, S- L% o& M8 C. ^3 d, _& T7 O* Y0 O( c$ }; a8 C; o
from nltk import stopwords ( n, w- f5 ]5 x2 tfrom nltk.stem.wordnet import WordNetLemmatizer! y; B; s% x/ D& p5 v
import string; z: x% ~( t! k b" [: m
2 @. @. i% L8 U, ^& g$ y) c, Nstop = set(stopwords.words('english'))' D2 L1 l# l8 m0 R, l; Q, O
exclude = set(string.punctuation) h$ u! L& U/ T a3 @4 M
lemma = WordNetLemmatizer() : P, z1 G: r9 ?0 [$ G- p1 s0 K" a4 e" v4 P3 n. q
def clean(doc):8 |" w, J0 O. ?) M
stop_free = " ".join([i for i in doc.lower().split() if i not in stop]) . H% C W. b- s0 X9 I punc_free = ''.join(ch for ch in stop_free if ch not in exclude)4 u1 q. G) N E& K% P; X
normalized = " ".join(lemma.lemmatize(word) for word in punc_free.split())# f0 |5 f$ \# i4 J' v- m
return normalized' K( x: X+ s- Y1 H/ B, u
- M- c+ ~3 Z9 |
doc_clean = [clean(doc).split() for doc in doc_complete] a/ |# I; y; a$ K- l5 K/ V5 P4 x' s* O
准备 Document - Term 矩阵 # ^: Y( E' l) L8 u- l$ Z语料是由所有的文档组成的,要运行数学模型,将语料转化为矩阵来表达是比较好的方式。LDA 模型在整个 DT 矩阵中寻找重复的词语模式。Python 提供了许多很好的库来进行文本挖掘任务,“genism” 是处理文本数据比较好的库。下面的代码掩饰如何转换语料为 Document - Term 矩阵: 6 T" T& K- m' ]' U& r% D n$ x3 H9 H0 k" v& g% g
import genism ; S8 t& a9 T& [# N# P& t- Q1 ffrom gensim import corpora, t* A: U! R1 h
' R* g, h- e4 k2 ^ L" O- R4 c' C6 n
# 创建语料的词语词典,每个单独的词语都会被赋予一个索引$ R! O q, B) y( X
dictionary = corpora.Dictionary(doc_clean)5 r0 K9 U- V7 Z/ Q. Y
$ [) E8 W, g' ^" a9 X1 M6 W! Q
# 使用上面的词典,将转换文档列表(语料)变成 DT 矩阵# l7 Z* l/ |; Q8 z6 q
doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean] 0 R) v) L$ O+ ~9 C _% `8 K! Q# t# ]0 ?, ?% N
构建 LDA 模型 . n# r J: T' O, R5 k创建一个 LDA 对象,使用 DT 矩阵进行训练。训练需要上面的一些超参数,gensim 模块允许 LDA 模型从训练语料中进行估计,并且从新的文档中获得对主题分布的推断。0 E, Y' m$ ^5 g9 r# |
8 F& a: U1 J& y5 G" L) C7 y8 t
# 使用 gensim 来创建 LDA 模型对象+ `" o8 G/ Z- ^# @) A, F* N
Lda = genism.models.ldamodel.LdaModel+ |" j1 M! C. X9 B
" [5 D! {, L& g$ Z. {* B: p
# 在 DT 矩阵上运行和训练 LDA 模型( R& \* a, c! v
ldamodel = Lda(doc_term_matrix, num_topics=3, id2word = dictionary, passes=50)2 e* w- V1 Y/ R
/ O- B, W8 G, T/ [$ n/ ^/ w
结果1 I) B, z/ {- Q8 R" O' Z- q8 p9 `
# 输出结果 % x4 _( p v6 Z J7 D/ [print(ldamodel.print_topics(num_topics=3, num_words=3)) E+ r& B0 X/ X1 p3 G