本文主要是介绍如何利用sklearn框架中LatentDirichletAllocation类完成LDA模型的训练。
理论基础
LDA是一个无监督的学习模型,它假设每个文档包含多个主题,文档中的每个主题都是基于词的概率分布。作为一个基于贝叶斯网络的文档生成模型,LDA刻画的是文档生成的一个概率化过程。
LDA的输入由一组文档D组成的词料库。LDA的输出包括文档主题分布$\theta$和主题中的词语的分布$\phi$。这里的$\theta$和$\phi$都假设服从多项式分布。为让分布更平滑,再假设这两个参数的先验分布服从狄利克雷分布,参数分别为$\alpha$和$\beta$。因为狄利克雷分布是多项式分布的共轭先验分布,所以假设该多项式分布的先验服从狄利克雷分布可以极大简化统计计算的过程。狄利克雷分布中有多个参数,再LDA中利用狄利克雷分布时,大多将参数设为同一个数值,这种设为同一个数值的狄利克雷分布称为对称的狄利克雷分布。以下时LDA模型生成一篇文档的方式。
按照先验概率$p(d_i)$的方式选择一篇文档$d_i$。
从超参数$\alpha$的狄利克雷分布中取样生成文档$d_i$的多项式主题分布$\theta_i$,即主题分布$\theta_i$由超参数$\alpha$的狄利克雷分布生成。
用$z_{i,j}$表示从主题的多项式分布$\theta_i$中采样生成文档$d_i$第j个词的主题。
从超参数为$\beta$的狄利克雷分布中采样生成主题$z_{i,j}$对应的词语分布$\phi_z$,即词语分布时由超参数$\beta$的狄利克雷分布生成的。
$W_{i,j}$表示从词语多项式分布$\phi_z$中采样生成最终的词语。
sklearn常用类
CountVectorizer
sklearn常用的文本特征提取类有CountVectorizer和TfidfVectorizer,以下依据sklearn的官方文档对CountVectorizer类中的部分参数做出解释。
input:参数类型为string,当参数为filename 预计时需要读取文件原始内容来进行分析;当参数为 file,官方文档给出的解释必须要有一个read方法来读取内存中的字节内容。具体用法不知;如果不是上述两项参数,则将视为直接进行分析的字符串序列或字节流内容。
encoding:参数类型为string,表示对输入字符串的解码方式,默认值为utf-8,
decoder_error: 参数可选为{‘strict’, ‘ignore’, ‘replace’},表示对输入内容呢,按照encoding参数设置的内容进行解码时,若出现不符合编码方式的错误时的解决办法。默认参数为strict,表示将会抛出UnicodeDecodeError错误;ignore表示忽略当前解码错误;replace参数作用尚不明确。
analyzer:参数可选为{‘word’, ‘char’, ‘char_wb’},该参数决定特征是否应该由单词或字符的n-gram组成,char_b表示创建的n-gram特征的字符范围为文本字符,n-gram不足部分用空格填充。
preprocessor: 重写预处理阶段,但标记化和n-gram的步骤会保留下来,默认参数为None。
tokenizer:类似于preprocessor参数,重写字符串标记化过程,但会保留预处理和n-gram步骤,该参数当analyer为word时才生效。
ngram_range: n-gram特征提取范围,参数类型为元组(tuple): (min_n, max_n),在$min_n \leq n \leq max_n$的n-gram都将被提取。
stop_word: 停用词去除参数。参数为’english’时,去除英语中的停用词;当参数为list类型的数据时,会假定该list中包含所有需要去除的停用词,将去除原始文本中该list指向的所有词,该参数当analyzer参数为word时才生效。
lowercase:参数类型为布尔值,默认参数为True,表示是否对文本进行小写化。
max_df: 该参数表示一个最大阈值,当参数类型为float时,参数范围为$[0.0, 1.0]$;当参数类型为int时,默认值为1。在建立词汇表时,若词汇中某个单词出现的频率(float)或次数(int)大于当前阈值时,该单词将不会加入到词汇统计中。
min_df: 该参数类似于max_df,表示最小阈值。
max_features: 参数类型为int,默认值为None。当参数为int时,表示构建的词汇表的词汇仅是语料中词频在排在max_features之前的词。
LatentDirichletAllocation
sklearn中训练LDA主题模型的类是LatentDirichletAllocation。
参数
n_components: 模型训练的预设主题数,参数类型为int,默认值为10。
doc_topic_prior: 即文档主题分布$\theta$的参数$\alpha$,参数类型为float,若参数为None,则$\alpha$参数默认为$1 / n_components$
topic_word_prior: 即主题词语分布$\phi$的参数$\beta$,参数类型为float,若参数为None,则$\beta$参数默认为$1 / n_components$
learning_method: LDA的求解算法,有’batch’和’online’两种,默认为’batch’。当数据规模较大时,’online’将比’batch’更快。
max_iter: 最大迭代次数,参数类型为int。
方法
fit(X[, y]): 利用训练数据训练LDA模型,输入参数为CountVectorizer类提取的文本词频矩阵。
transform(X[, y]): 利用训练好的模型推断语料X中文档的主题分布。
fit_transform(X[, y]): 对输入语料(训练数据)训练LDA模型,并推断输入语料的主题分布。
perplexity(X[, doc_topic_distr, sub_sampling]):计算语料X的的困惑度。
模型训练与调参
以困惑度(Perplexity)为基础调参
LDA在进行训练之前,需要由算法设计人员指定主题数目参数n,主题数目的选择会在一定程度上影响主题检测的效果。 因此可以考虑计算Perplexity的值来帮助选主题数目参数。具体调参方式为:
指定主题的数目范围为:n_topics = range(min, max)。
对$min \leq n \leq max$进行LDA主题模型训练的迭代。计算每一次迭代的Perplexity。
绘制Perplexity与n_topics的曲线图,从图像最低点附近寻找最合适的参数。
类实现
1 |
|
实验
主题-Perplexity曲线图
从图中可以看出,困惑度的最低点是主题数为4时。
主题-关键词
以下时主题数为4的主题-关键词分布。
Topic #0:couple counseling marriage therapy tip gloria relationship save saving expert help dr back get cambridge
Topic #1:today via thought bomber day go say im year love prayer http dont around affected
Topic #2:marathon explosion people new looking line injured finish runner victim friend today area via dead
Topic #3:suspect bombing police marathon amp photo news say breaking local official officer fbi three area
从关键词的性质可以看出,主题的分类效果较好。
参考
[1] 靳志辉,LDA数学八卦[M],2013.
[2] https://blog.csdn.net/TiffanyRabbit/article/details/76445909
文中代码链接:https://github.com/zhaohuang123/sentiment-analysis/tree/master/blog/LDA