Accéder au contenu principal

Analyse sémantique latente avec Python

Dans ce tutoriel, vous apprendrez à découvrir les sujets cachés d’un ensemble de documents avec l’analyse sémantique latente en Python.
Actualisé 19 sept. 2026  · 11 min lire

Explorer avec l’IA

ChatGPTClaudePerplexity

La découverte de thématiques est utile pour de nombreux usages : regrouper des documents, organiser des contenus en ligne pour la recherche d’information et la recommandation. De nombreux éditeurs de contenu et agences de presse utilisent des modèles de sujets pour recommander des articles à leurs lecteurs. De même, des cabinets de recrutement les emploient pour extraire des descriptions de postes et les faire correspondre aux compétences des candidats. Le métier de data scientist consiste justement à extraire de la « connaissance » à partir d’un grand volume de données collectées, le plus souvent non structurées. Il faut donc des outils et des techniques puissantes pour analyser et comprendre ces masses de données non structurées.

Le topic modeling (modélisation de sujets) est une technique de fouille de textes qui identifie des mots-clés cooccurrents afin de résumer de larges collections d’informations textuelles. Elle aide à découvrir des sujets latents dans les documents, à annoter les documents avec ces sujets et à organiser de grandes quantités de données non structurées.

Topic modeling

Le topic modeling découvre automatiquement les thèmes cachés dans un ensemble de documents. Il s’agit d’un algorithme d’analyse de texte non supervisé, utilisé pour trouver des groupes de mots dans les documents. Ces groupes de mots représentent un sujet. Un même document peut être associé à plusieurs thèmes. Par exemple, un groupe de mots comme « patient », « docteur », « maladie », « cancer » et « santé » renverra au sujet « santé ». Le topic modeling diffère fondamentalement d’une recherche textuelle à base de règles et d’expressions régulières.

diagramme

Comparer classification de texte et topic modeling

La classification de texte est un problème d’apprentissage supervisé où un document est affecté à un ensemble prédéfini de classes. Le topic modeling vise à découvrir des groupes de mots cooccurrents dans des documents. Ces groupes de mots apparentés forment des « sujets ». C’est une approche non supervisée : l’ensemble des sujets possibles est inconnu a priori. Le topic modeling peut d’ailleurs servir à résoudre un problème de classification : il identifie les sujets présents dans un document, tandis que la classification affecte le texte à une seule classe.

diagramme

Analyse sémantique latente

LSA (Latent Semantic Analysis), également appelée LSI (Latent Semantic Indexing), s’appuie sur le modèle sac de mots (BoW) pour produire une matrice terme-document (fréquences des termes dans les documents). Les lignes représentent les termes et les colonnes, les documents. LSA apprend des sujets latents en décomposant la matrice document-terme au moyen de la décomposition en valeurs singulières (SVD). LSA est généralement utilisée pour la réduction de dimension ou la réduction de bruit.

Analyse sémantique latente

Décomposition en valeurs singulières (SVD)

La SVD est une factorisation matricielle qui représente une matrice comme le produit de deux (en pratique trois) matrices. Elle offre de nombreuses applications en traitement du signal, psychologie, sociologie, climatologie et sciences de l’atmosphère, statistiques et astronomie.

factorisation
  • M est une matrice m×m
  • U est une matrice m×n de vecteurs singuliers à gauche
  • Σ est une matrice diagonale n×n à valeurs réelles non négatives
  • V est une matrice m×n de vecteurs singuliers à droite
  • V* est une matrice n×m, la transposée de V

Matrice identité : matrice carrée dont tous les éléments de la diagonale principale valent 1 et tous les autres 0.

Matrice diagonale : matrice dont toutes les entrées hors diagonale principale sont nulles.

Matrice singulière : matrice carrée de déterminant nul, donc non inversible.

Déterminer le nombre optimal de sujets

