自然语言处理-LDA主题模型

LDA主题模型
哈尔滨工程大学-537

一、LDA主题模型简介
LDA(Latent Dirichlet Allocation)中文翻译为:潜在狄利克雷分布。LDA主题模型是一种文档生成模型,是一种非监督机器学习技术。它认为一篇文档是有多个主题的,而每个主题又对应着不同的词。一篇文档的构造过程,首先是以一定的概率选择某个主题,然后再在这个主题下以一定的概率选出某一个词,这样就生成了这篇文档的第一个词。不断重复这个过程,就生成了整篇文章(当然这里假定词与词之间是没有顺序的,即所有词无序的堆放在一个大袋子中,称之为词袋,这种方式可以使算法相对简化一些)。

LDA的使用是上述文档生成过程的逆过程,即根据一篇得到的文档,去寻找出这篇文档的主题,以及这些主题所对应的词。

白话解释:比如document1的内容为:[自从乔布斯去世之后,iPhone再难以产生革命性的创新了] 
通过上述的方法,document1将对应两个主题topic1,topic2,进而,主题topic1会对应一些词:[苹果创始人][苹果手机],主题topic2会对应一些词:[重大革新][技术突破]。于是LDA模型的好处显而易见,就是可以挖掘文档中的潜在词或者找到两篇没有相同词的文档之间的联系。

二、算法流程
(超详细,超通俗易懂,逻辑脉络超清晰)

我们以文档集合D中的文档d为例,文档d中包含单词序列<w1,w2,...wn><w1,w2,...wn>,wiwi表示第ii个单词,设d中有nn个单词; 
文档集合D中出现的全部词组成VocabularyVocabulary; 
首先将文档d作为算法的输入,并输入主题数K,此时d对应到各个主题的概率为θd=(pt1,pt2,...ptk)θd=(pt1,pt2,...ptk),ptipti为d对应第ii个主题的概率; 
此时输入到算法中的只有文档d和主题数K,那么pt1,pt2...ptkpt1,pt2...ptk的数值从何而来?

我们首先人为设置文档d中对应主题t1,t2,...tkt1,t2,...tk的词的个数,比如文档d中5个词对应主题t1t1,7个词对应主题t2t2,…,4个词对应主题tktk,那么此时,我们就人为确定了一个参数向量(5,7,…4),将这个向量记作α⃗ α→,这个我们人为设置的参数向量称为超参数。 
那么如何将超参数α⃗ α→转化为概率分布θd=(pt1,pt2,...ptk)θd=(pt1,pt2,...ptk)呢?

这里我们引入狄利克雷分布函数: 
Dirichlet(p1,p2,p3|α1,α2,α3)=Γ(α1+α2+α3)Γ(α1)Γ(α2)Γ(α3)pα1−11pα2−22pα3−33
Dirichlet(p1,p2,p3|α1,α2,α3)=Γ(α1+α2+α3)Γ(α1)Γ(α2)Γ(α3)p1α1−1p2α2−2p3α3−3
它所表达的含义简单来说就是,已知α1,α2,α3α1,α2,α3的条件下,概率p1,p2,p3p1,p2,p3的概率分布,也就是概率的概率,分布的分布。再直观点说就是:比如在已知α1,α2,α3α1,α2,α3为(5,7,4)(5,7,4)的条件下,样本点p1,p2,p3p1,p2,p3为(0.4,0.5,0.1)(0.4,0.5,0.1)的概率是多少。

那么我们将上述的三维DirichletDirichlet函数扩展为KK维,即在已知α⃗ α→的条件下,得到p⃗ p→的分布(α⃗ ,p⃗ α→,p→分别为K维向量)。KK维DirichletDirichlet公式如下: 
Dirichlet(p⃗ |α⃗ )=Γ(∑Kk=1αk)∏Kk=1Γ(αk)∏k=1Kpαk−1k
Dirichlet(p→|α→)=Γ(∑k=1Kαk)∏k=1KΓ(αk)∏k=1Kpkαk−1
至此,我们通过输入超参数α⃗ α→得到了文档d的关于K个主题的狄利克雷分布: 
θd=Dirichlet(α⃗ )
θd=Dirichlet(α→)

