我的编程空间,编程开发者的网络收藏夹
学习永远不晚

LDA主题模型简介及Python实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

LDA主题模型简介及Python实现

一、LDA主题模型简介

        LDA主题模型主要用于推测文档的主题分布,可以将文档集中每篇文档的主题以概率分布的形式给出根据主题进行主题聚类或文本分类。

        LDA主题模型不关心文档中单词的顺序,通常使用词袋特征(bag-of-word feature)来代表文档。词袋模型介绍可以参考这篇文章:文本向量化表示——词袋模型 - 知乎

        了解LDA模型,我们需要先了解LDA的生成模型,LDA认为一篇文章是怎么形成的呢?

        LDA模型认为主题可以由一个词汇分布来表示,而文章可以由主题分布来表示

        比如有两个主题,美食美妆。LDA说两个主题可以由词汇分布表示,他们分别是:

{面包:0.4,火锅:0.5,眉笔:0.03,腮红:0.07}
{眉笔:0.4,腮红:0.5,面包:0.03,火锅:0.07}

        同样,对于两篇文章,LDA认为文章可以由主题分布这么表示:

《美妆日记》{美妆:0.8,美食:0.1,其他:0.1}

《美食探索》{美食:0.8,美妆:0.1,其他:0.1}

        所以想要生成一篇文章,可以先以一定的概率选取上述某个主题,再以一定的概率选取那个主题下的某个单词,不断重复这两步就可以生成最终文章。

        在LDA模型中,一篇文档生成的方式如下:

 

        其中,类似Beta分布是二项式分布的共轭先验概率分布,而狄利克雷分布(Dirichlet分布)是多项式分布的共轭先验概率分布。

        如果我们要生成一篇文档,它里面的每个词语出现的概率为:

         更详细的数学推导可以见:通俗理解LDA主题模型_结构之法 算法之道-CSDN博客_lda模型

        看到文章推断其隐藏的主题分布,就是建模的目的。换言之,人类根据文档生成模型写成了各类文章,然后丢给了计算机,相当于计算机看到的是一篇篇已经写好的文章。现在计算机需要根据一篇篇文章中看到的一系列词归纳出当篇文章的主题,进而得出各个主题各自不同的出现概率:主题分布。

        至于LDA主题模型在计算机中具体是怎么实现的,我们也可以不必细究,现在有很多可以直接用来进行LDA主题分析的包,我们直接用就行。(没错,我就是调包侠)

