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')
1万+

被折叠的 条评论
为什么被折叠?



