IA
Mar 1, 2020

Les word embeddings: la géométrie des mots

Aujourd’hui, nous découvrirons des mots en orbite. Non, je ne vous emmène pas en voyage dans la Voie Lactée. Les mots en orbite, ce sont les word embeddings. En une phrase, les word embeddings sont des vecteurs qui représentent les mots d’un corpus (ici, un corpus est un ensemble de phrases). Tous les mots (oui, même ceux qui ne sont dans aucun dictionnaire) peuvent être représentés sous forme de word embeddings. Il suffit seulement d’avoir un corpus de grande taille sous la main. Non, je ne crois pas que votre recette de sucre à la crème soit un assez gros corpus (à moins qu’elle ne contienne plusieurs centaines de milliers de mots, bien sûr).

C’est bien beau tout cela, me direz-vous, mais quelle est l’utilité des word embeddings? En fait, ils sont très utiles pour évaluer la parenté sémantique (plus simplement, la relation de sens) entre les mots. À titre d’exemples, voici quelques paires de mots sémantiquement parents:

Arbre / Forêt
Arbre / Branche
Arbre / Érable
Arbre / Plante

La proximité des vecteurs dans l’espace vectoriel correspond à la parenté sémantique: les vecteurs des mots se retrouvant dans des contextes similaires dans le corpus ont tendance à se rapprocher les uns des autres. La parenté sémantique entre deux mots peut alors être évaluée avec une mesure comme la similarité cosinus, la distance euclidienne ou la distance de Manhattan. Vous ne connaissez pas ces mesures? Pas de problème, les personnages de Kung Fu Panda vous ont préparé quelque chose:

Figure 1 : http://dataaspirant.com/2015/04/11/five-most-popular-similarity-measures-implementation-in-python/


Il existe plusieurs modèles pour entraîner des word embeddings. Les plus connus sont Word2Vec [1], GloVe [2] et FastText [3]. Les word embeddings qui seront présentés un peu plus loin dans cet article ont été entraînés avec Word2Vec.

Word2Vec vient en deux saveurs:

  • Continuous bag-of-words
  • Skip-gram
Figure 2 : https://arxiv.org/pdf/1301.3781.pdf

En fait, ces deux architectures correspondent à deux façons légèrement différentes d’entraîner les word embeddings. Prenons l’exemple suivant:

Le gros ____ jappe.

Vous avez probablement deviné que le mot « chien » complète la phrase. Cet exemple correspond à l’entraînement avec l’architecture continuous bag-of-words, dont l’objectif est de prédire un mot à l’aide du contexte.

Quelques détails supplémentaires pour ceux qui s’intéressent aux maths.

Quand l’architecture continuous bag-of-words est utilisée, le contexte est traité comme une seule observation:

([le, gros, jappe], chien)

Le modèle évalue alors la probabilité que le mot « chien » se retrouve dans un contexte composé des mots « le », « gros » et « jappe ».

Regardons maintenant cet exemple:

____ gros chien jappe.
Le ____ chien jappe.
Le gros chien ____.

Cet exemple correspond à l’entraînement avec l’architecture skip-gram, dont l’objectif est de prédire le contexte à l’aide d’un mot (dans ce cas-ci, le mot « chien »).

Encore une fois, quelques détails supplémentaires pour ceux qui s’intéressent aux maths.

Quand l’architecture skip-gram est utilisée, chaque mot du contexte est traité comme une nouvelle observation:

(chien, le), (chien, gros), (chien, jappe)

Le modèle évalue alors la probabilité que le mot « le » se retrouve dans le même contexte que le mot « chien », que le mot « gros » se retrouve dans le même contexte que le mot « chien » et que le mot « jappe » se retrouve dans le même contexte que le mot « chien ».

Voici maintenant quelques détails sur l’entraînement des word embeddings qui seront présentés dans cet article.

Étape 1 : Le choix des corpus

Deux modèles de word embeddings ont été entraînés. Le premier modèle a été entraîné sur des articles de Wikipédia faisant partie du Portail du Québec (1 869 213 mots). Les articles ont été extraits du corpus Wikipédia-FR [4]. Le deuxième modèle a été entraîné sur environ 4400 articles du Journal de Québec et du Journal de Montréal (2 200 642 mots). Pour extraire les données, un web scraper a été utilisé.

Étape 2 : Le prétraitement des données

Les deux corpus ont été segmentés en phrases, puis les phrases ont été segmentées (tokenized) en unités (mots et signes de ponctuation). Les mots ont tous été mis en minuscules et les tokens correspondant à un signe de ponctuation ont été retirés.

Étape 3 : Le choix de l’architecture et la définition des paramètres

Les deux modèles de word embeddings ont été entraînés avec l’implémentation de Word2Vec dans Gensim (librairie Python) [5]. Dans les deux cas, l’architecture skip-gram a été utilisée (mais c’est un choix purement arbitraire).

Pour les intéressés, voici les paramètres utilisés:

model = Word2Vec(sentences, size = 250, alpha = 0.025, min_alpha = 0.00025, min_count = 5, window = 3, sg = 1)
model.train(sentences, total_examples = len(sentences), epochs = 80)

Étape 4 : L’entraînement

Maintenant, il suffit de regarder l’aiguille de sa montre faire quelques tours… celle des secondes, rassurez-vous.

BONUS

Étape 5 : La conversion de chaque modèle en deux fichiers

L’entraînement est terminé, les deux modèles sont enregistrés, c’est l’heure de s’amuser. Grâce au script word2vec2tensor de Gensim, chaque modèle est converti en deux fichiers TSV: un fichier tensor et un fichier metadata. Ces fichiers sont nécessaires pour la visualisation des word embeddings avec le Tensorflow Embedding Projector [6].

Étape 6 : La visualisation avec le Tensorflow Embedding Projector

Préparez-vous maintenant à voir les plus jolis nuages de points.

Voici celui pour les word embeddings entraînés sur les articles de Wikipédia:

Lien

Et celui pour les word embeddings entraînés sur les articles du Journal de Québec et du Journal de Montréal:

Lien

Dans la colonne de droite, vous pouvez rechercher un mot et découvrir quels sont les word embeddings les plus proches de ce mot dans l’espace vectoriel. Vous pouvez également choisir d’afficher la similarité cosinus (cosine) ou la distance euclidienne (euclidean).

Voici maintenant quelques exemples. Recherchons le mot « neige » dans nos deux modèles et observons le résultat:

Wikipédia : tempête, arpents, quantité…
Journaux : tempête, chutes, glace…

Essayons maintenant avec un nom propre et recherchons « dion »:

Wikipédia : céline, jeik, incognito…
Journaux : céline, clermont, tremblay…

C’est plutôt bien, n’est-ce pas? Les word embeddings vous semblent probablement inoffensifs. Mais attention, ils sont parfois dangereux! En effet, ils sont très influençables et se font un plaisir de refléter les idées du corpus sur lequel ils ont été entraînés. Bref, objectivité et word embeddings ne font pas toujours bon ménage. Regardons quelques exemples.

Recherchons d’abord le mot « étudiants »:

Wikipédia : élèves, inscrits, professeurs…
Journaux : élèves, grève, jeunes…

Mais qu’est-ce que le mot « grève » peut bien faire là? Si vous vivez au Québec, vous connaissez la réponse…

Recherchons maintenant le mot « religieux »:

Wikipédia : musée, personnel, citoyens…
Journaux : signes, ostentatoires, intégrisme…

Oh là là… Vous avez certainement compris que les word embeddings entraînés sur les articles du Journal de Québec et du Journal de Montréal ont été fortement influencés par les événements très médiatisés de l’actualité québécoise.

En conclusion, si vous souhaitez travailler avec des word embeddings, prenez le temps de bien choisir votre corpus et soyez prudents!

Références mentionnées:

[1] Mikolov, T., Chen, K., Corrado, G., & Dean, J. (2013). Efficient Estimation of Word Representations in Vector Space. Communication présentée à: ICLR Workshop 2013, Scottsdale, États-Unis. https://arxiv.org/pdf/1301.3781.pdf

[2] Pennington, J., Socher, R., & Manning, C. D. (2014). Glove: Global Vectors for Word Representation. Communication présentée à: 19th Conference on Empirical Methods in Natural Language Processing (EMNLP 2014), Doha, Qatar. https://www.aclweb.org/anthology/D14-1162

[3] Bojanowski, P., Grave, E., Joulin, A., & Mikolov, T. (2017). Enriching Word Vectors with Subword Information. Transactions of the Association for Computational Linguistics, 5, 135–146. https://arxiv.org/pdf/1607.04606.pdf

[4] http://redac.univ-tlse2.fr/corpus/wikipedia.html

[5] https://radimrehurek.com/gensim/

[6] https://projector.tensorflow.org/

Pour en savoir plus:

Plus de détails sur les word embeddings:

https://www.shanelynn.ie/

Lien Google Doc

https://blog.acolyer.org/

Implémentation de Word2Vec dans Gensim:

Lien

https://www.shanelynn.ie/

Tutoriel de TensorFlow sur Word2Vec:

https://www.tensorflow.org

Livres suggérés:

Ganegedara, T. (2018). Natural Language Processing with TensorFlow: Teach language to machines using Python’s deep learning library. Birmingham, Royaume-Uni: Packt Publishing. (Chap. 3: Word2vec — Learning Word Embeddings).

Lien

Goyal, P., Pandey, S., & Jain, K. (2018). Deep Learning for Natural Language Processing: Creating Neural Networks with Python. New York, États-Unis: Apress. (Chap. 2: Word Vector Representations).

Lien

Jurafsky, D., & Martin, J. H. (2018). Speech and Language Processing: An Introduction to Natural Language Processing, Computational Linguistics, and Speech Recognition, Third Edition Draft. (Chap. 6: Vector Semantics).

https://web.stanford.edu/~jurafsky/slp3/

Pour continuer la lecture