其含义显然,DirichletDirichlet的输入参数为α⃗ α→,得到的输出为可以理解为一个矩阵: 
(pt1,pt2,...ptk)(pt1,pt2,...ptk) 
............ 
............ 
(pt1,pt2,....ptk)(pt1,pt2,....ptk) 
即文档d对应各个主题tktk的概率分布的分布。
同理,我们可以将任一主题tktk产生各个词的概率表示出来。人为设置主题tktk产生的各个词的数量,即设置超参数,用向量η⃗ η→来表示。同上所述,将η⃗ η→作为DirichletDirichlet函数的输入参数,得到主题tktk产生各个词的狄利克雷分布: 
βk=Dirichlet(η⃗ )
βk=Dirichlet(η→)
此时我们已经得到了文档d对应各个主题的概率分布的分布(即狄利克雷分布)θdθd,以及文档tktk产生各个词的概率分布的分布βkβk,那么接下来,我们要从文档d中取出第i个词,求这个词对应各个主题的分布; 
换句大家熟悉的话来说就是:已知第i个词wiwi在文档d中出现n次,且已知它对应各个主题的概率(这里每个词对应各个主题的概率就是文档d对应各个主题的概率,二者同分布),求该词被各个主题产生的次数; 
这就等同于我们熟知的一共有n个球,且已知红球、黄球、绿球的概率分别为p1,p2,p3p1,p2,p3,求这n个求当中红球、黄球、绿球的个数。

那么如何通过文档d对应各个主题的分布θdθd得到文档中的每个词被各个主题产生的次数,进而重新得到文档d中对应各个主题的词的个数呢?

首先我们引入十分熟悉的多项式分布: 
multi(m1,m2,m3|n,p1,p2,p3)=n!m1!m2!m3!pm11pm22pm33
multi(m1,m2,m3|n,p1,p2,p3)=n!m1!m2!m3!p1m1p2m2p3m3

这个公式的意义总所周知:已知一共n个球,且知道每种颜色球的概率,就可以得到有m1m1个红球,m2m2个黄球,m3m3个绿球的概率。
那么同样将其扩展为K维,将θdθd作为参数,就可以得到文档d中第i个词wiwi对应的各个主题的多项式分布zdn=multi(θd)zdn=multi(θd) 
于是,非常值得庆幸,我们通过文档d对应各个主题的概率θdθd,进而得知文档d中各个词对应各个主题的概率,且知道这个词在文档d中的出现次数,于是求得这个词被各个主题的产生次数,遍历文档d中的每一个词,就可以得到新的文档d中对应各个主题的词的个数。 
白话举例:文档d对应主题t1,t2t1,t2的概率分别为pt1,pt2,pt1,pt2,,于是文档d中词w1w1对应的主题t1,t2,t1,t2,的概率也分别为pt1,pt2pt1,pt2,又得知词w1w1在文档d中出现了15次,于是得到词w1w1由主题t1,t2t1,t2产生的次数分别为10次、5次(这个是假设的); 
对文档d中的每个词都执行此操作,(假设文档中只有两个词)词w2w2由主题t1,t2t1,t2产生的次数分别为13次、2次,于是就能重新得到文档d中对应各个主题的词的数量,即对应主题t1,t2t1,t2的词的数量分别为2个、0个(初始的d中对应各个主题的词的数量是人为设定的超参数α⃗ α→)。

于是,我们最终得到了文档d对应各个主题的词的个数的更新值:记作向量n⃗ n→,我们将更新后的向量n⃗ n→再次作为狄利克雷分布的输入向量,即Dirichlet(θd|n⃗ )Dirichlet(θd|n→),就会又会得到文档d对应各个主题的概率的更新值,即更新的θdθd,如此反复迭代,最终得到收敛的θdθd,即为我们要的结果。

有了以上的经验,主题tktk产生各个词的概率βkβk可以同样处理,对于产生文档d中的第ii个词wiwi的各个主题的分布为: 
multi(βi)multi(βi),于是用同上面相同的方法,可以得到更新后的各个主题产生各个单词的数量:记作向量m⃗ m→,将向量m⃗ m→作为新的参数再次带入狄利克雷分布Dirichlet(βk|m⃗ )Dirichlet(βk|m→),就又会得到每个主题产生各个词的概率,即更新的βkβk,如此反复迭代,最终得到收敛的βkβk,即所求结果。

