Un sens plus profond : modélisation de sujet en Python
Publié: 2022-03-11Les ordinateurs et les processeurs qui les alimentent sont conçus pour fonctionner avec des chiffres. En revanche, le langage courant des e-mails et des publications sur les réseaux sociaux a une structure lâche qui ne se prête pas au calcul.
C'est là qu'intervient le traitement du langage naturel (PNL). Le PNL est une branche de l'informatique qui chevauche la linguistique en appliquant des techniques informatiques (à savoir l'intelligence artificielle) pour analyser le langage naturel et la parole. La modélisation des sujets se concentre sur la compréhension des sujets sur lesquels porte un texte donné. La modélisation des sujets permet aux développeurs de mettre en œuvre des fonctionnalités utiles telles que la détection des dernières nouvelles sur les réseaux sociaux, la recommandation de messages personnalisés, la détection des faux utilisateurs et la caractérisation du flux d'informations.
Comment les développeurs peuvent-ils amadouer les ordinateurs axés sur le calcul pour comprendre les communications humaines à ces niveaux de sophistication ?
Un sac de mots
Pour répondre à cette question, nous devons être capables de décrire mathématiquement un texte. Nous allons commencer notre didacticiel Python de modélisation de sujet par la méthode la plus simple : un sac de mots.
Cette méthode représente un texte comme un ensemble de mots. Par exemple, la phrase This is an example peut être décrite comme un ensemble de mots utilisant la fréquence à laquelle ces mots apparaissent :
{"an": 1, "example": 1, "is": 1, "this": 1}Notez comment cette méthode ignore l'ordre des mots. Prenez ces exemples :
- "J'aime Star Wars mais je n'aime pas Harry Potter."
- "J'aime Harry Potter mais je n'aime pas Star Wars."
Ces sentiments sont représentés par les mêmes mots, mais ils ont des sens opposés. Aux fins de l'analyse des thèmes des textes, cependant, ces différences n'ont pas d'importance. Dans les deux cas, nous parlons de goûts pour Harry Potter et Star Wars, quels que soient ces goûts. En tant que tel, l'ordre des mots est sans importance.
Lorsque nous avons plusieurs textes et cherchons à comprendre les différences entre eux, nous avons besoin d'une représentation mathématique pour l'ensemble de notre corpus qui considère chaque texte séparément. Pour cela, nous pouvons utiliser une matrice, dans laquelle chaque colonne représente un mot ou un terme et chaque ligne représente un texte. Une représentation possible d'un corpus consiste à noter dans chaque cellule la fréquence d'utilisation d'un mot donné (colonne) dans un certain texte (ligne).
Dans notre exemple, le corpus est composé de deux phrases (les lignes de notre matrice) :
["I like Harry Potter", "I like Star Wars"]Nous listons les mots de ce corpus dans l'ordre où nous les rencontrons : I , like , Harry , Potter , Star , Wars . Celles-ci correspondent à nos colonnes matricielles.
Les valeurs de la matrice représentent le nombre de fois qu'un mot donné est utilisé dans chaque phrase :
[[1,1,1,1,0,0], [1,1,0,0,1,1]] Notez que la taille de la matrice est déterminée en multipliant le nombre de textes par le nombre de mots différents qui apparaissent dans au moins un texte. Ce dernier est généralement inutilement grand et peut être réduit. Par exemple, une matrice peut contenir deux colonnes pour les verbes conjugués, tels que « jouer » et « joué », indépendamment du fait que leur signification est similaire.
Mais des colonnes décrivant de nouveaux concepts peuvent manquer. Par exemple, « classique » et « musique » ont chacun des significations individuelles, mais lorsqu'ils sont combinés - « musique classique » - ils ont une autre signification.
En raison de ces problèmes, il est nécessaire de prétraiter le texte afin d'obtenir de bons résultats.
Modèles de prétraitement et de regroupement de sujets
Pour de meilleurs résultats, il est nécessaire d'utiliser plusieurs techniques de prétraitement. Voici quelques-uns des plus fréquemment utilisés :
- Minuscules. Mettez tous les mots en minuscules. Mettez tous les mots en minuscules. Le sens d'un mot ne change pas quelle que soit sa position dans la phrase.
- n -grammes. Considérez tous les groupes de n mots consécutifs comme de nouveaux termes, appelés n-grammes . De cette façon, des cas tels que "maison blanche" seront pris en compte et ajoutés à la liste de vocabulaire.
- Enracinement. Identifiez les préfixes et les suffixes des mots pour les isoler de leur racine. De cette façon, des mots comme « jouer », « joué » ou « joueur » sont représentés par le mot « jouer ». Le stemming peut être utile pour réduire le nombre de mots dans la liste de vocabulaire tout en préservant leur sens, mais il ralentit considérablement le prétraitement car il doit être appliqué à chaque mot du corpus.
- Arrêtez les mots. Ne tenez pas compte des groupes de mots dépourvus de sens ou d'utilité. Ceux-ci incluent des articles et des prépositions, mais peuvent également inclure des mots qui ne sont pas utiles pour notre étude de cas spécifique, tels que certains verbes courants.
- Fréquence du terme–fréquence inverse du document (tf–idf). Utilisez le coefficient de tf–idf au lieu de noter la fréquence de chaque mot dans chaque cellule de la matrice. Il se compose de deux nombres, multipliés :
- tf - la fréquence d'un terme ou d'un mot donné dans un texte, et
- idf : logarithme du nombre total de documents divisé par le nombre de documents contenant ce terme donné.
tf–idf est une mesure de la fréquence d'utilisation d'un mot dans le corpus. Pour pouvoir subdiviser les mots en groupes, il est important de comprendre non seulement quels mots apparaissent dans chaque texte, mais aussi quels mots apparaissent fréquemment dans un texte mais pas du tout dans les autres.
La figure suivante montre quelques exemples simples de ces techniques de prétraitement où le texte original du corpus est modifié afin de générer une liste de mots pertinente et gérable.

