Comprendre

Représenter le sens des mots

Raphaël d'Assignies
12 mai 2023
En linguistique, on appelle item lexical une chaîne de signes formant une unité pouvant constituer une entrée dans un dictionnaire.

Par exemple, la chaîne de signes « d » « r » « o » « i » « t » désigne le mot « droit ». Ce mot peut avoir plusieurs sens : la matière juridique ou l’aspect physique d’un objet, etc.

Ces items lexicaux partagent des liens entre eux :

  • de synonymie : items qui ont un sens identique dans le même contexte ou dans tous les contextes (voiture, automobile ; droit, rectiligne ; cobalt, Co) ;
  • d’antonymie : items qui ont un sens opposé (chaud, froid) ;
  • de similarité : items qui partagent des sens communs (voiture, bicyclette ; avocat, juriste ; chien, chat) mais pas identiques ;
  • de relation : items qui partagent un champ sémantique commun (maison et porte, fenêtre, entrée, salon) sans avoir forcément un sens commun ;
  • de concept : à un niveau plus abstrait, les mots sont en relation selon de multiples dimensions d’ordre conceptuel.

Savoir modéliser ses liens permet de faire des traitements sur la langue comme une traduction ou effectuer des recherches dans des bases documentaires.

Mais existe-t-il un moyen efficace en informatique pour représenter les sens et les relations entre ces mots ?

L’élaboration de la signature sémantique

En informatique, la représentation la plus efficace des mots se fait sous forme d’un tableau à une colonne qui contient une suite de nombres. Ces nombres représentent les différents champs sémantiques du mot et sont regroupés sous le terme de vecteur.

Cette représentation permet d’effectuer des opérations intéressantes sur les mots notamment pour en déterminer les relations. Mais auparavant, il faut construire cette représentation.

De ces affirmations découlent deux interrogations :

  • comment identifier les champs sémantiques associés à un mot ?
  • une fois ces champs identifiés, comment les traduire en représentation chiffrée ?

Identifier les champs sémantiques

Les chercheurs ont proposé plusieurs méthodes pour capturer la sémantique des mots. Elles ont toutes un point commun : regarder le contexte du mot, « dis-moi qui tu fréquentes et je te donnerai ton sens » ! Le voisinage d’un mot, les autres mots qu’il fréquente produisent le sens. C’est ce qu’on appelle le contexte.

Les mots qui interviennent dans des contextes similaires tendent à avoir une signification proche. On appelle cette approche l’hypothèse de distribution : les mots qui sont sémantiquement proches tendent à être utilisés dans le même contexte.

Partant de ce constat, on peut imaginer distribuer ces champs sémantiques avec les mots associés dans différents espaces comme l’illustre la figure suivante :

Représentation de mots dans deux dimensions
Dès lors, le sens du mot correspond à ces coordonnées dans l’espace. Les mots similaires tendent à être positionnés au même endroit.

Ce tableau de nombres, qui positionne le mot dans ses dimensions sémantiques, est appelé embeddings ou plongement de mots. C’est un ensemble de coordonnées qui place le mot à un endroit dans notre espace sémantique. On parlera, de manière plus expressive de signature sémantique (l’expression est de Thierry Poibeau) du mot. Voilà pour le principe.

En pratique, il faut déterminer à la fois les dimensions, à savoir les champs sémantiques, et les coordonnées de notre mot dans cet espace dimensionnel.

Il existe deux grandes méthodes que je détaille ci-après de manière intuitive.

Le comptage des mots voisins

Si notre hypothèse distributionnelle est vraie, on peut mettre en place une méthode qui compte combien de fois les mots apparaissent ensemble. Le résultat serait une matrice de co-occurences, c’est-à-dire un tableau qui associe, pour chaque mot, le nombre de fois où il apparaît avec un autre dans notre corpus.

