一、主题模型

在文本挖掘领域,大量的数据都是非结构化的,很难从信息中直接获取相关和期望的信息,一种文本挖掘的方法:主题模型(Topic Model)能够识别在文档里的主题,并且挖掘语料里隐藏信息,并且在主题聚合、从非结构化文本中提取信息、特征选择等场景有广泛的用途。

主题可以被定义为“语料库中具有相同词境的词的集合模式”,比如说,主题模型可以

  • 将“健康”,“医生”,“病人”,“医院” 集合成 “医疗保健” 主题
  • 将 “农场”,“玉米”,“小麦” 集合成 “农业”主题

二、狄利克雷分布(Latent Dirichlet Allocation,LDA)主题模型

LDA 模式是生成式模型,在这里,假设需要建模的数据为 XXX,标签信息为 Y" role="presentation" style="position: relative;">YYY。

判别式模型:对 YYY 的产生过程进行描述,对特征信息本身不建模。判别式模型有利于构建分类器或者回归分析生成式模型需要对 X" role="presentation" style="position: relative;">XXX 和 YYY 同时建模,更适合做无监督学习分析。

生成式模型:描述一个联合概率分布 P(X,Y)" role="presentation" style="position: relative;">P(X,Y)P(X,Y)P(X, Y) 的分解过程,这个分解过程是虚拟的过程,真实的数据不是这么产生的,但是任何一个数据的产生过程可以在数学上等价为一个联合概率分布。

LDA 是一种矩阵分解技术,在向量空间中,任何语料(文档的集合)可以表示为文档(Document - Term,DT)矩阵。下面矩阵表达了一个语料库的组成:

. W1W1W_1 W2W2W_2 WmWmW_m
D1D1D_1 0 2 3
D2D2D_2 1 4 0
.........
DnDnD_n 1 1 0

其中,NNN个文档 D1,D2,…,Dn" role="presentation" style="position: relative;">D1,D2,…,DnD1,D2,…,DnD_1, D_2,…,D_n的组成语料库,MMM 个词 W1,W2,…,Wm" role="presentation" style="position: relative;">W1,W2,…,WmW1,W2,…,WmW_1, W_2, … , W_m 组成词汇表。矩阵中的值表示了词 WjWjW_j 在文档 DiDiD_i 中出现的频率,同时,LDA 将这个矩阵转换为两个低维度的矩阵,M1M1M_1 和 M2M2M_2。

. Z1Z1Z_1 Z2Z2Z_2 ZkZkZ_k
θ1θ1\theta_1 0 2 3
θ2θ2\theta_2 1 4 0
.........
θnθn\theta_n 1 1 0

上面显示了 M1M1M_1 矩阵的情况,它是一个 N∗KN∗KN * K 大小的 document - topic 矩阵,NNN 指文档的数量,K" role="presentation" style="position: relative;">KKK 指主题的数量,M1M1M_1 中,θiθi \theta_i 是一个长度为 kkk 的向量,用于描述当前文档 θi" role="presentation" style="position: relative;">θiθi \theta_i 在 kkk 个主题上的分布情况,Z" role="presentation" style="position: relative;">ZZZ 表示具体的主题。

. W1W1W_1 W2W2W_2 WmWmW_m
ϕ1ϕ1\phi_1 0 2 3
ϕ2ϕ2\phi_2 1 4 0
.........
ϕkϕk\phi_k 1 1 0

上面显示了 M2M2M_2 矩阵的情况,它是一个 K∗VK∗VK * V 维的 topic - term矩阵,KKK 指主题的数量,V" role="presentation" style="position: relative;">VVV 指词汇表的大小。M2M2 M_2 中每一行都是一个 ϕϕ\phi 分布,也就是主题 ϕkϕk\phi_k 在 mmm 个词上的多项式分布情况,可以通过学习得到。

LDA 文档生成流程

