news 2026/6/25 15:09:21

AI大模型入门到实战系列(九)主题建模

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI大模型入门到实战系列(九)主题建模

主题建模

    • BERTopic:模块化主题建模框架
      • 查看主题信息
      • 获取特定主题的关键词
      • 搜索相关主题
      • 检查BERTopic论文所在主题
    • 可视化分析
      • 文档可视化
      • 条形图可视化
      • 热力图可视化
      • 层次结构可视化
    • 表示模型增强
      • KeyBERT启发式表示
      • 最大边际相关性
      • Flan-T5文本生成
      • OpenAI GPT模型
      • DataMap可视化
    • 附加功能:词云生成
      • 扩展主题关键词
      • 创建词云

BERTopic:模块化主题建模框架

需要提前下载BERTopic
pip install bertopic==0.12.0

frombertopicimportBERTopic# 使用之前定义的模型训练BERTopictopic_model=BERTopic(embedding_model=embedding_model,umap_model=umap_model,hdbscan_model=hdbscan_model,verbose=True).fit(abstracts,embeddings)

代码解释

  • BERTopic:基于预训练语言模型的主题建模框架
  • 重用之前创建的嵌入模型、UMAP降维和HDBSCAN聚类
  • verbose=True:显示训练过程的详细信息

查看主题信息

topic_model.get_topic_info()

代码解释

  • 返回包含所有主题信息的表格
  • 包括主题ID、文档数量、主题名称、关键词表示等

输出

获取特定主题的关键词

topic_model.get_topic(1)

代码解释

  • 获取第0个主题的TOP10关键词及其c-TF-IDF权重
  • 返回列表格式:[(关键词1, 权重1), (关键词2, 权重2), …]

输出

[(‘speech’, 0.02916771933942931),
(‘asr’, 0.019493756916806926),
(‘recognition’, 0.013777033749370282),
(‘end’, 0.010404587510925803),
(‘acoustic’, 0.009845264369644571),
(‘speaker’, 0.006988546126537315),
(‘audio’, 0.006985468019898262),
(‘error’, 0.006632519454240728),
(‘the’, 0.00657799288783312),
(‘wer’, 0.006572205206134124)]

搜索相关主题

topic_model.find_topics("topic modeling")

代码解释

  • 搜索与"topic modeling"相关的主题
  • 返回相关主题ID列表和相似度分数
  • 可用于发现特定主题或验证模型效果

输出

([22, 81, 57, 143, 21],
[0.9116786059372053,
0.8885478270047166,
0.8884254750613314,
0.886235835453459,
0.8851704089679455])

说明topic modeling和主题22的相似度最高,我们可以查看下该主题的关键词

topic_model.get_topic(22)

输出

[(‘topic’, 0.06726436387618918),
(‘topics’, 0.03579845294271458),
(‘lda’, 0.015623738508090517),
(‘latent’, 0.013025146733638438),
(‘document’, 0.012794247088366911),
(‘documents’, 0.012590347778107424),
(‘modeling’, 0.011939202193266057),
(‘dirichlet’, 0.009348055571065867),
(‘word’, 0.008570152851314879),
(‘allocation’, 0.0072828353158293745)]

可以看到与topic modeling的关键词相吻合。

检查BERTopic论文所在主题

topic_model.topics_[titles.index('BERTopic: Neural topic modeling with a class-based TF-IDF procedure')]

代码解释

  • 查找特定论文被分配到的主题ID
  • 验证主题模型是否将相关论文正确归类

输出

22

可视化分析

文档可视化

# 可视化主题和文档分布fig=topic_model.visualize_documents(titles,reduced_embeddings=reduced_embeddings,width=1200,hide_annotations=True)# 更新图例字体以便更好显示fig.update_layout(font=dict(size=16))

代码解释

  • visualize_documents():在2D空间中可视化文档分布
  • reduced_embeddings:使用之前计算的2维降维结果
  • hide_annotations=True:隐藏密集区域的标签避免重叠

如果在jupyter环境中显示不出可以用render进行渲染

# 方法 1: 使用 renderer 参数fig=topic_model.visualize_documents(titles,reduced_embeddings=reduced_embeddings,width=1200,hide_annotations=True)# 指定渲染器fig.show(renderer="notebook")# 或 "browser", "png" 等

