Word Embeddings : Guide complet — Word2Vec, GloVe, FastText
Résumé — Les word embeddings (plongements de mots) sont des représentations vectorielles denses des mots dans un espace continu. Contrairement aux représentations classiques (one-hot encoding, bag-of-words) qui traitent chaque mot indépendamment, les embeddings capturent les similarités sémantiques : des mots proches en sens ont des vecteurs proches dans l’espace. Word2Vec (2013), GloVe (2014) et FastText (2016) sont les trois méthodes historiques qui ont révolutionné le NLP avant l’ère des Transformers.
Principe mathématique
1. Skip-gram (Word2Vec)
L’objectif est de maximiser la probabilité d’observer les mots de contexte autour du mot central.
Fonction de coût :
$$
\max \prod_{t=1}^{T} \prod_{-c \leq j \leq c, j \neq 0} P(w_{t+j} \mid w_t)
$$
Avec softmax :
$$
P(w_O \mid w_I) = \frac{\exp(v_{w_O}^{\prime T} \cdot v_{w_I})}{\sum_{w=1}^{V} \exp(v_w^{\prime T} \cdot v_{w_I})}
$$
Où $v_{w_I}$ est le vecteur centre et $v’_{w_O}$ le vecteur contexte pour chaque mot. L’inférence sur un grand vocabulaire coûte $O(V)$ par mot, donc on utilise les techniques d’optimisation suivantes :
- Negative Sampling : au lieu de calculer sur tout le vocabulaire, on entraîne le mot contexte positif + $k$ mots négatifs tirés aléatoirement.
- Hierarchical Softmax : arbre binaire sur le vocabulaire réduisant le calcul à $O(\log V)$.
$$
\text{Loss} = -\log \sigma(v_{w_O}^{\prime T} v_{w_I}) – \sum_{k=1}^{K} \mathbb{E}{w_k \sim P_n(w)} [\log \sigma(-v)]
$$}^{\prime T} v_{w_I
2. CBOW (Continuous Bag of Words)
L’inverse du Skip-gram : on prédit le mot central à partir du contexte.
$$
P(w_I \mid w_{contexte}) = \text{softmax}(V^{\prime} \cdot \bar{v}_{contexte})
$$
CBOW est plus rapide que Skip-gram et performe mieux sur les mots fréquents, mais Skip-gram capture mieux les mots rares.
3. GloVe (Global Vectors)
GloVe combine les avantages de la factorisation matricielle et de l’apprentissage contextuel local.
$$
J = \sum_{i,j} f(X_{ij}) \left(w_i^T \tilde{w}j + b_i + \tilde{b}_j – \log X\right)^2
$$
Où $X_{ij}$ est le nombre de co-occurrences entre les mots $i$ et $j$, et $f(x)$ est une pondération qui limite l’influence des co-occurrences très fréquentes :
- $f(x) = (x/x_{max})^\alpha$ si $x < x_{max}$
- $f(x) = 1$ sinon
4. FastText (sous-mots / n-grams de caractères)
FastText améliore Word2Vec en représentant chaque mot comme la somme de ses sous-mots (n-grams de caractères).
$$
v_w = \sum_{g \in G_w} z_g
$$
Où $G_w$ est l’ensemble des n-grams de caractères du mot $w$. Exemple pour “chat” avec $n=3$ : <c, ch, cha, hat, at, t> avec délimiteurs de mot. Cela permet de gérer les mots inconnus (OOV) et d’apprendre des représentations pour les mots morphologiquement proches (“marcher”, “marchait”, “marchant”).
5. Similarité cosinus
Pour comparer deux embeddings de mots, on utilise la similarité cosinus plutôt que la distance euclidienne :
$$
\text{cos}(u, v) = \frac{u \cdot v}{|u| |v|}
$$
Intuition
Imaginez une énorme carte géographique où chaque mot est un point.
Sur cette carte :
- « Roi » et « reine » sont voisins, comme Paris et Lyon
- « Pomme » et « poire » sont dans le quartier « fruits »
- « Triste » et « mélancolique » habitent la même rue des émotions
La magie ? Cette carte n’a pas été dessinée à la main. Elle a été apprise automatiquement en lisant des milliards de mots et en observant quels mots apparaissent ensemble. “Roi” et “reine” sont voisins parce qu’ils apparaissent dans des contextes similaires : « le roi a décrété » ~ « la reine a décrété ».
Mieux encore : la géométrie de cette carte permet des analogies algébriques. L’opération vecteur(roi) – vecteur(homme) + vecteur(femme) donne un vecteur très proche de vecteur(reine). C’est comme si le sens des mots était devenu calculable.
Implémentation Python
1. Word2Vec avec Gensim
from gensim.models import Word2Vec
# Corpus exemple
sentences = [
["le", "chat", "dort", "sur", "le", "canapé"],
["le", "chien", "court", "dans", "le", "jardin"],
["la", "reine", "vit", "dans", "le", "château"],
["le", "roi", "gouverne", "le", "royaume"],
["le", "chat", "et", "le", "chien", "sont", "des", "animaux"],
["la", "femme", "du", "roi", "est", "une", "reine"],
]
# Entraînement Skip-gram
model = Word2Vec(
sentences,
vector_size=100,
window=3,
min_count=1,
sg=1, # 1 = Skip-gram, 0 = CBOW
epochs=100,
negative=5
)
# Mots les plus proches de "chat"
print(model.wv.most_similar("chat", topn=3))
# Analogie
similar = model.wv.most_similar(
positive=["roi", "femme"],
negative=["homme"],
topn=1
)
print(f"Roi - Homme + Femme = {similar[0][0]}")
2. Similarité et analogies
# Similarité cosinus entre deux mots
sim = model.wv.similarity("roi", "reine")
print(f"Similarité roi-reine: {sim:.4f}")
# Distance entre couples de mots
dist = model.wv.n_similarity(["roi", "reine"], ["homme", "femme"])
print(f"Similarité des couples: {dist:.4f}")
# Mot ne correspondant pas au groupe
odd = model.wv.doesnt_match(["chat", "chien", "oiseau", "chateau"])
print(f"Intrus: {odd}") # Devrait retourner "chateau"
3. FastText avec sous-mots
from gensim.models import FastText
model = FastText(
sentences,
vector_size=100,
window=3,
min_count=1,
sg=1,
epochs=100
)
# Même un mot inconnu du vocabulaire a un vecteur
# car FastText utilise les n-grams de caractères
vec = model.wv.get_vector("château")
print(f"Vecteur 'château' shape: {vec.shape}")
4. Visualisation 2D avec t-SNE
import numpy as np
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
# Extraire les vecteurs de tous les mots
words = list(model.wv.index_to_key)
vectors = np.array([model.wv[word] for word in words])
# Réduction à 2D avec t-SNE
tsne = TSNE(n_components=2, perplexity=5, random_state=42)
vectors_2d = tsne.fit_transform(vectors)
# Visualisation
plt.figure(figsize=(10, 8))
for i, word in enumerate(words):
plt.scatter(vectors_2d[i, 0], vectors_2d[i, 1])
plt.annotate(word, (vectors_2d[i, 0], vectors_2d[i, 1]))
plt.title("Word Embeddings 2D (t-SNE)")
plt.show()
Hyperparamètres
| Hyperparamètre | Valeur typique | Description |
|---|---|---|
vector_size |
100-300 | Dimension des vecteurs (plus = plus de nuances, mais plus lent) |
window |
3-10 | Taille de la fenêtre de contexte (petit = syntaxe, grand = thème) |
min_count |
1-5 | Ignorer les mots apparaissant moins de X fois |
sg |
0 ou 1 | 0 = CBOW (rapide), 1 = Skip-gram (mieux pour mots rares) |
epochs |
5-100 | Nombre de passages sur le corpus (plus pour petits corpus) |
negative |
5-20 | Nombre d’échantillons négatifs pour le negative sampling |
hs |
0 ou 1 | 1 = utiliser hierarchical softmax au lieu du negative sampling |
Avantages des Word Embeddings
- Réduction drastique de dimensionnalité : un vocabulaire de 50 000 mots passe d’un one-hot encoding creux de 50 000 dimensions à un vecteur dense de 300 dimensions.
- Capture de relations sémantiques : les similarités entre mots et les analogies sont encodées dans la géométrie du vecteur.
- Gestion de l’inconnu (FastText) : les sous-mots permettent de représenter des mots jamais vus pendant l’entraînement.
- Léger et rapide : un embedding de 300D pour 100 000 mots pèse ~120 Mo. C’est 1 000 fois plus léger qu’un BERT.
- Interprétable : contrairement aux représentations de BERT qui sont contextuelles (dépendent de la phrase), les embeddings pré-entraînés offrent une représentation fixe et analysable de chaque mot.
Limites des Word Embeddings
- Représentation statique : “Banc” a le même vecteur dans « banc de jardin » et « banc des accusés ». BERT résout ce problème avec des représentations contextuelles.
- Dépendance à la taille du corpus : pour des résultats de qualité, il faut des milliards de mots. Un corpus de 10 000 phrases ne produira pas d’embeddings significatifs.
- Pas de gestion de la syntaxe profonde : les embeddings capturent principalement des associations statistiques, pas la grammaire ou la logique.
- Problème des mots multi-sens : un seul vecteur par mot ne peut représenter toutes les significations possibles.
4 cas d’usage concrets
1. Recherche de documents (moteur sémantique)
Un site d’actualité utilise Word2Vec pour représenter les titres d’articles comme des moyennes de vecteurs de mots. Quand un utilisateur lit un article, on cherche les articles les plus proches dans l’espace des embeddings. Contrairement à un moteur basé sur les mots-clés exacts, ça fonctionne même quand les articles utilisent un vocabulaire différent mais parlent du même sujet.
2. Analyse de sentiments en français
Une entreprise fine-tune un classifieur linéaire sur des embeddings FastText pré-entraînés en français (modèle cc.fr de Facebook) pour classifier les avis clients en positif/négatif. FastText est idéal ici car il gère les erreurs d’orthographe et les variantes morphologiques fréquentes dans les avis en ligne.
3. Détection de plagiat sémantique
Un système universitaire compare les soumissions d’étudiants en convertissant les paragraphes en embeddings moyens et en calculant la similarité cosinus. Contrairement à la détection classique de copier-coller, cette approche détecte aussi les paraphrases où les mots ont été remplacés par des synonymes.
4. Recommandation de produits e-commerce
Les descriptions de produits sont encodées avec des embeddings Word2Vec. Quand un client consulte un produit, on recommande des produits dont les descriptions sont sémantiquement proches. L’approche fonctionne particulièrement bien pour des produits qui n’ont pas de catégorie explicite partagée mais qui sont fonctionnellement similaires.
Conclusion
Les word embeddings ont été la première révolution du NLP profond avant l’arrivée des Transformers. Word2Vec, GloVe et FastText ont démontré que le sens des mots pouvait être appris automatiquement à partir de données brutes, sans annotation manuelle.
Même si les représentations contextuelles de BERT et GPT les ont dépassées en performance, les embeddings pré-entraînés restent pertinents pour des applications légères, des environnements contraints en ressources, ou comme couche d’entrée dans les modèles profonds.
Voir aussi
- Calcul de l’Plus Petit Commun Multiple (PPCM) Moyen en Python : Guide Complet et Astuces
- Maîtriser les Roues Dentées Planétaires avec Python : Simulations et Applications Pratiques

