Package: bertopic
BERTopicBERTopic is a topic modeling technique that leverages ðŸ¤— transformers and c-TF-IDF to create dense clusters
allowing for easily interpretable topics whilst keeping important words in the topic descriptions.BERTopic supports all kinds of topic modeling techniques:GuidedSupervisedSemi-supervisedManualMulti-topic distributionsHierarchicalClass-basedDynamicOnline/IncrementalMultimodalMulti-aspectText Generation/LLMZero-shot(new!)Merge Models(new!)Seed Words(new!)Corresponding medium posts can be foundhere,hereandhere. For a more detailed overview, you can read thepaperor see abrief overview.InstallationInstallation, with sentence-transformers, can be done usingpypi:pipinstallbertopicIf you want to install BERTopic with other embedding models, you can choose one of the following:# Choose an embedding backendpipinstallbertopic[flair,gensim,spacy,use]# Topic modeling with imagespipinstallbertopic[vision]Getting StartedFor an in-depth overview of the features of BERTopic
you can check thefull documentationor you can follow along
with one of the examples below:NameLinkBERTopic -Best PracticesTopic Modeling with BERTopic(Custom) Embedding Models in BERTopicAdvanced Customization in BERTopic(semi-)Supervised Topic Modeling with BERTopicDynamic Topic Modeling with Trump's TweetsNew- Topic Modeling on Large DataNew- Topic Modeling with Llama 2 ðŸ¦™Topic Modeling arXiv AbstractsQuick StartWe start by extracting topics from the well-known 20 newsgroups dataset containing English documents:frombertopicimportBERTopicfromsklearn.datasetsimportfetch_20newsgroupsdocs=fetch_20newsgroups(subset='all',remove=('headers','footers','quotes'))['data']topic_model=BERTopic()topics,probs=topic_model.fit_transform(docs)After generating topics and their probabilities, we can access all of the topics together with their topic representations:>>>topic_model.get_topic_info()TopicCountName-14630-1_can_your_will_any069349_windows_drive_dos_file146632_jesus_bible_christian_faith24412_space_launch_orbit_lunar338122_key_encryption_keys_encrypted...The-1topic refers to all outlier documents and are typically ignored. Each word in a topic describes the underlying theme of that topic and can be used
for interpreting that topic. Next, let's take a look at the most frequent topic that was generated:>>>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)]Using.get_document_info, we can also extract information on a document level, such as their corresponding topics, probabilities, whether they are representative documents for a topic, etc.:>>>topic_model.get_document_info(docs)DocumentTopicNameTop_n_wordsProbability...IamsuresomebashersofPens...00_game_team_games_seasongame-team-games...0.200010...Mybrotherisinthemarketfor...-1-1_can_your_will_anycan-your-will...0.420668...Finallyyousaidwhatyoudream...-1-1_can_your_will_anycan-your-will...0.807259...Think!It's the SCSI card doing...	49     49_windows_drive_dos_file	windows - drive - docs...	0.071746       ...1)IhaveanoldJasminedrive...4949_windows_drive_dos_filewindows-drive-docs...0.038983...ðŸ”¥ Tip: UseBERTopic(language="multilingual")to select a model that supports 50+ languages.Fine-tune Topic RepresentationsIn BERTopic, there are a number of differenttopic representationsthat we can choose from. They are all quite different from one another and give interesting perspectives and variations of topic representations. A great start isKeyBERTInspired, which for many users increases the coherence and reduces stopwords from the resulting topic representations:frombertopic.representationimportKeyBERTInspired# Fine-tune your topic representationsrepresentation_model=KeyBERTInspired()topic_model=BERTopic(representation_model=representation_model)However, you might want to use something more powerful to describe your clusters. You can even use ChatGPT or other models from OpenAI to generate labels, summaries, phrases, keywords, and more:importopenaifrombertopic.representationimportOpenAI# Fine-tune topic representations with GPTclient=openai.OpenAI(api_key="sk-...")representation_model=OpenAI(client,model="gpt-3.5-turbo",chat=True)topic_model=BERTopic(representation_model=representation_model)ðŸ”¥ Tip: Instead of iterating over all of these different topic representations, you can model them simultaneously withmulti-aspect topic representationsin BERTopic.VisualizationsAfter having trained our BERTopic model, we can iteratively go through hundreds of topics to get a good
understanding of the topics that were extracted. However, that takes quite some time and lacks a global representation. Instead, we can use one of themany visualization optionsin BERTopic.
For example, we can visualize the topics that were generated in a way very similar toLDAvis:topic_model.visualize_topics()ModularityBy default, themain stepsfor topic modeling with BERTopic are sentence-transformers, UMAP, HDBSCAN, and c-TF-IDF run in sequence. However, it assumes some independence between these steps which makes BERTopic quite modular. In other words, BERTopic not only allows you to build your own topic model but to explore several topic modeling techniques on top of your customized topic model:https://user-images.githubusercontent.com/25746895/218420473-4b2bb539-9dbe-407a-9674-a8317c7fb3bf.mp4You can swap out any of these models or even remove them entirely. The following steps are completely modular:EmbeddingdocumentsReducing dimensionalityof embeddingsClusteringreduced embeddings into topicsTokenizationof topicsWeighttokensRepresent topicswith one ormultiplerepresentationsFunctionalityBERTopic has many functions that quickly can become overwhelming. To alleviate this issue, you will find an overview
of all methods and a short description of its purpose.CommonBelow, you will find an overview of common functions in BERTopic.MethodCodeFit the model.fit(docs)Fit the model and predict documents.fit_transform(docs)Predict new documents.transform([new_doc])Access single topic.get_topic(topic=12)Access all topics.get_topics()Get topic freq.get_topic_freq()Get all topic information.get_topic_info()Get all document information.get_document_info(docs)Get representative docs per topic.get_representative_docs()Update topic representation.update_topics(docs, n_gram_range=(1, 3))Generate topic labels.generate_topic_labels()Set topic labels.set_topic_labels(my_custom_labels)Merge topics.merge_topics(docs, topics_to_merge)Reduce nr of topics.reduce_topics(docs, nr_topics=30)Reduce outliers.reduce_outliers(docs, topics)Find topics.find_topics("vehicle")Save model.save("my_model", serialization="safetensors")Load modelBERTopic.load("my_model")Get parameters.get_params()AttributesAfter having trained your BERTopic model, several attributes are saved within your model. These attributes, in part,
refer to how model information is stored on an estimator during fitting. The attributes that you see below all end in_and are
public attributes that can be used to access model information.AttributeDescription.topics_The topics that are generated for each document after training or updating the topic model..probabilities_The probabilities that are generated for each document if HDBSCAN is used..topic_sizes_The size of each topic.topic_mapper_A class for tracking topics and their mappings anytime they are merged/reduced..topic_representations_The topnterms per topic and their respective c-TF-IDF values..c_tf_idf_The topic-term matrix as calculated through c-TF-IDF..topic_aspects_The different aspects, or representations, of each topic..topic_labels_The default labels for each topic..custom_labels_Custom labels for each topic as generated through.set_topic_labels..topic_embeddings_The embeddings for each topic ifembedding_modelwas used..representative_docs_The representative documents for each topic if HDBSCAN is used.VariationsThere are many different use cases in which topic modeling can be used. As such, several variations of BERTopic have been developed such that one package can be used across many use cases.MethodCodeTopic Distribution Approximation.approximate_distribution(docs)Online Topic Modeling.partial_fit(doc)Semi-supervised Topic Modeling.fit(docs, y=y)Supervised Topic Modeling.fit(docs, y=y)Manual Topic Modeling.fit(docs, y=y)Multimodal Topic Modeling.fit(docs, images=images)Topic Modeling per Class.topics_per_class(docs, classes)Dynamic Topic Modeling.topics_over_time(docs, timestamps)Hierarchical Topic Modeling.hierarchical_topics(docs)Guided Topic ModelingBERTopic(seed_topic_list=seed_topic_list)Zero-shot Topic ModelingBERTopic(zeroshot_topic_list=zeroshot_topic_list)Merge Multiple ModelsBERTopic.merge_models([topic_model_1, topic_model_2])VisualizationsEvaluating topic models can be rather difficult due to the somewhat subjective nature of evaluation.
Visualizing different aspects of the topic model helps in understanding the model and makes it easier
to tweak the model to your liking.MethodCodeVisualize Topics.visualize_topics()Visualize Documents.visualize_documents()Visualize Document Hierarchy.visualize_hierarchical_documents()Visualize Topic Hierarchy.visualize_hierarchy()Visualize Topic Tree.get_topic_tree(hierarchical_topics)Visualize Topic Terms.visualize_barchart()Visualize Topic Similarity.visualize_heatmap()Visualize Term Score Decline.visualize_term_rank()Visualize Topic Probability Distribution.visualize_distribution(probs[0])Visualize Topics over Time.visualize_topics_over_time(topics_over_time)Visualize Topics per Class.visualize_topics_per_class(topics_per_class)CitationTo cite theBERTopic paper, please use the following bibtex reference:@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}
}