目录

  • 什么是LDA主题模型
  • 背景知识
    • 贝叶斯理论
    • gamma函数
    • 多个分布
      • 博鲁尼分布
      • 二项分布
      • 多项分布
      • beta分布
      • Dirichlet 分布
  • 开始了解LDA
  • Python建模

什么是LDA主题模型

首先说明一下什么是主题模型。这里的主题模型是把一份份不同的文本内容通过某种方式来找到这些文本对应的主题。打个比方:我有一堆新闻类文档,但我想将这对文档进行主题分类。到底是娱乐?军事?政治?等主题。这时候就使用到主题模型。
而这里的LDA和特征工程的LDA不一样。全名Latent Dirichlet Allocation,是一款基于Dirichlet分布的概率主题模型。他属于非监督学习,当中运用到了概率论以及词袋模型等知识。

背景知识

为了更容易的了解LDA的工作原理,请原谅我的啰嗦。先简单的科普一下背景知识。当然已经熟悉的朋友,可以选择忽略这个酌情下一步

贝叶斯理论

这个应该很多人都认识的。这里面先验概率等知识我就不说了。这里先列出贝叶斯公式:
P(θ,y)=P(θ)P(y∣θ)P(\theta,y) = P(\theta)P(y|\theta) P(θ,y)=P(θ)P(y∣θ)
然后就演变出
P(θ∣y)=P(θ,y)P(θ)=P(θ)P(y∣θ)P(θ)P(\theta|y) = \frac{P(\theta,y)}{ P(\theta)}=\frac{P(\theta)P(y|\theta)}{P(\theta)} P(θ∣y)=P(θ)P(θ,y)​=P(θ)P(θ)P(y∣θ)​
这个公式的伟大之处就是实现了概率统计上的“交换律”。本来我们要求y下发现的概率,变成了theta下的概率。这为后面LDA模型提供了基础

gamma函数

gamma是阶乘函数在实数的推广。先回顾一下实数的阶乘公式
Γ(n)=(n−1)!\Gamma(n) = (n-1)! Γ(n)=(n−1)!
相对于实数界的有
Γ(x)=∫0∞tx−1e−tdt\Gamma(x) = \int_0^\infty{t^{x-1}}e^{-t}dt Γ(x)=∫0∞​tx−1e−tdt

多个分布

博鲁尼分布

博鲁尼就是只有两种出现的情况。比如要么0,要么1。我制作一次实现得到的分布结果。

二项分布

二项分布就是某一种概率事件,他只可能出现两种情况,要么正要么负{+,-}。他是博鲁尼分布执行N此以后的结果。这种分布就是二项分布。比如最常见的就是抛硬币,出现字和出现图案的概率就是二项分布。二项分布的密度函数有
P(K=k)=(kn)pk(1−p)n−kP(K=k)=(^n_k)p^k(1-p)^{n-k} P(K=k)=(kn​)pk(1−p)n−k

多项分布

多项分布就是二项分布的多维度展开式。也就是说我的概率事件不在是{+,-}。而是存在很多种情况。比如掷骰子,概率事件有{1,2,3,4,5,6}。在执行N此实验以后,就会出现k=6的多项分布。相关密度函数有
P(x1,x2,⋅⋅⋅,xk;n,p1,p2,⋅⋅⋅,pk)=n!x1!⋅⋅⋅xn!P1X1⋅⋅⋅PnXnP(x_1,x_2,···,x_k;n,p_1,p_2,···,p_k)=\frac{n!}{x_1!···x_n!}P_1^{X_1}···P_n^{X_n} P(x1​,x2​,⋅⋅⋅,xk​;n,p1​,p2​,⋅⋅⋅,pk​)=x1​!⋅⋅⋅xn​!n!​P1X1​​⋅⋅⋅PnXn​​

beta分布

