深度学习与自然语言处理第三次作业

深度学习与自然语言处理第三次作业

一、作业内容

1. 实验要求

在给定的数据库上利用Topic Model做无监督学习,学习到主题的分布。可以在数据库中随机选定K本小说,在每本小说中随机抽出M个段落作为训练数据,并抽出N个段落作为测试,利用topic model和其他的分类器对给定的段落属于哪一本小说进行分类。 其中K至少为3.

2. 数据库

内容:16本金庸武侠小说
深度学习与自然语言处理第三次作业
数据库地址: https://share.weiyun.com/5zGPyJX

二、实验原理

1. 主题模型(Topic Model)

对于一个文档集合来说,假如一篇文章是讲猫科动物的,那么可能会一部分讲猫, 一部分讲老虎, 一部分讲猎豹。那么讲猫的那一部分与猫有关的词语出现的频率应该高一些,比如“鱼”,“老鼠”等,讲老虎的那一部分与老虎有关的词语出现的频率应该高些,比如“森林之王”,“一山不容二虎”等,讲猎豹那一部分与猎豹有关的词语出现的频率应该高些,比如"速度",“豹纹”等等。所以一篇文档应该有多个主题,每个主题的比例不同,每一个主题下面也应该有很多词语,每个词语的比例也不同。
主题模型就是用数学框架来体现出文档的这种特点,主题模型自动分析每篇文档,统计文档内的词语,根据统计的信息来断定当前文档含有哪些主题,以及每个主题所占的比例各为多少。
从上面的定义可以看出,主题模型其实主要在学习两个分布,文档-主题分布(doc-topic)和主题-词分布(topic-word)。既然是分布就要满足两个条件,第一是非负性,第二是积分或者求和为1。也就是doc-topic矩阵或topic-word矩阵中,任意一行元素均为非负数且元素和为1。
Topic models主要可以分为四大类:
1.无监督无层次结构, 主要有:
(1)PLSA(Hofmann 1999),
(2) LDA(Blei et al., 2003),
(3)Correlated Topic Model (Blei and Lafferty, 2006 )
CTM 主要是为了克服标准LDA模型不能建模话题在文档中出现的相关性的缺点,将LDA中文档话题分布服从的Dirichlet分布改为Logistic正态分 布。例如CTM论文中举的一个例子是在Science杂志语料中,一篇遗传学文章很可能也跟健康和疾病有关,但是却不大可能跟射线天文学有关。
因为Logistic正态分布不再是Multinomial分布的共轭分布,因此模型的解变得更加复杂。对此,作者使用的方法是,在变分推理的过程中,继续使用Taylor展开式以简化似然函数下界的复杂性。
深度学习与自然语言处理第三次作业
Model 模型的图形表示
(4) PAM(Li and McCallum, ICML 2006),
Concept Topic Model等
2. 无监督有层次结构, 主要有:
HLDA(Blei NIPS 2003),
HDP(Teh et al., 2005):标准LDA模型中话题的个数K需要已知,然而很多时候确定K的大小是一件困难的事情。HDP能够根据数据自动确定K的大小。
HPAM(Mimno et al., ICML 2007)
3. 有监督无层次结构, 主要有:
S-LDA( Blei et al., 2007), Disc-LDA, MM-LDA, Author-Model, Labeled LDA(Ramage et al., 2009), PLDA(Wang et al., 2009) 等
4. 有监督有层次结构, 主要有:
hLLDA(Petinot et al., ACL 2011), HSLDA(Hierarchically Supervised Latent Dirichlet Allocation, Perotte et al., NIPS 2012)

