Word2Vec : Guide complet — Principes, Exemples et Implémentation Python
Résumé
Word2Vec est une famille de modèles d’apprentissage non supervisé introduite par Tomas Mikolov et ses collègues chez Google en 2013. Son objectif est d’apprendre des représentations vectorielles denses (embeddings) pour chaque mot d’un vocabulaire, de telle sorte que les mots apparaissant dans des contextes similaires se retrouvent proches dans l’espace vectoriel. Cette approche a révolutionné le traitement automatique du langage naturel (NLP) en remplaçant les représentations one-hot creuses par des vecteurs denses riches en sémantique, permettant des opérations algébriques sur le sens des mots.
Principe mathématique
Word2Vec repose sur une idée centrale : la signification d’un mot se définit par le contexte dans lequel il apparaît (l’hypothèse distributionnelle de Firth). Pour capturer cette idée, le modèle apprend à prédire des mots à partir de leur contexte (ou inversement) en ajustant des vecteurs de manière à maximiser la probabilité des paires de mots co-occurrents.
Architecture Skip-Gram
Skip-Gram cherche à prédire les mots du contexte à partir d’un mot cible. Formellement, pour une séquence de mots w₁, w₂, …, w_T, l’objectif est de maximiser la probabilité moyenne des mots de contexte étant donné chaque mot cible :
max θ (1/T) Σ log P(w_{t+j} | w_t)
où j parcourt la fenêtre de contexte [-c, c] \ {0}. La probabilité est modélisée par une fonction softmax :
P(w_O | w_I) = exp(v'_wO · v_wI) / Σ exp(v'_w · v_wI)
avec v_w le vecteur d’entrée du mot w et v’_w son vecteur de sortie. Le dénominateur somme sur tous les mots du vocabulaire V, ce qui rend le calcul prohibitif pour les grands vocabulaires.
Architecture CBOW (Continuous Bag-of-Words)
CBOW effectue l’opération inverse : elle prédit le mot cible à partir de la moyenne des vecteurs des mots du contexte.
max θ (1/T) Σ log P(w_t | w_{t-c}, …, w_{t-1}, w_{t+1}, …, w_{t+c})
La probabilité s’exprime de manière similaire avec un softmax, mais le vecteur d’entrée est la moyenne des vecteurs de contexte.
CBOW est généralement plus rapide à entraîner que Skip-Gram et performe mieux sur les mots fréquents, tandis que Skip-Gram capture mieux les mots rares et produit de meilleures similarités sémantiques.
Négative Sampling : une approximation efficace
Le calcul du softmax complet nécessite de sommer sur l’intégralité du vocabulaire (V ≈ 100 000 à plusieurs millions), ce qui est extrêmement coûteux. Word2Vec introduit le negative sampling comme approximation : au lieu de calculer la probabilité sur tout le vocabulaire, on optimise seulement le mot positif (celui qui apparaît réellement) et un petit nombre k de mots négatifs échantillonnés selon une distribution de bruit P_n(w).
La distribution P_n(w) est typiquement la fréquence unigramme élevée à la puissance 3/4, puis normalisée. Cette astuce réduit la complexité de O(V) à O(k · d) où d est la dimension des vecteurs, rendant l’entraînement faisable sur des corpus massifs.
L’autre technique d’optimisation utilisée est le hierarchical softmax, qui organise le vocabulaire dans un arbre binaire (souvent un arbre de Huffman) et remplace le softmax O(V) par un parcours d’arbre en O(log V).
Intuition : pourquoi les embeddings capturent le sens
L’intuition fondamentale de Word2Vec est simple et puissante : les mots qui apparaissent dans des contextes similaires auront des représentations vectorielles proches. Considérons les mots « roi » et « reine ». Ces deux mots apparaissent fréquemment dans des phrases structurellement similaires :
- « Le roi a annoncé une réforme. »
- « La reine a annoncé une réforme. »
Le modèle ajustera les vecteurs de « roi » et « reine » de manière à ce qu’ils soient proches dans l’espace vectoriel, car ils maximisent la vraisemblance des mêmes mots de contexte. De même, « chien » et « chat » seront proches car ils co-occurrent avec des mots comme « animal », « domestique », « nourrir ».
Ce qui est remarquable, c’est que ces embeddings capturent non seulement la similarité sémantique, mais aussi des relations analogiques régulières dans l’espace vectoriel. L’exemple le plus célèbre est :
vecteur("roi") - vecteur("homme") + vecteur("femme") ≈ vecteur("reine")
Cette propriété émerge naturellement de l’entraînement : si « roi » et « homme » co-occurrent avec certains mots que « reine » et « femme » partagent, alors la direction « homme → femme » dans l’espace vectoriel correspond approximativement à la direction « roi → reine ». Des relations similaires apparaissent pour les pays/capitales, les verbes conjugués, les singuliers/pluriels, et bien d’autres patterns linguistiques.
Implémentation Python avec gensim
La bibliothèque gensim offre une implémentation optimisée et facile à utiliser de Word2Vec. Voici un exemple complet :
from gensim.models import Word2Vec
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
import numpy as np
# 1. Corpus exemple (phrases tokenisées)
corpus = [
["le", "roi", "est", "un", "homme", "puissant"],
["la", "reine", "est", "une", "femme", "puissante"],
["le", "roi", "et", "la", "reine", "dirigent", "le", "royaume"],
["le", "prince", "est", "le", "fils", "du", "roi"],
["la", "princesse", "est", "la", "fille", "de", "la", "reine"],
["le", "chat", "dort", "sur", "le", "tapis"],
["le", "chien", "court", "dans", "le", "jardin"],
["mon", "chat", "est", "un", "animal", "doux"],
["mon", "chien", "est", "un", "animal", "fidèle"],
["paris", "est", "la", "capitale", "de", "la", "france"],
["londres", "est", "la", "capitale", "du", "royaume-uni"],
["la", "france", "est", "un", "pays", "européen"],
["le", "royaume-uni", "est", "un", "pays", "insulaire"],
]
# 2. Entraînement du modèle Word2Vec (Skip-Gram)
model = Word2Vec(
sentences=corpus,
vector_size=100, # dimension des embeddings
window=5, # taille de la fenêtre de contexte
min_count=1, # fréquence minimale des mots
sg=1, # 1 = Skip-Gram, 0 = CBOW
epochs=100, # nombre de passages sur le corpus
negative=5, # nombre d'échantillons négatifs
seed=42
)
print("Vocabulaire :", list(model.wv.key_to_index.keys()))
# 3. Trouver les mots les plus similaires
print("\nMots similaires à 'roi' :")
for mot, score in model.wv.most_similar("roi", topn=5):
print(f" {mot}: {score:.3f}")
# 4. Analogie : roi - homme + femme = ?
print("\nAnalogie : roi - homme + femme =")
resultat = model.wv.most_similar(
positive=["roi", "femme"],
negative=["homme"],
topn=1
)
print(f" {resultat[0][0]}: {resultat[0][1]:.3f}")
# 5. Similarité directe entre deux mots
sim = model.wv.similarity("chat", "chien")
print(f"\nSimilarité chat/chien : {sim:.3f}")
# 6. Visualisation t-SNE des embeddings
mots = list(model.wv.key_to_index.keys())[:15]
vectors = np.array([model.wv[mot] for mot in mots])
tsne = TSNE(n_components=2, random_state=42, perplexity=5)
vectors_2d = tsne.fit_transform(vectors)
plt.figure(figsize=(10, 8))
for i, mot in enumerate(mots):
plt.scatter(vectors_2d[i, 0], vectors_2d[i, 1])
plt.annotate(mot, (vectors_2d[i, 0], vectors_2d[i, 1]))
plt.title("Visualisation t-SNE des embeddings Word2Vec")
plt.xlabel("Composante 1")
plt.ylabel("Composante 2")
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("word2vec_tsne.png", dpi=150)
plt.close()
print("\nVisualisation sauvegardée : word2vec_tsne.png")
Sur ce petit corpus exemple, la similarité sémantique est limitée (le corpus est très petit). Pour obtenir des embeddings de qualité, il faut un corpus de taille importante — typiquement des millions de phrases. En pratique, on utilise des corpus comme Wikipedia, Common Crawl, ou des corpora spécialisés selon le domaine d’application.
Hyperparamètres de Word2Vec
Le choix des hyperparamètres influence significativement la qualité des embeddings appris :
| Hyperparamètre | Rôle | Valeurs typiques |
|---|---|---|
| vector_size | Dimension des vecteurs d’embeddings | 100–300 (gensim défaut : 100) |
| window | Taille maximale de la fenêtre de contexte de part et d’autre du mot cible | 5–10 |
| min_count | Fréquence minimale d’un mot pour être inclus dans le vocabulaire | 1–5 |
| sg | Algorithme d’entraînement : 0 = CBOW, 1 = Skip-Gram | 0 ou 1 |
| workers | Nombre de threads pour l’entraînement parallèle | 4–8 |
| epochs | Nombre de passages complets sur le corpus (paramètre nommé iter dans gensim < 4.0) |
5–20 |
| negative | Nombre d’échantillons négatifs pour le negative sampling (0 = hierarchical softmax) | 5–20 (défaut : 5) |
| ns_exponent | Exposant de la distribution de bruit pour le negative sampling | 0.75 (défaut), 1.0 = uniforme |
Recommandations pratiques
- Pour la similarité sémantique : Skip-Gram (sg=1) avec un negative de 10–20 tend à produire de meilleurs résultats.
- Pour la vitesse d’entraînement : CBOW (sg=0) est plus rapide et performe bien sur les tâches de modélisation de langage.
- Pour les grands corpus : augmentez
vector_sizeà 300 etwindowà 10. Les gros corpus permettent d’apprendre des dimensions plus riches sans surajustement. - Pour les petits corpus : réduisez
vector_size(50–100) pour éviter le surapprentissage.
Avantages et limites de Word2Vec
Avantages
- Efficacité computationnelle : Grâce au negative sampling et au hierarchical softmax, Word2Vec peut être entraîné sur des milliards de mots en quelques heures sur un GPU ou même un CPU multicœur.
- Qualité sémantique remarquable : Les embeddings capturent naturellement la similarité sémantique et syntaxique, ainsi que des relations analogiques complexes.
- Simplicité conceptuelle : L’architecture est simple (une seule couche cachée), ce qui rend le modèle facile à comprendre, à implémenter et à déboguer.
- Transfert de connaissances : Les embeddings Word2Vec pré-entraînés (Google News 3M, FastText) peuvent être utilisés comme point de départ pour de nombreuses tâches NLP en aval (fine-tuning).
Limites
- Représentation statique : Chaque mot reçoit un unique vecteur, incapable de représenter la polysémie. Le mot « banque » (établissement financier ou bord de rivière) aura le même embedding dans les deux contextes.
- Dépendance à la fréquence : Les mots rares ont des embeddings moins fiables car ils apparaissent dans peu de contextes d’entraînement.
- Fenêtre fixe : La fenêtre de contexte ignore les dépendances à longue distance au-delà de la taille de fenêtre, et le contexte est non directionnel (sauf si modifié).
- Pas de connaissance hors-contexte : Word2Vec ne capture pas les relations hiérarchiques ou logiques qui ne sont pas reflétées dans la co-occurrence de surface.
- Mots hors vocabulaire (OOV) : Les mots non vus pendant l’entraînement ne reçoivent aucun embedding (contrairement à FastText qui utilise les sous-mots).
4 cas d’usage de Word2Vec
1. Recherche d’information et moteur de recherche sémantique
Les embeddings Word2Vec permettent d’étendre les requêtes de recherche au-delà de la correspondance exacte de mots-clés. Lorsqu’un utilisateur recherche « véhicule électrique », le moteur peut aussi retourner des documents contenant « voiture électrique », « automobile électrique » ou « véhicule à batterie », car ces termes sont proches dans l’espace d’embeddings. Cette approche améliore significativement le rappel (recall) des systèmes de recherche.
2. Classification de texte
Les embeddings de mots servent de features d’entrée pour des classifieurs de texte (SVM, réseaux de neurones, etc.). Plutôt que d’utiliser des représentations one-hot creuses, on représente chaque document par la moyenne (ou la somme pondérée par TF-IDF) des embeddings de ses mots. Cette représentation dense capture la sémantique du document et améliore les performances de classification, notamment lorsque les données d’entraînement sont limitées.
3. Analyse de similarité sémantique entre documents
En représentant chaque document comme un vecteur moyen de ses mots, on peut calculer la similarité cosinus entre documents pour :
- Détecter le plagiat et la paraphrase automatique.
- Regrouper des avis clients (reviews) par thématique.
- Recommander des articles similaires dans un système de contenu éditorial.
- Identifier des réponses pertinentes dans un système de FAQ automatisé.
4. Analyse diachronique de la langue (évolution sémantique)
En entraînant des modèles Word2Vec séparés sur des corpus de différentes périodes temporelles, on peut étudier comment la signification des mots évolue au fil du temps. Par exemple, le mot « souris » se rapprochait historiquement des mots « animal », « rongeur », « forêt », puis s’est rapproché de « ordinateur », « clic », « écran » avec l’avènement de l’informatique. Cette technique est utilisée en linguistique computationnelle et en sciences sociales numériques pour étudier les changements culturels et sémantiques à grande échelle.
Voir aussi
- Créer votre propre jeu Python : Reproduisez l’action de Tom et Jerry avec Pygame
- Résoudre une Relation de Récurrence Carrée en Python : Guide Complet et Astuces Pratiques

