corex_topic
corex_topic 是一款基于 CorEx(相关性解释)算法的层次化主题建模工具,专为处理稀疏计数数据而设计。它能够帮助用户从大量文档中自动提取出信息量丰富且结构清晰的主题,有效解决了传统模型在缺乏标注数据时难以捕捉深层语义关联,或无法灵活融入专家知识的痛点。
这款工具非常适合自然语言处理研究人员、数据科学家以及需要深入挖掘文本数据的开发者使用。其核心亮点在于极高的灵活性:既支持完全无监督的自动探索,也允许通过“锚点词”进行半监督引导,让用户能将领域知识轻松融入模型,从而精准控制主题的方向与可解释性。此外,corex_topic 还能构建层次化的主题结构,揭示话题间的从属关系,并提供量化指标帮助用户科学地确定最佳主题数量。遵循 scikit-learn 的使用习惯,corex_topic 让复杂的主题分析变得简单高效,是探索文本数据内在结构的得力助手。
使用场景
某电商客服团队需要从数万条稀疏的用户投诉文本中,快速梳理出核心问题层级并定位特定业务线的异常。
没有 corex_topic 时
- 传统主题模型(如 LDA)生成的主题往往词汇重叠严重,难以区分“物流延迟”与“商品破损”等细粒度差异,导致分类模糊。
- 分析师明知“退款”、“缺货”是关键业务指标,却无法将这些领域知识强制融入模型,只能被动接受算法输出的无关主题。
- 面对海量数据,只能得到扁平的主题列表,无法自动构建从“售后服务”到“具体退换货流程”的层级结构,人工整理耗时极长。
- 对于短文本或稀疏的计数数据,模型效果大幅下降,大量包含关键信息的文档被错误归类或忽略。
使用 corex_topic 后
- 利用 CorEx 的最大信息量原则,生成的主题词汇互斥性更强,清晰分离出“支付失败”、“发货慢”等独立且高纯度的问题簇。
- 通过“锚点词(Anchor Words)”功能,直接将“优惠券”、“积分”设为引导词,迫使模型优先提取营销相关的潜在主题,实现半监督精准挖掘。
- 自动构建分层主题模型,顶层展示“物流”、“质量”等大方向,下层自动展开具体子问题,直观呈现问题根源的树状结构。
- 专为稀疏计数数据优化,即使是在只有几个关键词的简短投诉中,也能准确捕捉文档间的关联,显著提升召回率。
corex_topic 通过引入极少的人工先验知识,将原本黑盒的无监督聚类转化为可解释、可引导的层级化洞察工具,极大缩短了从原始数据到业务决策的路径。
运行环境要求
未说明
未说明