Comment choisir k (le nombre de sujets) en topic modeling ? Identifier le nombre optimal de sujets pour un corpus donné est un défi. Vous pouvez utiliser les options suivantes :

  • Assimiler chaque sujet à un cluster et évaluer l’efficacité du clustering via le coefficient de silhouette.
  • Utiliser la mesure de cohérence des sujets, plus réaliste pour identifier le bon nombre de sujets.

La cohérence de sujet est une métrique largement utilisée pour évaluer des modèles de sujets. Elle s’appuie sur des modèles à variables latentes. Chaque sujet généré est associé à une liste de mots. La mesure calcule la moyenne/médiane des similarités par paires entre les mots d’un même sujet. Plus le score de cohérence est élevé, meilleur est le modèle.

Implémenter LSA avec Gensim

Importer les bibliothèques nécessaires

#import modules
import os.path
from gensim import corpora
from gensim.models import LsiModel
from nltk.tokenize import RegexpTokenizer
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
from gensim.models.coherencemodel import CoherenceModel
import matplotlib.pyplot as plt

Chargement des données

Commençons par créer une fonction de chargement pour articles.csv. Vous pouvez télécharger les données ici.

def load_data(path,file_name):
    """
    Input  : path and file_name
    Purpose: loading text file
    Output : list of paragraphs/documents and
             title(initial 100 words considred as title of document)
    """
    documents_list = []
    titles=[]
    with open( os.path.join(path, file_name) ,"r") as fin:
        for line in fin.readlines():
            text = line.strip()
            documents_list.append(text)
    print("Total Number of Documents:",len(documents_list))
    titles.append( text[0:min(len(text),100)] )
    return documents_list,titles

Prétraitement des données

Après le chargement, il faut prétraiter le texte. Les étapes suivantes sont effectuées :

  • Tokeniser les articles
  • Supprimer les mots vides (stop words)
  • Appliquer le stemming
def preprocess_data(doc_set):
    """
    Input  : docuemnt list
    Purpose: preprocess text (tokenize, removing stopwords, and stemming)
    Output : preprocessed text
    """
    # initialize regex tokenizer
    tokenizer = RegexpTokenizer(r'\w+')
    # create English stop words list
    en_stop = set(stopwords.words('english'))
    # Create p_stemmer of class PorterStemmer
    p_stemmer = PorterStemmer()
    # list for tokenized documents in loop
    texts = []
    # loop through document list
    for i in doc_set:
        # clean and tokenize document string
        raw = i.lower()
        tokens = tokenizer.tokenize(raw)
        # remove stop words from tokens
        stopped_tokens = [i for i in tokens if not i in en_stop]
        # stem tokens
        stemmed_tokens = [p_stemmer.stem(i) for i in stopped_tokens]
        # add tokens to list
        texts.append(stemmed_tokens)
    return texts

Préparer le corpus

Étape suivante : préparer le corpus. Il s’agit de créer une matrice document-terme et un dictionnaire des termes.

def prepare_corpus(doc_clean):
    """
    Input  : clean document
    Purpose: create term dictionary of our courpus and Converting list of documents (corpus) into Document Term Matrix
    Output : term dictionary and Document Term Matrix
    """
    # Creating the term dictionary of our courpus, where every unique term is assigned an index. dictionary = corpora.Dictionary(doc_clean)
    dictionary = corpora.Dictionary(doc_clean)
    # Converting list of documents (corpus) into Document Term Matrix using dictionary prepared above.
    doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean]
    # generate LDA model
    return dictionary,doc_term_matrix

Créer un modèle LSA avec Gensim

Une fois le corpus prêt, vous pouvez générer un modèle LSA.

def create_gensim_lsa_model(doc_clean,number_of_topics,words):
    """
    Input  : clean document, number of topics and number of words associated with each topic
    Purpose: create LSA model using gensim
    Output : return LSA model
    """
    dictionary,doc_term_matrix=prepare_corpus(doc_clean)
    # generate LSA model
    lsamodel = LsiModel(doc_term_matrix, num_topics=number_of_topics, id2word = dictionary)  # train model
    print(lsamodel.print_topics(num_topics=number_of_topics, num_words=words))
    return lsamodel

