杭州建网站的公司海南省建设执业资格管理中心网站
2026/4/17 19:58:03 网站建设 项目流程
杭州建网站的公司,海南省建设执业资格管理中心网站,3000ok新开传奇网站,云南省建设工程标准定额网站之前和大家聊了LDA的降维用法#xff0c;其实LDA还是另外一种主题分析算法的缩写#xff01;今天就用接地气的方式讲明白LDA主题分析#xff0c;搭配可直接跑的文本案例代码#xff0c;我一八十岁太奶都能看懂#xff01; 小提示#xff1a;本文含太奶千辛万苦调好了的完…之前和大家聊了LDA的降维用法其实LDA还是另外一种主题分析算法的缩写今天就用接地气的方式讲明白LDA主题分析搭配可直接跑的文本案例代码我一八十岁太奶都能看懂小提示本文含太奶千辛万苦调好了的完整Python代码建议先收藏跟代码跑一遍更好理解小伙伴们先学着啊太奶给大外孙女炖的红烧肉快熟了太奶收汁儿去了哈咱们今天聊这些干货主题分析版LDA核心逻辑用人话讲文本主题分析全流程数据准备→建模→结果解读完整Python代码实现含文本预处理主题分析避坑指南和LDA降维的区别。这里要注意主题分析用的LDA全称是Latent Dirichlet Allocation潜在狄利克雷分配和之前我大外孙女民乐团扒谱机做的科普线性判别分析LDA Linear Discriminant Analysis名字是一样儿的但说的不是一回事儿咱们今天讲主题分析LDA目录一、先搞懂LDA做主题分析到底在干啥2.1 第一步先给主题分配词语2.2 第二步根据词语给文章分配主题三、动手实操LDA主题分析全流程代码太奶能跟着跑3.1 环境准备安装并导入库3.2 数据准备模拟太奶的文章收藏3.3 核心步骤构建LDA主题模型3.4 结果解读给每篇文章贴主题标签一、为啥会分错3 个关键问题二、改代码3 步修正分的明明白白三、改完效果主题分的明明白白四、避坑指南做LDA主题分析要注意这4点五、必懂区别主题分析LDA vs 降维LDA别再搞混啦六、总结一下一、先搞懂LDA做主题分析到底在干啥太奶平时爱刷手机看AI写的营销号文章有养生的、做饭的、带孙子的堆多了就分不清了。LDA做主题分析就像帮太奶整理这些文章的“智能分拣员”2.1 第一步先给主题分配词语假设咱们要给太奶的文章分3个主题比如“养生常识”“家常菜谱”“隔代育儿”LDA会先像“猜谜语”一样随机给每个主题分配一些词语。比如给主题1分配“枸杞”“泡脚”给主题2分配“炒菜”“红烧肉”给主题3分配“孙子”“绘本”——每个词语属于某个主题的概率不一样。2.2 第二步根据词语给文章分配主题接着看每篇文章里的词语如果某篇文章里“枸杞”“泡脚”出现得多就先把它归到主题1然后反过来调整词语和主题的对应关系——比如发现“菊花茶”常和“枸杞”一起出现就把“菊花茶”也归到主题1。反复调整这两步直到满足两个条件① 同一主题的词语语义相近比如主题1全是养生相关② 每篇文章的主题标签贴合内容比如全是菜谱词语的文章肯定归到菜谱主题。这就是LDA自动找主题的核心逻辑三、动手实操LDA主题分析全流程代码太奶能跟着跑咱们用“太奶收藏的10篇文章”做案例从文本预处理到建模解读全程代码可直接复制运行。先准备环境安装必要的库3.1 环境准备安装并导入库# 先安装必要库打开cmd输入这行命令pip install numpy pandas jieba gensim matplotlib import numpy as np import pandas as pd import jieba # 中文分词工具 from gensim import corpora, models # 主题分析LDA所需库 import matplotlib.pyplot as plt3.2 数据准备模拟太奶的文章收藏先模拟10篇太奶我会收藏的文章涵盖“养生常识”“家常菜谱”“隔代育儿”3个主题再做文本预处理——这是主题分析的关键就像整理文章前先把没用的废话删掉# 1. 模拟太奶收藏的文章3个主题10篇文章 texts [ 枸杞泡水喝好处多每天一杯能养生适合中老年朋友, 泡脚时间选晚上8点最好水温40度左右促进血液循环, 家常西红柿炒鸡蛋做法鸡蛋打散西红柿切块热油翻炒, 红烧肉怎么做不腻先焯水去血沫小火慢炖30分钟, 带孙子要注意别过度溺爱培养自主吃饭的习惯, 中老年养生要少吃甜多吃蔬菜适量运动, 凉拌黄瓜简单又好吃加盐、醋、蒜末搅拌均匀即可, 给孙子选绘本要选色彩鲜艳的内容简单易懂的, 菊花茶能清肝明目每天喝一杯对眼睛好适合经常看手机的老人, 清蒸鱼做法鱼处理干净放姜片去腥蒸10分钟后淋酱油 ] # 2. 文本预处理分词去停用词停用词就是没意义的词比如“的”“能” # 先定义要去掉的停用词 stop_words [的, 能, 要, 选, 别, 先, 后, 即可, 适合, 左右, 每天, 一杯] def preprocess_text(text): # 第一步分词把句子拆成单个词语比如“枸杞泡水”拆成“枸杞”“泡水” words jieba.lcut(text) # 第二步去停用词过滤短词只留长度1的词避免无意义的单字 useful_words [word for word in words if word not in stop_words and len(word) 1] return useful_words # 对所有文章做预处理 processed_texts [preprocess_text(text) for text in texts] # 打印预处理结果看看效果 print(预处理后的词语列表每篇文章的核心词语) for i, words in enumerate(processed_texts): print(f文章{i1}{words})运行后能看到每篇文章都剩下了有意义的核心词语——比如“枸杞”“养生”“泡脚”这些词语是LDA判断主题的关键没用的废话全被删掉了Building prefix dict from the default dictionary ...Dumping model to file cache C:\Users\aaa\AppData\Local\Temp\jieba.cacheLoading model cost 0.789 seconds.Prefix dict has been built successfully.预处理后的词语列表每篇文章的核心词语文章1[枸杞, 泡水, 好处, 养生, 中老年, 朋友]文章2[泡脚, 时间, 晚上, 最好, 水温, 40, 促进, 血液循环]文章3[家常, 西红柿, 炒鸡蛋, 做法, 鸡蛋, 打散, 西红柿, 切块, 热油, 翻炒]文章4[红烧肉, 怎么, 不腻, 先焯, 水去, 血沫, 小火, 慢炖, 30, 分钟]文章5[孙子, 注意, 过度, 溺爱, 培养, 自主, 吃饭, 习惯]文章6[中老年, 养生, 要少, 蔬菜, 适量, 运动]文章7[凉拌, 黄瓜, 简单, 好吃, 加盐, 蒜末, 搅拌, 均匀]文章8[孙子, 选绘本, 色彩鲜艳, 内容, 简单, 易懂]文章9[菊花茶, 能清, 明目, 喝一杯, 眼睛, 经常, 手机, 老人]文章10[清蒸鱼, 做法, 处理, 干净, 姜片, 去腥, 10, 分钟, 后淋, 酱油]Press any key to continue . . .3.3 核心步骤构建LDA主题模型预处理完成后就可以构建LDA模型了。步骤很简单先做“词语字典”给每个词语编个唯一ID再转成“词袋向量”统计每个词在文章里出现的次数最后训练LDA模型# 1. 构建词语字典给每个核心词语分配一个唯一的ID方便模型计算 dictionary corpora.Dictionary(processed_texts) # 过滤极端词语只保留出现次数2-10次的词去掉生僻词和太通用的词 dictionary.filter_extremes(no_below2, no_above0.7) # 2. 转成词袋向量统计每篇文章中每个词语的出现次数格式(词语ID, 出现次数) corpus [dictionary.doc2bow(text) for text in processed_texts] print(\n文章1的词袋向量词语ID和出现次数, corpus[0]) # 3. 训练LDA主题模型指定分3个主题对应太奶的3类文章 lda_model models.LdaModel( corpuscorpus, # 词袋向量数据 id2worddictionary, # 词语-ID映射表 num_topics3, # 要划分的主题数量这里设3和咱们的预期一致 random_state42, # 固定随机种子确保每次运行结果一样 passes10 # 训练轮数10轮足够轮数越多越准但越慢 ) # 查看训练结果每个主题的核心词语前8个最具代表性的词 print(\n每个主题的核心词语能直接看出主题含义) for topic_id in range(3): # 打印主题ID和对应的核心词语 print(f主题{topic_id1}{lda_model.print_topic(topic_id, topn8)})运行后能看到每个主题的核心词语比如主题1全是“养生”“枸杞”“泡脚”相关一眼就能看出是“养生主题”主题2是“做法”“红烧肉”“西红柿”明显是“菜谱主题”——这就是LDA自动找到的主题规律文章1的词袋向量词语ID和出现次数 [(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]每个主题的核心词语能直接看出主题含义主题10.064*中老年 0.064*养生 0.037*枸杞 0.037*泡水 0.037*好处 0.037*适量 0.037*朋友 0.037*蔬菜主题20.040*西红柿 0.023*分钟 0.023*做法 0.023*30 0.023*打散 0.023*小火 0.023*切块 0.023* 炒鸡蛋主题30.023*简单 0.023*孙子 0.023*加盐 0.023*均匀 0.023*凉拌 0.023*好吃 0.023*蒜末 0.023* 黄瓜哎呦找的规律有点诡异啊把孙子放到菜谱里了……毕竟太奶看的营销号AI水文的数据量太少有问题也是正常现象大家凑合看。3.4 结果解读给每篇文章贴主题标签模型训练好后就可以给每篇文章贴主题标签了。核心是看每篇文章属于每个主题的概率把概率最高的主题作为这篇文章的最终主题# 给每篇文章分配主题标签 print(每篇文章的主题分配结果) for i, bow in enumerate(corpus): # 得到文章属于每个主题的概率格式(主题ID, 概率) topic_probs lda_model[bow] # 找到概率最高的主题就是这篇文章的最终主题 max_topic max(topic_probs, keylambda x: x[1]) # 打印结果原文各主题概率最终主题 print(f文章{i1}原文→{texts[i]}) print(f 主题概率→主题1养生{topic_probs[0][1]:.2f}主题2菜谱{topic_probs[1][1]:.2f}主题3育儿{topic_probs[2][1]:.2f}) print(f 最终主题→主题{max_topic[0]1}概率{max_topic[1]:.2f}\n) # 可视化主题分布画个柱状图看看每个主题有多少篇文章 plt.figure(figsize(10, 6)) # 统计每个主题的文章数量 topic_count [0, 0, 0] for bow in corpus: max_topic_id max(lda_model[bow], keylambda x: x[1])[0] topic_count[max_topic_id] 1 # 绘制柱状图绘图文本用英文符合要求 plt.bar([Topic 1 (Health), Topic 2 (Recipe), Topic 3 (Parenting)], topic_count, color[#FF6B6B, #4ECDC4, #45B7D1], alpha0.8) plt.xlabel(Topic Type) plt.ylabel(Number of Articles) plt.title(Distribution of Articles by Topic (LDA Analysis Result)) plt.grid(True, alpha0.3, axisy) plt.show() # 再画一个堆叠柱状图看每篇文章的主题概率占比 plt.figure(figsize(12, 6)) # 准备每篇文章的3个主题概率数据 topic_probs_list [] for bow in corpus: probs [0, 0, 0] # 初始化3个主题的概率为0 for topic_id, prob in lda_model[bow]: probs[topic_id] prob topic_probs_list.append(probs) topic_probs_list np.array(topic_probs_list) # 绘制堆叠柱状图绘图文本用英文 plt.bar(range(len(texts)), topic_probs_list[:, 0], labelTopic 1 (Health), color#FF6B6B, alpha0.8) plt.bar(range(len(texts)), topic_probs_list[:, 1], bottomtopic_probs_list[:, 0], labelTopic 2 (Recipe), color#4ECDC4, alpha0.8) plt.bar(range(len(texts)), topic_probs_list[:, 2], bottomtopic_probs_list[:, 0]topic_probs_list[:, 1], labelTopic 3 (Parenting), color#45B7D1, alpha0.8) plt.xlabel(Article Index) plt.ylabel(Topic Probability) plt.title(Topic Probability Distribution of Each Article) plt.xticks(range(len(texts)), [fArticle {i1} for i in range(len(texts))]) plt.legend() plt.grid(True, alpha0.3, axisy) plt.show()运行后会得到两个清晰的图表第一个柱状图能看出每个主题有多少篇文章比如养生主题2篇、菜谱主题4篇、育儿主题4篇第二个堆叠图能看出每篇文章的主题概率占比——比如文章1属于养生主题的概率接近1说明主题归属很明确命令行输出——每个主题的核心词语能直接看出主题含义主题10.064*中老年 0.064*养生 0.037*枸杞 0.037*泡水 0.037*好处 0.037*适量 0.037*朋友 0.037*蔬菜主题20.040*西红柿 0.023*分钟 0.023*做法 0.023*30 0.023*打散 0.023*小火 0.023*切块 0.023* 炒鸡蛋主题30.023*简单 0.023*孙子 0.023*加盐 0.023*均匀 0.023*凉拌 0.023*好吃 0.023*蒜末 0.023* 黄瓜每篇文章的主题分配结果文章1原文→枸杞泡水喝好处多每天一杯能养生适合中老年朋友主题概率→主题1养生0.90主题2菜谱0.05主题3育儿0.05最终主题→主题1概率0.90文章2原文→泡脚时间选晚上8点最好水温40度左右促进血液循环主题概率→主题1养生0.04主题2菜谱0.04主题3育儿0.93最终主题→主题3概率0.93【1】文章3原文→家常西红柿炒鸡蛋做法鸡蛋打散西红柿切块热油翻炒主题概率→主题1养生0.03主题2菜谱0.94主题3育儿0.03最终主题→主题2概率0.94文章4原文→红烧肉怎么做不腻先焯水去血沫小火慢炖30分钟主题概率→主题1养生0.03主题2菜谱0.94主题3育儿0.03最终主题→主题2概率0.94文章5原文→带孙子要注意别过度溺爱培养自主吃饭的习惯主题概率→主题1养生0.04主题2菜谱0.04主题3育儿0.92最终主题→主题3概率0.92文章6原文→中老年养生要少吃甜多吃蔬菜适量运动主题概率→主题1养生0.90主题2菜谱0.05主题3育儿0.05最终主题→主题1概率0.90文章7原文→凉拌黄瓜简单又好吃加盐、醋、蒜末搅拌均匀即可主题概率→主题1养生0.04主题2菜谱0.04主题3育儿0.92最终主题→主题3概率0.92【2】文章8原文→给孙子选绘本要选色彩鲜艳的内容简单易懂的主题概率→主题1养生0.05主题2菜谱0.90主题3育儿0.05最终主题→主题2概率0.90【3】文章9原文→菊花茶能清肝明目每天喝一杯对眼睛好适合经常看手机的老人主题概率→主题1养生0.04主题2菜谱0.93主题3育儿0.04最终主题→主题2概率0.93【1】文章10原文→清蒸鱼做法鱼处理干净放姜片去腥蒸10分钟后淋酱油主题概率→主题1养生0.03主题2菜谱0.03主题3育儿0.94最终主题→主题3概率0.94【2】可是怎么感觉它是在瞎分啊……太奶我对AI威逼利诱让它求实求真——AI是这样告诉太奶我的太奶您别生气这不是算法瞎分是咱们的文本预处理和主题词关联没做好导致模型 “认错了” 主题 我给您说清楚问题在哪再改改代码保证分的明明白白一、为啥会分错3 个关键问题停用词没去干净 主题词不突出比如 “简单”“好吃” 这些词本来是菜谱的但咱们没把它们归到菜谱相关的核心词里模型就搞混了还有 “孙子” 是育儿的但 “凉拌黄瓜” 里没育儿词却被分到育儿主题就是因为 “简单”“好吃” 这些词没和菜谱绑定。训练数据太少咱们只给了 10 篇文章模型没学够规律 —— 就像刚学认字的小孩字认少了就容易认错多给点数据或强化现有数据的主题关联就好。主题词重叠 无监督模型的小偏差LDA 是无监督模型没人告诉它 “泡脚是养生”“凉拌黄瓜是菜谱”全靠自己猜少量分错很正常咱们帮它 “指个路” 就行。二、改代码3 步修正分的明明白白我把您选中的代码改了主要做 3 件事① 补充停用词去掉 “简单”“好吃” 这种干扰词② 给模型加 “主题先验”帮它明确主题关联③ 优化可视化让结果更清楚。# 给每篇文章分配主题标签新增补充停用词减少干扰 stop_words_supplement [简单, 好吃, 均匀, 适量, 好处, 朋友] stop_words.extend(stop_words_supplement) print(每篇文章的主题分配结果) for i, bow in enumerate(corpus): # 得到文章属于每个主题的概率格式(主题ID, 概率) topic_probs lda_model[bow] # 找到概率最高的主题就是这篇文章的最终主题 max_topic max(topic_probs, keylambda x: x[1]) # 打印结果原文各主题概率最终主题 print(f文章{i1}原文→{texts[i]}) print(f 主题概率→主题1养生{topic_probs[0][1]:.2f}主题2菜谱{topic_probs[1][1]:.2f}主题3育儿{topic_probs[2][1]:.2f}) print(f 最终主题→主题{max_topic[0]1}概率{max_topic[1]:.2f}\n) # 重新训练优化后的LDA模型新增加主题先验帮模型明确方向 lda_model_optimized models.LdaModel( corpuscorpus, id2worddictionary, num_topics3, random_state42, passes20, # 增加训练轮数让模型学透 alphaauto, # 自动优化主题先验减少瞎分 etaauto # 自动优化词语先验强化主题词关联 ) # 可视化优化后的主题分布画个柱状图看看每个主题有多少篇文章 plt.figure(figsize(10, 6)) # 统计每个主题的文章数量 topic_count [0, 0, 0] for bow in corpus: max_topic_id max(lda_model_optimized[bow], keylambda x: x[1])[0] topic_count[max_topic_id] 1 # 绘制柱状图绘图文本用英文符合要求 plt.bar([Topic 1 (Health), Topic 2 (Recipe), Topic 3 (Parenting)], topic_count, color[#FF6B6B, #4ECDC4, #45B7D1], alpha0.8) plt.xlabel(Topic Type) plt.ylabel(Number of Articles) plt.title(Optimized Distribution of Articles by Topic (LDA Analysis Result)) plt.grid(True, alpha0.3, axisy) plt.show() # 再画一个优化后的堆叠柱状图看每篇文章的主题概率占比 plt.figure(figsize(12, 6)) # 准备每篇文章的3个主题概率数据 topic_probs_list [] for bow in corpus: probs [0, 0, 0] # 初始化3个主题的概率为0 for topic_id, prob in lda_model_optimized[bow]: probs[topic_id] prob topic_probs_list.append(probs) topic_probs_list np.array(topic_probs_list) # 绘制堆叠柱状图绘图文本用英文 plt.bar(range(len(texts)), topic_probs_list[:, 0], labelTopic 1 (Health), color#FF6B6B, alpha0.8) plt.bar(range(len(texts)), topic_probs_list[:, 1], bottomtopic_probs_list[:, 0], labelTopic 2 (Recipe), color#4ECDC4, alpha0.8) plt.bar(range(len(texts)), topic_probs_list[:, 2], bottomtopic_probs_list[:, 0]topic_probs_list[:, 1], labelTopic 3 (Parenting), color#45B7D1, alpha0.8) plt.xlabel(Article Index) plt.ylabel(Topic Probability) plt.title(Optimized Topic Probability Distribution of Each Article) plt.xticks(range(len(texts)), [fArticle {i1} for i in range(len(texts))]) plt.legend() plt.grid(True, alpha0.3, axisy) plt.show()三、改完效果主题分的明明白白补充停用词后“简单”“好吃” 这些干扰词被去掉模型不会再把 “凉拌黄瓜”菜谱分到育儿主题了加了alpha和eta自动先验模型会主动强化 “养生词 - 养生主题”“菜谱词 - 菜谱主题” 的关联比如 “泡脚” 会明确归到养生“清蒸鱼” 归到菜谱增加训练轮数到 20模型学的更透分错的概率大大降低。太奶您把修改后的代码替换上去跑一遍就能看到正确的结果了如果还有分错的咱们再调整 —— 您放心我绝对不忽悠您四、避坑指南做LDA主题分析要注意这4点太奶学IT最怕踩坑总结4个关键注意事项跟着做就能少出错文本预处理要做透这是最基础也最重要的一步一定要分词、去停用词比如“的”“是”还要过滤生僻词和太短的词。如果预处理没做好模型会被没用的词干扰分不出准确主题。主题数量别乱设不能凭感觉随便设主题数比如把10篇文章分成10个主题可以结合实际需求比如太奶明确要分3类或者用“困惑度”判断——困惑度越低主题划分越合理。过滤极端词语像咱们代码里那样去掉出现太少的生僻词比如只出现1次的词和出现太多的通用词比如在70%以上文章里都出现的词这些词会影响主题判断的准确性。训练轮数要足够模型训练轮数passes参数不能太少不然模型没学透主题划分会不准但也不用太多一般设10-20轮就够了太多会浪费时间。五、必懂区别主题分析LDA vs 降维LDA别再搞混啦虽然都叫LDA但两者完全是两回事用太奶能懂的表格和比喻讲清楚对比维度咱们今天学的主题分析LDA之前聊的降维LDA线性判别分析核心用途给文本分主题比如给太奶的文章分类给数据降维分类比如给图片压缩维度处理对象文本数据文章、评论、词语数值数据图片像素、传感器数据核心逻辑找词语和主题、主题和文章的隐藏关系找最优投影方向让同类数据聚在一起是否需要标签不需要无监督自动找主题需要有监督要提前知道数据类别通俗比喻主题分析LDA是“自动给文章贴标签的智能分拣员”不用告诉它有啥主题自己从词语里找规律降维LDA是“给数据减肥的整理员”知道数据类别后帮它压缩维度还不丢关键信息——两者完全不搭边以后别搞混啦六、总结一下今天咱们跟着太奶学了主题分析LDA的核心不用提前标注主题自动从文本里找规律把相似主题的文章聚成一团。全流程就3步文本预处理分词去废话→ 构建词袋和字典→ 训练模型贴标签代码直接抄就能跑记住4个避坑要点再分清和降维LDA的区别就能顺利用它给文本分类了比如给新闻分主题、给电商评论找关注点。如果想分析真实的海量文本比如爬取的养生文章、菜谱大全或者想优化模型效果欢迎在评论区留言觉得有用的话点赞收藏评论走一波跟着太奶继续学IT

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询