BERTopic transforme du texte en topics interprétables en combinant embeddings (SentenceTransformers), réduction de dimension (UMAP), clustering (HDBSCAN) et c‑TF‑IDF pour nommer les clusters (voir SentenceTransformers, UMAP, HDBSCAN). Découvrez comment chaque étape produit des topics exploitables et actionnables.
Qu’est-ce que BERTopic
BERTopic est un pipeline modulaire qui convertit des documents en topics interprétables en enchaînant embeddings sémantiques, réduction de dimension, clustering et représentation par c‑TF‑IDF.
Le prétraitement reste minimal : mise en minuscules, suppression des espaces superflus et filtrage des documents très courts. La raison est simple : les embeddings contextuels (SentenceTransformers) capturent la sémantique et tolèrent la variation lexicale, réduisant le besoin de nettoyage lourd tel que stemming ou normalisation poussée.
- Texte brut → Embeddings (SentenceTransformers) : Les phrases deviennent des vecteurs qui encodent le sens, pas seulement la présence de mots.
- Embeddings → UMAP : La réduction de dimension conserve la structure locale et rend les distances exploitables pour le clustering.
- UMAP → HDBSCAN : L’algorithme de clustering hiérarchique densité‑based identifie des groupes de tailles variées et marque les outliers.
- Clusters → c‑TF‑IDF : Le calcul de TF‑IDF centré sur chaque cluster permet d’extraire des mots discriminants pour nommer les topics.
- Résultat : Topics interprétables représentés par mots-clés et documents associés.
La chaîne produit des topics plus cohérents que les approches bag‑of‑words pour trois raisons majeures. Premièrement, capture du sens : les embeddings regroupent les paraphrases et synonymes. Deuxièmement, robustesse aux synonymes et variations morphologiques : pas besoin d’aligner manuellement les formes. Troisièmement, détection d’outliers par HDBSCAN qui évite de forcer chaque document dans un topic inapproprié.
Exemple conceptuel :
Les étoiles brillent dans l'espace.
Le satellite en orbite transmet des données.
La philosophie questionne le sens de l'existence.
La logique d’attribution : Les deux premières phrases donnent des embeddings proches liés à l’astronomie/technique et peuvent former un ou deux clusters voisins (espace / satellite), tandis que la troisième est sémantiquement distincte et devient un cluster séparé (philosophie). HDBSCAN pourra aussi marquer une phrase rare comme outlier si elle ne s’aligne pas.
| Étape | Rôle | Bénéfice |
| Embeddings | Encoder le sens des documents | Capture sémantique et synonymie |
| UMAP | Réduire la dimension tout en conservant la structure | Distances exploitables pour clustering |
| HDBSCAN | Identifier clusters et outliers | Groupes de tailles variables et robustesse |
| c‑TF‑IDF | Extraire mots discriminants par cluster | Topics interprétables et lisibles |
Quelles sont les composantes clés du pipeline
Les composants essentiels sont le prétraitement minimal, les embeddings documentaires (SentenceTransformers), la réduction de dimension via UMAP, le clustering avec HDBSCAN et la représentation des topics par c‑TF‑IDF.
Prétraitement (Preprocessing)
Favoriser un prétraitement minimal : lowercase, suppression des espaces trims et des caractères non pertinents. Eviter une lemmatisation lourde qui casse le sens dans les embeddings. Gérer les documents très courts en les concaténant avec du contexte quand c’est possible ou en marquant leur faible confiance.
from nltk.tokenize import word_tokenize
texts = [t.lower().strip() for t in texts]
Je recommande de mesurer la longueur médiane et la proportion de textes
Document embeddings (SentenceTransformers)
Choisir un modèle selon le compromis qualité/coût : all-MiniLM-L6-v2 pour rapidité, paraphrase-MiniLM-L6-v2 pour similarité, modèles plus grands (all-mpnet-base-v2) pour précision. Les embeddings denses capturent la sémantique et coûtent en mémoire GPU/CPU.
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
emb = model.encode(texts, show_progress_bar=True)
Je conseille batch_size adapté à la RAM (ex. 32–128) et le float32 par défaut ; float16 si GPU et mémoire limitée.
UMAP
Réduction pour préserver la topologie locale avant clustering. Paramètres critiques : n_neighbors (voisinage), n_components (dimensions), min_dist (compactness), metric, init, random_state. Une faible n_neighbors → plus de granularité locale.
import umap
umap_model = umap.UMAP(n_neighbors=2, n_components=2, min_dist=0.0,
metric='cosine', init='random', random_state=42)
emb_reduced = umap_model.fit_transform(emb)
Je surveille la variance expliquée visuelle et le temps (UMAP O(n log n)).
HDBSCAN
Clustering hiérarchique basé sur la densité ; gère les outliers (label -1). Paramètres importants : min_cluster_size, min_samples, cluster_selection_epsilon. Ajuster min_cluster_size selon taille de corpus.
import hdbscan
clusterer = hdbscan.HDBSCAN(min_cluster_size=15, min_samples=5)
labels = clusterer.fit_predict(emb_reduced)
Je vérifie la proportion d’outliers et le nombre de clusters stables via clusterer.probabilities_.
c-TF-IDF
Calculer TF‑IDF au niveau des clusters (documents agrégés par cluster) pour obtenir des tokens caractéristiques. Formule : cTFIDF = tf_cluster * log((N + 1) / (df_word_in_all_clusters + 1)).
from sklearn.feature_extraction.text import TfidfVectorizer
docs_per_cluster = [" ".join(docs) for docs in clusters]
vect = TfidfVectorizer(max_features=50).fit(docs_per_cluster)
top_terms = vect.get_feature_names_out()
Je recommande max_features pour contrôler mémoire et lisibilité.
Tableau récapitulatif des paramètres clés :
| Composant | Paramètres critiques |
| Embeddings | model, batch_size, dtype |
| UMAP | n_neighbors, n_components, min_dist, metric, init, random_state |
| HDBSCAN | min_cluster_size, min_samples, cluster_selection_epsilon |
| c-TF-IDF | max_features, ngram_range |
Comment implémenter BERTopic pas à pas
Implémentez BERTopic en 6 étapes concrètes : préparer documents, encoder en embeddings, réduire la dimension, clusterer, calculer c‑TF‑IDF et extraire/nommer les topics.
Étapes clés (succinctes) :
- Préparer documents : nettoyage minimal (lowercase, strip).
- Encoder en embeddings : SentenceTransformers produit des vecteurs.
- Réduire la dimension : UMAP (n_neighbors, n_components, min_dist, metric).
- Clusterer : HDBSCAN (min_cluster_size, metric).
- Calculer c‑TF‑IDF : BERTopic agrège TF‑IDF pondéré par cluster.
- Extraire/nommer topics : récupérer top mots et gérer outliers.
Commandes pip recommandées (versions stables) :
- pip install sentence-transformers==2.2.2
- pip install umap-learn==0.5.3
- pip install hdbscan==0.8.29
- pip install bertopic==0.14.0
from sentence_transformers import SentenceTransformer
from umap import UMAP
from hdbscan import HDBSCAN
from bertopic import BERTopic
# Données d'exemple
docs = [
"NASA launched a satellite",
"Philosophy and religion are related",
"Space exploration is growing"
]
# Préprocessing simple
def preprocess(text):
return text.lower().strip()
docs = [preprocess(d) for d in docs]
# Encodage
model = SentenceTransformer("all-MiniLM-L6-v2")
embeddings = model.encode(docs, show_progress_bar=False)
# UMAP configuration
umap_model = UMAP(n_neighbors=15, n_components=5, min_dist=0.0, metric='cosine', random_state=42)
# HDBSCAN clustering
hdbscan_model = HDBSCAN(min_cluster_size=2, metric='euclidean', cluster_selection_method='eom')
# BERTopic (utilise embeddings + UMAP + HDBSCAN)
topic_model = BERTopic(umap_model=umap_model, hdbscan_model=hdbscan_model, calculate_probabilities=False)
topics, probs = topic_model.fit_transform(docs, embeddings)
# Résultats
print(topic_model.get_topic_info())
for t in set(topics):
if t == -1:
print("Outliers:", [docs[i] for i,lab in enumerate(topics) if lab==-1])
else:
print("Topic", t, ":", topic_model.get_topic(t))
Exemples de sorties attendues :
- Topic 0 : [‘space’, ‘exploration’, ‘satellite’]
- Topic 1 : [‘philosophy’, ‘religion’, ‘related’]
- Outliers : aucun ou liste des docs label -1
Gestion des outliers : exclure les docs avec label -1 ou les réaffecter en calculant la similarité cosinus entre leur embedding et les centroids des clusters puis attribuer le label du centroid le plus proche.
Conseils de debug rapides :
- Vérifier embeddings : calculer cosine similarity entre paires pour s’assurer que documents proches ont forte similarité.
- Visualiser UMAP : scatter plot avec matplotlib ou plotly pour détecter séparations naturelles.
- Vérifier distribution des tailles de clusters : topic_model.get_topic_info() montre counts par topic.
| Commande | Fonction/Objet |
| sentence-transformers | SentenceTransformer().encode |
| umap-learn | UMAP(n_neighbors, n_components, min_dist) |
| hdbscan | HDBSCAN(min_cluster_size) |
| bertopic | BERTopic.fit_transform, get_topic, get_topic_info |
Quelles bonnes pratiques et limites faut-il connaître
BERTopic est puissant mais nécessite arbitrage sur le choix d’embeddings, réglage UMAP/HDBSCAN et évaluation des topics; il présente aussi des limites en scalabilité et sensibilité aux paramètres.
Pour produire des topics exploitables, adoptez ces bonnes pratiques concrètes :
- Choisir le modèle d’embeddings selon la taille du corpus et le coût: pour prototypes, all‑MiniLM (rapide, ~384 dims) ; pour qualité supérieure, modèles SBERT plus grands.
- Normaliser le texte simplement: mise en minuscules, retrait des caractères non pertinents et tokenisation minimale pour éviter d’éliminer le signal sémantique.
- Régler n_neighbors et min_dist d’UMAP selon la granularité: augmenter n_neighbors pour topics larges, réduire pour plus de granularité; ajuster min_dist pour contrôler la densité.
- Tester plusieurs min_cluster_size dans HDBSCAN: valeur faible → plus de petits clusters, valeur haute → topics plus fiables mais moins nombreux.
- Utiliser un seed reproductible et sauvegarder/recycler l’index d’embeddings pour éviter ré-encodages coûteux.
Pour gérer les courts documents et le bruit :
- Agglomérer courts textes par utilisateur/session ou fenêtre temporelle quand le sens individuel est faible.
- Préférer embeddings robustes (plus profonds ou entraînés sur phrases courtes) et éviter d’appliquer uniquement c‑TF‑IDF si beaucoup de stopwords; préciser que c‑TF‑IDF est « class‑TF‑IDF », utile pour pondérer termes par topic.
- Filtrer le bruit avant l’étape de représentation: entités peu informatives, signatures, boilerplate.
Pour l’évaluation :
- Mesurer cohérence avec métriques courantes (Coherence CV, UMass) pour repérer topics faibles, sans entrer dans les détails mathématiques.
- Valider manuellement en inspectant les top‑terms et des exemples de documents par topic pour juger d’interprétabilité.
Pour la scalabilité :
- Batcher l’encodage, précalculer et stocker les embeddings, utiliser ANN (Faiss, hnswlib) et exécuter l’encodage sur GPU si possible.
- Estimer la mémoire: embeddings 768 dims ≈ 3 KB/doc (float32), donc 1M docs ≈ 3 GB en RAM; encodage all‑MiniLM ≈ 5 000 docs/min en CPU moyen — ordre de grandeur à valider par tests locaux.
Alternatives et limites :
- Préférer LDA pour modèles à forte contrainte probabiliste ou pour interprétabilité totalement explicite.
- Utiliser approches supervisées quand vous avez labels; garder en tête que l’interprétabilité automatique reste partielle et nécessite post‑traitement humain.
# Exemple: précalcul et sauvegarde d'embeddings (Python)
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = model.encode(documents, batch_size=64, show_progress_bar=True)
import numpy as np; np.save('embeddings.npy', embeddings)
| Bonnes pratiques | Erreurs fréquentes |
| Choisir embeddings adaptés, précalculer et réutiliser. | Réencoder tout à chaque test sans versionner les embeddings. |
| Tuner UMAP/HDBSCAN et utiliser seed. | Utiliser paramètres par défaut sans validation. |
| Valider avec métriques + inspection manuelle. | S’appuyer uniquement sur scores automatiques. |
Prêt à déployer BERTopic sur vos corpus pour générer des insights actionnables ?
BERTopic assemble embeddings Transformer, UMAP, HDBSCAN et c‑TF‑IDF pour produire des topics plus sémantiques et interprétables que les approches classiques. En maîtrisant le choix du modèle d’embeddings, les hyperparamètres UMAP/HDBSCAN et l’évaluation des topics, vous obtenez des clusters exploitables pour analytics, tagging ou exploration. Résultat concret : des thèmes actionnables, une meilleure segmentation de contenu et un gain de temps dans l’exploitation de vos corpus.
FAQ
A propos de l’auteur
Franck Scandolera — expert & formateur en Tracking avancé server-side, Analytics Engineering, Automatisation No/Low Code (n8n) et intégration de l’IA en entreprise. Responsable de l’agence webAnalyste et de l’organisme de formation Formations Analytics. Références : Logis Hôtel, Yelloh Village, BazarChic, Fédération Française de Football, Texdecor. Dispo pour aider les entreprises => contactez moi.
⭐ Analytics engineer, Data Analyst et Automatisation IA indépendant ⭐
- Ref clients : Logis Hôtel, Yelloh Village, BazarChic, Fédération Football Français, Texdecor…
Mon terrain de jeu :
- Data Analyst & Analytics engineering : tracking avancé (GTM server, e-commerce, CAPI, RGPD), entrepôt de données (BigQuery, Snowflake, PostgreSQL, ClickHouse), modèles (Airflow, dbt, Dataform), dashboards décisionnels (Looker, Power BI, Metabase, SQL, Python).
- Automatisation IA des taches Data, Marketing, RH, compta etc : conception de workflows intelligents robustes (n8n, App Script, scraping) connectés aux API de vos outils et LLM (OpenAI, Mistral, Claude…).
- Engineering IA pour créer des applications et agent IA sur mesure : intégration de LLM (OpenAI, Mistral…), RAG, assistants métier, génération de documents complexes, APIs, backends Node.js/Python.