Déterminer le nombre de sujets

Pour optimiser les résultats, il faut encore identifier un nombre de sujets optimal. Ici, vous allez générer des scores de cohérence afin de déterminer ce nombre.

def compute_coherence_values(dictionary, doc_term_matrix, doc_clean, stop, start=2, step=3):
    """
    Input   : dictionary : Gensim dictionary
              corpus : Gensim corpus
              texts : List of input texts
              stop : Max num of topics
    purpose : Compute c_v coherence for various number of topics
    Output  : model_list : List of LSA topic models
              coherence_values : Coherence values corresponding to the LDA model with respective number of topics
    """
    coherence_values = []
    model_list = []
    for num_topics in range(start, stop, step):
        # generate LSA model
        model = LsiModel(doc_term_matrix, num_topics=number_of_topics, id2word = dictionary)  # train model
        model_list.append(model)
        coherencemodel = CoherenceModel(model=model, texts=doc_clean, dictionary=dictionary, coherence='c_v')
        coherence_values.append(coherencemodel.get_coherence())
    return model_list, coherence_values

Traçons maintenant les scores de cohérence.

def plot_graph(doc_clean,start, stop, step):
    dictionary,doc_term_matrix=prepare_corpus(doc_clean)
    model_list, coherence_values = compute_coherence_values(dictionary, doc_term_matrix,doc_clean,
                                                            stop, start, step)
    # Show graph
    x = range(start, stop, step)
    plt.plot(x, coherence_values)
    plt.xlabel("Number of Topics")
    plt.ylabel("Coherence score")
    plt.legend(("coherence_values"), loc='best')
    plt.show()

start,stop,step=2,12,1
plot_graph(clean_text,start,stop,step)
courbe

Ce graphique est facile à lire : l’axe des abscisses indique le nombre de sujets, l’axe des ordonnées le score de cohérence. Ici, 7 sujets offrent le score le plus élevé : le nombre optimal est donc 7.

Exécuter l’ensemble des fonctions

# LSA Model
number_of_topics=7
words=10
document_list,titles=load_data("","articles.txt")
clean_text=preprocess_data(document_list)
model=create_gensim_lsa_model(clean_text,number_of_topics,words)
Total Number of Documents: 4551
[(0, '0.361*"trump" + 0.272*"say" + 0.233*"said" + 0.166*"would" + 0.160*"clinton" + 0.140*"peopl" + 0.136*"one" + 0.126*"campaign" + 0.123*"year" + 0.110*"time"'), (1, '-0.389*"citi" + -0.370*"v" + -0.356*"h" + -0.355*"2016" + -0.354*"2017" + -0.164*"unit" + -0.159*"west" + -0.157*"manchest" + -0.116*"apr" + -0.112*"dec"'), (2, '0.612*"trump" + 0.264*"clinton" + -0.261*"eu" + -0.148*"say" + -0.137*"would" + 0.135*"donald" + -0.134*"leav" + -0.134*"uk" + 0.119*"republican" + -0.110*"cameron"'), (3, '-0.400*"min" + 0.261*"eu" + -0.183*"goal" + -0.152*"ball" + -0.132*"play" + 0.128*"said" + 0.128*"say" + -0.126*"leagu" + 0.122*"leav" + -0.122*"game"'), (4, '0.404*"bank" + -0.305*"eu" + -0.290*"min" + 0.189*"year" + -0.164*"leav" + -0.153*"cameron" + 0.143*"market" + 0.140*"rate" + -0.139*"vote" + -0.133*"say"'), (5, '0.310*"bank" + -0.307*"say" + -0.221*"peopl" + 0.203*"trump" + 0.166*"1" + 0.164*"min" + 0.163*"0" + 0.152*"eu" + 0.152*"market" + -0.138*"like"'), (6, '0.570*"say" + 0.237*"min" + -0.170*"vote" + 0.158*"govern" + -0.154*"poll" + 0.122*"tax" + 0.115*"statement" + 0.115*"bank" + 0.112*"budget" + -0.108*"one"')]
  • Sujet 1 : "trump", "say", "said", "would", "clinton", "peopl", "one", "campaign", "year", "time" (élection présidentielle américaine)
  • Sujet 2 : "citi", "v", "h", "2016", "2017", "unit", "west", "manchest", "apr", "dec" (Premier League anglaise)
  • Sujet 3 : "trump", "clinton", "eu", "say", "would", "donald", "leav", "uk", "republican", "cameron" (élection américaine, Brexit)
  • Sujet 4 : "min", "eu", "goal", "ball", "play", "said", "say", "leagu", "leav", "game" (Premier League anglaise)
  • Sujet 5 : "bank", "eu", "min", "year", "leav", "cameron", "market", "rate", "vote", "say" (Brexit et conditions de marché)
  • Sujet 6 : "bank", "say", "peopl", "trump", "1", "min", "eu", "market", "like" (situation politique et marchés)
  • Sujet 7 : "say", "min", "vote", "govern", "poll", "tax", "statement", "bank", "budget", "one" (élection américaine et planification financière)

