GuidedLDA
GuidedLDA 是一款基于潜在狄利克雷分配(LDA)算法的半监督主题建模工具。传统的无监督 LDA 模型在自动挖掘文本主题时,生成的类别往往不够精准或难以符合业务预期。GuidedLDA 通过引入“种子词”机制巧妙解决了这一痛点:用户只需为每个期望的主题提供几个关键词作为引导,模型在训练过程中便会向这些方向收敛,从而生成更可控、更具解释性的主题结果。
该工具采用折叠吉布斯采样(Collapsed Gibbs Sampling)技术实现,接口设计遵循 scikit-learn 规范,支持稀疏矩阵输入,便于开发者快速集成到现有的 Python 数据分析流程中。其独特的技术亮点在于将人工先验知识与统计模型完美结合,既保留了机器学习的自动化能力,又赋予了用户对输出结果的干预权。
GuidedLDA 非常适合数据科学家、自然语言处理研究人员以及需要深入分析文档集合的开发者使用。无论是进行新闻分类、用户评论情感分析,还是构建垂直领域的知识图谱,只要您希望对提取的主题拥有更高的掌控度,GuidedLDA 都是一个轻量且高效的选择。
使用场景
某电商数据团队需要从数万条用户评论中自动提取“物流体验”和“售后质量”等特定维度的反馈,以优化运营策略。
没有 GuidedLDA 时
- 主题不可控:传统 LDA 算法完全无监督,生成的主题往往混杂了“价格”、“包装”等无关词汇,难以精准聚焦业务关心的核心维度。
- 人工清洗成本高:数据分析师需要逐个检查生成的几十个主题,手动筛选并重新归类包含目标信息的文档,耗时耗力。
- 关键信号被淹没:由于缺乏引导,稀疏但重要的“配送延迟”或“客服态度”等关键词容易被高频通用词(如“好的”、“收到”)掩盖,导致洞察缺失。
- 结果复现性差:每次运行模型得到的主题定义都不一致,难以建立标准化的监控指标体系。
使用 GuidedLDA 后
- 精准定向挖掘:通过预设“快递、慢、破损”作为物流主题的种子词,GuidedLDA 强制模型向该方向收敛,直接输出纯净的物流体验主题。
- 自动化分类高效:模型自动将涉及种子词相关语义的评论归入指定主题,无需人工二次干预,分析效率提升数倍。
- 长尾问题显性化:即使“冷链断裂”等低频词在语料中占比很小,只要纳入种子列表,GuidedLDA 也能将其识别为独立主题,避免关键风险被忽略。
- 业务对齐稳定:不同批次的数据分析均能保持主题定义的一致性,便于长期追踪特定维度的用户满意度变化趋势。
GuidedLDA 的核心价值在于将领域专家的先验知识融入无监督学习,把“碰运气”式的主题发现转变为可定制、可解释的业务洞察工具。
运行环境要求
- 未说明
不需要 GPU
未说明(作者提及处理 50 万文档需大型机器,具体数值取决于数据量)