Voici les étapes pas à pas :

  • on collecte un ensemble de documents (un corpus) ;
  • on découpe ces documents en phrases ;
  • on compte dans ces phrases le nombre de fois où deux mots apparaissent ensemble.`

💡Note : En NLP, le mot document désigne souvent une entité élémentaire pour l’analyse comme une phrase ou un paragraphe et non un document dans son intégralité (livre, rapport, article…).

Un exemple de matrice de co-occurrences peut être le suivant :

Chocolat Cuisine Atmosphère Nuage Météo Eclair
Eclair 30 7 2 13 20
Météo 0 2 50 70
Nuage 1 4 50
Atmosphère 0 0
Cuisine 23

On voit clairement que des mots reviennent souvent ensemble tandis que d’autres ne sont jamais associés.

Pour chaque mot, on peut associer 5 dimensions. Chacune de ces dimensions étant représentée par les autres mots qui lui sont associés. Par exemple le mot ‘Nuage’ est associé 70 fois avec la météo, 13 fois avec éclair, 50 fois avec atmosphère, 1 fois avec chocolat et 4 fois avec cuisine.

Si l’on prend deux dimensions, par exemple cuisine et météo, on peut représenter « chocolat », « éclair » et « nuage » de la manière suivante :

Représentation des vecteurs de mots avec calcul de similarité
On voit clairement que « chocolat » se situe sur la dimension « cuisine » et est éloigné du mot nuage. « Eclair » se situe plus près de nuage mais a un composante « cuisine » sûrement à cause d’éclair au chocolat.

Cette représentation permet de calculer de manière fiable la distance en calculant le cosinus de l’angle qui sépare les vecteurs. Plus cette valeur se rapproche de 0 plus les vecteurs sont à angle droit (orthogonaux) et donc les points sont éloignés. A l’inverse, si la valeur se rapproche de 1, les vecteurs sont alignés donc proches. Cette distance est en réalité un calcul de similarité sémantique.

Une question vient incidemment : peut-on considérer que tous les mots associés donnent un sens ?

Sélectionner les mots qui ont un sens

Dans la pratique, si je calcule ma matrice de co-occurences à partir d’un corpus, je vais être pollué par des items lexicaux qui n’ont pas de valeur sémantique propre comme les déterrminants. Les mots vont se retrouver très souvent associés à le, la, les, une, un, etc. Le calcul de la fréquence, très utile pour identifier le sens, devient une contrainte.

Pour résoudre ce problème, on peut utiliser une technique très simple appelée TF-IDF.

L’idée est d’attribuer un poids aux mots en fonction de deux facteurs :

  • TF : leur nombre d’apparitions dans le document ;
  • IDF : leur nombre d’apparitions dans tout le corpus (dans tous les documents).

En faisant ce calcul, on élimine le poids des mots sans signification pour caractériser un document et on attribue plus d’importance à un mot présent dans un document mais rare dans le corpus. Ainsi les mots passe-partout comme les déterminants mais également des mots génériques (chose, faire) vont voir leur poids diminué dans le calcul.

Maintenant que j’ai éliminé le problème des mots non signifiants, il reste une question-clé : comme identifier les dimensions sémantiques.

L’identification des dimensions sémantiques

Dans mon exemple précédent, j’ai opportunément inséré des mots qui ont un sens assez général comme cuisine ou météo. Ils permettent de donner une dimension claire à d’autres mots par association. En pratique, cette identification ne se fait pas à la main et il faut trouver des méthodes pour regrouper les mots entre eux selon des axes sémantiquement pertinents.

Il existe beaucoup de techniques pour calculer les co-occurrences directes ou indirectes, éliminer celles qui se produisent rarement pour arriver à des axes sémantiques pertinents.

Mais, la technique la plus efficace qui a été trouvée est d’entraîner un réseau de neurones à prédire le mot en fonction du contexte plutôt que de compter les co-occurrences.

Le produit d’un réseau de neurones

En 2013, un papier de recherche, intitulé « Efficient Estimation of Word Representations in Vector Space », montre comment construire ces représentations à partir d’un réseau de neurones.

Il s’agit d’entraîner un classifieur binaire c’est-à-dire un réseau qui doit prédire la probabilité que deux mots soient co-occurents (classe 1) ou non (classe 0). Le réseau ne sort pas une réponse binaire mais deux nombres qui correspondent à la probabilité d’appartenir à une des deux classes.

Voici les étapes simplifiées :

  • on construit à partir du corpus du documents des paires de mots qui se retrouvent ensemble (classe 1) dans les phrases et on extrapole des paires de mots qui ne se retrouvent pas ensemble (exemples appartenant à la classe 0 ) ;
  • à chaque mot, on associe un tableau de nombres aléatoires au départ (embeddings ou vecteur) d’une dimension choisie au départ (n) ;
  • le réseau doit apprendre à classifier les paires de mots en ajustant les nombres associés aux mots ;
  • une fois que le réseau a appris, en minimisant son taux d’erreurs, on extrait les paramètres pour chaque mot et on obtient une représentation chiffrée, c’est-à-dire à la fois le nombre de dimensions sémantiques et les coordonnées pour chacune d’elles.
Fenêtre de tir et sémantique

On peut appliquer la même approche en augmentant le contexte, c’est-à-dire qu’on veut associer non pas deux mots mais 2, 3, n mots ensemble. En augmentant le nombre de mots du contexte, on augmente le champ sémantique appris.

Par rapport à la méthode précédente, on note les différences suivantes :

  • on ne compte plus les mots mais on prédit la probabilité de leur co-occurrence de manière binaire ;
  • le réseau apprend les dimensions sémantiques ;
  • les dimensions sémantiques ne sont pas nommées mais représentées par des indices (0, 1, 2…, n) qui correspondent au nombre de coordonnées dans mon vecteur associé au mot ;
  • le réseau détermine les coordonnées dans les dimensions.

Exemple : word2vec entraîné sur la directive NIS 2

Voici quelques lignes de code qui illustrent une représentation vectorielle de mots à partir du texte de la directive NIS 2.

Afin de vous épargner les étapes de prétraitrement, sans intérêt dans notre cadre, j’ai pré-entraîné un modèle avec la librairie Gensim.

!pip install gensim
from gensim.models import Word2Vec
model = Word2Vec.load('nis2.model')

mot = "sécurité"

print(f"Voici les 10 premiers nombres représentant les coordonnées du mot {mot} : \n {model.wv[mot][:10]}\n")

print("Cette représentation permet notamment de rechercher les mots les plus similaires dans le même corpus :", model.wv.most_similar('identification'))
```
Word2Vec
Voici les 10 premiers nombres représentant les coordonnées du mot sécurité : [-0.21285973 0.5637689 0.20553416 -0.06742156 0.03788706 -0.7225273 0.11224744 0.9837986 -0.36839244 -0.33970815]

