LDA主题建模介绍以及代码实现

LDA(Latent Dirichlet Allocation)是一种无监督的生成概率模型,由Blei等人在2003年提出。该模型主要用于从文本数据中自动发现潜在主题,并将文档表示为这些主题的混合。其核心思想是通过概率分布描述文档与主题、主题与词语之间的关系。

LDA的基本原理

LDA基于三层贝叶斯概率模型,假设文档的生成过程遵循以下规则:

每个文档由多个主题的概率分布构成。
每个主题由一组词语的概率分布构成。
文档生成的具体过程如下:

为每篇文档生成一个主题分布,该分布服从Dirichlet先验。
对于文档中的每个词语:
从文档的主题分布中采样一个主题。
从该主题的词语分布中采样一个词语。
数学上可表示为:

文档的主题分布:θ ∼ Dir(α)
主题的词语分布:φ ∼ Dir(β)
词语生成过程:对于第n个词语,选择主题z_n ∼ Mult(θ),再选择词语w_n ∼ Mult(φ_z_n)

LDA的应用场景

文本主题挖掘

LDA能够从大规模文本语料中自动提取潜在主题,帮助理解文本内容的语义结构。例如,从新闻文章中挖掘政治、经济、体育等主题。

文档分类与聚类

通过文档的主题分布向量,可以实现文档的分类或聚类任务。相似主题分布的文档会被归为同一类别或簇。

信息检索

LDA可用于改进传统关键词匹配的检索方式。通过计算查询与文档在主题空间的相似度,提升检索结果的相关性。

推荐系统

在基于内容的推荐中,LDA能够分析用户历史交互内容的主题偏好,从而推荐具有相似主题的新项目。

文本摘要生成

通过识别文档的核心主题,LDA可以帮助筛选最能代表主题的关键句子或词语,辅助生成文本摘要。

Python代码实现

这段代码实现了基于LDA(Latent Dirichlet Allocation)的主题建模分析流程:首先读取文本数据并进行分词处理,构建词典和文档-词频矩阵;然后使用Gensim库训练LDA模型,提取指定数量的主题及其关键词分布;最后通过文档-主题概率分布确定每篇文档的主话题,并生成交互式可视化结果(保存为HTML文件)。整个过程完成了从原始文本到主题挖掘、文档分类及结果可视化的完整主题分析任务。

import gensim
from gensim import corpora
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import warnings
warnings.filterwarnings('ignore')  # To ignore all warnings that arise here to enhance clarity
 
from gensim.models.coherencemodel import CoherenceModel
from gensim.models.ldamodel import LdaModel
PATH = ""
 
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]  #为第几个单词出现了几次
ldamodel = LdaModel(corpus, num_topics=a, id2word = dictionary, passes=30,random_state = 1)   #分为a个主题
print(ldamodel.print_topics(num_topics=num_topics, num_words=b))  #每个主题输出b个单词

from gensim.models import LdaModel
import pandas as pd
from gensim.corpora import Dictionary
from gensim import corpora, models
import 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])

    
    import pyLDAvis.gensim
pyLDAvis.enable_notebook()
data = pyLDAvis.gensim.prepare(lda, corpus, dictionary)
pyLDAvis.save_html(data, 'E:/data/3topic.html')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

evil robot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值