快速开始
锚定 CorEx:只需最少领域知识的层次主题建模
Correlation Explanation (CorEx) 是一种主题模型,能够生成对一组文档最具信息量的丰富主题。与其他主题模型相比,CorEx 的优势在于,它可以根据用户需求轻松地作为无监督、半监督或层次主题模型运行。在半监督学习中,CorEx 允许用户通过“锚词”整合其领域知识。这种整合方式灵活,使用户能够引导主题模型朝这些词语的方向发展。这为促进主题表示、可分离性和方面提取提供了创造性的策略。更广泛地说,CorEx 的这一实现非常适合对任何稀疏二值数据进行聚类。
如果您使用此代码,请引用以下文献:
Gallagher, R. J., Reing, K., Kale, D., and Ver Steeg, G. “锚定相关解释:只需最少领域知识的主题建模.” 计算语言学协会汇刊 (TACL), 2017.
快速入门
安装
可以通过 pip 安装 CorEx 主题模型的 Python 代码:
pip install corextopic
示例笔记本
有关如何获取并解释 CorEx 主题模型输出的完整说明,请参阅 示例笔记本。下面我们介绍如何将 CorEx 运行为无监督、半监督或层次主题模型。
运行 CorEx 主题模型
给定一个文档-词矩阵,CorEx 主题模型非常容易运行。代码遵循 scikit-learn 的 fit/transform 约定。
import numpy as np
import scipy.sparse as ss
from corextopic import corextopic as ct
# 定义一个矩阵,其中行代表样本(文档),列代表特征(词)
X = np.array([[0,0,0,1,1],
[1,1,1,0,0],
[1,1,1,1,1]], dtype=int)
# 也支持稀疏矩阵
X = ss.csr_matrix(X)
# 可以为每一列提供词标签
words = ['狗', '猫', '鱼', '苹果', '橙子']
# 可以为每一行提供文档标签
docs = ['水果文档', '动物文档', '混合文档']
# 训练 CorEx 主题模型
topic_model = ct.Corex(n_hidden=2) # 定义要使用的潜在(隐藏)主题数量。
topic_model.fit(X, words=words, docs=docs)
模型训练完成后,我们可以使用 get_topics() 函数获取主题。
topics = topic_model.get_topics()
for topic_n,topic in enumerate(topics):
# w: 词,mi: 互信息,s: 符号
topic = [(w,mi,s) if s > 0 else ('~'+w,mi,s) for w,mi,s in topic]
# 解包主题信息
words,mis,signs = zip(*topic)
# 打印主题
topic_str = str(topic_n+1)+': '+', '.join(words)
print(topic_str)
同样,每个主题最可能对应的文档可以通过 get_top_docs() 函数访问。
top_docs = topic_model.get_top_docs()
for topic_n, topic_docs in enumerate(top_docs):
docs,probs = zip(*topic_docs)
topic_str = str(topic_n+1)+': '+', '.join(docs)
print(topic_str)
总结文件和可视化结果可以由 vis_topic.py 输出。
from corextopic import vis_topic as vt
vt.vis_rep(topic_model, column_label=words, prefix='topic-model-example')
选择主题数量
每个主题解释了 总相关性 (TC) 的一部分。我们可以通过 tcs 属性访问各主题的 TC,也可以通过 tc 属性访问总体 TC(即所有主题 TC 的总和)。为了确定应使用多少个主题,我们可以查看 tcs 的分布情况。如果添加更多主题对总体 TC 的贡献很小,则说明现有主题已经解释了文档中的大部分信息。在这种情况下,我们的主题模型可能不需要更多的主题。因此,作为一般经验法则,可以继续添加主题,直到总体 TC 达到平稳状态。
我们还可以从多个不同的初始化点重新启动 CorEx 主题模型。这样可以使 CorEx 探索主题空间的不同区域,并有可能找到更具信息量的主题。如果我们希望采用严格的定量方法来选择使用哪一次主题模型运行的结果,那么可以选择具有最高 TC 的模型(即能够解释最多文档信息的模型)。
半监督主题建模
使用锚词
锚定 CorEx 允许用户通过“锚词”整合其领域知识。锚定会鼓励(但不强制)CorEx 搜索与锚词相关的主题。这有助于我们找到感兴趣的主题、增强主题之间的可分离性,并围绕主题发现各个方面。
如果已初始化 words,则可以轻松使用锚词:
topic_model.fit(X, words=words, anchors=[['狗','猫'], '苹果'], anchor_strength=2)
这会将“狗”和“猫”锚定到第一个主题,“苹果”锚定到第二个主题。anchor_strength 是相对于所有其他词而言,给予锚词的相对权重。例如,如果 anchor_strength=2,那么 CorEx 在搜索相关主题时会将锚词的权重提高两倍。anchor_strength 应始终设置为大于 1。在此基础上的具体取值取决于词汇表的大小和具体任务。我们鼓励用户尝试不同的 anchor_strength 值,以找到最适合自身需求的设置。
如果未初始化 words,我们可以通过指定文档-术语矩阵中要锚定的列索引来进行锚定。例如,
topic_model.fit(X, anchors=[[0, 2], 1], anchor_strength=2)
将第 0 列和第 2 列的词锚定到第一个主题,将第 1 列的词锚定到第二个主题。
锚定策略
我们可以使用多种策略来应用锚定 CorEx 模型。以下仅提供几个示例。
- 将一组词语锚定到单个主题。这有助于引入在无监督 CorEx 主题模型运行中未自然出现的主题。例如,如果我们怀疑一组灾害救援文章中应包含雪崩主题,可以将“snow”、“cold”和“avalanche”等词语锚定到某个主题。
topic_model.fit(X, words=words, anchors=[['snow', 'cold', 'avalanche']], anchor_strength=4)
- 将多组词语分别锚定到多个主题。这可以帮助发现一个主题在不同上下文中可能涉及的不同方面。例如,我们可能将“protest”锚定到三个主题,“riot”锚定到另外三个主题,以理解关于政治抗议的推文所呈现的不同话语框架。
topic_model.fit(X, words=words, anchors=['protest', 'protest', 'protest', 'riot', 'riot', 'riot'], anchor_strength=2)
- 将不同的词语集分别锚定到多个主题。如果存在一些分离度较差的“嵌合体”主题,这种方法可以帮助增强主题的可区分性。例如,我们可以将“mountain”、“Bernese”和“dog”锚定到一个主题,同时将“mountain”、“rocky”和“colorado”锚定到另一个主题,以更好地分离讨论伯恩山犬和落基山脉的主题。
topic_model.fit(X, words=words, anchors=[['bernese', 'mountain', 'dog'], ['mountain', 'rocky', 'colorado']], anchor_strength=2)
示例笔记本详细介绍了其他使用锚定 CorEx 的示例。我们鼓励领域专家根据自身需求尝试不同的锚定策略。
注意:在运行无监督 CorEx 时,主题会按照其解释的总相关性大小进行排序并返回。而在运行锚定 CorEx 时,主题不会按总相关性排序,前 n 个主题将对应于模型输入中给出顺序的前 n 个锚定主题。
层次化主题建模
构建层次化主题模型
对于 CorEx 主题模型而言,主题是潜在因子,可以在每篇文档中出现或不出现。我们可以将这些主题表达矩阵作为另一层 CorEx 主题模型的输入,从而构建层次化主题模型。
# 训练第一层
topic_model = ct.Corex(n_hidden=100)
topic_model.fit(X)
# 训练后续各层
tm_layer2 = ct.Corex(n_hidden=10)
tm_layer2.fit(topic_model.labels)
tm_layer3 = ct.Corex(n_hidden=1)
tm_layer3.fit(tm_layer2.labels)
可以通过 vis_topic.py 访问层次化主题模型的可视化结果。
vt.vis_hierarchy([topic_model, tm_layer2, tm_layer3], column_label=words, max_edges=300, prefix='topic-model-example')
技术说明
文档二值化
出于速度考虑,本版本的 CorEx 主题模型仅适用于二值数据,并生成二值潜在因子。尽管存在这一限制,我们的研究表明,对于短至中等长度的文档,CorEx 所生成的主题连贯性与 LDA 相当甚至更好。然而,处理较长文档时,您可能需要考虑额外的预处理步骤。我们提供了几种文本数据处理策略。
简单二值化。此方法适用于长度相近的文档,尤其适合短至中等长度的文档。
平均二值词袋。我们将文档分割成若干块,计算每块的二值词袋,然后取平均值。这种方法会隐式地对所有文档赋予相等的权重。
全部二值词袋。将文档分割成若干块,并将每块视为独立的二值词袋文档。这样做会改变文档数量,因此如果需要,可能需要重新匹配文档 ID。隐式地,这种方法会更重视较长的文档。总体而言,这似乎是最具理论依据的方法。理想情况下,您可以汇总子文档的潜在因子,以获得更高层的潜在因子“计数”。
分数计数。此方法将计数转换为相对于背景频率的比例,最大值为 1。短文档通常保持二值状态,而长文档中的词语则会根据其在语料库中的背景频率进行加权。该方法在测试中表现尚可。它无需对计数数据进行预处理,且能充分利用所有可能的输入范围。然而,这种方法尚未经过严格或充分的测试。
对于 Python API,针对第 1 和第 2 种方法,您可以使用 vis_topic 中的函数来处理数据,也可以自行完成。简单二值化可通过 count='binarize' 参数指定,分数计数则通过 count='fraction' 指定。尽管分数计数在理论上可行,但其在 CorEx 主题模型中的应用尚未得到充分验证。
单一主题归属
同样出于速度考虑,CorEx 主题模型强制要求每个词语只能属于一个主题。如果用户将某个词语锚定到多个主题,则单一归属规则将被覆盖。
参考文献
如果您使用此代码,请引用以下文献:
Gallagher, R. J., Reing, K., Kale, D., and Ver Steeg, G. “锚定相关性解释:基于最小领域知识的主题建模.” 计算语言学协会汇刊 (TACL), 2017.
如果您想了解 CorEx 在稀疏二值数据之外的一般工作原理,请参阅以下论文:
通过相关性解释发现高维数据中的结构, Ver Steeg 和 Galstyan, NIPS 2014.
高维数据的最大信息量层次表示, Ver Steeg 和 Galstyan, AISTATS 2015.
常见问题
相似工具推荐
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 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
NextChat
NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
ragflow
RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。