beta分布式二项分布的共轭先验分布。说白了他就是二项分布+gamma函数。
给定参数a他的函数公式有:
Beta(x∣α,β)=Γ(a+β)Γ(a)Γ(β)pα−1(1−x)β−1Beta(x|\alpha,\beta)=\frac{\Gamma(a+\beta)}{\Gamma(a)\Gamma(\beta)}p^{\alpha-1}(1-x)^{\beta-1} Beta(x∣α,β)=Γ(a)Γ(β)Γ(a+β)​pα−1(1−x)β−1

Dirichlet 分布

最后Dirichlet分布其实就是beta分布的多维度推广。他们的关系可以理解为二项分布与多项分布的关系。所以,他的函数公式为:
Dirichlet(x1,x2,⋅⋅⋅,xn;α1,α2,⋅⋅⋅,αn)=Γ(α1+α2+⋅⋅⋅+αn)Γ(α1)Γ(α2)⋅⋅⋅Γ(αn)x1α1−1x2α2−1⋅⋅⋅xnαn−1Dirichlet(x_1,x_2,···,x_n;\alpha_1,\alpha_2,···,\alpha_n)=\frac{\Gamma(\alpha_1+\alpha_2+···+\alpha_n)}{\Gamma(\alpha_1)\Gamma(\alpha_2)···\Gamma(\alpha_n)}x_1^{\alpha_1-1}x_2^{\alpha_2-1}···x_n^{\alpha_n-1} Dirichlet(x1​,x2​,⋅⋅⋅,xn​;α1​,α2​,⋅⋅⋅,αn​)=Γ(α1​)Γ(α2​)⋅⋅⋅Γ(αn​)Γ(α1​+α2​+⋅⋅⋅+αn​)​x1α1​−1​x2α2​−1​⋅⋅⋅xnαn​−1​
这里细看一下,是不是感觉和多项式分布的公式有点像

开始了解LDA

上面讲了那么多东西,那么到底什么才是LDA模型呢?我们先拟定一个命题:现在我们有很多篇新闻稿件,我们要针对这些稿件进行主题分类。大概如图下面的意思(图片来源于网络)

也就是我们需要求概率P(主题|文档)。然后从P的最大值获取该稿件的最可能概率。这里利用贝叶斯概率公式的链条化简,可以得到这么一条公式
P(单词∣文档)=P(单词∣主题)P(主题∣文档)P(单词|文档)=P(单词|主题)P(主题|文档) P(单词∣文档)=P(单词∣主题)P(主题∣文档)
具体推导我这里就不列出来了,大家可以自行对照上面的贝叶斯进行化简。
从这里我们可以看出,LDA对主题分类做了一件什么事呢?他其实就是求P(单词|文档)P(单词|主题) 这两个概率分布,然后结合着两个概率分布来求出P(主题|文档)的最大值。最后得到该文档的主题。所以LDA的具体流程如下:

他的具体步骤如下:

  1. 首先假设稿件主题的先验分布服从Dirichlet分布。既对某个文档d,其主题的分布有:
    θd=Dirichlet(α)\theta_{d}=Dirichlet(\alpha) θd​=Dirichlet(α)
    这里对应的是流程图中左边的两个圈圈的步骤。

  2. 假设主题中的词的先验分布服从Dirichlet分布。既对任意一个主题k有:
    βk=Dirichlet(μ)\beta_{k}=Dirichlet(\mu) βk​=Dirichlet(μ)
    这里对应流程图中右边的两个圈圈。

  3. 最后结合两边的分布最后得到最后的词分布,从而达到预测主题的想过。

Python建模

理论知识就到此为止,接下来我们进行python的建模。采用往上面比较多用的希拉里邮件数据:https://wx.jdcloud.com/market/packet/10487
然后下面是我的代码和注释