得到了收敛的θdθd和βkβk,算法就大功告成了,这时,该算法就会根据输入的文档d,找到潜在主题下的相关词啦!!!!
————————————————
版权声明:本文为CSDN博主「weixin_41090915」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41090915/article/details/79058768

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css 百分比 怎么固定正方形_你未必知道的49个CSS知识点

本文的每一条&#xff0c;都是我曾经发过的掘金沸点&#xff0c;其中有很多条超过了百赞(窃喜)。鉴于时不时有童鞋翻我以前的沸点&#xff0c;因此&#xff0c;本文收集了个人目前发过的所有CSS知识点动图&#xff0c;以便阅读。需要说明的是&#xff0c;顺序仍是按当时发布顺序…

CSS 实现加载动画之五-光盘旋转

今天做的这个动画叫光盘旋转&#xff0c;名字自己取的。动画的效果估计很多人都很熟悉&#xff0c;就是微信朋友圈里的加载动画。做过前面几个动画&#xff0c;发现其实都一个原理&#xff0c;就是如何将动画的元素如何分离出来。这个动画的实现也很简单&#xff0c;关键点在于…

css hover变成手_web前端入门到实战:彻底掌握css动画「transition」

马上就2020年了&#xff0c;不知道小伙伴们今年学习了css3动画了吗&#xff1f;说起来css动画是一个很尬的事&#xff0c;一方面因为公司用css动画比较少&#xff0c;另一方面大部分开发者习惯了用JavaScript来做动画&#xff0c;所以就导致了许多程序员比较排斥来学习css动画(…

用Docker部署TensorFlow Serving服务

文章目录1. 安装 Docker2. 使用 Docker 部署3. 请求服务3.1 手写数字例子3.2 猫狗分类例子参考&#xff1a; https://tf.wiki/zh_hans/deployment/serving.html# https://tensorflow.google.cn/tfx/serving/docker 1. 安装 Docker 以下均为 centos7 环境 参考文章&#xff1a…

K-Means算法和K-Means++算法的聚类

在构成圆形的30000个随机样本点上&#xff0c;设置7个簇&#xff0c;使用K-Means算法聚类 from math import pi, sin, cos from collections import namedtuple from random import random, choice from copy import copy import matplotlib.pyplot as plt import numpy as np…

convert.todatetime指定日期格式_MATLAB的时间与日期

7 日期和时间MATLAB在2014b版本中将日期和时间独立成了一个数据类型&#xff0c;新的版本中对于时间数据的处理功能更为强大。比如datetime和duration等函数&#xff0c;可以支持对时间的高效计算、对比、格式化显示。对这类数组的操作方法和对普通数组的操作是基本一致的。下…

dategurd oracle_Oracle 时间和日期处理

-- Oracle时间SELECT SYSDATE FROM dual; -- 系统时间SELECT SYSTIMESTAMP FROM dual; -- 当前系统时间戳SELECT CURRENT_TIMESTAMP FROM dual; -- 与时区设置有关&#xff0c;返回的秒是系统的&#xff0c;返回的日期和时间是根据时区转换过的SELECT current_date FROM dual; …

关于有多个Fragment中的textview跑马灯问题

问题描述一个activity里面有多个Fragment,1,2,3,4其中fragment1中有2个textview,在第一次启动fragment1的时候跑马灯能正常跑马; 当跳转到其他fragment后,再回到fragment1的时候,跑马灯已经不跑马了?关于这个是textview的焦点问题吗?求大神解答,,,求大神解决.... 解决方案1应…

跨设备链路聚合_路由与交换技术(华为设备)第五讲---链路聚合

前言&#xff1a;随着网络规模不断扩大&#xff0c;用户对骨干链路的带宽和可靠性提出了越来越高的要求。在传统技术中&#xff0c;常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽&#xff0c;但这种方案需要付出高额的费用&#xff0c;而且不够灵活。采…

电影评论分类:二分类问题

根据电影评论的 文字内容将其划分为正面或负面。 使用IMDB 数据集&#xff0c;它包含来自互联网电影数据库&#xff08;IMDB&#xff09;的50 000 条严重两极分 化的评论。数据集被分为用于训练的25 000 条评论与用于测试的25 000 条评论&#xff0c;训练集和测试 集都包含50%…

