01
📖 Qu'est-ce qu'un embedding ?
Un embedding est une représentation vectorielle numérique d'un texte (mot, phrase, document) qui capture son sens sémantique. Les mots ou phrases ayant des significations similaires ont des vecteurs proches dans l'espace vectoriel.
💡 À retenir : Un embedding transforme du texte en nombres compréhensibles par les machines tout en préservant la similarité sémantique.
🔢 Visualisation simplifiée :
"Paris" → [0.12, 0.45, 0.78, 0.03, ...] (vecteur 384 dimensions)
"France" → [0.14, 0.42, 0.75, 0.05, ...] (vecteur proche)
"Pizza" → [0.89, 0.12, 0.23, 0.91, ...] (vecteur éloigné)
Propriétés fondamentales :
- ✅ Similarité sémantique : mots proches = vecteurs proches
- ✅ Relations vectorielles : "roi" - "homme" + "femme" ≈ "reine"
- ✅ Dimensions compressées : 384-1536 dimensions (vs vocabulaire de 50k+ mots)
- ✅ Transfer learning : pré-entraînés sur des corpus massifs
02
🧠 Principe des embeddings
Les embeddings sont générés par des modèles de deep learning entraînés sur des corpus massifs de texte. Ils apprennent à placer les mots sémantiquement proches dans des régions voisines de l'espace vectoriel.
📊 Exemple de similarités cosinus :
| Paire de mots |
Similarité |
| "discours" - "allocution" |
0.87 |
| "liberté" - "indépendance" |
0.82 |
| "résistance" - "combat" |
0.79 |
| "discours" - "cuisine" |
0.12 |
| "liberté" - "dictature" |
0.08 |
L'analogie vectorielle
# "roi" - "homme" + "femme" ≈ "reine"
embedding("roi") - embedding("homme") + embedding("femme") ≈ embedding("reine")
03
🤖 Modèles d'embeddings
Sentence-BERT
Dimensions : 384-768
Langues : 50+ (dont français)
Type : Open source
✅ Idéal pour phrases et documents
OpenAI Ada-002
Dimensions : 1536
Langues : Multilingue
Type : API (payant)
✅ Haute qualité, dimensions élevées
Mistral Embed
Dimensions : 1024
Langues : Multilingue
Type : API / Open source
✅ Rapport qualité/prix
CamemBERT
Dimensions : 768
Langues : Français uniquement
Type : Open source
✅ Spécialiste français
💡 Notre recommandation : Pour le français, utilisez Sentence-BERT (paraphrase-multilingual-MiniLM-L12-v2) : gratuit, efficace, 384 dimensions.
04
⚙️ Génération d'embeddings
Avec Sentence-BERT (Python)
from sentence_transformers import SentenceTransformer
# Charger le modèle (téléchargement la première fois)
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# Générer un embedding pour une phrase
phrase = "L'Appel du 18 juin est un discours historique"
embedding = model.encode(phrase)
print(embedding.shape) # (384,) - vecteur de 384 dimensions
print(embedding[:5]) # [ 0.12, -0.34, 0.56, -0.08, 0.23]
Batch processing (plusieurs textes)
# Générer des embeddings pour plusieurs textes
textes = [
"Charles de Gaulle a prononcé l'Appel du 18 juin",
"Victor Hugo a écrit Les Misérables",
"La Résistance française pendant la Seconde Guerre mondiale"
]
embeddings = model.encode(textes)
print(embeddings.shape) # (3, 384)
Avec l'API Le Monde Sémantique
curl -X POST https://lemondesemantique.fr/api/v2/embed \
-H "Authorization: Bearer kg_live_xxxxx" \
-H "Content-Type: application/json" \
-d '{"text": "Discours sur la liberté"}'
05
📊 Mesure de similarité
Une fois les embeddings générés, on compare les vecteurs pour mesurer la similarité sémantique.
Similarité cosinus
import numpy as np
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# Calculer la similarité entre deux phrases
phrase1 = "discours sur la liberté"
phrase2 = "appel à la résistance"
emb1 = model.encode(phrase1)
emb2 = model.encode(phrase2)
similarite = cosine_similarity(emb1, emb2)
print(f"Similarité : {similarite:.3f}") # > 0.7 si sémantiquement proches
Autres métriques
| Métrique | Formule | Utilisation |
| Cosinus
| cos(θ) = (A·B)/(||A||·||B||)
| Textes (orientation, pas magnitude)
|
| Euclidienne
| distance = √Σ(Ai-Bi)²
| Vecteurs proches dans l'espace
|
| Produit scalaire
| similarité = A·B
| Vecteurs normalisés
|
06
🔍 Recherche vectorielle
La recherche vectorielle consiste à trouver les k vecteurs les plus similaires à un vecteur requête.
Avec FAISS
import faiss
# Créer un index FAISS
dimension = 384
index = faiss.IndexFlatIP(dimension) # Similarité cosinus (produit scalaire)
# Ajouter les embeddings
index.add(embeddings) # embeddings: matrice (nb_textes, 384)
# Rechercher les 5 plus similaires
requete = model.encode(["discours sur la liberté"])
scores, indices = index.search(requete, k=5)
for score, idx in zip(scores[0], indices[0]):
print(f"{textes[idx]} (score: {score:.3f})")
📝 Résultat de recherche :
Requête : "discours sur la liberté"
1. "Appel du 18 juin" (score: 0.89)
2. "Appel du 22 juin" (score: 0.85)
3. "Discours de Bayeux" (score: 0.76)
4. "Discours de Grenoble" (score: 0.71)
5. "Discours de Vichy" (score: 0.52)
07
🎯 Cas d'usage des embeddings
1. Recherche sémantique
Trouver des documents par sens, pas par mots-clés.
2. RAG (Retrieval-Augmented Generation)
Récupérer les documents pertinents pour alimenter un LLM.
3. Détection de similarité / plagiat
Comparer des documents pour trouver des passages similaires.
4. Clustering de documents
Grouper des documents par thèmes (classification non supervisée).
5. Recommandation
"Les utilisateurs qui ont aimé ce discours ont aussi aimé..."