Transformer des lettres en chiffres

Cet article est issu de la newsletter IA Comprise et reproduit ici par commodité. Recevez toutes les lettres dans votre boîte mail au fur et à mesure de leur publication en laissant votre adresse dans le cadre à droite !


Chère lectrice, cher lecteur,

Je vous avais parlé dans ma dernière lettre du Traitement du Langage Naturel (Natural Language Processing ou NLP en anglais), ce vaste champ de l’Intelligence Artificielle en pleine ébullition qui traite des méthodes d’analyse automatiques de textes.

Mais comment parvient-on au juste à appliquer des outils statistiques et mathématiques sur quelque chose d’aussi immense et flou que le langage ?

Je préfère prévenir tout de suite : impossible de faire plus qu’effleurer le sujet dans cette lettre. Chacun des problèmes dont je vous avais parlé dans ma précédente lettre (analyser des commentaires clients, reconnaître un spam, créer un chatbot…) pourrait faire l’objet de plusieurs livres. Ce n’est pas pour rien que ce domaine est aujourd’hui encore l’une des frontières de l’Intelligence Artificielle…

Alors, si le NLP vous est déjà familier, je vous prie d’excuser les quelques raccourcis et simplifications nécessaires pour rester concis et accessible dans cette lettre !

Transformer les lettres en chiffres

Tout l’art du traitement du langage naturel consiste à trouver une manière intelligente de transformer un texte en objet mathématique sur lesquels appliquer ensuite des algorithmes statistiques.

Pour expliquer ce que cela signifie en pratique, rien ne vaut un bon exemple : le « sac de mots » (bag of words en anglais).

Il s’agit de l’une des plus anciennes méthodes d’analyse de texte. Elle consiste à transformer un texte en une matrice dans laquelle chaque colonne correspond à un mot et contient le nombre de fois que le mot apparaît dans le texte [1].

Un tel encodage conduit évidemment à une énorme perte d’information. Entre autres, l’ordre des mots dans le texte original n’est pas pris en compte.

Pour autant, c’est une méthode simple et rapide qui peut donner des résultats satisfaisant dans des applications simples.

Par exemple, un modèle de détection de spam basique peut être entraîné sur une telle matrice et « apprendre » à en reconnaître la structure puis

Par exemple, un modèle de détection de spam basique peut être entraîné sur une telle matrice et « apprendre » à en reconnaître la structure puis indiquer une probabilité qu’un autre mail soit un spam, sur des critères tels que :

  • Présence de certains mots (« V**** » – non je ne peux pas citer le nom de cette petite pilule bleue sans que cette lettre n’atterrisse justement dans vos spams…)
  • Présence de combinaisons de mots (« sans » suivi de « prescription »)
  • Absence de mots (« V**** » sans « acheter »)
  • Liste blanche (« Coucou papa »), etc.

Trop grand, trop vide

Appliquer directement un sac de mots présente en pratique un problème : on se retrouve facilement avec des matrices de dizaines de milliers de colonnes, pour la plupart remplies de zéros [2].

C’est un problème non seulement technique (travailler sur de telles matrices est coûteux en ressources et temps de calcul), mais aussi de qualité des résultats : il faut énormément de données d’entraînement pour évaluer convenablement l’impact de chaque colonne [3].

La solution ? Réduire le nombre de colonnes en perdant le moins d’information possible.

Voici un petit florilège des principales techniques utilisées :

Stop words (mots vides)

Une façon particulièrement expéditive de simplifier l’analyse consiste à retirer du texte tous les mots qui ne portent pas de signification précise (« le », « à », « du », etc.) et que l’on appelle les stop words.

Il existe des listes de stop words pour chaque langue, que l’on peut compléter par des mots de son choix en fonction du contexte [4].

Stemming (racinisation)

Dans le tableau plus haut, vous avez certainement relevé qu’il y avait deux colonnes pour « verte » et « verts ». On perdrait peu d’information en les rassemblant dans un même mot, « vert ».

Le stemming consiste à couper les mots pour n’en conserver que la racine, sans les terminaisons (-e ou -s pour le féminin/pluriel) ni les conjugaisons (« manger », « mangeons » et « mangera » sont ainsi tous transformés en « mang »).

Lemmatisation

La lemmatisation est une méthode de rassemblement des mots plus perfectionnée que la racinisation. Au lieu de se contenter de couper à la hache la fin des mots, la lemmatisation s’appuie sur des dictionnaires pour associer à chaque mot une forme normalisée : mot au singulier/masculin, verbe à l’infinitif, etc.

La lemmatisation transforme ainsi des mots tels que « suis », « est », « sommes » ou « seront » en « être ».

Analyse TF-IDF

L’analyse « Term Frequency – Inverse Document Frequency » consiste à associer à chaque mot un score, calculé comme la fréquence de ce mot dans un texte multipliée par l’inverse de sa fréquence dans tous les textes étudiés (d’où la dénomination « TF-IDF »).

