LDA (Latent Dirichlet Allocation)
LDA (Latent Dirichlet Allocation) est un modèle probabiliste génératif pour le topic modeling qui modélise chaque document comme un mélange de thèmes latents (topics), et chaque topic comme une distribution de probabilité sur les mots du vocabulaire. Publié par David Blei, Andrew Ng et Michael Jordan en 2003, c’est l’algorithme fondateur du topic modeling.
L’intuition de LDA est directe : quand un auteur écrit un article sur l’IA appliquée à la santé, il puise dans plusieurs « thèmes » mentaux. Certains passages traitent d’intelligence artificielle (mots comme « modèle », « entraînement », « réseau »), d’autres de santé (mots comme « patient », « diagnostic », « traitement »). LDA formalise cette intuition en un modèle mathématique rigoureux. Il découvre automatiquement ces thèmes latents dans un corpus de documents, sans qu’on lui dise à l’avance quels thèmes chercher.
- Catégorie
- NLP / Topic Modeling
- Nom complet
- Latent Dirichlet Allocation
- Auteurs
- David Blei, Andrew Ng, Michael Jordan (2003)
- Type
- Modèle probabiliste génératif bayésien, non supervisé
- Hypothèse
- Bag-of-words (l’ordre des mots est ignoré)
- Paramètres clés
- K (nombre de topics), α (prior doc-topic), β (prior topic-mot)
- Successeur moderne
- BERTopic (embeddings + clustering)
Le modèle génératif de LDA
LDA est un modèle génératif : il décrit un processus hypothétique par lequel les documents auraient été « générés ». En inversant ce processus (inférence), l’algorithme retrouve les thèmes cachés. Voici le processus génératif, étape par étape.
Le processus de génération d’un document
Étape 1 : Choisir la mixture de topics. Pour chaque document d, on tire une distribution de topics θ_d depuis une distribution de Dirichlet paramétrée par α. Si le corpus a K=5 topics, θ_d pourrait être [0,4 ; 0,3 ; 0,2 ; 0,05 ; 0,05], signifiant que ce document est principalement composé des topics 1 et 2.
Étape 2 : Pour chaque mot du document. Pour chaque position de mot n dans le document :
a) Tirer un topic z_n selon la distribution θ_d du document. Par exemple, avec θ_d = [0,4 ; 0,3 ; …], il y a 40% de chance de tirer le topic 1.
b) Tirer un mot w_n depuis la distribution de mots du topic z_n. Chaque topic k est caractérisé par une distribution φ_k sur le vocabulaire. Si le topic 1 est « intelligence artificielle », les mots « modèle », « données », « entraînement » auront des probabilités élevées.
Ce processus produit un document mot par mot. LDA ignore l’ordre des mots (hypothèse bag-of-words) : seule la fréquence de chaque mot compte.
Le rôle de la distribution de Dirichlet
La distribution de Dirichlet est au cœur de LDA (d’où son nom). C’est une distribution de probabilité sur les distributions de probabilité : elle produit des vecteurs dont les éléments sont positifs et somment à 1, ce qui en fait un prior naturel pour les proportions (comme la proportion de topics dans un document).
Le paramètre α de la Dirichlet contrôle la forme de la distribution :
α élevé (ex. α > 1) : Les documents contiennent un mélange équilibré de tous les topics. Chaque document parle un peu de tout.
α faible (ex. α < 1) : Les documents sont concentrés sur peu de topics. Un document parle principalement d’un seul sujet. C’est généralement plus réaliste pour du texte réel.
Le paramètre β (ou η selon les implémentations) joue le même rôle pour la distribution des mots par topic :
β élevé : Chaque topic utilise un large vocabulaire.
β faible : Chaque topic est concentré sur peu de mots distinctifs. Cela produit des topics plus spécifiques et interprétables.
Inférence : retrouver les topics cachés
Le problème central de LDA est l’inférence : étant donné les mots observés dans les documents, retrouver les distributions cachées (θ pour les proportions de topics par document, φ pour les distributions de mots par topic, et z pour l’assignation de chaque mot à un topic). Ce problème est intraitable analytiquement, mais deux méthodes d’approximation sont largement utilisées.
Échantillonnage de Gibbs (Gibbs Sampling)
Proposé par Griffiths et Steyvers (2004), c’est la méthode la plus populaire pour LDA. L’idée : itérer sur chaque mot de chaque document et ré-assigner son topic en fonction des assignations actuelles de tous les autres mots. Après suffisamment d’itérations (typiquement 500 à 2000), les assignations convergent vers la distribution postérieure. C’est une méthode de Monte Carlo par chaînes de Markov (MCMC).
Avantage : simple à implémenter, donne des résultats de bonne qualité. Inconvénient : lent sur de très gros corpus (des milliards de mots).
Inférence variationnelle (Variational Bayes)
Proposée dans l’article original de Blei et al. (2003). L’idée : approximer la distribution postérieure exacte par une distribution plus simple (factorisée), puis optimiser les paramètres de cette approximation. C’est plus rapide que le Gibbs sampling et plus facilement parallélisable, mais l’approximation peut être moins fidèle.
C’est la méthode utilisée par défaut dans scikit-learn et gensim.
Les paramètres de LDA et comment les régler
| Paramètre | Rôle | Valeur typique | Impact |
|---|---|---|---|
| K | Nombre de topics | 5 à 50 (dépend du corpus) | Trop peu → topics trop larges. Trop → topics fragmentés. |
| α (alpha) | Prior sur la distribution doc-topic | 50/K ou « auto » | α bas → documents concentrés sur peu de topics. α haut → mélange uniforme. |
| β (eta) | Prior sur la distribution topic-mot | 0,01 ou « auto » | β bas → topics spécifiques (peu de mots dominants). β haut → topics diffus. |
| Itérations | Nombre de passes d’inférence | 500 à 2000 (Gibbs), 50 à 200 (variationnelle) | Plus d’itérations → convergence meilleure, mais plus lent. |
| Passes | Nombre de passes sur le corpus (gensim) | 10 à 20 | Plus de passes → meilleur modèle, surtout sur petits corpus. |
Comment choisir K (le nombre de topics)
C’est le paramètre le plus critique et le plus difficile à régler. Trois approches :
Cohérence des topics (coherence score) : Entraînez LDA pour K = 5, 10, 15, 20, 25, 30 et calculez le score de cohérence C_V pour chaque K. Choisissez le K qui maximise la cohérence. C’est la méthode la plus fiable. gensim fournit CoherenceModel pour ce calcul.
Perplexité : Mesure la capacité du modèle à prédire de nouveaux documents. Une perplexité plus basse est meilleure, mais elle ne corrèle pas toujours bien avec l’interprétabilité humaine des topics. À utiliser avec prudence.
Jugement expert : Visualisez les topics avec pyLDAvis et demandez à un expert du domaine si les thèmes sont cohérents et utiles. Aucune métrique ne remplace le bon sens humain.
Implémentation en Python
Avec gensim (la référence LDA)
import gensim
from gensim import corpora
from gensim.models import LdaMulticore, CoherenceModel
import spacy
# 1. Prétraitement avec spaCy
nlp = spacy.load("fr_core_news_lg")
def preprocess(text):
doc = nlp(text)
return [token.lemma_.lower() for token in doc
if not token.is_stop and not token.is_punct
and token.is_alpha and len(token) > 2]
# 2. Préparer le corpus
texts = [preprocess(doc) for doc in documents]
dictionary = corpora.Dictionary(texts)
dictionary.filter_extremes(no_below=5, no_above=0.5) # Filtrer
corpus = [dictionary.doc2bow(text) for text in texts]
# 3. Entraîner le modèle LDA
lda_model = LdaMulticore(
corpus=corpus,
id2word=dictionary,
num_topics=10, # K = 10 topics
passes=15, # 15 passes sur le corpus
workers=4, # Parallélisation sur 4 cœurs
alpha='asymmetric', # Alpha asymétrique (recommandé)
eta='auto', # Beta optimisé automatiquement
random_state=42
)
# 4. Afficher les topics
for idx, topic in lda_model.print_topics(num_words=8):
print(f"Topic {idx}: {topic}")
# 5. Évaluer avec le coherence score
coherence_model = CoherenceModel(
model=lda_model,
texts=texts,
dictionary=dictionary,
coherence='c_v'
)
print(f"Coherence Score: {coherence_model.get_coherence():.4f}")
Trouver le K optimal
import matplotlib.pyplot as plt
# Tester différentes valeurs de K
coherence_scores = []
k_range = range(5, 35, 5)
for k in k_range:
model = LdaMulticore(
corpus=corpus, id2word=dictionary,
num_topics=k, passes=10, workers=4, random_state=42
)
cm = CoherenceModel(
model=model, texts=texts,
dictionary=dictionary, coherence='c_v'
)
coherence_scores.append(cm.get_coherence())
print(f"K={k} → Coherence: {coherence_scores[-1]:.4f}")
# Visualiser
plt.plot(list(k_range), coherence_scores, marker='o')
plt.xlabel("Nombre de topics (K)")
plt.ylabel("Coherence Score (C_V)")
plt.title("Choix optimal de K")
plt.show()
# → Choisir le K au coude de la courbe ou au maximum
Visualisation avec pyLDAvis
import pyLDAvis.gensim_models
# Visualisation interactive des topics
vis = pyLDAvis.gensim_models.prepare(lda_model, corpus, dictionary)
pyLDAvis.save_html(vis, 'lda_visualization.html')
# → Ouvre une visualisation interactive dans le navigateur
# Chaque bulle = un topic, taille = fréquence, distance = dissimilarité
# Barre de droite = mots les plus pertinents pour le topic sélectionné
pyLDAvis est l’outil de visualisation de référence pour LDA. Il affiche les topics comme des bulles dans un espace 2D : les topics proches sont similaires, les topics distants sont distincts. Cliquer sur un topic affiche ses mots les plus caractéristiques. C’est indispensable pour évaluer la qualité du modèle.
Avec scikit-learn
from sklearn.decomposition import LatentDirichletAllocation
from sklearn.feature_extraction.text import CountVectorizer
# 1. Vectorisation (bag-of-words)
vectorizer = CountVectorizer(
max_df=0.5, min_df=5,
stop_words="french",
max_features=10000
)
doc_term_matrix = vectorizer.fit_transform(documents)
# 2. Entraîner LDA
lda = LatentDirichletAllocation(
n_components=10, # K = 10 topics
learning_method='online',
random_state=42,
max_iter=50
)
lda.fit(doc_term_matrix)
# 3. Afficher les topics
feature_names = vectorizer.get_feature_names_out()
for idx, topic in enumerate(lda.components_):
top_words = [feature_names[i] for i in topic.argsort()[-10:]]
print(f"Topic {idx}: {', '.join(top_words)}")
scikit-learn utilise l’inférence variationnelle (plus rapide que le Gibbs sampling de gensim). L’API est plus simple mais offre moins de contrôle et pas de calcul natif de la cohérence.
LDA vs BERTopic : quand utiliser lequel
Depuis l’émergence de BERTopic en 2022, LDA est souvent présenté comme obsolète. Ce n’est pas entièrement vrai. LDA conserve des avantages dans certains contextes.
Utilisez LDA quand :
Vous avez besoin d’assigner plusieurs topics par document (LDA le fait nativement via les distributions de probabilité). Votre corpus est composé de documents longs et bien écrits (articles, rapports, publications). Les ressources de calcul sont très limitées (LDA est nettement plus rapide). Vous avez besoin d’un modèle probabiliste interprétable avec des distributions explicites. Le prétraitement est déjà en place (pipeline NLP mature).
Utilisez BERTopic quand :
Vos documents sont courts (tweets, avis, titres). Vous ne savez pas combien de topics existent. Votre corpus est multilingue. Vous voulez intégrer un LLM pour nommer les topics automatiquement. Vous avez accès à un GPU pour l’étape d’embedding.
En pratique, BERTopic est le choix par défaut pour les nouveaux projets. Mais LDA reste pertinent dans des contextes spécifiques, et sa base théorique (modèle probabiliste bayésien) en fait un outil de référence en recherche et en enseignement.
Variantes et extensions de LDA
Correlated Topic Model (CTM) : Extension de Blei et Lafferty (2007) qui modélise les corrélations entre topics. LDA standard suppose les topics indépendants, ce qui est souvent irréaliste (les topics « politique » et « économie » sont corrélés).
Dynamic Topic Model (DTM) : Extension de Blei et Lafferty (2006) pour les corpus temporels. Les distributions topic-mot évoluent dans le temps, permettant de suivre comment les sujets changent.
Supervised LDA (sLDA) : Variante supervisée qui associe chaque document à un label (ex. note de satisfaction). Le modèle apprend à la fois les topics et à prédire le label, produisant des topics plus pertinents pour la tâche de prédiction.
Hierarchical LDA (hLDA) : Découvre une hiérarchie de topics (topics généraux → sous-topics). Ne nécessite pas de fixer K à l’avance car il utilise un processus de Dirichlet hiérarchique.
Online LDA : Variante incrémentale qui peut traiter de très gros corpus en mini-batches, sans charger tout le corpus en mémoire. Implémenté dans gensim et scikit-learn.
Cas d’usage de LDA
Analyse de littérature scientifique : Cartographier un champ de recherche en découvrant les sous-thèmes dans des milliers d’articles. LDA est très utilisé en bibliométrie et en revue systématique de la littérature.
Classification de documents : Étape exploratoire pour découvrir les catégories naturelles d’un corpus avant d’entraîner un classifieur supervisé.
Analyse de contenu éditorial : Comprendre les thèmes abordés par un média, un blog ou un ensemble de rapports. Utile pour l’analyse de discours et la veille stratégique.
Systèmes de recommandation : Représenter les utilisateurs et les items par leurs distributions de topics pour calculer des similarités et faire des recommandations (content-based filtering via LDA).
Analyse de feedback : Découvrir les thèmes récurrents dans les enquêtes de satisfaction, les avis produits ou les retours d’expérience.
Limites de LDA
Bag-of-words. LDA ignore l’ordre des mots. « Le chat mange la souris » et « la souris mange le chat » sont indistinguables. Cela limite la finesse de l’analyse sémantique.
Nombre de topics à fixer. Vous devez spécifier K à l’avance. Le mauvais choix de K dégrade fortement la qualité des résultats. BERTopic et hLDA évitent ce problème.
Prétraitement critique. La qualité des topics dépend fortement du prétraitement : stop words, lemmatisation, filtrage des mots rares et fréquents. Un mauvais prétraitement produit des topics bruités.
Pas de sémantique contextuelle. LDA ne comprend pas que « banque » dans « banque de données » et « banque d’investissement » a des sens différents. Chaque mot est traité comme une seule entité indépendante du contexte.
Stochasticité. LDA peut produire des résultats différents à chaque exécution (surtout avec le Gibbs sampling). Fixez le random_state et lancez plusieurs runs pour vérifier la stabilité des topics.
Verdict
LDA est un classique de la data science qui a défini le champ du topic modeling. Vingt ans après sa publication, il reste un outil pertinent pour les documents longs, les corpus bien structurés et les contextes où un modèle probabiliste interprétable est requis. Son implémentation est mature (gensim, scikit-learn, MALLET), sa théorie est bien comprise, et sa communauté reste active.
Cela dit, pour les nouveaux projets de topic modeling, BERTopic est le choix par défaut. Il produit des topics de meilleure qualité, ne nécessite pas de fixer le nombre de thèmes, gère nativement le multilingue et les textes courts, et nécessite moins de prétraitement. LDA est le premier outil à maîtriser pour comprendre le topic modeling. BERTopic est celui à déployer en production.
Questions fréquentes sur LDA
Que signifie « Latent Dirichlet Allocation » ?
« Latent » signifie que les topics sont des variables cachées (non directement observées) que l’algorithme doit inférer. « Dirichlet » fait référence à la distribution de Dirichlet, un prior bayésien utilisé pour modéliser les proportions de topics par document et les distributions de mots par topic. « Allocation » signifie l’assignation de chaque mot à un topic. Ensemble : l’algorithme alloue (assigne) les mots à des topics cachés (latents) en utilisant un modèle bayésien basé sur la distribution de Dirichlet.
Comment choisir le nombre de topics K ?
La méthode la plus fiable est d’entraîner LDA pour plusieurs valeurs de K (ex. 5, 10, 15, 20, 25, 30) et de calculer le coherence score (C_V) pour chacune. Choisissez le K qui maximise la cohérence ou se situe au coude de la courbe. Gensim fournit CoherenceModel pour ce calcul. Complétez toujours par une visualisation avec pyLDAvis et une validation par un expert du domaine. La perplexité est une alternative mais corrèle moins bien avec la qualité perçue des topics.
LDA fonctionne-t-il en français ?
Oui, mais le prétraitement est essentiel. Utilisez spaCy avec le modèle français (fr_core_news_lg) pour la lemmatisation et la suppression des stop words. Filtrez les mots trop rares (apparaissent dans moins de 5 documents) et trop fréquents (apparaissent dans plus de 50% des documents). Sans ce prétraitement adapté au français, les topics seront de mauvaise qualité. BERTopic avec un modèle d’embedding multilingue nécessite moins de prétraitement pour le français.
Quelle bibliothèque utiliser pour LDA ?
Gensim est la référence pour LDA en Python. Il offre l’implémentation la plus complète (Gibbs sampling, online LDA, multicore), le calcul de cohérence, et la compatibilité avec pyLDAvis pour la visualisation. Scikit-learn offre une API plus simple mais moins de contrôle (inférence variationnelle uniquement). MALLET (Java) est réputé pour produire des topics de meilleure qualité grâce à son échantillonneur de Gibbs optimisé. Gensim inclut un wrapper Python pour MALLET.
LDA est-il obsolète face à BERTopic ?
Non, mais son champ d’application s’est réduit. BERTopic surpasse LDA en qualité de topics sur la majorité des benchmarks, notamment les textes courts et multilingues. Mais LDA reste pertinent quand vous avez besoin d’assigner plusieurs topics par document (distribution de probabilité), quand les ressources GPU ne sont pas disponibles, quand vous travaillez avec des documents longs et bien structurés, ou quand un modèle probabiliste interprétable est requis (recherche académique, compliance). LDA est la fondation théorique à comprendre. BERTopic est l’outil de production à déployer.