LDA 假设文档是由多个主题的混合来产生的,每个文档的生成过程如下:

  1. 从全局的泊松分布参数为 β" role="presentation" style="position: relative;">ββ\beta 的分布中生成一个文档的长度 NNN
  2. 从全局的狄利克雷参数为 alpha" role="presentation" style="position: relative;">alphaalphaalpha 的分布中生成一个当前文档的 θθ\theta
    • 对当前文档长度 NNN 的每一个字都有

      • 从 θ" role="presentation" style="position: relative;">θθ\theta 为参数的多项式分布生成一个主题的下标 znznz_n
      • 从 θθ\theta 和 zzz 共同为参数的多项式分布中,产生一个字 wn" role="presentation" style="position: relative;">wnwnw_n
      • 这些主题基于词的概率分布来产生词,给定文档数据集,LDA 可以学习出,是哪些主题产生了这些文档。

        对于文档生成过程,则有,首先对于文档 nnn 中的每一个字,都先从文档矩阵 M1" role="presentation" style="position: relative;">M1M1M_1 中的 θiθi \theta_i 中产生一个下标,告诉我们现在要从主题矩阵 M2M2M_2 中的哪一行 ϕmϕm\phi_m生成当前的字。

        训练过程(吉布斯采样)

        吉布斯采样 (Gibbs Sampling) 首先选取概率向量的一个维度,给定其他维度的变量值当前维度的值,不断收敛来输出待估计的参数。具体地

        1. 随机给每一篇文档的每一个词 www,随机分配主题编号 z" role="presentation" style="position: relative;">zzz
        2. 统计每个主题 ziziz_i 下出现字 www 的数量,以及每个文档 n" role="presentation" style="position: relative;">nnn 中出现主题 ziziz_i 中的词 www 的数量
        3. 每次排除当前词 www 的主题分布 zi" role="presentation" style="position: relative;">ziziz_i,根据其他所有词的主题分类,来估计当前词 www 分配到各个主题 z1,z2,…,zk" role="presentation" style="position: relative;">z1,z2,…,zkz1,z2,…,zkz_1, z_2, …,z_k 的概率,即计算 p(zi|z−i,d,w)p(zi|z−i,d,w)p(z_i | z_{-i}, d, w ) (Gibbs updating rule))。得到当前词属于所有主题z1,z2,…,zkz1,z2,…,zkz_1, z_2, …, z_k 的概率分布后,重新为词采样一个新的主题 z1z1z_1。用同样的方法不断更新的下一个词的主题,直到每个文档下的主题分布θnθn\theta_n 和每个主题下的词分布 ϕkϕk\phi_k 收敛。
        4. 最后输出待估计参数,θnθn\theta_n 和 ϕkϕk\phi_k ,每个单词的主题 zn,kzn,kz_{n,k} 也可以得到。

        LDA 对于每个文档的每一个字都有一个主题下标。但从文档聚类的角度来说,LDA 没有一个文档统一的聚类标签,而是每个字都有一个聚类标签,这个就是主题。LDA 每个字都有可能属于不同的类别,每个文档都有可能属于不同的类别。在大量的迭代后,主题分布和字分布都比较稳定也比较好了,LDA 模型收敛。

        三、LDA 的参数

        αα\alpha :表示 document-topic 密度, αα\alpha 越高,文档包含的主题更多,反之包含的主题更少

        ββ\beta :表示 topic-word 密度, ββ\beta 越高,主题包含的单词更多,反之包含的单词更少

        主题数量:主题数量从语料中抽取得到,使用 Kullback Leibler Divergence Score 可以获取最好的主题数量。

        主题词数:组成一个主题所需要的词的数量。这些词的数量通常根据需求得到,如果说需求是抽取特征或者关键词,那么主题词数比较少,如果是抽取概念或者论点,那么主题词数比较多。

        迭代次数:使得 LDA 算法收敛的最大迭代次数

        四、Running in Python

        准备文档集合
        doc1 = "Sugar is bad to consume. My sister likes to have sugar, but not my father."
        doc2 = "My father spends a lot of time driving my sister around to dance practice."
        doc3 = "Doctors suggest that driving may cause increased stress and blood pressure."
        doc4 = "Sometimes I feel pressure to perform well at school, but my father never seems to drive my sister to do better."
        doc5 = "Health experts say that Sugar is not good for your lifestyle."# 整合文档数据
        doc_complete = [doc1, doc2, doc3, doc4, doc5]
        数据清洗和预处理

        数据清洗对于任何文本挖掘任务来说都非常重要,在这个任务中,移除标点符号,停用词和标准化语料库(Lemmatizer,对于英文,将词归元)。

        from nltk import stopwords
        from nltk.stem.wordnet import WordNetLemmatizer
        import stringstop = set(stopwords.words('english'))
        exclude = set(string.punctuation)
        lemma = WordNetLemmatizer()def clean(doc):stop_free = " ".join([i for i in doc.lower().split() if i not in stop])punc_free = ''.join(ch for ch in stop_free if ch not in exclude)normalized = " ".join(lemma.lemmatize(word) for word in punc_free.split())return normalizeddoc_clean = [clean(doc).split() for doc in doc_complete]
        准备 Document - Term 矩阵

        语料是由所有的文档组成的,要运行数学模型,将语料转化为矩阵来表达是比较好的方式。LDA 模型在整个 DT 矩阵中寻找重复的词语模式。Python 提供了许多很好的库来进行文本挖掘任务,“genism” 是处理文本数据比较好的库。下面的代码掩饰如何转换语料为 Document - Term 矩阵:

        import genism
        from gensim import corpora# 创建语料的词语词典,每个单独的词语都会被赋予一个索引
        dictionary = corpora.Dictionary(doc_clean)# 使用上面的词典,将转换文档列表(语料)变成 DT 矩阵
        doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean]
        构建 LDA 模型

        创建一个 LDA 对象,使用 DT 矩阵进行训练。训练需要上面的一些超参数,gensim 模块允许 LDA 模型从训练语料中进行估计,并且从新的文档中获得对主题分布的推断。

        # 使用 gensim 来创建 LDA 模型对象
        Lda = genism.models.ldamodel.LdaModel# 在 DT 矩阵上运行和训练 LDA 模型
        ldamodel = Lda(doc_term_matrix, num_topics=3, id2word = dictionary, passes=50)
        结果
        # 输出结果
        print(ldamodel.print_topics(num_topics=3, num_words=3))['0.168*health + 0.083*sugar + 0.072*bad,'0.061*consume + 0.050*drive + 0.050*sister,'0.049*pressur + 0.049*father + 0.049*sister
        ]

        每一行包含了主题词和主题词的权重,Topic 1 可以看作为“不良健康习惯”,Topic 3 可以看作 “家庭”。

        五、提高主题模型结果的一些方法

        主题模型的结果完全取决于特征在语料库中的表示,但是语料通常表示为比较稀疏的文档矩阵,因此减少矩阵的维度可以提升主题模型的结果。

        1. 根据词频调整稀疏矩阵

        根据频率来分布词,高频词更可能出现在结果中,低频词实际上是语料库中的弱特征,对于词频进行分析,可以决定什么频率的值应该被视为阈值。

        2. 根据词性标注 (Part of Speech Tag) 调整稀疏矩阵

        比起频率特征,词性特征更关注于上下文的信息。主题模型尝试去映射相近的词作为主题,但是每个词在上下文上有可能重要性不同,比如说介词 “IN” 包含 “within”,“upon”, “except”,基数词 “CD” 包含:许多(many),若干(several),个把(a,few)等等,情态助动词 “MD” 包含 “may”,“must” 等等,这些词可能只是语言的支撑词,对实际意义影响不大,因此可以通过词性来消除这些词的影响。

        3. 调整 LDA 的 Batch 大小

        为了得到主题中最重要的主题词,语料可以被分为固定大小的 batch,在这些 batch 上运行 LDA 模型会提供不同的结果,但是最佳的主题词会在这些 batch 上有交集。

        主题模型用于特征选择

        比如说文本分类任务中,LDA 可以用来选择特征,因为训练数据中含有类别信息,可以在不同类别的结果中,删除相同的、比较常见的主题词,为主题类别提供更好的特征。

        结语

        本文主要参考了[1],没有什么公式,用于对 LDA 有一个大概的了解,后面也会更深入 LDA 模型,可以一边运行上面的代码一边感受 LDA 的作用。

        参考文献

        [1] https://www.analyticsvidhya.com/blog/2016/08/beginners-guide-to-topic-modeling-in-python

        [2] http://link.springer.com/chapter/10.1007%2F978-3-642-13657-3_43