Cette représentation permet notamment de rechercher les mots les plus similaires dans le même corpus : [('fiabilité', 0.9851323962211609), ('signatures', 0.9841110110282898), ('listes', 0.9839881658554077), ('cadre', 0.9838947653770447), ('protection', 0.9838393926620483), ('niveau', 0.9837104082107544), ('partie', 0.9837022423744202), ('électroniques', 0.983534574508667), ('directive', 0.9835230112075806), ('l’utilisation', 0.9835212230682373)]

Cette méthode pour construire des vecteurs a été très efficace et a constitué l’état de l’art au début des années 2010. On trouve en ligne des modèles pré entraînés sur des corpus très larges dans plusieurs langues.

Encore plus de contextes…

Le problème de notre approche est que les différents sens, représentés par notre vecteur, ne prennent pas en compte la subtilité des différents contextes.

Par exemple, le mot « éclair » peut être vu dans le contexte de la météo ou de la cuisine de même que nuage (nuage de crème) ou « atmosphère » qui n’aura pas le même sens si on parle du temps qu’il fait ou d’une ambiance.

Avec notre système de type word2vec, notre représentation du mot est unique. Elle ne change pas en fonction du contexte dans lequel le mot apparaît. Les deux sens peuvent être embarqués dans notre représentation, comme on le voit avec le mot « éclair » qui « hésite » entre la cuisine et la météo, mais on aboutit à une cote mal taillée.

Une première approche a consisté à ajouter au vecteur de base, d’autres vecteurs qui matérialisent d’autres contextes. Ainsi le vecteur initial se verra enrichi et affiné en fonction d’autres contextes sémantiques.

Dans cette optique, le mot ‘avocat’ dans les phrases « l’avocat a livré une plaidoirie au vitriol » et « la salade d’avocat était délicieuse », aura clairement des vecteurs de contextes différents en plus de vecteurs représentant la sémantique de base du mot.

Cette solution était obtenue en entraînant des réseaux dits récurrents (RNN). Le but était de découvrir le mot suivant en fonction d’une séquence précédente. Le langage a besoin de mémoire pour fonctionner efficacement. En effet, pour deviner un mot, il faut que je connaisse les mots précédents. Cette architecture permettait de mémoriser l’information.

Bien qu’efficace, de nombreux problèmes techniques rendaient cette solution lente et difficile à entraîner.

Face à ce problème, des chercheurs ont proposé une architecture qui allait révolutionner le domaine : les Transformers.