快速开始
GuidedLDA:基于潜在狄利克雷分配的引导主题建模
.. image:: https://readthedocs.org/projects/guidedlda/badge/?version=latest :target: http://guidedlda.readthedocs.io/en/latest/?badge=latest :alt: 文档状态
.. image:: https://badge.fury.io/py/guidedlda.svg :target: https://badge.fury.io/py/guidedlda :alt: 包版本
GuidedLDA 或 SeededLDA 使用折叠吉布斯采样实现了潜在狄利克雷分配(LDA)。通过为每个主题设置一些种子词,可以引导 GuidedLDA 的主题学习方向,从而使主题向指定方向收敛。
您可以在 文档 <https://guidedlda.readthedocs.io>_ 中了解更多关于 guidedlda 的信息。
我还曾在 freecodecamp Medium 博客 <https://medium.freecodecamp.org/how-we-changed-unsupervised-lda-to-semi-supervised-guidedlda-e36a95f3a164> 上发表了一篇文章,介绍了这一方法。
安装
::
pip install guidedlda
如果使用 pip 安装失败,请尝试下一步:
::
https://github.com/vi3k6i5/GuidedLDA
cd GuidedLDA
sh build_dist.sh
python setup.py sdist
pip install -e .
如果上述步骤仍然无法成功,请在 GitHub 仓库的 Issues 页面 <https://github.com/vi3k6i5/guidedlda/issues>_ 上提交问题,并提供您的工作环境的操作系统版本、Python 版本、架构等详细信息,我会尽力尽快修复。
开始使用
guidedlda.GuidedLDA 实现了潜在狄利克雷分配(LDA)。其接口遵循 scikit-learn_ 中的惯例。
示例代码 <https://github.com/vi3k6i5/GuidedLDA/blob/master/examples/example_seeded_lda.py>_。
以下演示如何检查 NYT 新闻数据集子集的模型。下面的输入 X 是一个文档-词矩阵(支持稀疏矩阵)。
.. code-block:: python
>>> import numpy as np
>>> import guidedlda
>>> X = guidedlda.datasets.load_data(guidedlda.datasets.NYT)
>>> vocab = guidedlda.datasets.load_vocab(guidedlda.datasets.NYT)
>>> word2id = dict((v, idx) for idx, v in enumerate(vocab))
>>> X.shape
(8447, 3012)
>>> X.sum()
1221626
>>> # 无种子的普通 LDA
>>> model = guidedlda.GuidedLDA(n_topics=5, n_iter=100, random_state=7, refresh=20)
>>> model.fit(X)
INFO:guidedlda:n_documents: 8447
INFO:guidedlda:vocab_size: 3012
INFO:guidedlda:n_words: 1221626
INFO:guidedlda:n_topics: 5
INFO:guidedlda:n_iter: 100
WARNING:guidedlda:发现文档-词矩阵中存在全零列
INFO:guidedlda:<0> 对数似然值: -11489265
INFO:guidedlda:<20> 对数似然值: -9844667
INFO:guidedlda:<40> 对数似然值: -9694223
INFO:guidedlda:<60> 对数似然值: -9642506
INFO:guidedlda:<80> 对数似然值: -9617962
INFO:guidedlda:<99> 对数似然值: -9604031
>>> topic_word = model.topic_word_
>>> n_top_words = 8
>>> for i, topic_dist in enumerate(topic_word):
>>> topic_words = np.array(vocab)[np.argsort(topic_dist)][:-(n_top_words+1):-1]
>>> print('Topic {}: {}'.format(i, ' '.join(topic_words)))
Topic 0: company percent market business plan pay price increase
Topic 1: game play team win player season second start
Topic 2: life child write man school woman father family
Topic 3: place open small house music turn large play
Topic 4: official state government political states issue leader case
>>> # 带有种子主题的引导 LDA
>>> seed_topic_list = [['game', 'team', 'win', 'player', 'season', 'second', 'victory'],
>>> ['percent', 'company', 'market', 'price', 'sell', 'business', 'stock', 'share'],
>>> ['music', 'write', 'art', 'book', 'world', 'film'],
>>> ['political', 'government', 'leader', 'official', 'state', 'country', 'american','case', 'law', 'police', 'charge', 'officer', 'kill', 'arrest', 'lawyer']]
>>> model = guidedlda.GuidedLDA(n_topics=5, n_iter=100, random_state=7, refresh=20)
>>> seed_topics = {}
>>> for t_id, st in enumerate(seed_topic_list):
>>> for word in st:
>>> seed_topics[word2id[word]] = t_id
>>> model.fit(X, seed_topics=seed_topics, seed_confidence=0.15)
INFO:guidedlda:n_documents: 8447
INFO:guidedlda:vocab_size: 3012
INFO:guidedlda:n_words: 1221626
INFO:guidedlda:n_topics: 5
INFO:guidedlda:n_iter: 100
WARNING:guidedlda:发现文档-词矩阵中存在全零列
INFO:guidedlda:<0> 对数似然值: -11486362
INFO:guidedlda:<20> 对数似然值: -9767277
INFO:guidedlda:<40> 对数似然值: -9663718
INFO:guidedlda:<60> 对数似然值: -9624150
INFO:guidedlda:<80> 对数似然值: -9601684
INFO:guidedlda:<99> 对数似然值: -9587803
>>> n_top_words = 10
>>> topic_word = model.topic_word_
>>> for i, topic_dist in enumerate(topic_word):
>>> topic_words = np.array(vocab)[np.argsort(topic_dist)][:-(n_top_words+1):-1]
>>> print('Topic {}: {}'.format(i, ' '.join(topic_words)))
Topic 0: game play team win season player second point start victory
Topic 1: company percent market price business sell executive pay plan sale
Topic 2: play life man music place write turn woman old book
Topic 3: official government state political leader states issue case member country
Topic 4: school child city program problem student state study family group
文档-主题分布可以通过 doc_topic = model.transform(X) 获取。
.. code-block:: python
>>> doc_topic = model.transform(X)
>>> for i in range(9):
>>> print("top topic: {} Document: {}".format(doc_topic[i].argmax(),
', '.join(np.array(vocab)[list(reversed(X[i,:].argsort()))[0:5]])))
top topic: 4 Document: plant, increase, food, increasingly, animal
top topic: 3 Document: explain, life, country, citizen, nation
top topic: 2 Document: thing, solve, problem, machine, carry
top topic: 2 Document: company, authority, opera, artistic, director
top topic: 3 Document: partner, lawyer, attorney, client, indict
top topic: 2 Document: roll, place, soon, treat, rating
top topic: 3 Document: city, drug, program, commission, report
top topic: 1 Document: company, comic, series, case, executive
top topic: 3 Document: son, scene, charge, episode, attack
可选地,可以通过清除额外矩阵来简化模型:
.. code-block:: python
>>> # 下一步将减轻模型对象的负担
>>> # 这一步会删除模型内部的一些矩阵。
>>> # 您仍然可以像之前一样使用 model.transform(X)。
>>> # 但将无法再使用 model.fit_transform(X_new)。
>>> model.purge_extra_matrices()
将模型保存以供生产或后续运行使用:
.. code-block:: python
from six.moves import cPickle as pickle >>> with open('guidedlda_model.pickle', 'wb') as file_handle: >>> pickle.dump(model, file_handle) >>> # 加载模型进行预测 >>> with open('guidedlda_model.pickle', 'rb') as file_handle: >>> model = pickle.load(file_handle) >>> doc_topic = model.transform(X)
要求
需要 Python 2.7 或 Python 3.3 及以上版本。以下软件包是必需的:
- numpy_
- pbr_
注意事项
guidedlda 的目标是引导式 LDA。通常情况下,我们从 LDA 模型中得到的主题并不令人满意。GuidedLDA 可以将主题朝我们希望的方向稍微调整。我们在生产环境中用五十万篇文档训练过该模型(我们有一台性能强大的机器)。我们也对数百万篇文档进行了预测,并手动检查了数千个主题(结果令我们满意)。
如果你处理的是非常大的语料库,可能需要使用更复杂的话题模型,例如 hca_ 和 MALLET_ 中实现的那些。hca_ 完全用 C 语言编写,而 MALLET_ 则是用 Java 编写的。与 guidedlda 不同,hca_ 可以同时利用多个处理器。MALLET_ 和 hca_ 都实现了比标准潜在狄利克雷分配更为稳健的话题模型。
注释
潜在狄利克雷分配在 Blei 等人 (2003)_ 和 Pritchard 等人 (2000)_ 中有描述。使用折叠吉布斯采样的推断方法在 Griffiths 和 Steyvers (2004)_ 中有所介绍。而引导式 LDA 则在 Jagadeesh Jagarlamudi、Hal Daume III 和 Raghavendra Udupa (2012)_ 中有说明。
重要链接
- 文档:http://guidedlda.readthedocs.org
- 源代码:https://github.com/vi3k6i5/guidedlda/
- 问题跟踪器:https://github.com/vi3k6i5/guidedlda/issues
其他实现
- scikit-learn_ 的
LatentDirichletAllocation <http://scikit-learn.org/dev/modules/generated/sklearn.decomposition.LatentDirichletAllocation.html>_(使用在线变分推断) gensim <https://pypi.python.org/pypi/gensim>_(使用在线变分推断)
致谢
我要感谢 LDA 项目 <https://github.com/lda-project/lda>_ 的创建者们。我以该 LDA 项目的代码为基础,在其上实现了 GuidedLDA。
特别感谢:Allen Riddell <https://twitter.com/ariddell>_ 和 Tim Hopper <https://twitter.com/tdhopper>_。:)
许可证
guidedlda 采用 Mozilla 公共许可证第 2.0 版本授权。
.. _Python: http://www.python.org/ .. _scikit-learn: http://scikit-learn.org .. _hca: http://www.mloss.org/software/view/527/ .. _MALLET: http://mallet.cs.umass.edu/ .. _numpy: http://www.numpy.org/ .. _pbr: https://pypi.python.org/pypi/pbr .. _Cython: http://cython.org .. _Blei et al. (2003): http://jmlr.org/papers/v3/blei03a.html .. _Pritchard et al. (2000): http://www.genetics.org/content/155/2/945.full .. _Griffiths and Steyvers (2004): http://www.pnas.org/content/101/suppl_1/5228.abstract .. _Jagadeesh Jagarlamudi, Hal Daume III and Raghavendra Udupa (2012): http://www.aclweb.org/anthology/E12-1021
常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器