1818logger .configure ("WARNING" )
1919
2020
21- def zeroshot_tm (topic_model : "BERTopic" , corpus : Corpus ) -> Corpus :
21+ def zeroshot_tm (topic_model : "BERTopic" , corpus : Corpus ) -> tuple [ Corpus , Corpus ] :
2222 """Find documents that could be assigned to either one of the topics in topic_model.zeroshot_topic_list.
2323
2424 We transform the topics in `topic_model.zeroshot_topic_list` to embeddings and
@@ -30,8 +30,8 @@ def zeroshot_tm(topic_model: "BERTopic", corpus: Corpus) -> Corpus:
3030 corpus: The documents and their embeddings
3131
3232 Returns:
33- zeroshot_data: Documents containing documents assigned to zero-shot topics
3433 cluster_data: Documents containing documents to be clustered
34+ zeroshot_data: Documents containing documents assigned to zero-shot topics
3535 """
3636 zeroshot_data = Corpus ()
3737 if not topic_model ._is_zeroshot ():
@@ -58,8 +58,8 @@ def zeroshot_tm(topic_model: "BERTopic", corpus: Corpus) -> Corpus:
5858 zeroshot_data = Corpus ()
5959 if len (assigned_ids ) > 0 :
6060 zeroshot_documents = corpus .get_documents_by_indices (assigned_ids )
61- zeroshot_topics = [ topic for topic in assignment [assigned_ids ]]
62- zeroshot_labels = [topic_model .zeroshot_topic_list [i ] for i in sorted ( list ( set ( zeroshot_topics ))) ]
61+ matched , zeroshot_topics = np . unique ( assignment [assigned_ids ], return_inverse = True )
62+ zeroshot_labels = [topic_model .zeroshot_topic_list [index ] for index in matched ]
6363 zeroshot_data = Corpus (
6464 documents = zeroshot_documents ,
6565 embeddings = corpus .embeddings [assigned_ids ],
@@ -75,10 +75,8 @@ def zeroshot_tm(topic_model: "BERTopic", corpus: Corpus) -> Corpus:
7575 original_indices = non_assigned_ids ,
7676 y = corpus .y [non_assigned_ids ] if corpus .y is not None else None ,
7777 )
78- cluster_data .umap_embeddings = topic_model .umap_model .transform (cluster_data .embeddings )
79- # If all documents were assigned to zero-shot topics
80- if len (assigned_ids ) == len (corpus .documents ):
81- corpus .topics = zeroshot_data .topics
78+ if non_assigned_ids :
79+ cluster_data .umap_embeddings = topic_model .umap_model .transform (cluster_data .embeddings )
8280
8381 logger .info ("Zeroshot Step 1 - Completed \u2713 " )
8482
@@ -112,15 +110,14 @@ def combine_zeroshot_topics(topic_model: "BERTopic", corpus: Corpus, zeroshot_da
112110 Returns:
113111 corpus: Documents containing all the original documents with their topic assignments
114112 """
115- if len (corpus ) > 0 and len ( zeroshot_data ) > 0 :
113+ if len (zeroshot_data ) > 0 :
116114 logger .info (
117115 "Zeroshot Step 2 - Combining topics from zero-shot topic modeling with topics from clustering..."
118116 )
119117
120- # Combine data
121- corpus .sort_topics_by_frequency ()
118+ # Combine data, or keep the zero-shot rows alone when every document matched a zero-shot topic
122119 zeroshot_data .sort_topics_by_frequency ()
123- corpus = corpus + zeroshot_data
120+ corpus = corpus . sort_topics_by_frequency () + zeroshot_data if len ( corpus ) > 0 else zeroshot_data
124121
125122 # Create new Topics
126123 topic_model ._topics = Topics ().initialize (corpus .topics , corpus ._zeroshot_labels ).sort_by_frequency ()
0 commit comments