TensorFlow 2.0 - tf.distribute 分布式训练

文章目录1. 单机多卡 MirroredStrategy2. 多机训练 MultiWorkerMirroredStrategy3. TPU 张量处理单元学习于&#xff1a;简单粗暴 TensorFlow 2 1. 单机多卡 MirroredStrategy # 分布式训练 import tensorflow as tf import tensorflow_datasets as tfds# 1 单机多卡 Mirrore…

python抽象基类的作用_Python:多态、鸭子模型和抽象基类

1. 多态什么是多态-- 多态&#xff0c;指的是一种事务具有多种形态&#xff1b;-- python是一种动态语言&#xff0c;默认支持多态&#xff0c;同一个方法 调用 不同的类对象 &#xff0c;执行的 结果各不相同&#xff1b;多态实现-- 继承&#xff1a;不同子类 继承 同一父类&a…

非抢占式优先级调度算法_华为鸿蒙操作系统内核真面目之抢占式和非抢占式内核...

华为鸿蒙操作系统内核真面目之抢占式和非抢占式内核众所周知华为鸿蒙操作系统内核是Linux内核。而Linux内核即是抢占式内核也是非抢占式内核。设置软件优先级在优先级在0-99之间是抢占式优先级。设置优先级在100-139之间是非抢占式优先级。从华为官方发布的信息--优先级高的任务…

windows下python 使用CRF++ python接口的配置

1. 下载包含python接口的版本的CRF并安装&#xff0c;安装成功后查看python文件夹包含setup.py 文件&#xff0c;内容如下&#xff1a; #!/usr/bin/env python from distutils.core import setup,Extension,os import string setup(name "mecab-python", p…

TensorFlow 2.0 - Hub 模型复用

文章目录1. tfhub2. 例子&#xff1a;神经风格转换3. retrain 例子学习于&#xff1a;简单粗暴 TensorFlow 2 1. tfhub 网址&#xff1a; https://hub.tensorflow.google.cn/ https://tfhub.dev/ 可以搜索&#xff0c;下载模型 安装包 pip install tensorflow-hub import…

微服务 注册中心的作用_102,谈谈微服务注册中心zookeeperamp;Eureka

首先&#xff0c;大家要明确一点微服务注册中心是一个重要的组件&#xff0c;解决的是服务的注册和发现的问题&#xff0c;而zookeeper&#xff0c;Eureka都只是其中一款落地实现的产品&#xff0c;再比如Nacos也是如此&#xff0c;所以关键是掌握注册中心的工作原理&#xff0…

python2转python3代码_2to3 – 自动Python 2到3代码翻译 – 开发工具(Python教程)(参考资料)...

使用2to3 2to3通常与Python解释器一起安装为脚本。它也位于Python根目录的Tools/scripts目录下 2to3的基本参数是要转换的文件或目录列表。这些目录以递归方式遍历Python源. 这是一个示例Python 2.x源文件&#xff0c; def greet(name): print "Hello, {0}!".format(…

文本表示

1 one-hot representation 该单词对应所在元素为1&#xff0c;向量中其他元素均为0&#xff0c;向量的维度就等于词库中的单词数目  所有向量都是互相正交的&#xff0c;我们无法有效的表示两个向量间的相似度  向量维度过大。 from sklearn.feature_extraction.text…

天池 在线编程 课程表(拓扑排序 + 回溯)

文章目录1. 题目2. 解题1. 题目 总共有n个课程&#xff0c;从0到n-1。 有些课程可能有先决条件&#xff0c;例如&#xff0c;你想修课程0&#xff0c;你必须先修一门课程1&#xff0c;这两门课之间的关系表示为:[0,1] 给定课程的总数和先决条件对的列表&#xff0c;返回你可以…

fence机制 linux_Linux ha fence设备测试

另外&#xff0c;在配置RHCS5.3时&#xff0c;Fence设备只ping通还不行&#xff0c;还必须经过测试&#xff0c;我在网上找了一篇IPMI的文章&#xff0c;现粘贴如下&#xff1a;What is IPMI?Intelligent Platform Management Interface[edit]AdvantagesLow cost.Available on…