输出

条形图可视化

topic_model.visualize_barchart()

代码解释

  • 显示每个主题的关键词条形图
  • 按c-TF-IDF权重排序的关键词

如果在jupyter可能显示不出来,可以用下面方式渲染

# 在代码开头添加importplotly.ioaspio# 尝试不同的渲染器pio.renderers.default="notebook"# 尝试这个# pio.renderers.default = "jupyterlab" # 或这个# pio.renderers.default = "iframe" # 或这个# 然后运行可视化代码barchart=topic_model.visualize_barchart()barchart.show()# 现在应该能显示

输出

热力图可视化

topic_model.visualize_heatmap(n_clusters=30)

代码解释

  • 显示主题间相似度的热力图
  • n_clusters=30:将主题分成30个簇进行聚类显示

如果在jupyter可能显示不出来,可以用下面方式渲染

heatmap=topic_model.visualize_heatmap(n_clusters=30)heatmap.show()

输出

层次结构可视化

topic_model.visualize_hierarchy()

代码解释

  • 显示主题的层次聚类结构
  • 展示主题间的层级关系

如果在jupyter可能显示不出来,可以用下面方式渲染

hierarchy=topic_model.visualize_hierarchy()hierarchy.show()

输出

表示模型增强

KeyBERT启发式表示

frombertopic.representationimportKeyBERTInspiredfrombertopicimportBERTopic# 创建表示模型representation_model=KeyBERTInspired()# 在BERTopic中使用表示模型topic_model=BERTopic(representation_model=representation_model)

代码解释

  • KeyBERTInspired:基于KeyBERT的关键词提取算法
  • 用于改进主题的关键词表示质量

最大边际相关性

frombertopic.representationimportMaximalMarginalRelevance# 更新主题表示使用MMRrepresentation_model=MaximalMarginalRelevance(diversity=0.5)topic_model.update_topics(abstracts,representation_model=representation_model)

代码解释

  • MaximalMarginalRelevance:最大边际相关性算法
  • diversity=0.5:多样性参数,平衡相关性和多样性
  • 减少关键词之间的冗余,增加多样性

Flan-T5文本生成

fromtransformersimportpipelinefrombertopic.representationimportTextGeneration prompt="""我有一个包含以下文档的主题: [文档] 该主题由以下关键词描述:'[关键词]' 基于这些文档和关键词,这个主题是关于什么的?"""# 使用Flan-T5更新主题表示generator=pipeline('text2text-generation',model='google/flan-t5-small')representation_model=TextGeneration(generator,prompt=prompt,doc_length=50,tokenizer="whitespace")topic_model.update_topics(abstracts,representation_model=representation_model)

代码解释

  • 使用Flan-T5模型为每个主题生成自然语言描述
  • prompt:自定义提示模板,指导模型生成主题描述
  • doc_length=50:限制输入文档的长度
  • 可以将关键词列表转化为连贯的主题描述

OpenAI GPT模型

importopenaifrombertopic.representationimportOpenAI prompt=""" 我有一个包含以下文档的主题: [文档] 该主题由以下关键词描述:[关键词] 基于以上信息,提取一个简短的主题标签,格式如下: 主题: <简短主题标签> """# 使用GPT-3.5更新主题表示client=openai.OpenAI(api_key="YOUR_KEY_HERE")representation_model=OpenAI(client,model="gpt-3.5-turbo",exponential_backoff=True,chat=True,prompt=prompt)topic_model.update_topics(abstracts,representation_model=representation_model)

代码解释

  • 使用OpenAI GPT模型生成更高质量的主题标签
  • exponential_backoff=True:启用指数退避策略处理API限制
  • chat=True:使用聊天模式
  • 生成更加连贯和准确的主题描述

DataMap可视化

# 可视化主题和文档分布的高级视图fig=topic_model.visualize_document_datamap(titles,topics=list(range(20)),reduced_embeddings=reduced_embeddings,width=1200,label_font_size=11,label_wrap_width=20,use_medoids=True,)plt.savefig("datamapplot.png",dpi=300)

