{"id":487,"date":"2026-10-07T16:15:01","date_gmt":"2026-10-07T14:15:01","guid":{"rendered":"https:\/\/www.ranksignal.fr\/blog\/?p=487"},"modified":"2026-10-14T17:47:44","modified_gmt":"2026-10-14T15:47:44","slug":"que-sont-les-embeddings","status":"publish","type":"post","link":"https:\/\/www.ranksignal.fr\/blog\/rag\/que-sont-les-embeddings\/","title":{"rendered":"Embeddings : comment une machine range les mots par le sens"},"content":{"rendered":"<p><\/p>\n<p>Pour un sac de mots, \u00ab good \u00bb et \u00ab great \u00bb sont deux colonnes distinctes d&rsquo;un tableau, sans plus de lien que n&rsquo;importe quelle autre paire. N&rsquo;importe quel lecteur sent pourtant qu&rsquo;elles se ressemblent. Les embeddings sont le proc\u00e9d\u00e9 qui rend cette intuition \u00e0 la machine : ils donnent \u00e0 chaque mot, phrase ou image une adresse dans un espace o\u00f9 le voisinage veut dire quelque chose.<\/p>\n<p>\u00c0 la fin, tu sauras ce qu&rsquo;est un embedding, comment un r\u00e9seau de neurones apprend ces adresses en jouant \u00e0 deviner un mot manquant, \u00e0 quoi elles servent, et dans quels cas elles te trompent.<\/p>\n<p><strong>Sommaire<\/strong><\/p>\n<ul>\n<li><a href=\"#l-essentiel-en-30-secondes\">L&rsquo;essentiel en 30 secondes<\/a><\/li>\n<li><a href=\"#pourquoi-compter-les-mots-ne-suffit-pas\">Pourquoi compter les mots ne suffit pas<\/a><\/li>\n<li><a href=\"#un-mot-vaut-ses-voisins-la-definition-d-un-embedding\">Un mot vaut ses voisins : la d\u00e9finition d&rsquo;un embedding<\/a><\/li>\n<li><a href=\"#comment-un-reseau-apprend-ces-adresses\">Comment un r\u00e9seau apprend ces adresses<\/a><\/li>\n<li><a href=\"#interroger-l-espace-voisins-analogies-et-rates\">Interroger l&rsquo;espace : voisins, analogies et rat\u00e9s<\/a><\/li>\n<li><a href=\"#a-quoi-ca-sert-au-dela-de-la-recherche\">\u00c0 quoi \u00e7a sert, au-del\u00e0 de la recherche<\/a><\/li>\n<li><a href=\"#quand-le-vecteur-depend-de-la-phrase\">Quand le vecteur d\u00e9pend de la phrase<\/a><\/li>\n<li><a href=\"#apprendre-par-contraste-les-embeddings-de-phrases\">Apprendre par contraste : les embeddings de phrases<\/a><\/li>\n<li><a href=\"#pas-seulement-du-texte-images-et-graphes\">Pas seulement du texte : images et graphes<\/a><\/li>\n<li><a href=\"#ce-qu-on-croit-a-tort-des-embeddings\">Ce qu&rsquo;on croit \u00e0 tort des embeddings<\/a><\/li>\n<\/ul>\n<h2 id=\"l-essentiel-en-30-secondes\">L&rsquo;essentiel en 30 secondes<\/h2>\n<ul>\n<li>Un embedding est <strong>un vecteur dense de longueur fixe<\/strong> qui capte le sens d&rsquo;un texte, d&rsquo;une image ou d&rsquo;un autre contenu.<\/li>\n<li>On l&rsquo;obtient en apprenant \u00e0 <strong>deviner le contexte d&rsquo;un mot<\/strong> : les poids du r\u00e9seau deviennent les vecteurs, sans \u00e9tiquette \u00e0 fournir.<\/li>\n<li>Deux contenus de sens proche re\u00e7oivent des adresses voisines, ce qui permet de les comparer <strong>avec de simples math\u00e9matiques<\/strong>.<\/li>\n<li>Les mod\u00e8les actuels produisent des vecteurs <strong>contextuels<\/strong> : le m\u00eame mot n&rsquo;a plus la m\u00eame adresse selon la phrase.<\/li>\n<li>Leur sens vient des <strong>cooccurrences observ\u00e9es<\/strong> : ils h\u00e9ritent des biais des textes et ne se comparent pas d&rsquo;un mod\u00e8le \u00e0 l&rsquo;autre.<\/li>\n<\/ul>\n<h2 id=\"pourquoi-compter-les-mots-ne-suffit-pas\">Pourquoi compter les mots ne suffit pas<\/h2>\n<p>Un texte devient num\u00e9rique par paliers. On part du texte brut, on passe \u00e0 l&rsquo;encodage one-hot (un 1 par mot, le reste \u00e0 z\u00e9ro), puis au sac de mots et au TF-IDF, qui comptent les fr\u00e9quences par document, et l&rsquo;on arrive enfin aux embeddings.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46b78af2&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46b78af2\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2250\" height=\"960\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_chaine_representations.png\" alt=\"Cha\u00eene de repr\u00e9sentations du texte, du texte brut \u00e0 l'encodage one-hot, puis au sac de mots et au TF-IDF, jusqu'aux embeddings, de plus en plus compacts\" class=\"wp-image-481\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_chaine_representations.png 2250w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_chaine_representations-300x128.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_chaine_representations-1024x437.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_chaine_representations-768x328.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_chaine_representations-1536x655.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_chaine_representations-2048x874.png 2048w\" sizes=\"auto, (max-width: 2250px) 100vw, 2250px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Lis la cha\u00eene de gauche \u00e0 droite : chaque case est plus compacte que la pr\u00e9c\u00e9dente, et seule la derni\u00e8re porte du sens. Les trois premi\u00e8res ne mesurent que la pr\u00e9sence et la fr\u00e9quence des mots.<\/figcaption><\/figure>\n\n\n<p>Le sac de mots a un d\u00e9faut de fond : il jette en vrac les mots d&rsquo;un document et ignore leur ordre. Il a aussi un d\u00e9faut de taille. Le vocabulaire grandit avec le corpus, et <strong>les vecteurs avec lui<\/strong>, tout en restant creux, c&rsquo;est-\u00e0-dire presque enti\u00e8rement faits de z\u00e9ros.<\/p>\n<p>Un vecteur tr\u00e8s long co\u00fbte de la m\u00e9moire et du calcul, mais aussi de la qualit\u00e9 : plus il est long, plus l&rsquo;algorithme a de poids \u00e0 apprendre et plus le surapprentissage menace. C&rsquo;est le <em>fl\u00e9au de la dimension<\/em> : plus il y a de caract\u00e9ristiques, moins les distances entre exemples veulent dire quelque chose.<\/p>\n<p>Le TF-IDF corrige une partie du probl\u00e8me en \u00e9crasant les mots qui reviennent partout et en valorisant ceux qui sont propres \u00e0 quelques documents. Mais il laisse intacts le creux et la grande dimension : ce qu&rsquo;on cherche, c&rsquo;est un vecteur petit, qui garde l&rsquo;information de contexte.<\/p>\n<h2 id=\"un-mot-vaut-ses-voisins-la-definition-d-un-embedding\">Un mot vaut ses voisins : la d\u00e9finition d&rsquo;un embedding<\/h2>\n<p>L&rsquo;issue vient d&rsquo;une hypoth\u00e8se de linguiste, dite <em>distributionnelle<\/em> : des mots qui se retrouvent dans les m\u00eames contextes ont le m\u00eame sens. Inversement, un m\u00eame mot change de sens avec son entourage : \u00ab je suis all\u00e9 d\u00e9poser de l&rsquo;argent \u00e0 la banque \u00bb n&rsquo;a rien \u00e0 voir avec \u00ab nous avons pique-niqu\u00e9 sur la berge de la rivi\u00e8re \u00bb.<\/p>\n<p>On voudrait donc un tableau de vecteurs, un par mot, qui soient petits, compos\u00e9s de nombres r\u00e9els (on dit <strong>denses<\/strong>) et qui conservent l&rsquo;information de contexte. Leur taille ne doit pas grandir avec le vocabulaire. Leur sens est <em>distribu\u00e9<\/em> : au lieu de se loger dans l&rsquo;unique case \u00e0 1 du cas creux, il se r\u00e9partit sur l&rsquo;ensemble des composantes. Ces vecteurs s&rsquo;appellent des <strong>embeddings de mots<\/strong>, introduits en 2013 par Mikolov avec le cadre Word2Vec.<\/p>\n<p>La notion s&rsquo;est ensuite g\u00e9n\u00e9ralis\u00e9e. Un mod\u00e8le d&#8217;embedding transforme un texte de longueur variable, ou une autre modalit\u00e9 comme une image, en un vecteur de longueur fixe qui capte le sens de l&rsquo;entr\u00e9e. Ce vecteur compte en g\u00e9n\u00e9ral de quelques centaines \u00e0 quelques milliers de valeurs. Dans cet espace partag\u00e9, on compare deux contenus en mesurant la distance entre leurs vecteurs.<\/p>\n<blockquote>\n<p><strong>\ud83d\udca1 Intuition<\/strong> Dans un sac de mots, un mot est une case allum\u00e9e parmi des milliers : on sait <em>quel<\/em> mot c&rsquo;est, pas ce qu&rsquo;il veut dire. Dans un embedding, un mot est un point : sa position dit de quels mots il est le voisin. Avec une seule dimension, on ne saurait pas ranger fid\u00e8lement des mots aussi diff\u00e9rents qu&rsquo;un animal, un bruit et une action ; en ajoutant des dimensions, la carte gagne en nuances.<\/p>\n<\/blockquote>\n<h2 id=\"comment-un-reseau-apprend-ces-adresses\">Comment un r\u00e9seau apprend ces adresses<\/h2>\n<p>Personne n&rsquo;\u00e9crit ces vecteurs \u00e0 la main. L&rsquo;intuition de Word2Vec est simple : pr\u00e9dire un mot \u00e0 partir de son contexte. On dispose d&rsquo;un r\u00e9seau de neurones et d&rsquo;un grand corpus ; en l&rsquo;entra\u00eenant \u00e0 deviner quels mots se trouvent pr\u00e8s d&rsquo;un mot cible, <strong>les poids deviennent les embeddings<\/strong>. Le mod\u00e8le est auto-supervis\u00e9 : les \u00e9tiquettes sont implicites, il n&rsquo;y a rien \u00e0 annoter.<\/p>\n<p>Pour aller vite, Word2Vec transforme la t\u00e2che en une question oui\/non : tel mot est-il attendu dans le contexte de tel autre ? Une fen\u00eatre se d\u00e9place le long du texte. Les mots autour du mot central sont les exemples positifs ; des mots tir\u00e9s au hasard dans le vocabulaire servent d&rsquo;exemples n\u00e9gatifs. Un classifieur de <a href=\"\/blog\/maths\/vulgarisation-mathematique-extreme-qui-explique-de-maniere-intuitive-et-sans-jargon-les-concepts-mathematiques-derriere-la-regression-logistique\/\" title=\"r\u00e9gression logistique\">r\u00e9gression logistique<\/a> apprend \u00e0 les distinguer, et ses poids sont les embeddings.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46b790a0&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46b790a0\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2250\" height=\"1200\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_word2vec_fenetre.png\" alt=\"Fen\u00eatre glissante de Word2Vec sur \u00ab le chat mange des croquettes \u00bb : le mot cible \u00ab mange \u00bb est entour\u00e9 de \u00ab chat \u00bb et \u00ab des \u00bb, positifs, tandis que \u00ab voiture \u00bb et \u00ab nuage \u00bb sont tir\u00e9s au hasard comme n\u00e9gatifs\" class=\"wp-image-319\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_word2vec_fenetre.png 2250w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_word2vec_fenetre-300x160.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_word2vec_fenetre-1024x546.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_word2vec_fenetre-768x410.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_word2vec_fenetre-1536x819.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_word2vec_fenetre-2048x1092.png 2048w\" sizes=\"auto, (max-width: 2250px) 100vw, 2250px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Sur le sch\u00e9ma, \u00ab chat \u00bb et \u00ab des \u00bb sont les voisins r\u00e9els de \u00ab mange \u00bb : le mod\u00e8le doit les juger plausibles. \u00ab voiture \u00bb et \u00ab nuage \u00bb n&rsquo;ont rien \u00e0 faire l\u00e0 : le mod\u00e8le doit les rejeter. C&rsquo;est cette pression, r\u00e9p\u00e9t\u00e9e sur des millions de phrases, qui range les mots.<\/figcaption><\/figure>\n\n\n<p>Reste \u00e0 dire comment \u00ab plausible \u00bb se mesure. Pour un mot cible <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-dfee5c980777976ae8cf6541893fb572_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#119;\" title=\"Rendered by QuickLaTeX.com\" height=\"8\" width=\"13\" style=\"vertical-align: 0px;\"\/> et un mot de contexte <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-41a04eeea923a1a0c28094a8a4680525_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#99;\" title=\"Rendered by QuickLaTeX.com\" height=\"8\" width=\"8\" style=\"vertical-align: 0px;\"\/>, on veut que la probabilit\u00e9 que <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-41a04eeea923a1a0c28094a8a4680525_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#99;\" title=\"Rendered by QuickLaTeX.com\" height=\"8\" width=\"8\" style=\"vertical-align: 0px;\"\/> soit dans le contexte de <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-dfee5c980777976ae8cf6541893fb572_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#119;\" title=\"Rendered by QuickLaTeX.com\" height=\"8\" width=\"13\" style=\"vertical-align: 0px;\"\/> suive la similarit\u00e9 de leurs embeddings, mesur\u00e9e par le produit scalaire <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-74ee614d444d168595e4b6e8a70f8ce9_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#99;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#119;\" title=\"Rendered by QuickLaTeX.com\" height=\"8\" width=\"33\" style=\"vertical-align: 0px;\"\/> transform\u00e9 en probabilit\u00e9 par la fonction sigmo\u00efde :<\/p>\n<p><p class=\"ql-center-displayed-equation\" style=\"line-height: 41px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-85ac149f69d9f0f6c2594c4520a80256_l3.png\" height=\"41\" width=\"317\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91; &#80;&#40;&#43;&#92;&#109;&#105;&#100;&#32;&#119;&#44;&#99;&#41;&#61;&#92;&#115;&#105;&#103;&#109;&#97;&#40;&#99;&#92;&#99;&#100;&#111;&#116;&#32;&#119;&#41;&#61;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#49;&#43;&#92;&#101;&#120;&#112;&#40;&#45;&#99;&#92;&#99;&#100;&#111;&#116;&#32;&#119;&#41;&#125;&#46;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n<p>Le produit scalaire est grand quand les deux vecteurs ont des valeurs importantes dans les m\u00eames dimensions ; la sigmo\u00efde l&rsquo;\u00e9crase en un nombre entre 0 et 1, lisible comme une probabilit\u00e9. Si les vecteurs de <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-dfee5c980777976ae8cf6541893fb572_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#119;\" title=\"Rendered by QuickLaTeX.com\" height=\"8\" width=\"13\" style=\"vertical-align: 0px;\"\/> et <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-41a04eeea923a1a0c28094a8a4680525_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#99;\" title=\"Rendered by QuickLaTeX.com\" height=\"8\" width=\"8\" style=\"vertical-align: 0px;\"\/> se ressemblent, <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-41a04eeea923a1a0c28094a8a4680525_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#99;\" title=\"Rendered by QuickLaTeX.com\" height=\"8\" width=\"8\" style=\"vertical-align: 0px;\"\/> doit appara\u00eetre souvent pr\u00e8s de <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-dfee5c980777976ae8cf6541893fb572_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#119;\" title=\"Rendered by QuickLaTeX.com\" height=\"8\" width=\"13\" style=\"vertical-align: 0px;\"\/>.<\/p>\n<p>Pour l&rsquo;entra\u00eenement, on additionne deux termes : on veut une grande probabilit\u00e9 pour le vrai voisin, et une petite pour chacun des <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-66a9f474fc3c52efdfb0ba6a70199ee8_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#76;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"12\" style=\"vertical-align: 0px;\"\/> mots tir\u00e9s au hasard. En passant au logarithme, les produits deviennent des sommes, et l&rsquo;on minimise l&rsquo;entropie crois\u00e9e :<\/p>\n<p><p class=\"ql-center-displayed-equation\" style=\"line-height: 52px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-a7fc9fa359be361f6d4fcec8003eca46_l3.png\" height=\"52\" width=\"394\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91; &#76;&#95;&#123;&#67;&#69;&#125;&#61;&#45;&#92;&#108;&#111;&#103;&#32;&#80;&#40;&#43;&#92;&#109;&#105;&#100;&#32;&#119;&#44;&#99;&#95;&#123;&#112;&#111;&#115;&#125;&#41;&#45;&#92;&#115;&#117;&#109;&#95;&#123;&#105;&#61;&#49;&#125;&#94;&#123;&#76;&#125;&#92;&#108;&#111;&#103;&#32;&#80;&#40;&#45;&#92;&#109;&#105;&#100;&#32;&#119;&#44;&#99;&#95;&#123;&#110;&#101;&#103;&#125;&#41;&#46;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n<p>Lis-la en deux morceaux. Le premier terme est petit quand le vrai voisin <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-ecbfa8a8abc13ed93e4b58980470b2a0_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#99;&#95;&#123;&#112;&#111;&#115;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"14\" width=\"28\" style=\"vertical-align: -6px;\"\/> re\u00e7oit une probabilit\u00e9 proche de 1. La somme est petite quand les faux voisins <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-4c7673aa577b792c3e357dbb7e4659f3_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#99;&#95;&#123;&#110;&#101;&#103;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"14\" width=\"29\" style=\"vertical-align: -6px;\"\/> re\u00e7oivent une probabilit\u00e9 proche de 0. Minimiser la perte, c&rsquo;est donc rapprocher les mots qui cohabitent et \u00e9loigner les autres.<\/p>\n<p>Un d\u00e9tail pratique : le mod\u00e8le apprend en r\u00e9alit\u00e9 deux matrices de vecteurs, une pour les mots cibles et une pour les mots de contexte, tr\u00e8s proches l&rsquo;une de l&rsquo;autre. On n&rsquo;en garde qu&rsquo;une, et c&rsquo;est elle qui forme l&#8217;embedding.<\/p>\n<p>Trois r\u00e9glages p\u00e8sent sur la qualit\u00e9 du r\u00e9sultat :<\/p>\n<ul>\n<li>la qualit\u00e9 des donn\u00e9es : Wikip\u00e9dia donne de meilleurs embeddings pour les t\u00e2ches s\u00e9mantiques, la presse am\u00e9liore les t\u00e2ches syntaxiques (un m\u00e9lange est recommand\u00e9), et les r\u00e9seaux sociaux peuvent introduire des biais ; une plus grande quantit\u00e9 de texte aide aussi, au prix d&rsquo;un entra\u00eenement bien plus long ;<\/li>\n<li>la dimension : plus l&#8217;embedding est grand, meilleures sont les performances, mais <strong>300 est un bon compromis<\/strong>, car au-del\u00e0 le gain devient n\u00e9gligeable ;<\/li>\n<li>la taille de la fen\u00eatre : une fen\u00eatre de 2 donne des vecteurs qui identifient mieux les cat\u00e9gories grammaticales, de longues fen\u00eatres conviennent mieux \u00e0 une similarit\u00e9 large.<\/li>\n<\/ul>\n<p>En Python, la biblioth\u00e8que gensim r\u00e9duit tout cela \u00e0 quelques lignes. <code>list_of_tokens<\/code> est la liste des phrases d\u00e9j\u00e0 d\u00e9coup\u00e9es en mots.<\/p>\n<pre><code>from gensim.models import Word2Vec\nmodel = Word2Vec(sentences=list_of_tokens,\n                 sg=1,\n                 vector_size=100,\n                 window=5,\n                 workers=4)\n<\/code><\/pre>\n<p>Le param\u00e8tre <code>sg=1<\/code> choisit l&rsquo;architecture skip-gram, qui pr\u00e9dit le contexte \u00e0 partir du mot central. Ici, l&#8217;embedding a 100 dimensions, la fen\u00eatre contient 5 mots, et <code>workers=4<\/code> r\u00e9partit le calcul sur 4 threads.<\/p>\n<h2 id=\"interroger-l-espace-voisins-analogies-et-rates\">Interroger l&rsquo;espace : voisins, analogies et rat\u00e9s<\/h2>\n<p>Une fois les vecteurs appris, on peut les questionner. La premi\u00e8re question est : quels sont les mots les plus proches de <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-dfee5c980777976ae8cf6541893fb572_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#119;\" title=\"Rendered by QuickLaTeX.com\" height=\"8\" width=\"13\" style=\"vertical-align: 0px;\"\/> ? La seconde est celle des analogies, que les chercheurs repr\u00e9sentent par un parall\u00e9logramme : puisque les mots sont des vecteurs, on les additionne et on les soustrait.<\/p>\n<p>Voici le test complet, sur le mod\u00e8le entra\u00een\u00e9 plus haut. Les premi\u00e8res lignes cherchent les trois mots les plus proches de \u00ab good \u00bb et comparent sa distance \u00e0 un synonyme (\u00ab great \u00bb) et \u00e0 un antonyme (\u00ab bad \u00bb). Les derni\u00e8res retirent \u00ab man \u00bb de \u00ab king \u00bb, ajoutent \u00ab woman \u00bb, et affichent le mot le plus proche du r\u00e9sultat.<\/p>\n<pre><code>word_1 = &quot;good&quot;\nsyn = &quot;great&quot;\nant = &quot;bad&quot;\nmost_sim =model.wv.most_similar(&quot;good&quot;)\nprint(&quot;Top 3 most similar words to {} are :{}&quot;.format(\n    word_1, most_sim[:3]))\nsynonyms_dist = model.wv.distance(word_1, syn)\nantonyms_dist = model.wv.distance(word_1, ant)\nprint(&quot;Synonyms {}, {} have cosine distance: {}&quot;.format(\n    word_1, syn, synonyms_dist))\nprint(&quot;Antonyms {}, {} have cosine distance: {}&quot;.format(\n    word_1, ant, antonyms_dist))\na = 'king'\na_star = 'man'\nb = 'woman'\nb_star= model.wv.most_similar(positive=[a, b], negative=[a_star])\nprint(&quot;{} is to {} as {} is to: {} &quot;.format(\n    a, a_star, b, b_star[0][0]))\n<\/code><\/pre>\n<p>Que lire dans les r\u00e9sultats ? Le mod\u00e8le <strong>g\u00e8re mal les antonymes<\/strong> : leur distance \u00e0 \u00ab good \u00bb ne les distingue pas nettement des synonymes. La raison est dans la d\u00e9finition m\u00eame du voisinage, fond\u00e9e sur l&rsquo;apparition dans la m\u00eame fen\u00eatre de contexte : \u00ab good \u00bb et \u00ab bad \u00bb se glissent dans les m\u00eames phrases.<\/p>\n<p>Les analogies, elles, marchent \u00e0 demi : la bonne r\u00e9ponse n&rsquo;est pas toujours la premi\u00e8re, mais elle figure souvent parmi les trois premi\u00e8res. Elles r\u00e9ussissent bien pour des entit\u00e9s fr\u00e9quentes (noms de villes, mots courants) et nettement moins pour des entit\u00e9s rares.<\/p>\n<p>Ces vecteurs ont entre 100 et 1 024 dimensions, impossibles \u00e0 regarder tels quels. Pour les visualiser, on les projette en deux ou trois dimensions avec l&rsquo;analyse en composantes principales (PCA), le t-SNE ou, plus r\u00e9cemment, UMAP. UMAP pr\u00e9serve mieux le sens et les structures locales comme globales, ce qui donne de meilleurs groupes ; on voit alors les mots de sens voisin se regrouper.<\/p>\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Une carte en deux dimensions est une projection, pas l&rsquo;espace lui-m\u00eame : deux points qui paraissent voisins sur l&rsquo;\u00e9cran peuvent \u00eatre \u00e9loign\u00e9s dans les 100 dimensions d&rsquo;origine.<\/p>\n<\/blockquote>\n<h2 id=\"a-quoi-ca-sert-au-dela-de-la-recherche\">\u00c0 quoi \u00e7a sert, au-del\u00e0 de la recherche<\/h2>\n<p>Un embedding est une brique, rarement une fin. On le retrouve dans la recherche et les syst\u00e8mes de recommandation, mais aussi pour b\u00e2tir des m\u00e9moires d&rsquo;agents. Quelques usages moins connus montrent l&rsquo;\u00e9tendue du principe.<\/p>\n<p><strong>Suivre l&rsquo;\u00e9volution d&rsquo;un mot.<\/strong> En entra\u00eenant des embeddings sur des corpus qui couvrent plusieurs d\u00e9cennies, on voit des mots comme <em>gay<\/em>, <em>broadcast<\/em> ou <em>awful<\/em> changer de voisinage s\u00e9mantique d&rsquo;une \u00e9poque \u00e0 l&rsquo;autre.<\/p>\n<p><strong>Nettoyer un jeu de donn\u00e9es.<\/strong> Pour pr\u00e9parer des exemples d&rsquo;entra\u00eenement, on d\u00e9duplique par similarit\u00e9 d&#8217;embeddings : deux textes dont les vecteurs sont presque confondus sont probablement des doublons.<\/p>\n<p><strong>Choisir le bon outil.<\/strong> Un agent qui dispose de nombreux outils peut encoder une fois la description de chacun dans une base de vecteurs. \u00c0 chaque requ\u00eate, il encode le contexte courant avec le m\u00eame mod\u00e8le et retient les <em>k<\/em> outils les plus proches, parmi lesquels le mod\u00e8le de langage fait son choix. C&rsquo;est le motif le plus courant et le plus recommand\u00e9 dans la plupart des cas : g\u00e9n\u00e9ralement plus rapide que de tout lui pr\u00e9senter, performant et raisonnablement extensible.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46b79610&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46b79610\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1408\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b4_ch05_selection_semantique-scaled.png\" alt=\"S\u00e9lection s\u00e9mantique d'outils : les descriptions sont encod\u00e9es une seule fois dans une base de vecteurs, la requ\u00eate retrouve les k outils les plus proches, puis le mod\u00e8le choisit l'outil et ses param\u00e8tres\" class=\"wp-image-482\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b4_ch05_selection_semantique-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b4_ch05_selection_semantique-300x165.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b4_ch05_selection_semantique-1024x563.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b4_ch05_selection_semantique-768x422.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b4_ch05_selection_semantique-1536x845.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b4_ch05_selection_semantique-2048x1126.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Remarque que le calcul co\u00fbteux, l&rsquo;encodage des descriptions, se fait une fois ; le calcul r\u00e9p\u00e9t\u00e9 \u00e0 chaque requ\u00eate se r\u00e9duit \u00e0 une comparaison de vecteurs.<\/figcaption><\/figure>\n\n\n<p><strong>Alimenter un classifieur.<\/strong> On peut aussi apprendre un embedding <em>dans<\/em> un r\u00e9seau, pour une t\u00e2che pr\u00e9cise. Exemple : classer 50 000 avis de films, positifs ou n\u00e9gatifs, de 230 mots en moyenne. Le r\u00e9seau transforme chaque avis en indices de mots, les convertit en embeddings de 300 dimensions, les passe dans trois couches GRU de 256 unit\u00e9s avec un dropout de 0,5, puis dans une couche lin\u00e9aire suivie d&rsquo;une sigmo\u00efde.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46b79b7a&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46b79b7a\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2250\" height=\"1260\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_architecture_sentiments.png\" alt=\"Architecture du classifieur de sentiments : avis brut, indices de mots avec remplissage, embedding de 300 dimensions, GRU \u00e0 3 couches de 256 unit\u00e9s avec dropout 0,5, couche lin\u00e9aire et sigmo\u00efde, pr\u00e9diction positive ou n\u00e9gative\" class=\"wp-image-483\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_architecture_sentiments.png 2250w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_architecture_sentiments-300x168.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_architecture_sentiments-1024x573.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_architecture_sentiments-768x430.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_architecture_sentiments-1536x860.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch01_architecture_sentiments-2048x1147.png 2048w\" sizes=\"auto, (max-width: 2250px) 100vw, 2250px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Sur le sch\u00e9ma, l&#8217;embedding est la deuxi\u00e8me marche : c&rsquo;est lui qui transforme des indices sans sens en vecteurs que les couches suivantes peuvent exploiter. Dans le code, il se r\u00e8gle par un seul hyperparam\u00e8tre.<\/figcaption><\/figure>\n\n\n<pre><code># Hyperparameters\nno_layers = 3\nvocab_size = len(vocab) + 1  # extra 1 for padding\nembedding_dim = 300\noutput_dim = 1\nhidden_dim = 256\n# Initialize the model\nmodel = SentimentRNN(no_layers, vocab_size, hidden_dim,\n                     embedding_dim, drop_prob=0.5)\n<\/code><\/pre>\n<p>Ici, <code>embedding_dim = 300<\/code> fixe la taille de chaque vecteur de mot, et <code>vocab_size<\/code> le nombre de mots connus (<code>vocab<\/code> est le vocabulaire construit au pr\u00e9traitement), plus une case r\u00e9serv\u00e9e au remplissage. Apr\u00e8s l&rsquo;entra\u00eenement, si l&rsquo;on projette les avis, <strong>l&#8217;embedding s&rsquo;est organis\u00e9 selon le sentiment<\/strong> : le mod\u00e8le a appris \u00e0 s\u00e9parer avis positifs et n\u00e9gatifs.<\/p>\n<h2 id=\"quand-le-vecteur-depend-de-la-phrase\">Quand le vecteur d\u00e9pend de la phrase<\/h2>\n<p>Revenons \u00e0 la banque et \u00e0 la berge. Un vecteur Word2Vec est fixe : il repr\u00e9sente une somme pond\u00e9r\u00e9e des diff\u00e9rents sens du mot, en proportion de leur fr\u00e9quence dans le texte, une superposition lin\u00e9aire. Quand on additionne ou soustrait des vecteurs pour une analogie, on travaille sur ces composantes : dans \u00ab pomme : rouge :: banane : ? \u00bb, on ne retire \u00e0 \u00ab pomme \u00bb que la part proche de \u00ab rouge \u00bb.<\/p>\n<p>Pour qu&rsquo;un m\u00eame mot ait plusieurs adresses selon son contexte, on passe par un <a href=\"\/blog\/deep-learning\/qu-est-ce-qu-un-transformer\/\" title=\"Transformer\">Transformer<\/a>. Pour une s\u00e9quence de jetons, on extrait la repr\u00e9sentation <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-4586e340cb83d5b642972e97a288fec2_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#122;\" title=\"Rendered by QuickLaTeX.com\" height=\"8\" width=\"9\" style=\"vertical-align: 0px;\"\/> obtenue \u00e0 la derni\u00e8re couche : on obtient un vecteur de grande dimension qui d\u00e9sambigu\u00efse le sens. \u00ab Banque \u00bb, dans un contexte d&rsquo;argent ou de rivi\u00e8re, re\u00e7oit des <strong>embeddings contextuels diff\u00e9rents<\/strong>, ce que montre clairement une projection t-SNE de BERT.<\/p>\n<p>Par commodit\u00e9 on prend la derni\u00e8re couche, mais on propose en g\u00e9n\u00e9ral de moyenner les repr\u00e9sentations de plusieurs couches, car chaque bloc apprend une repr\u00e9sentation diff\u00e9rente du texte.<\/p>\n<p>O\u00f9 ce vecteur se fabrique-t-il ? Au tout d\u00e9but du mod\u00e8le. Le texte est d&rsquo;abord d\u00e9coup\u00e9 en jetons, puis une \u00e9tape d&#8217;embedding fournit un vecteur par jeton ; comme l&rsquo;auto-attention ne conna\u00eet pas l&rsquo;ordre, on additionne aux vecteurs un encodage de la position de chaque jeton. Un <a href=\"\/blog\/inference\/qu-est-ce-qu-un-llm\/\" title=\"grand mod\u00e8le de langage\">grand mod\u00e8le de langage<\/a> se compose ainsi de trois sortes de couches : la couche d&#8217;embedding, couche d&rsquo;entr\u00e9e qui prend des jetons et renvoie des embeddings ; des dizaines \u00e0 centaines de blocs transformeurs ; et une couche de sortie qui produit un score par jeton du vocabulaire.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46b7a072&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46b7a072\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1067\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch03_anatomie_bloc_transformer-scaled.png\" alt=\"Anatomie d'un mod\u00e8le transformer : embedding des tokens en vecteurs, bloc r\u00e9p\u00e9t\u00e9 des dizaines \u00e0 centaines de fois, t\u00eate de langage qui produit un logit par token, et d\u00e9tail d'un bloc avec normalisation, attention multi-t\u00eates et r\u00e9seau feed-forward\" class=\"wp-image-484\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch03_anatomie_bloc_transformer-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch03_anatomie_bloc_transformer-300x125.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch03_anatomie_bloc_transformer-1024x427.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch03_anatomie_bloc_transformer-768x320.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch03_anatomie_bloc_transformer-1536x640.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch03_anatomie_bloc_transformer-2048x853.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">L&#8217;embedding est la porte d&rsquo;entr\u00e9e du sch\u00e9ma. On peut m\u00eame la rouvrir apr\u00e8s coup : en retirant la derni\u00e8re couche d&rsquo;un Transformer, on obtient une repr\u00e9sentation contextualis\u00e9e du texte.<\/figcaption><\/figure>\n\n\n<p>Ces vecteurs contextuels ont une particularit\u00e9 \u00e9trange : l&rsquo;<strong>anisotropie<\/strong>. Pour des mots pris au hasard, leur similarit\u00e9 est plus \u00e9lev\u00e9e qu&rsquo;elle ne devrait l&rsquo;\u00eatre. La cause : de 1 \u00e0 5 <em>dimensions aberrantes<\/em>, de grande magnitude et de variance disproportionn\u00e9e, dominent le vecteur. Elles sont tr\u00e8s corr\u00e9l\u00e9es \u00e0 la position absolue et \u00e0 la ponctuation, donc peu informatives. On les att\u00e9nue par une transformation comme la normalisation par z-score.<\/p>\n<h2 id=\"apprendre-par-contraste-les-embeddings-de-phrases\">Apprendre par contraste : les embeddings de phrases<\/h2>\n<p>Pour comparer des phrases enti\u00e8res, la devinette du mot manquant ne suffit plus. On entra\u00eene le mod\u00e8le en lui montrant des paires : une phrase doit avoir un embedding proche de celui d&rsquo;un exemple positif, et \u00e9loign\u00e9 de celui d&rsquo;un exemple n\u00e9gatif. On parle d&rsquo;<strong>apprentissage contrastif<\/strong>. Entra\u00eener un mod\u00e8le de z\u00e9ro est possible, mais il vaut en g\u00e9n\u00e9ral mieux prendre un LLM entra\u00een\u00e9 sans supervision et l&rsquo;adapter \u00e0 cette t\u00e2che.<\/p>\n<p>Un jeu tr\u00e8s utilis\u00e9 est MultiNLI : 433 000 paires de phrases annot\u00e9es. \u00c0 partir d&rsquo;une hypoth\u00e8se, la seconde phrase exprime une implication, une contradiction ou ni l&rsquo;une ni l&rsquo;autre (neutre). Une phrase en implication sert d&rsquo;exemple positif, une contradiction d&rsquo;exemple n\u00e9gatif.<\/p>\n<p>Deux fonctions de perte dominent :<\/p>\n<ul>\n<li>la <strong>perte de similarit\u00e9 cosinus<\/strong> vise une similarit\u00e9 proche de 1 pour des phrases semblables (la phrase d&rsquo;origine et son exemple positif) et proche de 0 pour des phrases dissemblables ;<\/li>\n<li>la perte de classement \u00e0 n\u00e9gatifs multiples (<em>InfoNCE<\/em>) n&rsquo;utilise que des exemples positifs : pour les n\u00e9gatifs, on prend la phrase d&rsquo;implication d&rsquo;une <em>autre<\/em> phrase, et l&rsquo;on maximise la similarit\u00e9 avec la phrase li\u00e9e tout en minimisant celle avec les autres. La t\u00e2che devient une classification, avec l&rsquo;entropie crois\u00e9e.<\/li>\n<\/ul>\n<p>Un pi\u00e8ge guette : si les n\u00e9gatifs n&rsquo;ont aucun rapport avec la phrase, la t\u00e2che est trop facile pour le mod\u00e8le. Mieux vaut ajouter des phrases n\u00e9gatives li\u00e9es au sujet mais qui ne sont pas la bonne r\u00e9ponse.<\/p>\n<p>Il existe des dizaines de milliers de mod\u00e8les d&#8217;embedding sur Hugging Face, mais tous reposent sur l&rsquo;une de deux familles. Les mod\u00e8les de type BERT, \u00e0 encodeur seul, comptent g\u00e9n\u00e9ralement moins d&rsquo;un milliard de param\u00e8tres et \u00e9taient con\u00e7us \u00e0 l&rsquo;origine pour pr\u00e9dire des jetons masqu\u00e9s. Les mod\u00e8les \u00e0 base de LLM, d&rsquo;au plus huit milliards de param\u00e8tres, sont des mod\u00e8les de langage modernes d\u00e9tourn\u00e9s pour produire des embeddings. Les seconds offrent aujourd&rsquo;hui des capacit\u00e9s nettement sup\u00e9rieures, mais les premiers servent encore \u00e0 des t\u00e2ches simples sensibles \u00e0 la latence, comme la classification.<\/p>\n<p>Enfin, ajuster un embedder <strong>co\u00fbte bien moins que l&rsquo;entra\u00eener de z\u00e9ro<\/strong>, y compris avec des donn\u00e9es synth\u00e9tiques cr\u00e9\u00e9es par un gros LLM quand on n&rsquo;a pas de jeu adapt\u00e9. L&rsquo;ajustement est en g\u00e9n\u00e9ral supervis\u00e9, avec des exemples positifs et n\u00e9gatifs comme \u00e0 l&rsquo;entra\u00eenement d&rsquo;origine.<\/p>\n<h2 id=\"pas-seulement-du-texte-images-et-graphes\">Pas seulement du texte : images et graphes<\/h2>\n<p>Le principe contrastif sert aussi \u00e0 relier des modalit\u00e9s. CLIP a \u00e9t\u00e9 entra\u00een\u00e9 avec 400 millions de paires (image, texte) collect\u00e9es sur internet. Il utilise un encodeur Transformer pour chacun des deux types de donn\u00e9es. Une fois l&rsquo;image et sa l\u00e9gende encod\u00e9es, on compare leurs embeddings : le mod\u00e8le apprend \u00e0 maximiser la similarit\u00e9 avec la bonne l\u00e9gende, et \u00e0 la minimiser avec les mauvaises.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46b7a4ae&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46b7a4ae\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1238\" height=\"1330\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch03_clip_contrastif.png\" alt=\"Principe de CLIP : une matrice croisant cinq images et cinq l\u00e9gendes, dont la diagonale (paires correctes) est \u00e0 maximiser et le reste \u00e0 minimiser\" class=\"wp-image-485\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch03_clip_contrastif.png 1238w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch03_clip_contrastif-279x300.png 279w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch03_clip_contrastif-953x1024.png 953w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b3_ch03_clip_contrastif-768x825.png 768w\" sizes=\"auto, (max-width: 1238px) 100vw, 1238px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">La matrice se lit ligne par ligne : chaque image a une seule bonne l\u00e9gende, sur la diagonale, et toutes les autres cases sont des mauvaises r\u00e9ponses. Pr\u00e9sent\u00e9 comme une classification o\u00f9 le mod\u00e8le pr\u00e9dit la bonne paire, c&rsquo;est exactement le jeu des n\u00e9gatifs vu plus haut, appliqu\u00e9 \u00e0 deux modalit\u00e9s.<\/figcaption><\/figure>\n\n\n<p>Avec les biblioth\u00e8ques Hugging Face, on obtient les embeddings d&rsquo;images et de l\u00e9gendes, puis la matrice de similarit\u00e9, en quelques lignes.<\/p>\n<pre><code>from sentence_transformers import SentenceTransformer, util\nmodel = SentenceTransformer('clip-ViT-B-32')\nimage_embeddings = model.encode(images, convert_to_tensor=True)\ncaption_embeddings = model.encode(\n    captions, convert_to_tensor=True)\nsimilarity_matrix = util.cos_sim(\n    image_embeddings, caption_embeddings)\n<\/code><\/pre>\n<p><code>images<\/code> et <code>captions<\/code> sont les listes d&rsquo;images et de l\u00e9gendes \u00e0 comparer. Un seul mod\u00e8le encode les deux, et <code>util.cos_sim<\/code> renvoie la matrice des scores entre chaque image et chaque l\u00e9gende.<\/p>\n<p>Cet espace commun rend possibles des <strong>t\u00e2ches nouvelles<\/strong> : classer une image \u00e0 partir d&rsquo;un simple ensemble d&rsquo;\u00e9tiquettes (classification <em>zero-shot<\/em>), chercher dans de grands jeux d&rsquo;images, ou les regrouper puis attribuer des mots-cl\u00e9s aux groupes. Il pilote m\u00eame la g\u00e9n\u00e9ration d&rsquo;images : dans Stable Diffusion, un encodeur de texte comme CLIP produit des embeddings proches de ceux des images correspondantes, et de l&rsquo;attention crois\u00e9e relie cette information au processus de g\u00e9n\u00e9ration.<\/p>\n<p>On plonge enfin dans des espaces vectoriels des objets qui n&rsquo;ont rien d&rsquo;une phrase : les <a href=\"\/blog\/rag\/qu-est-ce-qu-un-graphe-de-connaissances\/\" title=\"graphes de connaissances\">graphes de connaissances<\/a>. Un mod\u00e8le d&#8217;embedding de graphe apprend une projection qui pr\u00e9serve la structure et l&rsquo;information. Avec TransE, les relations deviennent des vecteurs : pour un triplet <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-c9ee10aa0aaec21405ab9c7cb318484e_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#40;&#104;&#44;&#32;&#114;&#44;&#32;&#116;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"51\" style=\"vertical-align: -5px;\"\/>, il apprend un espace o\u00f9 <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-82716a19170c77c2bed190de40460b15_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#104;&#32;&#43;&#32;&#114;&#32;&#92;&#97;&#112;&#112;&#114;&#111;&#120;&#32;&#116;\" title=\"Rendered by QuickLaTeX.com\" height=\"14\" width=\"70\" style=\"vertical-align: -2px;\"\/>. D&rsquo;autres m\u00e9thodes pr\u00e9servent la sym\u00e9trie ou la composition des relations, ou, comme ATTH, des structures hi\u00e9rarchiques dans un espace hyperbolique.<\/p>\n<h2 id=\"ce-qu-on-croit-a-tort-des-embeddings\">Ce qu&rsquo;on croit \u00e0 tort des embeddings<\/h2>\n<h3>\u00ab Plus de dimensions, c&rsquo;est toujours mieux \u00bb<\/h3>\n<p>Des vecteurs plus longs encodent plus d&rsquo;information, mais la dimension ne change gu\u00e8re le temps d&rsquo;inf\u00e9rence : elle p\u00e8se sur le stockage, la r\u00e9cup\u00e9ration et le calcul de similarit\u00e9. Chaque dimension en virgule flottante demande 4 octets, ce qui peut co\u00fbter exorbitant \u00e0 grande \u00e9chelle.<\/p>\n<p>D&rsquo;o\u00f9 l&rsquo;int\u00e9r\u00eat de comprimer. La quantification binaire garde 1 bit par dimension et r\u00e9duit la m\u00e9moire jusqu&rsquo;\u00e0 <strong>32 fois<\/strong>. La plus simple applique un seuil nul :<\/p>\n<p><p class=\"ql-center-displayed-equation\" style=\"line-height: 54px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-1b1ab3c48d28ee8e4924b9d11e54b0cd_l3.png\" height=\"54\" width=\"163\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91; &#102;&#40;&#120;&#41;&#61;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#99;&#97;&#115;&#101;&#115;&#125;&#48;&#32;&#38;&#32;&#92;&#116;&#101;&#120;&#116;&#123;&#115;&#105;&#32;&#125;&#32;&#120;&#92;&#108;&#101;&#32;&#48;&#44;&#92;&#92;&#32;&#49;&#32;&#38;&#32;&#92;&#116;&#101;&#120;&#116;&#123;&#115;&#105;&#32;&#125;&#32;&#120;&#62;&#48;&#46;&#92;&#101;&#110;&#100;&#123;&#99;&#97;&#115;&#101;&#115;&#125;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n<p>Chaque composante positive devient 1, toute autre devient 0. On compare alors les vecteurs par la distance de Hamming, adapt\u00e9e aux vecteurs binaires. Cette compression donne une vitesse et un gain de m\u00e9moire sans pr\u00e9c\u00e9dent, mais co\u00fbte en g\u00e9n\u00e9ral de la performance ; des versions plus fines, avec une nouvelle notation des r\u00e9sultats trouv\u00e9s, conservent jusqu&rsquo;\u00e0 <strong>96 %<\/strong> de la similarit\u00e9. Un bon compromis consiste souvent \u00e0 passer du format float32 \u00e0 int8, qui repr\u00e9sente les valeurs avec 256 niveaux, en recalibrant les vecteurs.<\/p>\n<p>Une autre voie, les repr\u00e9sentations Matriochka, place l&rsquo;information la plus importante dans les premi\u00e8res dimensions : on peut tronquer le vecteur en gardant la performance sur les t\u00e2ches aval. Pour v\u00e9rifier qu&rsquo;un mod\u00e8le d&#8217;embedding quantifi\u00e9 reste fid\u00e8le, on passe les m\u00eames entr\u00e9es dans l&rsquo;original et dans la version quantifi\u00e9e, puis on compare les vecteurs : il faut <strong>au moins 99 %<\/strong> de similarit\u00e9 pour \u00eatre en confiance.<\/p>\n<h3>\u00ab Deux vecteurs de m\u00eame longueur se comparent \u00bb<\/h3>\n<p>Les vecteurs d&rsquo;un mod\u00e8le d&#8217;embedding ne se comparent en g\u00e9n\u00e9ral pas de fa\u00e7on significative \u00e0 ceux d&rsquo;un autre, m\u00eame de m\u00eame longueur : chaque mod\u00e8le encode les entr\u00e9es dans son propre espace s\u00e9mantique. Une longueur identique ne garantit pas un rep\u00e8re identique.<\/p>\n<h3>\u00ab Un embedding peut r\u00e9sumer n&rsquo;importe quel texte \u00bb<\/h3>\n<p>Aucun mod\u00e8le d&#8217;embedding actuel ne g\u00e8re les contextes tr\u00e8s longs : le maximum est de 32 000 jetons. Un texte plus long doit donc \u00eatre d\u00e9coup\u00e9 avant d&rsquo;\u00eatre encod\u00e9.<\/p>\n<h3>\u00ab L&rsquo;espace des embeddings est neutre \u00bb<\/h3>\n<p>Ces espaces refl\u00e8tent les textes dont ils sont tir\u00e9s. Les mod\u00e8les d&#8217;embedding peuvent amplifier les biais, et l&rsquo;on y a identifi\u00e9 l&rsquo;association de contenus nocifs \u00e0 des groupes et \u00e0 des minorit\u00e9s. Les approches de d\u00e9biaisage montrent un potentiel, mais restent loin d&rsquo;\u00eatre efficaces. La parade passe par le jeu de pr\u00e9-entra\u00eenement : le d\u00e9sintoxiquer avant l&rsquo;entra\u00eenement et varier les sources, car les textes produits aux \u00c9tats-Unis dominent ceux d&rsquo;ailleurs.<\/p>\n<blockquote>\n<p><strong>\ud83d\udccc \u00c0 retenir<\/strong> Un embedding n&rsquo;est pas un sens, c&rsquo;est une position apprise : celle que les voisins d&rsquo;un mot, d&rsquo;une phrase ou d&rsquo;une image lui ont donn\u00e9e pendant l&rsquo;entra\u00eenement. Sa force est de rendre le sens calculable ; sa limite est qu&rsquo;il ne sait rien de plus que ce que ses donn\u00e9es lui ont montr\u00e9.<\/p>\n<\/blockquote>","protected":false},"excerpt":{"rendered":"<p>Un embedding donne \u00e0 un mot, une phrase ou une image une adresse dans un espace o\u00f9 le voisinage a un sens. Comment il s&rsquo;apprend, \u00e0 quoi il sert, o\u00f9 il se trompe.<\/p>\n","protected":false},"author":1,"featured_media":486,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-487","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-rag"],"_links":{"self":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/487","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/comments?post=487"}],"version-history":[{"count":3,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/487\/revisions"}],"predecessor-version":[{"id":823,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/487\/revisions\/823"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media\/486"}],"wp:attachment":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media?parent=487"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/categories?post=487"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/tags?post=487"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}