# 导包
import numpy as np
import pandas as pd
import re
from gensim import corpora, models, similarities
import gensim# 文本预处理
def clean_email_text(text):text = text.replace('\n'," ") #新行,我们是不需要的text = re.sub(r"-", " ", text) #把 "-" 的两个单词,分开。(比如:july-edu ==> july edu)text = re.sub(r"\d+/\d+/\d+", "", text) #日期,对主体模型没什么意义text = re.sub(r"[0-2]?[0-9]:[0-6][0-9]", "", text) #时间,没意义text = re.sub(r"[\w]+@[\.\w]+", "", text) #邮件地址,没意义text = re.sub(r"/[a-zA-Z]*[:\//\]*[A-Za-z0-9\-_]+\.+[A-Za-z0-9\.\/%&=\?\-_]+/i", "", text) #网址,没意义pure_text = ''# 以防还有其他特殊字符(数字)等等,我们直接把他们loop一遍,过滤掉for letter in text:# 只留下字母和空格if letter.isalpha() or letter==' ':pure_text += letter# 再把那些去除特殊字符后落单的单词,直接排除。# 我们就只剩下有意义的单词了。text = ' '.join(word for word in pure_text.split() if len(word)>1)return text
# 数据读取
df = pd.read_csv('Emails.csv')
# 简单处理一下,去掉空
df = df[['Id','ExtractedBodyText']].dropna()
# 清除无用内容,只保留单词
docs = df['ExtractedBodyText'].apply(lambda x: clean_email_text(x))
doclist = docs.values
# 手动列出停用词列表,中文的话可稍微百度一下虚词列表
stoplist = ['very', 'ourselves', 'am', 'doesn', 'through', 'me', 'against', 'up', 'just', 'her', 'ours', 'couldn', 'because', 'is', 'isn', 'it', 'only', 'in', 'such', 'too', 'mustn', 'under', 'their', 'if', 'to', 'my', 'himself', 'after', 'why', 'while', 'can', 'each', 'itself', 'his', 'all', 'once', 'herself', 'more', 'our', 'they', 'hasn', 'on', 'ma', 'them', 'its', 'where', 'did', 'll', 'you', 'didn', 'nor', 'as', 'now', 'before', 'those', 'yours', 'from', 'who', 'was', 'm', 'been', 'will', 'into', 'same', 'how', 'some', 'of', 'out', 'with', 's', 'being', 't', 'mightn', 'she', 'again', 'be', 'by', 'shan', 'have', 'yourselves', 'needn', 'and', 'are', 'o', 'these', 'further', 'most', 'yourself', 'having', 'aren', 'here', 'he', 'were', 'but', 'this', 'myself', 'own', 'we', 'so', 'i', 'does', 'both', 'when', 'between', 'd', 'had', 'the', 'y', 'has', 'down', 'off', 'than', 'haven', 'whom', 'wouldn', 'should', 've', 'over', 'themselves', 'few', 'then', 'hadn', 'what', 'until', 'won', 'no', 'about', 'any', 'that', 'for', 'shouldn', 'don', 'do', 'there', 'doing', 'an', 'or', 'ain', 'hers', 'wasn', 'weren', 'above', 'a', 'at', 'your', 'theirs', 'below', 'other', 'not', 're', 'him', 'during', 'which','am','pm']
# 去除停用词
texts = [[word.lower() for word in doc.lower().split() if word not in stoplist] for doc in doclist]
# 创建语料库,把每一个单词转化成元祖模式展示[(15, 1), (17, 1)]
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
# 训练模型
lda = gensim.models.ldamodel.LdaModel(corpus=corpus,id2word=dictionary,num_topics=20)
# 打印主题各单词结果
print(lda.print_topics(num_topics=20,num_words=10))
# 保存语料库与模型
lda.save('hillary_classify_model.model')
dictionary.save('hillary_classify_dictionary.model')
# 模型的加载和预测
model = gensim.models.ldamodel.LdaModel.load('hillary_classify_model.model')
dic = corpora.Dictionary.load('hillary_classify_dictionary.model')
# 这里假设我有一篇关于奥巴马与民主党的新闻稿件
s = 'The news of Obama or Republican Party'
text = s.lower().split(' ')
# 预测主题
bow = dic.doc2bow(text)
model.get_document_topics(bow)