Nous allons maintenant montrer comment appliquer certaines de ces techniques en Python. Une fois notre corpus représenté mathématiquement, nous devons identifier les sujets abordés en appliquant des algorithmes d'apprentissage automatique non supervisés. Dans ce cas, "non supervisé" signifie que l'algorithme n'a pas d'étiquettes de sujet prédéfinies, comme "science-fiction", à appliquer à sa sortie.
Pour regrouper notre corpus, nous pouvons choisir parmi plusieurs algorithmes, notamment la factorisation matricielle non négative (NMF), l'analyse en composantes principales creuses (PCA clairsemée) et l'allocation de dirichlet latent (LDA). Nous nous concentrerons sur LDA car il est largement utilisé par la communauté scientifique en raison de ses bons résultats dans les médias sociaux, les sciences médicales, les sciences politiques et le génie logiciel.
LDA est un modèle de décomposition thématique non supervisée : il regroupe les textes en fonction des mots qu'ils contiennent et de la probabilité qu'un mot appartienne à un certain sujet. L'algorithme LDA génère la distribution des mots de sujet. Avec ces informations, nous pouvons définir les principaux sujets en fonction des mots qui leur sont le plus probablement associés. Une fois que nous avons identifié les thèmes principaux et leurs mots associés, nous pouvons savoir quel(s) thème(s) s'applique(nt) à chaque texte.
Considérons le corpus suivant composé de cinq phrases courtes (toutes tirées des gros titres du New York Times ) :
corpus = [ "Rafael Nadal Joins Roger Federer in Missing US Open", "Rafael Nadal Is Out of the Australian Open", "Biden Announces Virus Measures", "Biden's Virus Plans Meet Reality", "Where Biden's Virus Plan Stands"]L'algorithme devrait clairement identifier un sujet lié à la politique et au coronavirus, et un second lié à Nadal et au tennis.
Appliquer la stratégie en Python
Afin de détecter les sujets, nous devons importer les bibliothèques nécessaires. Python possède quelques bibliothèques utiles pour la PNL et l'apprentissage automatique, notamment NLTK et Scikit-learn (sklearn).
from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer from sklearn.decomposition import LatentDirichletAllocation as LDA from nltk.corpus import stopwords En utilisant CountVectorizer() , nous générons la matrice qui indique la fréquence des mots de chaque texte en utilisant CountVectorizer() . Notez que le CountVectorizer permet le prétraitement si vous incluez des paramètres tels que stop_words pour inclure les mots vides, ngram_range pour inclure n -grammes ou lowercase=True pour convertir tous les caractères en minuscules.
count_vect = CountVectorizer(stop_words=stopwords.words('english'), lowercase=True) x_counts = count_vect.fit_transform(corpus) x_counts.todense() matrix([[0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0], [1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1]], dtype=int64) Pour définir le vocabulaire de notre corpus, nous pouvons simplement utiliser l'attribut .get_feature_names() :
count_vect.get_feature_names() ['announces', 'australian', 'biden', 'federer', 'joins', 'measures', 'meet', 'missing', 'nadal', 'open', 'plan', 'plans', 'rafael', 'reality', 'roger', 'stands', 'virus']Ensuite, nous effectuons les calculs tf–idf avec la fonction sklearn :
tfidf_transformer = TfidfTransformer() x_tfidf = tfidf_transformer.fit_transform(x_counts)Afin d'effectuer la décomposition LDA, nous devons définir le nombre de sujets. Dans ce cas simple, nous savons qu'il y a deux sujets ou "dimensions". Mais dans les cas généraux, il s'agit d'un hyperparamètre qui nécessite quelques ajustements, ce qui peut être fait à l'aide d'algorithmes comme la recherche aléatoire ou la recherche par grille :
dimension = 2 lda = LDA(n_components = dimension) lda_array = lda.fit_transform(x_tfidf) lda_array array([[0.8516198 , 0.1483802 ], [0.82359501, 0.17640499], [0.18072751, 0.81927249], [0.1695452 , 0.8304548 ], [0.18072805, 0.81927195]])LDA est une méthode probabiliste. Ici, nous pouvons voir la probabilité que chacun des cinq titres appartienne à chacun des deux sujets. Nous pouvons voir que les deux premiers textes ont une probabilité plus élevée d'appartenir au premier thème et les trois suivants au deuxième thème, comme prévu.
Enfin, si nous voulons comprendre de quoi parlent ces deux sujets, nous pouvons voir les mots les plus importants dans chaque sujet :
components = [lda.components_[i] for i in range(len(lda.components_))] features = count_vect.get_feature_names() important_words = [sorted(features, key = lambda x: components[j][features.index(x)], reverse = True)[:3] for j in range(len(components))] important_words [['open', 'nadal', 'rafael'], ['virus', 'biden', 'measures']]Comme prévu, LDA a correctement attribué les mots liés aux tournois de tennis et Nadal au premier sujet et les mots liés à Biden et au virus au deuxième sujet.
Analyses à grande échelle et cas d'utilisation réels
Une analyse à grande échelle de la modélisation thématique peut être vue dans cet article; J'ai étudié les principaux sujets d'actualité lors de l'élection présidentielle américaine de 2016 et observé les sujets que certains médias de masse - comme le New York Times et Fox News - ont inclus dans leur couverture, tels que la corruption et l'immigration. Dans cet article, j'ai également analysé les corrélations et les causalités entre le contenu des médias de masse et les résultats des élections.
La modélisation thématique est également largement utilisée en dehors du milieu universitaire pour découvrir des modèles thématiques cachés présents dans de grandes collections de textes. Par exemple, il peut être utilisé dans les systèmes de recommandation ou pour déterminer de quoi les clients/utilisateurs parlent dans les sondages, dans les formulaires de commentaires ou sur les réseaux sociaux.
Le blog Toptal Engineering exprime sa gratitude à Juan Manuel Ortiz de Zarate pour avoir examiné les exemples de code présentés dans cet article.
Lecture recommandée sur la modélisation de sujet
Modélisation de sujet améliorée dans Twitter
Albanese, Federico et Esteban Feuerstein. "Amélioration de la modélisation des sujets sur Twitter grâce à la mise en commun de la communauté." (20 décembre 2021) : arXiv:2201.00690 [cs.IR]
Analyser Twitter pour la santé publique
Paul, Michael et Mark Dredze. "Vous êtes ce que vous tweetez : analyse de Twitter pour la santé publique." 3 août 2021.
Classer l'orientation politique sur Twitter
Cohen, Raviv et Derek Ruths. « Classer l'orientation politique sur Twitter : ce n'est pas facile ! 3 août 2021.
Utilisation de modèles de sujet relationnel pour capturer le couplage
Gethers, Malcom et Denis Poshyvanyk. "Utilisation de modèles de sujets relationnels pour capturer le couplage entre les classes dans les systèmes logiciels orientés objet." 25 octobre 2010.