Ici, 7 sujets ont été découverts via l’analyse sémantique latente. Certains se recouvrent. Pour mieux capturer les polysémies avec une précision supérieure, essayez LDA (latent Dirichlet allocation). Je vous laisse en faire l’exercice avec Gensim et partager vos retours.

Avantages et limites de LSA

L’algorithme LSA est simple à comprendre et à implémenter. Il donne souvent de meilleurs résultats que le modèle vectoriel classique et il est plus rapide que d’autres approches, car il repose uniquement sur la décomposition de la matrice document-terme.

La dimension latente dépend du rang de la matrice : on ne peut pas dépasser cette limite. La matrice décomposée par LSA est très dense, ce qui complique l’indexation des dimensions individuelles. LSA capture mal les multiples sens d’un mot. Sa mise en œuvre est moins aisée que LDA et sa précision est généralement inférieure à celle de LDA.

Cas d’usage du topic modeling

Parmi les applications courantes : le clustering de documents en analyse de texte, les systèmes de recommandation et la recherche d’information. Des cas d’usage plus détaillés :

  • Résumé de CV : aider les recruteurs à évaluer rapidement les candidatures et à réduire l’effort de tri.
  • Optimisation pour les moteurs de recherche : les articles, blogs et documents en ligne peuvent être facilement étiquetés par sujets et mots-clés associés, ce qui améliore les résultats de recherche.
  • Optimisation de systèmes de recommandation : en tant que filtres d’information, ils conseillent selon le profil et l’historique utilisateur, et permettent de découvrir des contenus pertinents non encore consultés.
  • Amélioration du support client : identifier les sujets et mots-clés présents dans les réclamations et retours (spécifications produit et service, service/département, agence). Ces informations facilitent l’orientation directe vers le bon service.
  • Dans la santé, le topic modeling permet d’extraire des informations utiles à partir de rapports médicaux non structurés, exploitables pour le traitement des patients et la recherche médicale.

Conclusion

Dans ce tutoriel, vous avez exploré en détail le topic modeling : ce que c’est, le principe de l’analyse sémantique latente, comment construire les modèles associés et comment LSA génère des sujets. Vous avez aussi revu des notions clés comme la décomposition en valeurs singulières et le score de cohérence.

Vous pouvez désormais utiliser le topic modeling pour analyser vos propres jeux de données. Merci de votre lecture !

Pour aller plus loin en Python, suivez le cours Case Studies in Statistical Thinking de DataCamp.

Sujets
Python
Science des données

Cours Python

Cours

Introduction à Python

4 h
7M
Apprenez les bases de l’analyse de données avec Python en quatre heures et explorez ses principaux packages.
Afficher les détailsRight Arrow
Commencer Le Cours
Voir plusRight Arrow