LDA主题模型的原理和建模相关推荐

  1. LDA主题模型的原理及使用教程

    这是一个NLP参赛项目的主题分析环节的代码,总体的工程代码已经上传至github,可以直接下载使用. https://github.com/stay-leave/weibo-public-opinio ...

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

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

  3. LDA通俗理解LDA主题模型

    转自:http://blog.csdn.net/v_july_v/article/details/41209515#t13 通俗理解LDA主题模型 0 前言 印象中,最开始听说"LDA&qu ...

  4. 通俗理解LDA主题模型(转载自 v_JULY_v 大佬)

    通俗理解LDA主题模型 原文:https://blog.csdn.net/v_july_v/article/details/41209515 0 前言 印象中,最开始听说"LDA" ...

  5. 理解 LDA 主题模型

    前言 gamma函数 0 整体把握LDA 1 gamma函数 beta分布 1 beta分布 2 Beta-Binomial 共轭 3 共轭先验分布 4 从beta分布推广到Dirichlet 分布 ...

  6. 通俗理解LDA主题模型(转)

    from :http://blog.csdn.net/v_july_v/article/details/41209515 也推荐:LDA漫步指南 通俗理解LDA主题模型 0 前言 印象中,最开始听说& ...

  7. 词典构造方法之LDA主题模型

    词典构造方法之LDA主题模型 主题模型LDA原理理解 LDA是一种非监督学习技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息.它采用了词 ...

  8. 【NLP】LDA主题模型详解

    前言   本人在开始学习LDA主题模型时,一开始看上去感觉挺简单.挺容易理解的.但是,要想真正理解它不是那么容易,大概是因为里面的数学知识点比较多,让一些数学基础不好的人望而生畏.不过好在,如果不想深 ...

  9. 用R做中文LDA主题模型可视化分析

    LDA主题模型在2002年被David M. Blei.Andrew Y. Ng(是的,就是吴恩达老师)和Michael I. Jordan三位第一次提出,近几年随着社会化媒体的兴起,文本数据成为越来 ...

最新文章

  1. 步进电机加减速算法介绍和基于AVR446_Linear speed control of stepper motor的步进电机加减速实现
  2. Supervisor 守护你的进程
  3. 用 Hadoop 进行分布式并行编程, 第 3 部分 部署到分布式环境
  4. 百度大数据可视化产品矩阵
  5. 2.2 KNN算法实现
  6. 服务器与客户端渲染(AngularJS与服务器端MVC)
  7. python hack_Python进阶:深入GIL(上篇)
  8. 关于微信内置浏览器,打开图片上传功能,调用的问题
  9. 前端安全 -- XSS攻击
  10. 关于IOS内存机制的较深入分析
  11. FPGA--(verilog)一个完整工程的设计(包含设计块和激励块)及仿真
  12. IE、firefox下怎样获得自定义属性的值
  13. suse11 升级glibc版本
  14. java万年历程序代码_JAVA万年历程序代码
  15. Chrome 进阶:用扩展武装自己
  16. Preact 在TSX中优雅使用className
  17. centos搭建proxypool
  18. 金融数据分析与挖掘具体实现方法
  19. 产业数字化时代,近千亿美元估值的阿里云必将大有所为!
  20. 端到端机器学习_使用automl进行端到端的自动化机器学习过程

热门文章

  1. cleave.js_Cleave.js的Vue.js 2.x组件
  2. 微信红包居然可以撤回?这功能我猜你应该还不知道!
  3. 机器学习与物理科学(三)(Machine learning and the physical sciences)
  4. 全网最强 JVM 来袭!(至尊典藏版)
  5. 游戏美术人体结构设计分享(二):动作、运动与肌肉形变
  6. JAVA:错误: 编码GBK的不可映射字符;错误: 找不到或无法加载主类;
  7. TQ2440使用手册
  8. 鲲鹏HCIA学习笔记【一】鲲鹏体系介绍
  9. 解决4G路由器内网无法ping通外网问题总结
  10. 【Ansys Maxwell 2D】电磁场有限元仿真新手教程 [EE 2022/7/11学习笔记]