除上述集中类型的话题模型外,还有一些半监督的话题模型,主要有:
Semi-LDA(Wang et al. 2007), SSHLDA(Semi-Supervised Hierarchical Topic Model, Mao EMNLP 2012)
另一些LDA变种主要是为了描述一些链接信息而作的扩展:
Link LDA (2004)
Topic-Link LDA(Liu et al., ICML 2009)
RTM (Chang and Blei, AISTATS 2009): Relational topic models: 文档之间有连接关系,即对一个文档网络建模。使用一个响应变量来表示文档之间的关系。
Author-topic model(Rosen-Zvi et al., UAI 2004): 将文档作者也考虑进去
DTM(Blei and Lafferty, ICML 2006) Dynamic Topic Models,话题随时间的演变
STM(Pathak, et al., KDD workshop 2008)Social Topic Models for Community Extraction
Social-Network Analysis Using Topic Model SIGIR2012

2. LDA模型

1.定义

LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。
所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。
LDA是一种非监督机器学习技术,可以用来识别大规模文档集或语料库中潜藏的主题信息。它采用了词袋的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了契机。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。

2.LDA生成过程

对于语料库中的每篇文档,LDA定义了如下生成过程:
1.对每一篇文档,从主题分布中抽取一个主题;
2.从上述被抽到的主题所对应的单词分布中抽取一个单词;
3.重复上述过程直至遍历文档中的每一个单词。
语料库中的每一篇文档与T(通过反复试验等方法事先给定)个主题的一个多项分布 相对应,将该多项分布记为θ。每个主题又与词汇表中的V个单词的一个多项分布相对应,将这个多项分布记为φ。

3.LDA整体流程

先定义一些字母的含义:文档集合D,主题(topic)集合T
D中每个文档d看作一个单词序列<w1,w2,…,wn>,wi表示第i个单词,设d有n个单词。(LDA里面称之为wordbag,实际上每个单词的出现位置对LDA算法无影响)
·D中涉及的所有不同单词组成一个大集合VOCABULARY,LDA以文档集合D作为输入,希望训练出的两个结果向量(设聚成k个topic,VOC*包含m个词):
·对每个D中的文档d,对应到不同Topic的概率θd<pt1,…,ptk>,其中,pti表示d对应T中第i个topic的概率。计算方法是直观的,pti=nti/n,其中nti表示d中对应第i个topic的词的数目,n是d中所有词的总数。
·对每个T中的topict,生成不同单词的概率φt<pw1,…,pwm>,其中,pwi表示t生成VOC中第i个单词的概率。计算方法同样很直观,pwi=Nwi/N,其中Nwi表示对应到topict的VOC中第i个单词的数目,N表示所有对应到topict的单词总数。

LDA的核心公式如下:
p(w|d)=p(w|t)*p(t|d)
直观的看这个公式,就是以Topic作为中间层,可以通过当前的θd和φt给出了文档d中出现单词w的概率。其中p(t|d)利用θd计算得到,p(w|t)利用φt计算得到。
实际上,利用当前的θd和φt,我们可以为一个文档中的一个单词计算它对应任意一个Topic时的p(w|d),然后根据这些结果来更新这个词应该对应的topic。然后,如果这个更新改变了这个单词所对应的Topic,就会反过来影响θd和φt。

4.LDA学习过程

下面介绍一种LDA的学习过程:
LDA算法开始时,先随机地给θd和φt赋值(对所有的d和t)。然后上述过程不断重复,最终收敛到的结果就是LDA的输出。再详细说一下这个迭代的学习过程:
1.针对一个特定的文档ds中的第i单词wi,如果令该单词对应的topic为tj,可以把上述公式改写为:
pj(wi|ds)=p(wi|tj)*p(tj|ds)
2.现在我们可以枚举T中的topic,得到所有的pj(wi|ds),其中j取值1~k。然后可以根据这些概率值结果为ds中的第i个单词wi选择一个topic。最简单的想法是取令pj(wi|ds)最大的tj(注意,这个式子里只有j是变量),即argmax[j]pj(wi|ds)
3.然后,如果ds中的第i个单词wi在这里选择了一个与原先不同的topic,就会对θd和φt有影响了(根据前面提到过的这两个向量的计算公式可以很容易知道)。它们的影响又会反过来影响对上面提到的p(w|d)的计算。对D中所有的d中的所有w进行一次p(w|d)的计算并重新选择topic看作一次迭代。这样进行n次循环迭代之后,就会收敛到LDA所需要的结果了。