二、Python实现

        在用Python进行LDA主题模型分析之前,我先对文档进行了分词和去停用词处理(详情可以看我之前的文章:用python对单一微博文档进行分词——jieba分词(加保留词和停用词)_阿丢是丢心心的博客-CSDN博客_jieba 停用词

        我下面的输入文件也是已经分好词的文件

1.导入算法包

import gensimfrom gensim import corporaimport matplotlib.pyplot as pltimport matplotlibimport numpy as npimport warningswarnings.filterwarnings('ignore')  # To ignore all warnings that arise here to enhance clarityfrom gensim.models.coherencemodel import CoherenceModelfrom gensim.models.ldamodel import LdaModel

2.加载数据

        先将文档转化为一个二元列表,其中每个子列表代表一条微博:

PATH = "E:/data/output.csv"file_object2=open(PATH,encoding = 'utf-8',errors = 'ignore').read().split('\n')  #一行行的读取内容data_set=[]  #建立存储分词的列表for i in range(len(file_object2)):    result=[]    seg_list = file_object2[i].split()    for w in seg_list :  #读取每一行分词        result.append(w)    data_set.append(result)print(data_set)

        构建词典,语料向量化表示:

dictionary = corpora.Dictionary(data_set)  # 构建词典corpus = [dictionary.doc2bow(text) for text in data_set]  #表示为第几个单词出现了几次

3.构建LDA模型

ldamodel = LdaModel(corpus, num_topics=10, id2word = dictionary, passes=30,random_state = 1)   #分为10个主题print(ldamodel.print_topics(num_topics=num_topics, num_words=15))  #每个主题输出15个单词

        这是确定主题数时LDA模型的构建方法,一般我们可以用指标来评估模型好坏,也可以用这些指标来确定最优主题数。一般用来评价LDA主题模型的指标有困惑度(perplexity)和主题一致性(coherence),困惑度越低或者一致性越高说明模型越好。一些研究表明perplexity并不是一个好的指标,所以一般我用coherence来评价模型并选择最优主题,但下面代码两种方法我都用了。

#计算困惑度def perplexity(num_topics):    ldamodel = LdaModel(corpus, num_topics=num_topics, id2word = dictionary, passes=30)    print(ldamodel.print_topics(num_topics=num_topics, num_words=15))    print(ldamodel.log_perplexity(corpus))    return ldamodel.log_perplexity(corpus)#计算coherencedef coherence(num_topics):    ldamodel = LdaModel(corpus, num_topics=num_topics, id2word = dictionary, passes=30,random_state = 1)    print(ldamodel.print_topics(num_topics=num_topics, num_words=10))    ldacm = CoherenceModel(model=ldamodel, texts=data_set, dictionary=dictionary, coherence='c_v')    print(ldacm.get_coherence())    return ldacm.get_coherence()

4.绘制主题-coherence曲线,选择最佳主题数

x = range(1,15)# z = [perplexity(i) for i in x]  #如果想用困惑度就选这个y = [coherence(i) for i in x]plt.plot(x, y)plt.xlabel('主题数目')plt.ylabel('coherence大小')plt.rcParams['font.sans-serif']=['SimHei']matplotlib.rcParams['axes.unicode_minus']=Falseplt.title('主题-coherence变化情况')plt.show()

        最终能得到各主题的词语分布和这样的图形:

 5.结果输出与可视化

        通过上述主题评估,我们发现可以选择5作为主题个数,接下来我们可以再跑一次模型,设定主题数为5,并输出每个文档最有可能对应的主题

from gensim.models import LdaModelimport pandas as pdfrom gensim.corpora import Dictionaryfrom gensim import corpora, modelsimport csv# 准备数据PATH = "E:/data/output1.csv"file_object2=open(PATH,encoding = 'utf-8',errors = 'ignore').read().split('\n')  #一行行的读取内容data_set=[] #建立存储分词的列表for i in range(len(file_object2)):    result=[]    seg_list = file_object2[i].split()    for w in seg_list :#读取每一行分词        result.append(w)    data_set.append(result)dictionary = corpora.Dictionary(data_set)  # 构建词典corpus = [dictionary.doc2bow(text) for text in data_set]lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=5, passes = 30,random_state=1)topic_list=lda.print_topics()print(topic_list)for i in lda.get_document_topics(corpus)[:]:    listj=[]    for j in i:        listj.append(j[1])    bz=listj.index(max(listj))    print(i[bz][0])

        同时我们可以用pyLDAvis对LDA模型结果进行可视化:

import pyLDAvis.gensimpyLDAvis.enable_notebook()data = pyLDAvis.gensim.prepare(lda, corpus, dictionary)pyLDAvis.save_html(data, 'E:/data/3topic.html')

        大概能得到这样的结果:

 左侧圆圈表示主题,右侧表示各个词语对主题的贡献度。

所有代码如下:

import gensimfrom gensim import corporaimport matplotlib.pyplot as pltimport matplotlibimport numpy as npimport warningswarnings.filterwarnings('ignore')  # To ignore all warnings that arise here to enhance clarityfrom gensim.models.coherencemodel import CoherenceModelfrom gensim.models.ldamodel import LdaModel # 准备数据PATH = "E:/data/output.csv"file_object2=open(PATH,encoding = 'utf-8',errors = 'ignore').read().split('\n')  #一行行的读取内容data_set=[] #建立存储分词的列表for i in range(len(file_object2)):    result=[]    seg_list = file_object2[i].split()    for w in seg_list :#读取每一行分词        result.append(w)    data_set.append(result)print(data_set)dictionary = corpora.Dictionary(data_set)  # 构建 document-term matrixcorpus = [dictionary.doc2bow(text) for text in data_set]#Lda = gensim.models.ldamodel.LdaModel  # 创建LDA对象#计算困惑度def perplexity(num_topics):    ldamodel = LdaModel(corpus, num_topics=num_topics, id2word = dictionary, passes=30)    print(ldamodel.print_topics(num_topics=num_topics, num_words=15))    print(ldamodel.log_perplexity(corpus))    return ldamodel.log_perplexity(corpus)#计算coherencedef coherence(num_topics):    ldamodel = LdaModel(corpus, num_topics=num_topics, id2word = dictionary, passes=30,random_state = 1)    print(ldamodel.print_topics(num_topics=num_topics, num_words=10))    ldacm = CoherenceModel(model=ldamodel, texts=data_set, dictionary=dictionary, coherence='c_v')    print(ldacm.get_coherence())    return ldacm.get_coherence()# 绘制困惑度折线图x = range(1,15)# z = [perplexity(i) for i in x]y = [coherence(i) for i in x]plt.plot(x, y)plt.xlabel('主题数目')plt.ylabel('coherence大小')plt.rcParams['font.sans-serif']=['SimHei']matplotlib.rcParams['axes.unicode_minus']=Falseplt.title('主题-coherence变化情况')plt.show()
from gensim.models import LdaModelimport pandas as pdfrom gensim.corpora import Dictionaryfrom gensim import corpora, modelsimport csv# 准备数据PATH = "E:/data/output1.csv"file_object2=open(PATH,encoding = 'utf-8',errors = 'ignore').read().split('\n')  #一行行的读取内容data_set=[] #建立存储分词的列表for i in range(len(file_object2)):    result=[]    seg_list = file_object2[i].split()    for w in seg_list :#读取每一行分词        result.append(w)    data_set.append(result)dictionary = corpora.Dictionary(data_set)  # 构建 document-term matrixcorpus = [dictionary.doc2bow(text) for text in data_set]lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=5, passes = 30,random_state=1)topic_list=lda.print_topics()print(topic_list)result_list =[]for i in lda.get_document_topics(corpus)[:]:    listj=[]    for j in i:        listj.append(j[1])    bz=listj.index(max(listj))    result_list.append(i[bz][0])print(result_list)
import pyLDAvis.gensimpyLDAvis.enable_notebook()data = pyLDAvis.gensim.prepare(lda, corpus, dictionary)pyLDAvis.save_html(data, 'E:/data/topic.html')

有需要自取~

还可以关注我,之后我还会发更多关于数据分析的干货文章~

来源地址:https://blog.csdn.net/weixin_41168304/article/details/122389948

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

LDA主题模型简介及Python实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Wu-Manber算法简介及Python实现说明

Wu-Manber算法是一种字符串匹配算法,用于高效地搜索字符串。它是一种混合算法,结合了Boyer-Moore和Knuth-Morris-Pratt算法的优势,可提供快速准确的模式匹配。Wu-Manber算法步骤1.创建一个哈希表,将模式
Wu-Manber算法简介及Python实现说明
2024-01-23

Golang中的类型断言机制简介及其实现原理

Golang中的断言机制简介及其实现原理概述:在Golang中,断言(Assertion)是一种用于确定接口类型的方法。它用于检查接口是否满足某个具体的类型,并在满足时将接口转换为该具体类型。断言机制在Golang中被广泛使用,使得我们可
Golang中的类型断言机制简介及其实现原理
2024-01-29

如何使用Python实现一个简易的ORM模型

目录元类描述器本文记录下自己使用Python实现一个简易的ORM模型 使用到的知识 1、元类 2、描述器 元类 对于元类,我的理解其实也便较浅,大概是这个意思 所有的类都是使用元类来进行创建的,而所有的类的父类中必然是object(针对Py
2022-06-02

简单介绍SORT跟踪算法及其Python实现示例

SORT(Simple Online and Realtime Tracking)是一种基于卡尔曼滤波的目标跟踪算法,它可以在实时场景中对移动目标进行鲁棒跟踪。SORT算法最初是由Alex Bewley等人在2016年提出的,它已被广泛应用
简单介绍SORT跟踪算法及其Python实现示例
2024-01-24

Python怎样实现LeNet网络模型的训练及预测

本篇文章给大家分享的是有关Python怎样实现LeNet网络模型的训练及预测,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.LeNet模型训练脚本整体的训练代码如下,下面我会
2023-06-21

RiSearch PHP 与主题模型的结合实现多维搜索与推荐

摘要:随着信息化时代的发展,人们对于搜索引擎和推荐系统的需求越来越高。传统的搜索引擎和推荐系统往往面临着信息过载和推荐准确度不高的问题。而RiSearch PHP作为一种高性能的全文搜索引擎和主题模型作为一种文本分析的技术,结合起来能够实现
2023-10-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录