主题模型 LDA 入门(附 Python 代码)相关推荐

  1. 数学建模python代码_主题模型 LDA 入门(附 Python 代码)

    一.主题模型 . m! g4 ~. ^3 |% A# f在文本挖掘领域,大量的数据都是非结构化的,很难从信息中直接获取相关和期望的信息,一种文本挖掘的方法:主题模型(Topic Model)能够识别在 ...

  2. MATLAB算法实战应用案例精讲-【深度学习】扩散模型(DM)(附python代码实现)

    目录 前言 广播模型 扩散模型 几个高频面试题目 GAN.VAE和基于流的生成模型之间的区别

  3. LDA主题模型原理解析与python实现

    本文转自:LDA主题模型原理解析与python实现_wind_blast的博客-CSDN博客   python实现: #-*- coding:utf-8 -*- import logging impo ...

  4. python主题建模_在PYTHON中进行主题模型LDA分析

    原文链接:在PYTHON中进行主题模型LDA分析​tecdat.cn 主题建模是一种在大量文档中查找抽象主题的艺术方法.一种作为监督无的机器学习方法,主题模型不容易评估,因为没有标记的"基础 ...

  5. 数据包络分析(超效率-SBM模型)附python代码

    超效率-SBM模型 超效率SBM python代码(部分) 这段时间差不多忙完了,终于有时间可以来经营我的博客了. 上阵子挺多人私信我,原谅我记性不好,可能没有回复全. 这篇文章是超效率的扩展. 超效 ...

  6. 教程 | 理解和实现自然语言处理终极指南(附Python代码)

     教程 | 理解和实现自然语言处理终极指南(附Python代码) 时间 2017-02-16 14:41:39 机器之心 原文  http://www.jiqizhixin.com/article ...

  7. 机器学习系列(12)_XGBoost参数调优完全指南(附Python代码)

    机器学习系列(12)_XGBoost参数调优完全指南(附Python代码) 原文链接:http://blog.csdn.net/han_xiaoyang/article/details/5266539 ...

  8. python重点知识归纳_一文了解机器学习知识点及其算法(附python代码)

    一文了解机器学习知识点及其算法(附python代码) 来源:数据城堡 时间:2016-09-09 14:05:50 作者: 机器学习发展到现在,已经形成较为完善的知识体系,同时大量的数据科学家的研究成 ...

  9. 狄利克雷分布主题模型LDA

    狄利克雷分布主题模型LDA 文章目录 狄利克雷分布主题模型LDA 1.整体把握LDA 2.前提知识 2.1 gamma函数 2.2 四个分布 2.2.1 二项分布 2.2.2 多项分布 2.2.3 B ...

