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.
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.
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.
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.
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 modulesimport 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
Propulsé par
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.
defload_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=[]withopen( 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
Propulsé par
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
defpreprocess_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 listfor 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 ifnot 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
Propulsé par
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.
defprepare_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 modelreturn dictionary,doc_term_matrix
Propulsé par
Créer un modèle LSA avec Gensim
Une fois le corpus prêt, vous pouvez générer un modèle LSA.
defcreate_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 modelprint(lsamodel.print_topics(num_topics=number_of_topics, num_words=words))return lsamodel
Propulsé par
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.
defcompute_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 inrange(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_valuesPropulsé par
Traçons maintenant les scores de cohérence.
defplot_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)Propulsé par
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)Propulsé par
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 !
Initiez-vous aux structures de données de Python : apprenez-en plus sur les types de données et les structures de données primitives et non primitives, telles que les chaînes de caractères, les listes, les piles, etc.
Apprenez à utiliser JSON en Python, notamment la sérialisation, la désérialisation, le formatage, l'optimisation des performances, la gestion des API, ainsi que les limites et les alternatives de JSON.
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.
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.
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.
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.
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 :
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
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.
Prétraitement des données
Après le chargement, il faut prétraiter le texte. Les étapes suivantes sont effectuées :
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.
Créer un modèle LSA avec Gensim
Une fois le corpus prêt, vous pouvez générer un modèle LSA.
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.
Traçons maintenant les scores de cohérence.
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
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 :
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.