BERTopic
BERTopic是一种主题建模技术,它利用🤗 transformers和c-TF-IDF创建密集集群,允许轻松解释主题,同时在主题描述中保留重要词语。
BERTopic支持各种主题建模技术:
相关的Medium文章可以在这里、这里和这里找到。如需更详细的概述,您可以阅读论文或查看简要概述。
安装
使用sentence-transformers进行安装可以通过pypi完成:
pip install bertopic
如果您想安装BERTopic并使用其他嵌入模型,可以选择以下之一:
# 选择嵌入后端
pip install bertopic[flair,gensim,spacy,use]
# 图像主题建模
pip install bertopic[vision]
入门
要深入了解BERTopic的功能,您可以查看完整文档或按照以下示例之一进行操作:
名称 | 链接 |
---|---|
从这里开始 - BERTopic最佳实践 | |
🆕 新功能! - 大数据主题建模(GPU加速) | |
🆕 新功能! - 使用Llama 2进行主题建模 🦙 | |
🆕 新功能! - 使用量化LLM进行主题建模 | |
使用BERTopic进行主题建模 | |
BERTopic中的(自定义)嵌入模型 | |
BERTopic中的高级自定义 | |
使用BERTopic进行(半)监督主题建模 | |
使用特朗普推文进行动态主题建模 | |
arXiv摘要主题建模 |
快速入门
我们从著名的20个新闻组数据集中提取主题,该数据集包含英文文档:
from bertopic import BERTopic
from sklearn.datasets import fetch_20newsgroups
docs = fetch_20newsgroups(subset='all', remove=('headers', 'footers', 'quotes'))['data']
topic_model = BERTopic()
topics, probs = topic_model.fit_transform(docs)
生成主题及其概率后,我们可以访问所有主题及其主题表示:
>>> topic_model.get_topic_info()
Topic Count Name
-1 4630 -1_can_your_will_any
0 693 49_windows_drive_dos_file
1 466 32_jesus_bible_christian_faith
2 441 2_space_launch_orbit_lunar
3 381 22_key_encryption_keys_encrypted
...
-1
主题指所有异常文档,通常被忽略。主题中的每个词都描述了该主题的潜在主题,可用于解释该主题。接下来,让我们看看生成的最频繁主题:
>>> topic_model.get_topic(0)
[('windows', 0.006152228076250982),
('drive', 0.004982897610645755),
('dos', 0.004845038866360651),
('file', 0.004140142872194834),
('disk', 0.004131678774810884),
('mac', 0.003624848635985097),
('memory', 0.0034840976976789903),
('software', 0.0034415334250699077),
('email', 0.0034239554442333257),
('pc', 0.003047105930670237)]
使用.get_document_info
,我们还可以提取文档级别的信息,如它们对应的主题、概率、是否为主题的代表性文档等:
>>> topic_model.get_document_info(docs)
Document Topic Name Top_n_words Probability ...
I am sure some bashers of Pens... 0 0_game_team_games_season game - team - games... 0.200010 ...
My brother is in the market for... -1 -1_can_your_will_any can - your - will... 0.420668 ...
Finally you said what you dream... -1 -1_can_your_will_any can - your - will... 0.807259 ...
Think! It's the SCSI card doing... 49 49_windows_drive_dos_file windows - drive - docs... 0.071746 ...
1) I have an old Jasmine drive... 49 49_windows_drive_dos_file windows - drive - docs... 0.038983 ...
🔥 提示
:使用BERTopic(language="multilingual")
选择支持50多种语言的模型。
微调主题表示
在BERTopic中,我们可以选择多种不同的主题表示。它们彼此之间都有很大的不同,提供了有趣的视角和主题表示的变体。一个很好的起点是KeyBERTInspired
,对许多用户来说,它提高了连贯性并减少了结果主题表示中的停用词:
from bertopic.representation import KeyBERTInspired
# 微调您的主题表示
representation_model = KeyBERTInspired()
topic_model = BERTopic(representation_model=representation_model)
然而,您可能想使用更强大的方法来描述您的集群。您甚至可以使用ChatGPT或其他来自OpenAI的模型来生成标签、摘
模块化
默认情况下,BERTopic 的主要主题建模步骤依次为 sentence-transformers、UMAP、HDBSCAN 和 c-TF-IDF。然而,这些步骤之间假定存在一定的独立性,这使得 BERTopic 具有很强的模块化特性。换句话说,BERTopic 不仅允许您构建自己的主题模型,还可以在您定制的主题模型基础上探索多种主题建模技术:
您可以替换其中任何一个模型,甚至完全移除它们。以下步骤都是完全模块化的:
- 文档嵌入
- 嵌入的降维
- 将降维后的嵌入聚类为主题
- 主题的分词
- 词语加权
- 用一个或多个表示来表示主题
功能
BERTopic 有许多函数,可能会让人感到overwhelmed。为了缓解这个问题,您将看到所有方法的概述及其简短描述。
常用
以下是 BERTopic 中常用函数的概述。
方法 | 代码 |
---|---|
拟合模型 | .fit(docs) |
拟合模型并预测文档 | .fit_transform(docs) |
预测新文档 | .transform([new_doc]) |
访问单个主题 | .get_topic(topic=12) |
访问所有主题 | .get_topics() |
获取主题频率 | .get_topic_freq() |
获取所有主题信息 | .get_topic_info() |
获取所有文档信息 | .get_document_info(docs) |
获取每个主题的代表性文档 | .get_representative_docs() |
更新主题表示 | .update_topics(docs, n_gram_range=(1, 3)) |
生成主题标签 | .generate_topic_labels() |
设置主题标签 | .set_topic_labels(my_custom_labels) |
合并主题 | .merge_topics(docs, topics_to_merge) |
减少主题数量 | .reduce_topics(docs, nr_topics=30) |
减少离群值 | .reduce_outliers(docs, topics) |
查找主题 | .find_topics("vehicle") |
保存模型 | .save("my_model", serialization="safetensors") |
加载模型 | BERTopic.load("my_model") |
获取参数 | .get_params() |
属性
训练 BERTopic 模型后,几个属性会保存在模型中。这些属性部分指的是在拟合过程中模型信息如何存储在估计器上。您在下面看到的所有以 _
结尾的属性都是可用于访问模型信息的公共属性。
属性 | 描述 |
---|---|
.topics_ | 训练或更新主题模型后为每个文档生成的主题。 |
.probabilities_ | 如果使用 HDBSCAN,为每个文档生成的概率。 |
.topic_sizes_ | 每个主题的大小 |
.topic_mapper_ | 一个用于在合并/减少主题时跟踪主题及其映射的类。 |
.topic_representations_ | 每个主题的前 n 个词及其各自的 c-TF-IDF 值。 |
.c_tf_idf_ | 通过 c-TF-IDF 计算的主题-词矩阵。 |
.topic_aspects_ | 每个主题的不同方面或表示。 |
.topic_labels_ | 每个主题的默认标签。 |
.custom_labels_ | 通过 .set_topic_labels 生成的每个主题的自定义标签。 |
.topic_embeddings_ | 如果使用了 embedding_model ,则为每个主题的嵌入。 |
.representative_docs_ | 如果使用 HDBSCAN,则为每个主题的代表性文档。 |
变体
主题建模可以用于many不同的use cases。因此,开发了几种 BERTopic 的变体,使得一个包可以在许多用例中使用。
方法 | 代码 |
---|---|
主题分布近似 | .approximate_distribution(docs) |
在线主题建模 | .partial_fit(doc) |
半监督主题建模 | .fit(docs, y=y) |
监督主题建模 | .fit(docs, y=y) |
手动主题建模 | .fit(docs, y=y) |
多模态主题建模 | .fit(docs, images=images) |
按类别的主题建模 | .topics_per_class(docs, classes) |
动态主题建模 | .topics_over_time(docs, timestamps) |
层次主题建模 | .hierarchical_topics(docs) |
引导式主题建模 | BERTopic(seed_topic_list=seed_topic_list) |
零样本主题建模 | BERTopic(zeroshot_topic_list=zeroshot_topic_list) |
合并多个模型 | BERTopic.merge_models([topic_model_1, topic_model_2]) |
可视化
由于评估的somewhat主观性,评估主题模型可能相当困难。可视化主题模型的不同方面有助于理解模型,并使得更容易根据您的喜好调整模型。
方法 | 代码 |
---|---|
可视化主题 | .visualize_topics() |
可视化文档 | .visualize_documents() |
可视化文档层次结构 | .visualize_hierarchical_documents() |
可视化主题层次结构 | .visualize_hierarchy() |
可视化主题树 | .get_topic_tree(hierarchical_topics) |
可视化主题词 | .visualize_barchart() |
可视化主题相似度 | .visualize_heatmap() |
可视化词语得分下降 | .visualize_term_rank() |
可视化主题概率分布 | .visualize_distribution(probs[0]) |
可视化随时间变化的主题 | .visualize_topics_over_time(topics_over_time) |
可视化每个类别的主题 | .visualize_topics_per_class(topics_per_class) |
引用
要引用 BERTopic 论文,请使用以下 bibtex 引用:
@article{grootendorst2022bertopic,
title={BERTopic: Neural topic modeling with a class-based TF-IDF procedure},
author={Grootendorst, Maarten},
journal={arXiv preprint arXiv:2203.05794},
year={2022}
}