使用 FASTopic,轻松、快速、有效地进行主题建模,适合初学者

社区文章 发布于 2024年8月23日

作者:吴晓宝

stars PyPI arXiv

引言

什么是主题建模?

主题建模是 NLP 和机器学习中用于自动发现大量文档或文本数据中潜在主题的技术。它通过分析文档中单词共现的模式,并将经常一起出现的单词分组为主题来工作。

每个主题通常表示为词语分布,每个文档表示为这些主题的混合,其中某些主题在某些文档中比其他文档更突出。这允许对大量文本数据进行分类和总结,帮助用户理解数据中的基本主题和趋势。

主题建模广泛应用于文档分类、文本摘要、信息检索和情感分析等领域,是用于从非结构化文本数据中提取有意义信息的宝贵工具。

什么是 FASTopic?

之前的主题模型可分为三类:(1) 传统主题模型,如 LDA。它们通常使用 Gibbs 采样或变分推断来学习主题。(2) 基于 VAE 的神经主题模型,如 ProdLDA 和 ETM。它们利用变分自编码器(VAE)对主题进行建模。(3) 基于聚类的神经主题模型,如 Top2Vec 和 BERTopic。它们对文档嵌入进行聚类,并从文档聚类中提取重要词语。

与这些工作不同,FASTopic 模拟文档、主题和词语之间的最优传输方案。FASTopic 只需预训练 Transformers(如 sentence-transformers)的文档嵌入。它利用文档、主题和词语嵌入之间的最优传输方案来建模主题和文档的主题分布。

FASTopic 为用户理解文档提供了强大的工具。它用户友好、速度极快、高效、稳定且可迁移。用户可以在商业智能、学术研究、新闻媒体、医疗保健、法律和营销等不同领域使用 FASTopic。凭借其多功能性,FASTopic 适用于各种领域,提供有价值的见解并提高多个行业中文本分析任务的效率。

为什么选择 FASTopic?

  1. 极快速度。FASTopic 不需要 LDA 的 Gibbs 采样、神经主题模型的复杂 VAE 结构,也不需要 BERTopic 的降维和聚类过程。FASTopic 直接使用快速 Sinkhorn 算法来解决文档、主题和词语嵌入之间的最优传输问题。

  1. 高效。FASTopic 在主题一致性、主题多样性和文档主题分布的推断能力方面表现出强大的性能。

  1. 简单架构。FASTopic 具有简单的架构和有限的超参数。用户可以避免复杂而令人沮丧的超参数微调。

  2. 高可迁移性。在一个数据集上训练的 FASTopic 可以在另一个数据集上显示出高可迁移性。

快速入门:如何使用 FASTopic

我们将介绍如何快速使用 FASTopic 处理您的数据集。

  1. 使用 pip 安装 FASTopic。
pip install fastopic
  1. 传入您的数据集。
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 是文档的主题分布(文档-主题分布),一个形状为 N×KN×K 的 numpy 数组(文档数量 NN 和主题数量 KK)。

教程:使用 FASTopic 分析《纽约时报》的新闻。

本教程的代码可在 Colab 上获取

  1. 准备数据集。

我们下载了预处理的数据集 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
  1. 训练 FASTopic。
model = FASTopic(num_topics=50, verbose=True)
topic_top_words, doc_topic_dist = model.fit_transform(docs)
  1. 主题信息。

我们可以获取已发现主题的顶部词汇及其概率。

model.get_topic(topic_idx=36)

(('cancer', 0.004797671),
 ('monkeypox', 0.0044828397),
 ('certificates', 0.004410268),
 ('redfield', 0.004407463),
 ('administering', 0.0043857736))
  1. 可视化这些主题。
fig = model.visualize_topic(top_n=5)
fig.show()

  1. 主题层次结构。

我们使用学习到的主题嵌入和 scipy.cluster.hierarchy 来构建已发现主题的层次结构。

fig = model.visualize_topic_hierarchy()
fig.show()

  1. 主题权重。

我们绘制了给定数据集中主题的权重。

fig = model.visualize_topic_weights(top_n=20, height=500)
fig.show()

  1. 主题随时间的变化。

主题活动指的是某个时间切片中主题的权重。我们额外输入文档的时间切片 `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

联系方式: 吴晓宝

社区

注册登录 以评论