La page qui ne partage aucun mot
Un plongement (en anglais embedding) est une liste de nombres qui représente le sens d’un texte. Deux textes de sens proche donnent deux listes qui pointent dans la même direction, et un programme peut alors comparer des sens avec du calcul.
Un visiteur de la médiathèque cherche « règles d’emprunt ». La page utile s’intitule « Conditions de prêt ». Les deux ne partagent aucun mot, donc une recherche par mots ne trouve rien. Les nombres, eux, peuvent la trouver.
À la fin de cette leçon
Remarque
Je peux dire ce qu’est un plongement et comparer deux plongements avec la similarité cosinus.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Plongement | une liste de nombres qui représente un sens | |
| Vecteur | une liste de nombres, vue comme un point ou une flèche | |
| Produit scalaire | la somme des produits des nombres de même rang | |
| Similarité cosinus | un score qui dit si deux flèches pointent pareil | 0.98 |
| Recherche | trouver les morceaux de texte qui correspondent à une question |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Vrais plongements et nos substituts
Un vrai plongement compte des centaines de nombres et vient d’un modèle. Rien dans ce module n’en fabrique.
Les leçons utilisent de petits substituts : des listes inventées de trois nombres, et des comptes de mots que le script calcule lui-même. Ainsi, chaque étape peut être lancée et vérifiée ici. La méthode reste la même.
Un vecteur est une liste de nombres
Imaginez une liste de nombres comme un point sur une carte. Deux nombres donnent un point sur une carte plate. Trois nombres donnent un point dans une pièce.
Donnez un sens à chaque place de la liste. Ici, les trois places sont animal, véhicule et nourriture. Un grand nombre veut dire que le mot parle beaucoup de cette chose.
Exemple travaillé : quatre vecteurs inventés
| Mot | Animal | Véhicule | Nourriture |
|---|---|---|---|
| chat | 0.9 | 0.1 | 0.1 |
| chaton | 0.8 | 0.1 | 0.2 |
| bus | 0.1 | 0.9 | 0.0 |
| croissant | 0.1 | 0.0 | 0.9 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
La similarité cosinus note la ressemblance
Pour comparer deux vecteurs, il faut trois petites étapes. Le produit scalaire multiplie les nombres de même rang et les additionne. La longueur est la racine carrée du produit scalaire du vecteur avec lui-même.
Le cosinus est le produit scalaire divisé par les deux longueurs. Il vaut 1 si les flèches pointent pareil, 0 à angle droit et moins de 0 si elles s’éloignent.
Exemple travaillé : deux petits vecteurs
| Étape | Calcul avec a = [1, 2] et b = [2, 1] | Résultat |
|---|---|---|
| Produit scalaire | 1 x 2 + 2 x 1 | 4 |
| Longueur de a | racine carrée de (1 x 1 + 2 x 2) | 2,24 |
| Longueur de b | racine carrée de (2 x 2 + 1 x 1) | 2,24 |
| Cosinus | 4 divisé par (2,24 x 2,24) | 0,8 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Écrire le calcul sous forme de boucle
Le script suivant contient les quatre vecteurs et écrit les trois étapes sous forme de petites fonctions. Il affiche le cosinus de chaque paire.
Il fabrique aussi un vecteur de comptes : une liste fixe de mots, et le nombre de fois que chacun apparaît dans une phrase. Deux phrases qui emploient les mêmes mots donnent des vecteurs qui pointent pareil.
Écrire le script des vecteurs, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Petits vecteurs inventés : [animal, véhicule, nourriture]. Un vrai plongement a des centaines de nombres.' 'const vecteurs = {' ' chat: [0.9, 0.1, 0.1],' ' chaton: [0.8, 0.1, 0.2],' ' bus: [0.1, 0.9, 0.0],' ' croissant: [0.1, 0.0, 0.9],' '};' 'function produitScalaire(a, b) {' ' let total = 0;' ' for (let i = 0; i < a.length; i++) total = total + a[i] * b[i];' ' return total;' '}' 'function longueur(a) { return Math.sqrt(produitScalaire(a, a)); }' 'function cosinus(a, b) { return produitScalaire(a, b) / (longueur(a) * longueur(b)); }' > vec.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le script des vecteurs, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const noms = Object.keys(vecteurs);' 'for (let i = 0; i < noms.length; i++) {' ' for (let j = i + 1; j < noms.length; j++) {' ' const score = cosinus(vecteurs[noms[i]], vecteurs[noms[j]]);' ' console.log(noms[i] + \" et \" + noms[j] + \" : \" + score.toFixed(2));' ' }' '}' '// Un vecteur de comptes : combien de fois chaque mot d’une liste fixe apparaît.' 'const vocabulaire = [\"ouvre\", \"tard\", \"livre\", \"amende\"];' 'function comptes(phrase) {' ' const trouves = phrase.toLowerCase().split(\" \");' ' return vocabulaire.map(function (mot) {' ' return trouves.filter(function (un) { return un === mot; }).length;' ' });' '}' >> vec.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le script des vecteurs, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const un = comptes(\"ouvre tard ouvre\");' 'const deux = comptes(\"livre ouvre tard\");' 'console.log(\"Comptes :\", un.join(\" \"), \"et\", deux.join(\" \"));' 'console.log(\"Cosinus des comptes :\", cosinus(un, deux).toFixed(2));' >> vec.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lancer le script et lire les scores
docker exec -w /home/node/project agent node vec.jsAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Ce qu’il affiche
| Ligne | Ce qu’elle montre |
|---|---|
| chat et chaton : 0.99 | Très ressemblants |
| chat et bus : 0.22 | Peu ressemblants |
| bus et croissant : 0.01 | Presque rien en commun |
| Cosinus des comptes : 0.77 | Les phrases partagent les mots ouvre et tard |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
Beaucoup de gens croient qu’un cosinus de 0,9 veut dire « identique à 90 % ». Ce n’est pas le cas. Le score sert seulement à classer : 0,9 est plus proche que 0,5. Servez-vous-en pour ordonner, jamais comme un pourcentage de vérité.