代码解释

  • visualize_document_datamap():高级文档地图可视化
  • topics=list(range(20)):只显示前20个主题
  • label_font_size=11:设置标签字体大小
  • use_medoids=True:使用簇中心点作为代表
  • 生成出版质量的图表

附加功能:词云生成

首先确保安装wordcloud库:!pip install wordcloud

扩展主题关键词

topic_model.update_topics(abstracts,top_n_words=500)

代码解释

  • top_n_words=500:将每个主题的关键词扩展到500个
  • 为词云生成提供更多词汇选择

创建词云

fromwordcloudimportWordCloudimportmatplotlib.pyplotaspltdefcreate_wordcloud(model,topic):plt.figure(figsize=(10,5))text={word:valueforword,valueinmodel.get_topic(topic)}wc=WordCloud(background_color="white",max_words=1000,width=1600,height=800)wc.generate_from_frequencies(text)plt.imshow(wc,interpolation="bilinear")plt.axis("off")plt.show()# 显示词云create_wordcloud(topic_model,topic=17)

代码解释

  • create_wordcloud():创建指定主题的词云可视化
  • get_topic(topic):获取主题的关键词和权重字典
  • WordCloud():创建词云对象,设置背景色、最大词数、尺寸等参数
  • generate_from_frequencies():根据词频生成词云
  • 直观展示主题的关键词分布和重要性
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 2:46:58

OBS Studio:开源免费的屏幕录制与直播推流一体化解决方案

OBS Studio作为一款功能全面的开源视频录制与直播软件&#xff0c;在内容创作和实时推流领域发挥着重要作用。这款跨平台工具以其专业的录制能力和灵活的直播配置&#xff0c;成为视频创作者和直播主播的首选工具。 获取地址&#xff1a;https://pan.quark.cn/s/fd2a86d8d920 …

作者头像 李华
网站建设 2026/6/25 19:29:16

我们不仅是宇宙的产物,更是宇宙进行自我认知的器官

22. 【冥想之镜 止息的波澜】当思维的潮水终于退去&#xff0c;意识的海床得以显现。它不是空无&#xff0c;而是一种无比清晰、映照万有的明镜止水。23. 【神义论之镜 恶的难题】如果神是全知全能全善&#xff0c;世间为何存在痛苦与不公&#xff1f;或许自由意志是更珍贵的…

作者头像 李华
网站建设 2026/6/24 11:15:25

灵遁者:光是宇宙的独裁者,设定了一切运动的终极上限

39. 【无名者之镜 尘埃的光辉】 历史书记载英雄与帝王。 而构成大地质量的&#xff0c;是无数个“他”&#xff1a; 没有留下姓名的士卒&#xff0c;建造金字塔的奴隶&#xff0c; 流水线上的女工&#xff0c;以及此刻正在清扫 英雄铜像脚下落叶的清洁工。 他们是时代的…

作者头像 李华
网站建设 2026/6/25 4:03:31

共用体类型

一、 共用体的基本概念1. 什么是共用体共用体&#xff08;union&#xff09;是一种特殊的数据类型&#xff0c;允许在同一内存位置存储不同的数据类型。所有成员共享同一段内存空间&#xff0c;共用体的大小等于其最大成员的大小。 2. 与结构体的本质区别结构体&#xff1a;各成…

作者头像 李华
网站建设 2026/6/24 13:50:39

分布式锁简介

产生背景 服务器集群模式下需要对临界资源实现互斥访问实现方案 基于数据库 使用唯一索引或排他锁来实现。 缺点是IO限制导致的性能较差&#xff0c;同时支持功能太少&#xff0c;需要额外开发锁超时、锁失效等功能。基于KV缓存 一般通过redis来实现。 一种是单机方案&#xff…

作者头像 李华
网站建设 2026/6/24 23:22:44

为什么IDEA提示不推荐@Autowired❓️如果使用@Resource呢❓️

IDEA&#xff08;IntelliJ IDEA&#xff09;在字段上使用 Autowired 进行依赖注入时&#xff0c;会提示警告 “Field injection is not recommended”&#xff08;字段注入不推荐&#xff09;。这是因为 Spring 官方和 IDEA 的 Spring 插件都推荐优先使用构造函数注入&#xff…

作者头像 李华