La LDA (Latent Dirichlet Allocation) lit des milliers de textes et en dégage des thèmes sans qu'on les lui donne. Chaque thème est une liste de mots qui vont ensemble, chaque document un mélange de thèmes. C'est l'outil classique pour cartographier des verbatims, des tickets ou des réponses à une enquête.
Un documentaliste trie 1 500 lettres sans connaître les sujets à l'avance. Il remarque que « notice », « montage » et « impossible » reviennent souvent ensemble, et en fait une pile.
Chaque texte devient un sac de mots : l'ordre est oublié, seules les fréquences comptent. Les mots vides (« le », « de ») sont retirés.
Le modèle part d'une hypothèse : chaque texte mélange quelques thèmes, et chaque thème favorise certains mots. On fixe seulement le nombre de thèmes.
L'algorithme répartit mots et textes entre les thèmes jusqu'à expliquer au mieux les fréquences observées. Il rend deux tableaux : les mots de chaque thème, les thèmes de chaque texte.
Des avis de une à trois phrases, sur la livraison, la qualité, le service après-vente. Personne n'a le temps de les lire un par un.
Sur le jeu d'exemple, avec 8 thèmes, des groupes lisibles ressortent : notice et montage, remboursement, couleur et photo, service client, qualité et rapport qualité-prix. Chaque avis reçoit sa part de chaque thème, ce qui permet de compter le volume par sujet.
Il n'y a pas de bonne réponse à laquelle comparer. On vérifie que chaque thème se résume en quelques mots et que les avis qui en relèvent le plus parlent bien de ce sujet. Certains thèmes mélangent deux sujets : on ajuste alors le nombre de thèmes ou les mots vides.
Le nombre de thèmes et la préparation du texte font l'essentiel. Noms donnés pour R (topicmodels) et Python (scikit-learn).
Le nombre de thèmes. On en teste plusieurs (5, 8, 10, 15) et on garde celui dont les thèmes se lisent le mieux, en s'aidant d'un score de cohérence ou de la perplexité.
Le réglage le plus rentable. Un mot présent partout (« produit » ici) pollue tous les thèmes. scikit-learn n'a pas de liste française : il faut fournir la sienne.
Contrôle le nombre de thèmes par document. Petit : chaque texte parle d'un ou deux sujets. topicmodels l'estime par défaut avec la méthode VEM.
Écarter les mots trop rares (fautes, noms propres isolés) et trop fréquents. Réduit le bruit et accélère le calcul.
# Thèmes des avis clients : LDA en R
library(tm)
library(topicmodels)
avis <- read.csv("avis_clients.csv")
corpus <- VCorpus(VectorSource(avis$texte))
# Matrice avis x mots, sans mots vides ni « produit » (présent partout)
dtm <- DocumentTermMatrix(corpus, control = list(
tolower = TRUE, removePunctuation = TRUE,
stopwords = c(stopwords("french"), "produit"),
bounds = list(global = c(5, Inf))))
# 8 thèmes, graine fixée pour des résultats reproductibles
modele <- LDA(dtm, k = 8, control = list(seed = 42))
# Les 6 mots les plus caractéristiques de chaque thème
print(terms(modele, 6))
# Part des avis dont c'est le thème dominant (en %)
print(round(100 * prop.table(table(topics(modele))), 1))
# Thèmes des avis clients : LDA en Python
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
avis = pd.read_csv("avis_clients.csv")
# Mots vides : trop fréquents pour caractériser un thème
mots_vides = ["le", "la", "les", "de", "des", "du", "un", "une", "et", "au", "à", "a", "été", "je",
"pas", "ne", "mais", "pour", "avec", "très", "rien", "sans", "plus", "dans", "produit", "vous"]
compteur = CountVectorizer(stop_words=mots_vides, min_df=5)
comptes = compteur.fit_transform(avis["texte"])
lda = LatentDirichletAllocation(n_components=8, random_state=42)
themes = lda.fit_transform(comptes) # part de chaque thème dans chaque avis
# Les 6 mots les plus caractéristiques de chaque thème
mots = compteur.get_feature_names_out()
for k, poids in enumerate(lda.components_):
print("Thème", k + 1, ":", ", ".join(mots[poids.argsort()[::-1][:6]]))
# Part des avis dont c'est le thème dominant (en %)
dominant = pd.Series(themes.argmax(axis=1) + 1)
print((dominant.value_counts(normalize=True).sort_index() * 100).round(1))
On entraîne plusieurs modèles avec des nombres de thèmes différents et on compare un score de cohérence, qui mesure si les mots d'un thème apparaissent vraiment ensemble. Le critère final reste la lecture : des thèmes qu'un métier sait nommer et exploiter.
Aucun rapport, seul le sigle est commun. Latent Dirichlet Allocation trouve des thèmes dans des textes sans étiquettes. Linear Discriminant Analysis est une méthode supervisée de classification sur des données numériques.
La LDA est gratuite, rapide, reproductible et tourne en interne, mais ses thèmes sont des listes de mots à interpréter. Un LLM produit des thèmes rédigés et comprend la négation, mais coûte plus cher sur de gros volumes et varie d'un appel à l'autre. Une approche courante : LDA ou clustering pour structurer, LLM pour nommer.
Factorise la même matrice mots x documents. Souvent des thèmes plus nets sur les textes courts, sans modèle probabiliste.
Voir la fiche → le sens plutôt que les motsDes vecteurs qui captent le sens des phrases. Regroupés par clustering, ils donnent des thèmes plus fins sur les textes courts.
Voir la fiche → pour nommer et résumerUn LLM peut étiqueter les thèmes trouvés ou classer directement les textes. Plus souple, plus coûteux et moins reproductible.
Voir la fiche →Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.
Nous utilisons des cookies de mesure d'audience et de suivi publicitaire pour comprendre la fréquentation du site et l'efficacité de nos annonces. Rien n'est déposé sans votre accord. En savoir plus