使用 FASTopic,轻松、快速、有效地进行主题建模,适合初学者
作者:吴晓宝
引言
什么是主题建模?
主题建模是 NLP 和机器学习中用于自动发现大量文档或文本数据中潜在主题的技术。它通过分析文档中单词共现的模式,并将经常一起出现的单词分组为主题来工作。
每个主题通常表示为词语分布,每个文档表示为这些主题的混合,其中某些主题在某些文档中比其他文档更突出。这允许对大量文本数据进行分类和总结,帮助用户理解数据中的基本主题和趋势。
主题建模广泛应用于文档分类、文本摘要、信息检索和情感分析等领域,是用于从非结构化文本数据中提取有意义信息的宝贵工具。
什么是 FASTopic?
之前的主题模型可分为三类:(1) 传统主题模型,如 LDA。它们通常使用 Gibbs 采样或变分推断来学习主题。(2) 基于 VAE 的神经主题模型,如 ProdLDA 和 ETM。它们利用变分自编码器(VAE)对主题进行建模。(3) 基于聚类的神经主题模型,如 Top2Vec 和 BERTopic。它们对文档嵌入进行聚类,并从文档聚类中提取重要词语。
与这些工作不同,FASTopic 模拟文档、主题和词语之间的最优传输方案。FASTopic 只需预训练 Transformers(如 sentence-transformers)的文档嵌入。它利用文档、主题和词语嵌入之间的最优传输方案来建模主题和文档的主题分布。
FASTopic 为用户理解文档提供了强大的工具。它用户友好、速度极快、高效、稳定且可迁移。用户可以在商业智能、学术研究、新闻媒体、医疗保健、法律和营销等不同领域使用 FASTopic。凭借其多功能性,FASTopic 适用于各种领域,提供有价值的见解并提高多个行业中文本分析任务的效率。
为什么选择 FASTopic?
- 极快速度。FASTopic 不需要 LDA 的 Gibbs 采样、神经主题模型的复杂 VAE 结构,也不需要 BERTopic 的降维和聚类过程。FASTopic 直接使用快速 Sinkhorn 算法来解决文档、主题和词语嵌入之间的最优传输问题。
- 高效。FASTopic 在主题一致性、主题多样性和文档主题分布的推断能力方面表现出强大的性能。
简单架构。FASTopic 具有简单的架构和有限的超参数。用户可以避免复杂而令人沮丧的超参数微调。
高可迁移性。在一个数据集上训练的 FASTopic 可以在另一个数据集上显示出高可迁移性。
快速入门:如何使用 FASTopic
我们将介绍如何快速使用 FASTopic 处理您的数据集。
- 使用 pip 安装 FASTopic。
pip install fastopic
- 传入您的数据集。
from fastopic import FASTopic
from topmost import Preprocess
# Prepare your dataset.
docs = [
'doc 1',
'doc 2', # ...
]
# Preprocess the dataset. This step tokenizes docs, removes stopwords, and sets max vocabulary size, etc.
# preprocess = Preprocess(vocab_size=your_vocab_size, tokenizer=your_tokenizer, stopwords=your_stopwords_set)
preprocess = Preprocess()
model = FASTopic(50, preprocess)
top_words, doc_topic_dist = model.fit_transform(docs)
top_words
是一个列表,包含已发现主题的顶部词汇。doc_topic_dist
是文档的主题分布(文档-主题分布),一个形状为 的 numpy 数组(文档数量 和主题数量 )。
教程:使用 FASTopic 分析《纽约时报》的新闻。
本教程的代码可在 Colab 上获取
- 准备数据集。
我们下载了预处理的数据集 NYT,其中包含《纽约时报》的新闻文章。
import topmost
from topmost.data import download_dataset
from fastopic import FASTopic
download_dataset("NYT", cache_path="./datasets")
dataset = topmost.data.DynamicDataset("./datasets/NYT", as_tensor=False)
docs = dataset.train_texts
- 训练 FASTopic。
model = FASTopic(num_topics=50, verbose=True)
topic_top_words, doc_topic_dist = model.fit_transform(docs)
- 主题信息。
我们可以获取已发现主题的顶部词汇及其概率。
model.get_topic(topic_idx=36)
(('cancer', 0.004797671),
('monkeypox', 0.0044828397),
('certificates', 0.004410268),
('redfield', 0.004407463),
('administering', 0.0043857736))
- 可视化这些主题。
fig = model.visualize_topic(top_n=5)
fig.show()
- 主题层次结构。
我们使用学习到的主题嵌入和 scipy.cluster.hierarchy 来构建已发现主题的层次结构。
fig = model.visualize_topic_hierarchy()
fig.show()
- 主题权重。
我们绘制了给定数据集中主题的权重。
fig = model.visualize_topic_weights(top_n=20, height=500)
fig.show()
- 主题随时间的变化。
主题活动指的是某个时间切片中主题的权重。我们额外输入文档的时间切片 `time_slices` 来计算并绘制主题随时间的变化。
time_slices = dataset.train_times
act = model.topic_activity_over_time(time_slices)
fig = model.visualize_topic_activity(top_n=6, topic_activity=act, time_slices=time_slices)
fig.show()
参考文献
FASTopic Github 仓库:https://github.com/bobxwu/FASTopic
FASTopic 论文:https://arxiv.org/abs/2405.17978
TopMost Github 仓库:https://github.com/bobxwu/topmost
联系方式: 吴晓宝