3. SVM介绍

支持向量机(Support Vector Machine, SVM)是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面 。
SVM使用铰链损失函数计算经验风险并在求解系统中加入了正则化项以优化结构风险,是一个具有稀疏性和稳健性的分类器 。SVM可以通过核方法行非线性分类,是常见的核学习方法之一 。

三、实验过程

1.过程分析

使用LDA进行模型训练,得到每个文档的主题分布,即每个文档包含的每个主题的权重,此权重即可作为特征,然后将此特征进行svm训练,即可进行后续的文本的分类

2.处理步骤

(1)文本分词,去除停用词
(2)LDA模型训练
(3)SVM训练和分类

四、实验代码

1.LDA代码流程:

(1) 先对文档进行分词,然后对每个词语赋ID编号0~(n-1),计算共有n个词,m个文档
(2) 参数,变量设置:
K 主题数
beta β
alpha α
iter_times 迭代次数
top_words_num 每个主题特征词个数
p,概率向量,double类型,存储采样的临时变量,长度为主题数
nw,词word在主题上的分布数,长度为[n][K]
nwsum,每个主题的词的总数,长度为[K]
nd,每个文档中各个主题的词的总数,长度为[m][K]
ndsum,每个文档中词的总数,长度为[m]
Z,文档中各个词的所属主题,长度为[m][各个文档的词个数]
theta,长度为[m][K] 文章-主题分布
phi,长度为[K][n] 词-主题分布
(3) 初始化
先为各个文档里的词随机分配主题
for i to 文档数:
ndsum[i] = 文档i的词数
for j to 文档i的词数:
随机主题topic
Z[i][j] = topic
nw[词的ID编号][topic] += 1
nd[i][topic] += 1
nwsum[topic] += 1
(4) 开始迭代
迭代iter_times次:
for i to 文档数:
for j to 文档i的词数:
topic = self.Z[i][j] 取出文档i中第j的词的主题
取出文档i中第j的词的ID编号id,假设去除这个词后的主题分布
nw[id][topic] -= 1
nd[i][topic] -= 1
nwsum[topic] -= 1
ndsum[i] -= 1

            #计算每个主题的概率分布
            Vbeta = 词数 * self.beta
            Kalpha = K * self.alpha
            p = (nw[id] + beta)/(nwsum + Vbeta)*(nd[i] + alpha) / (ndsum[i] + Kalpha)
            for k to K:
                p[k] += p[k-1]

            随机一个概率u in (0,p[K-1])
            #如果转移概率大于u,则转移.
            for topic to K:
                if p[k]>u:
                break

            #确定文档i中的第j个词的主题为topic,重新赋值
            nw[id][topic] +=1
            nwsum[topic] +=1
            nd[i][topic] +=1
            ndsum[i] +=1

(5) 计算文章-主题分布,计算词-主题分布
for i to m: #这文档各个主题的单词数除以这文档总的词数
theta[i] = (nd[i]+alpha)/(ndsum[i]+K * alpha)
for i to K: #这主题各个的单词的数量除以这主题总的单词数
phi[i] = (nw.T[i]+beta)/(nwsum[i]+ n * beta)
(6) 取各个主题的前top_words_num个特征词
循环phi,取每一行的前top_words_num的最大值的下标,将下表反编码成词语输出.

2.SVM对文本训练分类

五.实验结果及分析

1.实验结果

用LDA模型抽取文本特征,再用线性SVM分类,输出结果:
Precision:0.680,Recall:0.649,F1:0.654

2.实验分析

由于时间较紧,LDA和SVM代码部分均存在问题,分类效果很差,还有待改进
会在后续完成完整代码。

六.附录

上一篇:动手实践用LDA模型计算两篇英文文档相似度


下一篇:no module namedpyLDAvis.gensim