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 LatentDirichletAllocation
import numpy as np
import jieba
def 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_list
def 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()