LDA(Latent Dirichlet Allocation,隐含狄利克雷分布)模型
机器学习高级算法中LDA算法有线性判别分析(Linear Discriminant Analysis,LDA)和隐含狄利克雷分布(Latent Dirichlet Allocation,LDA)模型两个。本文介绍的是隐含狄利克雷分布模型,此模型主要用于文本主题分类。
本文使用sklearn中的LatentDirichletAllocation实现主题分类。
# -*- coding:utf-8 -*-from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocationimport numpy as np
import jiebadef cut_doc_words():# 数据文档列表doc_list = ['河南大学创立于1912年,始名河南留学欧美预备学校,首任校长为林伯襄先生,校园选建于河南贡院旧址之上。后历经中州大学、国立开封中山大学 ( 又称国立第五中山大学 )、省立河南大学等阶段 ,1942年升格为国立河南大学 。','1952年院系调整,部分院系或独立建校或并入兄弟高校,校本部更名为河南师范学院。后又经开封师范学院、河南师范大学等阶段,1984年恢复河南大学校名。','2008年10月,学校进入省部共建高校行列。2017年9月,学校入选首批国家“双一流”建设高校。2022年2月,学校再次入选国家“双一流”建设高校。','111年来,河南大学恪守“明德新民,止于至善”的校训,形成“团结、勤奋、严谨、朴实”的校风和以“百折不挠、自强不息”为核心的大学精神,培养70多万名各类人才,为教育振兴、科技创新、文化传承、社会进步和人类文明作出突出贡献。']# 进行分词,并存入list:doc_words_list = []for doc in doc_list:# jieba对文档分词doc_words = jieba.cut(doc)doc_words_list.append(' '.join(doc_words))return doc_words_listdef run_lda_model():# 对文本分词doc_words_list = cut_doc_words()print("词列表:", doc_words_list)# CountVectorizer会将文本中的词语转换为词频矩阵count_vec = CountVectorizer()# fit_transform函数计算各个词语出现的次数word_frequency = count_vec.fit_transform(doc_words_list)print("词汇表:", count_vec.vocabulary_)print("词频矩阵:\n", word_frequency)word_list = count_vec.get_feature_names_out()print('主题词袋:\n', word_list)# LDA主题模型lda = LatentDirichletAllocation(# 设置主题个数n_components=2)# LDA拟合文档的不同主题的概率分布,二维矩阵doc_theme_probability = lda.fit_transform(word_frequency)print("文档主题的概率分布:\n", doc_theme_probability)# 转化为np类型doc_theme_probability = np.array(doc_theme_probability)# 将2维概率分布矩阵转化为1维分类矩阵doc_theme_classify = np.argmax(doc_theme_probability, axis=1)print("每个文档所属类别:", doc_theme_classify)# 打印每个主题下词的权重值theme_probability_matrix = lda.components_print("主题概率矩阵:\n", theme_probability_matrix)for theme_probability_matrix_one in theme_probability_matrix:word_probability_list = [(word, probability) for word, probability in zip(word_list, theme_probability_matrix_one)]print("词概率:", word_probability_list)# 根据词的概率对单词排序word_probability_list_sort = sorted(word_probability_list, key=lambda x: x[1], reverse=True)print("词排序:", word_probability_list_sort)if __name__ == '__main__':run_lda_model()