最新文章

  1. java--IO流(详)
  2. 电销机器人价格_箭鱼电销机器人:为什么电话机器人公司不用机器人给你打电话?...
  3. hdu-4451-Dressing
  4. NSMutableArray 排序
  5. Javascript 检测 页面是否在iframe中
  6. 那些查了无数遍的问题
  7. 算法入门——排序算法
  8. Android ADV 虚拟卡常见错误Failed to push的解决
  9. Markdown(四)——绘图工具mermaid之状态图stateDiagram
  10. Matlab协方差矩阵的计算原理
  11. Luogu1095 守望者的逃离
  12. cstring判断包含字符串_Power Query中判断字符串中是否包含有字母的三种解决办法...
  13. Django根据现有数据库建立model
  14. LVS(三)lvs+keeplive
  15. 用计算机上初中英语课的方法,如何上好初中英语读写课
  16. rssi室内定位算法原理_室内定位常用算法概述
  17. WebSocket服务端消息推送
  18. 通过文件流转加密压缩文件并下载
  19. Error opening device
  20. 亚马逊AWS命令行 aws cli

热门文章

  1. 从输入url开始能做哪些优化
  2. 安装SQL Server详细教程
  3. 戴尔灵越/成就 5402/5502 最新十一代处理器重装系统过程中无法识别硬盘解决方案
  4. 杨贵妃秘史雷人台词抢先看!
  5. .NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现与应用(1)
  6. 如何将域名解析度aws_使用信息上下文的aws appsync条件解析器
  7. 凹凸世界搬运工机器人图片_凹凸世界夏日学园祭头像怎么领取?奖励预览内容汇...
  8. fastlane 进行 ios 构建
  9. Dynamic-OFA: Runtime DNN Architecture Switching for Performance Scaling on Heterogeneous Embedd Pla
  10. 推荐近年来印象最深的几本书