Un score élevé signifie que le mot est présent de nombreuses fois dans un nombre limité de textes : il est donc probable que ce soit un mot significatif dans ce contexte.

En revanche un score bas signifie que le mot est présent dans de nombreux documents, voire dans tous les documents : son utilité pour caractériser un texte est donc faible.

Ce score peut remplacer le simple décompte des occurrences dans le sac de mots ou permettre d’éliminer les colonnes peu pertinentes.

Principal Component Analysis (Analyse en composantes principales)

Cet algorithme classique de machine learning, non spécifique au NLP, permet de réorganiser les colonnes par similarité et d’éliminer celles qui sont fortement corrélées.

Par exemple, il est extrêmement probable que deux colonnes « Orang » et « Outan » seront pratiquement identiques, puisque ces deux mots se retrouvent généralement ensemble. On peut alors se contenter d’une seule colonne en perdant peu d’information.

Positionner les mots sur une carte lexicale

Le sac de mots ne tient aucunement compte de la signification des mots. Finalement, si chaque mot était remplacé par un numéro, il donnerait les mêmes résultats.

Pour des applications plus sophistiquées comme les chatbots ou la traduction, les modèles s’appuient sur la représentation des mots d’un texte par des vecteurs mathématiques. C’est ce que l’on appelle le word embedding.

Cela fonctionne en quelque sorte comme une position sur une carte, déterminée par ses coordonnées (latitude, longitude, hauteur) : chaque mot est une combinaison de « coordonnées » lexicales.

Un chat peut ainsi être représenté comme une combinaison d’« animal », « domestique » et « félin ». L’analyse de texte sera alors capable de déterminer qu’un chien, « animal », « domestique » et « canin », est lexicalement proche d’un chat – en tout cas, davantage qu’une banane.

Avec un tel système, il est même possible de faire des opérations mathématiques, comme « Chien » = « chat » – « félin » + « canin », ou « Chaton » = « chat » + « bébé » !

Un exemple de représentation vectorielle de mots sur des axes arbitraires [5].
Le vecteur allant de « USA » à « France » est le même que celui allant de « Washington » à « Paris » ; les vecteurs allant d’un pays à sa capitale sont aussi identiques.

Au lieu de constituer une matrice dont les colonnes sont les mots, les colonnes sont les « coordonnées lexicales » des différents mots. Là où un sac de mots ne verrait aucun lien entre un texte parlant de chats et un autre parlant de chiens, l’encodage vectoriel est capable non seulement d’en mettre en évidence la proximité, mais également d’indiquer la nature de cette proximité (les deux textes parlent d’animaux domestiques).

Exemple (simplifié et fictif) de word embedding

Il n’est pas nécessaire de réinventer la roue à chaque analyse : des représentations vectorielles plus ou moins complexes ont déjà été réalisées une bonne fois pour toutes dans les différents langages. L’encodage consiste alors à remplacer chaque mot par les coordonnées trouvées dans ces lexiques.

Pour aller encore au-delà…

La méthode ci-dessus ne règle pas toutes les ambiguïtés possibles.

Par exemple, la position des mots n’est toujours pas prise en compte et les homophones ne sont pas distingués – le mot « souris » désigne-t-il un animal ou l’action de sourire ?

Des modèles plus complexes basés sur des réseaux neuronaux ont donc été développés au cours de la dernière décennie pour améliorer la représentation vectorielle d’un mot non pas uniquement à partir du mot lui-même, mais des mots voisins dans le texte en question.

Mais c’est encore un vaste sujet… pour une autre fois !

À la prochaine !

Erwan


Inscrivez-vous gratuitement pour ne rater aucune lettre !


[1] On peut également choisir d’indiquer à la place du nombre d’apparition la fréquence du mot parmi l’ensemble des mots du texte, un encodage binaire (« 1 » s’il apparaît et « 0 » sinon), ou encore un score (comme le score TF-IDF évoqué plus bas).
[2] Puisqu’il y a toujours beaucoup plus de mots qui n’apparaissent pas dans un texte que de mots qui y apparaissent…
[3] En machine learning, on parle de malédiction de la dimensionalité (« curse of dimensionality »), qui n’a rien de spécifique au traitement du langage naturel.
[4] Lorsque j’avais analysé les titres d’articles du Monde dans une précédente lettre, j’avais ainsi arbitrairement inclus dans la liste des mots à exclure des termes tels que « monde » ou « janvier », peu significatifs pour l’objectif recherché (identifier les mots marquants chaque mois).
[5] Image issue de : Fan, Miao & Zhou, Qiang & Zheng, Fang. (2015). Learning Embedding Representations for Knowledge Inference on Imperfect and Incomplete Repositories

Laisser un commentaire

Abonnez-moi à la newsletter