import{S as Sc,i as Hc,s as Uc,e as r,k as m,w as _,t as n,M as Oc,c as a,d as s,m as p,x as b,a as l,h as o,b as d,N as ds,G as t,g as u,y as E,o as v,p as Bc,q as h,B as $,v as Vc,n as Gc}from"../../chunks/vendor-hf-doc-builder.js";import{T as Jc}from"../../chunks/Tip-hf-doc-builder.js";import{Y as ro}from"../../chunks/Youtube-hf-doc-builder.js";import{I as de}from"../../chunks/IconCopyLink-hf-doc-builder.js";import{C as Y}from"../../chunks/CodeBlock-hf-doc-builder.js";import{D as Dc}from"../../chunks/DocNotebookDropdown-hf-doc-builder.js";import{F as Rc}from"../../chunks/FrameworkSwitchCourse-hf-doc-builder.js";function Fc(W){let c,q;return c=new Dc({props:{classNames:"absolute z-10 right-0 top-0",options:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/chapter2/section4_tf.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/chapter2/section4_tf.ipynb"}]}}),{c(){_(c.$$.fragment)},l(f){b(c.$$.fragment,f)},m(f,w){E(c,f,w),q=!0},i(f){q||(h(c.$$.fragment,f),q=!0)},o(f){v(c.$$.fragment,f),q=!1},d(f){$(c,f)}}}function Kc(W){let c,q;return c=new Dc({props:{classNames:"absolute z-10 right-0 top-0",options:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/chapter2/section4_pt.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/chapter2/section4_pt.ipynb"}]}}),{c(){_(c.$$.fragment)},l(f){b(c.$$.fragment,f)},m(f,w){E(c,f,w),q=!0},i(f){q||(h(c.$$.fragment,f),q=!0)},o(f){v(c.$$.fragment,f),q=!1},d(f){$(c,f)}}}function Yc(W){let c,q,f,w,y,g,D,C,M,T,B,z,P,V,x,j,G;return{c(){c=r("p"),q=n("Similaire \xE0 "),f=r("code"),w=n("TFAutoModel"),y=n(", la classe "),g=r("code"),D=n("AutoTokenizer"),C=n(" r\xE9cup\xE8re la classe de "),M=r("em"),T=n("tokenizer"),B=n(" appropri\xE9e dans la biblioth\xE8que bas\xE9e sur le nom du "),z=r("em"),P=n("checkpoint"),V=n(". Elle peut \xEAtre utilis\xE9e directement avec n\u2019importe quel "),x=r("em"),j=n("checkpoint"),G=n(" :")},l(L){c=a(L,"P",{});var k=l(c);q=o(k,"Similaire \xE0 "),f=a(k,"CODE",{});var S=l(f);w=o(S,"TFAutoModel"),S.forEach(s),y=o(k,", la classe "),g=a(k,"CODE",{});var fe=l(g);D=o(fe,"AutoTokenizer"),fe.forEach(s),C=o(k," r\xE9cup\xE8re la classe de "),M=a(k,"EM",{});var te=l(M);T=o(te,"tokenizer"),te.forEach(s),B=o(k," appropri\xE9e dans la biblioth\xE8que bas\xE9e sur le nom du "),z=a(k,"EM",{});var ve=l(z);P=o(ve,"checkpoint"),ve.forEach(s),V=o(k,". Elle peut \xEAtre utilis\xE9e directement avec n\u2019importe quel "),x=a(k,"EM",{});var he=l(x);j=o(he,"checkpoint"),he.forEach(s),G=o(k," :"),k.forEach(s)},m(L,k){u(L,c,k),t(c,q),t(c,f),t(f,w),t(c,y),t(c,g),t(g,D),t(c,C),t(c,M),t(M,T),t(c,B),t(c,z),t(z,P),t(c,V),t(c,x),t(x,j),t(c,G)},d(L){L&&s(c)}}}function Wc(W){let c,q,f,w,y,g,D,C,M,T,B,z,P,V,x,j,G;return{c(){c=r("p"),q=n("Similaire \xE0 "),f=r("code"),w=n("AutoModel"),y=n(", la classe "),g=r("code"),D=n("AutoTokenizer"),C=n(" r\xE9cup\xE8re la classe de "),M=r("em"),T=n("tokenizer"),B=n(" appropri\xE9e dans la biblioth\xE8que bas\xE9e sur le nom du "),z=r("em"),P=n("checkpoint"),V=n(". Elle peut \xEAtre utilis\xE9e directement avec n\u2019importe quel "),x=r("em"),j=n("checkpoint"),G=n(" :")},l(L){c=a(L,"P",{});var k=l(c);q=o(k,"Similaire \xE0 "),f=a(k,"CODE",{});var S=l(f);w=o(S,"AutoModel"),S.forEach(s),y=o(k,", la classe "),g=a(k,"CODE",{});var fe=l(g);D=o(fe,"AutoTokenizer"),fe.forEach(s),C=o(k," r\xE9cup\xE8re la classe de "),M=a(k,"EM",{});var te=l(M);T=o(te,"tokenizer"),te.forEach(s),B=o(k," appropri\xE9e dans la biblioth\xE8que bas\xE9e sur le nom du "),z=a(k,"EM",{});var ve=l(z);P=o(ve,"checkpoint"),ve.forEach(s),V=o(k,". Elle peut \xEAtre utilis\xE9e directement avec n\u2019importe quel "),x=a(k,"EM",{});var he=l(x);j=o(he,"checkpoint"),he.forEach(s),G=o(k," :"),k.forEach(s)},m(L,k){u(L,c,k),t(c,q),t(c,f),t(f,w),t(c,y),t(c,g),t(g,D),t(c,C),t(c,M),t(M,T),t(c,B),t(c,z),t(z,P),t(c,V),t(c,x),t(x,j),t(c,G)},d(L){L&&s(c)}}}function Qc(W){let c,q,f,w,y,g,D,C,M,T,B;return{c(){c=r("p"),q=n("\u270F\uFE0F "),f=r("strong"),w=n("Essayez !"),y=n(" Reproduisez les deux derni\xE8res \xE9tapes (tok\xE9nisation et conversion en identifiants d\u2019entr\xE9e) sur les phrases des entr\xE9es que nous avons utilis\xE9es dans la section 2 (\xAB "),g=r("i"),D=n("I\u2019ve been waiting for a HuggingFace course my whole life."),C=n(" \xBB et \xAB "),M=r("i"),T=n("I hate this so much!"),B=n(" \xBB). V\xE9rifiez que vous obtenez les m\xEAmes identifiants d\u2019entr\xE9e que nous avons obtenus pr\xE9c\xE9demment !")},l(z){c=a(z,"P",{});var P=l(c);q=o(P,"\u270F\uFE0F "),f=a(P,"STRONG",{});var V=l(f);w=o(V,"Essayez !"),V.forEach(s),y=o(P," Reproduisez les deux derni\xE8res \xE9tapes (tok\xE9nisation et conversion en identifiants d\u2019entr\xE9e) sur les phrases des entr\xE9es que nous avons utilis\xE9es dans la section 2 (\xAB "),g=a(P,"I",{});var x=l(g);D=o(x,"I\u2019ve been waiting for a HuggingFace course my whole life."),x.forEach(s),C=o(P," \xBB et \xAB "),M=a(P,"I",{});var j=l(M);T=o(j,"I hate this so much!"),j.forEach(s),B=o(P," \xBB). V\xE9rifiez que vous obtenez les m\xEAmes identifiants d\u2019entr\xE9e que nous avons obtenus pr\xE9c\xE9demment !"),P.forEach(s)},m(z,P){u(z,c,P),t(c,q),t(c,f),t(f,w),t(c,y),t(c,g),t(g,D),t(c,C),t(c,M),t(M,T),t(c,B)},d(z){z&&s(c)}}}function Xc(W){let c,q,f,w,y,g,D,C,M,T,B,z,P,V,x,j,G,L,k,S,fe,te,ve,he,fs,sa,na,ao,Vt,oa,lo,nt,io,Me,ra,vs,aa,la,uo,Gt,ia,mo,ke,Ae,hs,ot,ua,Jt,ks,ma,pa,po,rt,co,Ce,ca,_s,da,fa,fo,_e,at,km,va,lt,_m,vo,Le,ha,bs,ka,_a,ho,it,ko,ut,_o,Q,ba,Es,Ea,$a,$s,qa,ga,qs,xa,za,bo,Rt,wa,Eo,oe,Pa,gs,ja,ya,xs,Ma,Aa,$o,se,Ca,zs,La,Ta,ws,Na,Ia,ne,Da,Ps,Sa,Ha,js,Ua,Oa,ys,Ba,Va,qo,re,Ga,Ms,Ja,Ra,As,Fa,Ka,go,be,Te,Cs,mt,Ya,Ft,Ls,Wa,Qa,xo,pt,zo,Ne,Xa,Ts,Za,el,wo,Ie,Ns,tl,sl,ct,nl,Is,ol,rl,Po,Kt,al,jo,Ee,dt,bm,ll,ft,Em,yo,Yt,il,Mo,H,ul,Ds,ml,pl,Ss,cl,dl,Hs,fl,vl,Us,hl,kl,Os,_l,bl,Ao,De,El,Bs,$l,ql,Co,$e,Se,Vs,vt,gl,Gs,xl,Lo,ht,To,Wt,zl,No,Qt,wl,Io,He,Pl,Js,jl,yl,Do,qe,kt,$m,Ml,_t,qm,So,N,Al,Rs,Cl,Ll,Fs,Tl,Nl,Ks,Il,Dl,Ys,Sl,Hl,Ws,Ul,Ol,Qs,Bl,Vl,Ho,Xt,Gl,Uo,ge,Ue,Xs,bt,Jl,Zs,Rl,Oo,Zt,Fl,Bo,ae,Et,Kl,en,Yl,Wl,Ql,$t,Xl,tn,Zl,ei,ti,Oe,sn,si,ni,nn,oi,ri,Vo,es,ai,Go,xe,Be,on,qt,li,rn,ii,Jo,I,ui,an,mi,pi,ln,ci,di,un,fi,vi,mn,hi,ki,pn,_i,bi,cn,Ei,$i,Ro,X,qi,dn,gi,xi,fn,zi,wi,vn,Pi,ji,Fo,gt,Ko,ts,xt,Yo,Ve,yi,hn,Mi,Ai,Wo,zt,Qo,wt,Xo,ss,Ci,Zo,Pt,er,U,Li,kn,Ti,Ni,ns,Ii,Di,_n,Si,Hi,bn,Ui,Oi,En,Bi,Vi,tr,ze,Ge,$n,jt,Gi,qn,Ji,sr,yt,nr,Je,Ri,gn,Fi,Ki,or,le,Yi,xn,Wi,Qi,zn,Xi,Zi,rr,J,eu,wn,tu,su,Pn,nu,ou,jn,ru,au,yn,lu,iu,ar,Re,uu,Mn,mu,pu,lr,we,Fe,An,Mt,cu,Cn,du,ir,ie,fu,Ln,vu,hu,Tn,ku,_u,ur,At,mr,Ke,bu,Nn,Eu,$u,pr,Ct,cr,A,qu,In,gu,xu,Dn,zu,wu,Sn,Pu,ju,Hn,yu,Mu,Un,Au,Cu,On,Lu,Tu,Bn,Nu,Iu,dr,Pe,Ye,Vn,Lt,Du,Tt,Su,Gn,Hu,Uu,fr,ue,Ou,Jn,Bu,Vu,Rn,Gu,Ju,vr,Nt,hr,It,kr,We,Ru,Fn,Fu,Ku,_r,Qe,br,je,Xe,Kn,Dt,Yu,Yn,Wu,Er,me,Qu,Wn,Xu,Zu,Qn,em,tm,$r,St,qr,Ht,gr,R,sm,Xn,nm,om,Zn,rm,am,eo,lm,im,to,um,mm,xr,Ze,pm,so,cm,dm,zr;f=new Rc({props:{fw:W[0]}}),C=new de({});const gm=[Kc,Fc],Ut=[];function xm(e,i){return e[0]==="pt"?0:1}x=xm(W),j=Ut[x]=gm[x](W),L=new ro({props:{id:"VFp38yj8h3A"}}),nt=new Y({props:{code:"Jim Henson was a puppeteer # Jim Henson \xE9tait un marionnettiste",highlighted:'Jim Henson was <span class="hljs-keyword">a</span> puppeteer <span class="hljs-comment"># Jim Henson \xE9tait un marionnettiste</span>'}}),ot=new de({}),rt=new ro({props:{id:"nhJxYji1aho"}}),it=new Y({props:{code:`tokenized_text = "Jim Henson was a puppeteer".split()
print(tokenized_text)`,highlighted:`tokenized_text = <span class="hljs-string">&quot;Jim Henson was a puppeteer&quot;</span>.split()
<span class="hljs-built_in">print</span>(tokenized_text)`}}),ut=new Y({props:{code:"['Jim', 'Henson', 'was', 'a', 'puppeteer'] # ['Jim', 'Henson', \xE9tait, 'un', 'marionnettiste']",highlighted:'[<span class="hljs-string">&#x27;Jim&#x27;</span>, <span class="hljs-string">&#x27;Henson&#x27;</span>, <span class="hljs-string">&#x27;was&#x27;</span>, <span class="hljs-string">&#x27;a&#x27;</span>, <span class="hljs-string">&#x27;puppeteer&#x27;</span>] <span class="hljs-comment"># [&#x27;Jim&#x27;, &#x27;Henson&#x27;, \xE9tait, &#x27;un&#x27;, &#x27;marionnettiste&#x27;]</span>'}}),mt=new de({}),pt=new ro({props:{id:"ssLq_EK2jLE"}}),vt=new de({}),ht=new ro({props:{id:"zHvTiHr506c"}}),bt=new de({}),qt=new de({}),gt=new Y({props:{code:`from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained("bert-base-cased")`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> BertTokenizer

tokenizer = BertTokenizer.from_pretrained(<span class="hljs-string">&quot;bert-base-cased&quot;</span>)`}});function zm(e,i){return e[0]==="pt"?Wc:Yc}let wr=zm(W),ye=wr(W);return xt=new Y({props:{code:`from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(<span class="hljs-string">&quot;bert-base-cased&quot;</span>)`}}),zt=new Y({props:{code:'tokenizer("Using a Transformer network is simple")',highlighted:'tokenizer(<span class="hljs-string">&quot;Using a Transformer network is simple&quot;</span>)'}}),wt=new Y({props:{code:`{'input_ids': [101, 7993, 170, 11303, 1200, 2443, 1110, 3014, 102],
 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0],
 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1]}`,highlighted:`{<span class="hljs-string">&#x27;input_ids&#x27;</span>: [<span class="hljs-number">101</span>, <span class="hljs-number">7993</span>, <span class="hljs-number">170</span>, <span class="hljs-number">11303</span>, <span class="hljs-number">1200</span>, <span class="hljs-number">2443</span>, <span class="hljs-number">1110</span>, <span class="hljs-number">3014</span>, <span class="hljs-number">102</span>],
 <span class="hljs-string">&#x27;token_type_ids&#x27;</span>: [<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>],
 <span class="hljs-string">&#x27;attention_mask&#x27;</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>]}`}}),Pt=new Y({props:{code:'tokenizer.save_pretrained("directory_on_my_computer")',highlighted:'tokenizer.save_pretrained(<span class="hljs-string">&quot;directory_on_my_computer&quot;</span>)'}}),jt=new de({}),yt=new ro({props:{id:"Yffk5aydLzg"}}),Mt=new de({}),At=new Y({props:{code:`from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")

sequence = "Using a Transformer network is simple"
tokens = tokenizer.tokenize(sequence)

print(tokens)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(<span class="hljs-string">&quot;bert-base-cased&quot;</span>)

sequence = <span class="hljs-string">&quot;Using a Transformer network is simple&quot;</span>
tokens = tokenizer.tokenize(sequence)

<span class="hljs-built_in">print</span>(tokens)`}}),Ct=new Y({props:{code:"['Using', 'a', 'transform', '##er', 'network', 'is', 'simple']",highlighted:'[<span class="hljs-string">&#x27;Using&#x27;</span>, <span class="hljs-string">&#x27;a&#x27;</span>, <span class="hljs-string">&#x27;transform&#x27;</span>, <span class="hljs-string">&#x27;##er&#x27;</span>, <span class="hljs-string">&#x27;network&#x27;</span>, <span class="hljs-string">&#x27;is&#x27;</span>, <span class="hljs-string">&#x27;simple&#x27;</span>]'}}),Lt=new de({}),Nt=new Y({props:{code:`ids = tokenizer.convert_tokens_to_ids(tokens)

print(ids)`,highlighted:`ids = tokenizer.convert_tokens_to_ids(tokens)

<span class="hljs-built_in">print</span>(ids)`}}),It=new Y({props:{code:"[7993, 170, 11303, 1200, 2443, 1110, 3014]",highlighted:'[<span class="hljs-number">7993</span>, <span class="hljs-number">170</span>, <span class="hljs-number">11303</span>, <span class="hljs-number">1200</span>, <span class="hljs-number">2443</span>, <span class="hljs-number">1110</span>, <span class="hljs-number">3014</span>]'}}),Qe=new Jc({props:{$$slots:{default:[Qc]},$$scope:{ctx:W}}}),Dt=new de({}),St=new Y({props:{code:`decoded_string = tokenizer.decode([7993, 170, 11303, 1200, 2443, 1110, 3014])
print(decoded_string)`,highlighted:`decoded_string = tokenizer.decode([<span class="hljs-number">7993</span>, <span class="hljs-number">170</span>, <span class="hljs-number">11303</span>, <span class="hljs-number">1200</span>, <span class="hljs-number">2443</span>, <span class="hljs-number">1110</span>, <span class="hljs-number">3014</span>])
<span class="hljs-built_in">print</span>(decoded_string)`}}),Ht=new Y({props:{code:"'Using a Transformer network is simple'",highlighted:'<span class="hljs-string">&#x27;Using a Transformer network is simple&#x27;</span>'}}),{c(){c=r("meta"),q=m(),_(f.$$.fragment),w=m(),y=r("h1"),g=r("a"),D=r("span"),_(C.$$.fragment),M=m(),T=r("span"),B=n("Les "),z=r("i"),P=n("tokenizers"),V=m(),j.c(),G=m(),_(L.$$.fragment),k=m(),S=r("p"),fe=n("Les "),te=r("em"),ve=n("tokenizers"),he=n(" sont l\u2019un des principaux composants du pipeline de NLP. Ils ont un seul objectif : traduire le texte en donn\xE9es pouvant \xEAtre trait\xE9es par le mod\xE8le. Les mod\xE8les ne pouvant traiter que des nombres, les "),fs=r("em"),sa=n("tokenizers"),na=n(" doivent convertir nos entr\xE9es textuelles en donn\xE9es num\xE9riques. Dans cette section, nous allons explorer ce qui se passe exactement dans le pipeline de tok\xE9nisation."),ao=m(),Vt=r("p"),oa=n("Dans les t\xE2ches de NLP, les donn\xE9es trait\xE9es sont g\xE9n\xE9ralement du texte brut. Voici un exemple de ce type de texte :"),lo=m(),_(nt.$$.fragment),io=m(),Me=r("p"),ra=n("Les mod\xE8les ne pouvant traiter que des nombres, nous devons trouver un moyen de convertir le texte brut en nombres. C\u2019est ce que font les "),vs=r("em"),aa=n("tokenizers"),la=n(" et il existe de nombreuses fa\xE7ons de proc\xE9der. L\u2019objectif est de trouver la repr\xE9sentation la plus significative, c\u2019est-\xE0-dire celle qui a le plus de sens pour le mod\xE8le, et si possible qui soit la plus petite."),uo=m(),Gt=r("p"),ia=n("Voyons quelques exemples d\u2019algorithmes de tok\xE9nisation et essayons de r\xE9pondre \xE0 certaines des questions que vous pouvez vous poser \xE0 ce sujet."),mo=m(),ke=r("h2"),Ae=r("a"),hs=r("span"),_(ot.$$.fragment),ua=m(),Jt=r("span"),ks=r("i"),ma=n("Tokenizer"),pa=n(" bas\xE9 sur les mots"),po=m(),_(rt.$$.fragment),co=m(),Ce=r("p"),ca=n("Le premier type de "),_s=r("em"),da=n("tokenizer"),fa=n(" qui vient \xE0 l\u2019esprit est celui bas\xE9 sur les mots. Il est g\xE9n\xE9ralement tr\xE8s facile \xE0 utiliser et configurable avec seulement quelques r\xE8gles. Il donne souvent des r\xE9sultats d\xE9cents. Par exemple, dans l\u2019image ci-dessous, l\u2019objectif est de diviser le texte brut en mots et de trouver une repr\xE9sentation num\xE9rique pour chacun d\u2019eux :"),fo=m(),_e=r("div"),at=r("img"),va=m(),lt=r("img"),vo=m(),Le=r("p"),ha=n("Il existe diff\xE9rentes fa\xE7ons de diviser le texte. Par exemple, nous pouvons utiliser les espaces pour segmenter le texte en mots en appliquant la fonction "),bs=r("code"),ka=n("split()"),_a=n(" de Python :"),ho=m(),_(it.$$.fragment),ko=m(),_(ut.$$.fragment),_o=m(),Q=r("p"),ba=n("Il existe \xE9galement des variantes des "),Es=r("em"),Ea=n("tokenizers"),$a=n(" bas\xE9s sur les mots qui ont des r\xE8gles suppl\xE9mentaires pour la ponctuation. Avec ce type de "),$s=r("em"),qa=n("tokenizers"),ga=n(" nous pouvons nous retrouver avec des \xAB vocabulaires \xBB assez larges, o\xF9 un vocabulaire est d\xE9fini par le nombre total de "),qs=r("em"),xa=n("tokens"),za=n(" ind\xE9pendants que nous avons dans notre corpus."),bo=m(),Rt=r("p"),wa=n("Un identifiant est attribu\xE9 \xE0 chaque mot, en commen\xE7ant par 0 et en allant jusqu\u2019\xE0 la taille du vocabulaire. Le mod\xE8le utilise ces identifiants pour identifier chaque mot."),Eo=m(),oe=r("p"),Pa=n("Si nous voulons couvrir compl\xE8tement une langue avec un "),gs=r("em"),ja=n("tokenizer"),ya=n(" bas\xE9 sur les mots, nous devons avoir un identifiant pour chaque mot de la langue que nous traitons, ce qui g\xE9n\xE8re une \xE9norme quantit\xE9 de "),xs=r("em"),Ma=n("tokens"),Aa=n(". Par exemple, il y a plus de 500 000 mots dans la langue anglaise. Ainsi pour associer chaque mot \xE0 un identifiant, nous devrions garder la trace d\u2019autant d\u2019identifiants. De plus, des mots comme \xAB chien \xBB sont repr\xE9sent\xE9s diff\xE9remment de mots comme \xAB chiens \xBB. Le mod\xE8le n\u2019a initialement aucun moyen de savoir que \xAB chien \xBB et \xAB chiens \xBB sont similaires : il identifie les deux mots comme non apparent\xE9s. Il en va de m\xEAme pour d\u2019autres mots similaires, comme \xAB maison \xBB et \xAB maisonnette \xBB que le mod\xE8le ne consid\xE9rera pas comme similaires au d\xE9part."),$o=m(),se=r("p"),Ca=n("Enfin, nous avons besoin d\u2019un "),zs=r("em"),La=n("token"),Ta=n(" personnalis\xE9 pour repr\xE9senter les mots qui ne font pas partie de notre vocabulaire. C\u2019est ce qu\u2019on appelle le "),ws=r("em"),Na=n("token"),Ia=n(" \xAB inconnu \xBB souvent repr\xE9sent\xE9 par \xAB [UNK] \xBB (de l\u2019anglais \xAB unknown \xBB) ou \xAB "),ne=r("unk"),Da=n("; \xBB. C\u2019est g\xE9n\xE9ralement un mauvais signe si vous constatez que le "),Ps=r("em"),Sa=n("tokenizer"),Ha=n(" produit un nombre important de ce jeton sp\xE9cial. Cela signifie qu\u2019il n\u2019a pas \xE9t\xE9 en mesure de r\xE9cup\xE9rer une repr\xE9sentation sens\xE9e d\u2019un mot et que vous perdez des informations en cours de route. L\u2019objectif de l\u2019\xE9laboration du vocabulaire est de faire en sorte que le "),js=r("em"),Ua=n("tokenizer"),Oa=n(" transforme le moins de mots possible en "),ys=r("em"),Ba=n("token"),Va=n(" inconnu."),qo=m(),re=r("p"),Ga=n("Une fa\xE7on de r\xE9duire la quantit\xE9 de "),Ms=r("em"),Ja=n("tokens"),Ra=n(" inconnus est d\u2019aller un niveau plus profond, en utilisant un "),As=r("em"),Fa=n("tokenizer"),Ka=n(" bas\xE9 sur les caract\xE8res."),go=m(),be=r("h2"),Te=r("a"),Cs=r("span"),_(mt.$$.fragment),Ya=m(),Ft=r("span"),Ls=r("i"),Wa=n("Tokenizer"),Qa=n("  bas\xE9 sur les caract\xE8res"),xo=m(),_(pt.$$.fragment),zo=m(),Ne=r("p"),Xa=n("Les "),Ts=r("em"),Za=n("tokenizers"),el=n(" bas\xE9s sur les caract\xE8res divisent le texte en caract\xE8res, plut\xF4t qu\u2019en mots. Cela pr\xE9sente deux avantages principaux :"),wo=m(),Ie=r("ul"),Ns=r("li"),tl=n("le vocabulaire est beaucoup plus petit"),sl=m(),ct=r("li"),nl=n("il y a beaucoup moins de "),Is=r("em"),ol=n("tokens"),rl=n(" hors vocabulaire (inconnus) puisque chaque mot peut \xEAtre construit \xE0 partir de caract\xE8res."),Po=m(),Kt=r("p"),al=n("Mais l\xE0 aussi, des questions se posent concernant les espaces et la ponctuation :"),jo=m(),Ee=r("div"),dt=r("img"),ll=m(),ft=r("img"),yo=m(),Yt=r("p"),il=n("Cette approche n\u2019est pas non plus parfaite. Puisque la repr\xE9sentation est maintenant bas\xE9e sur des caract\xE8res plut\xF4t que sur des mots, on pourrait dire intuitivement qu\u2019elle est moins significative : chaque caract\xE8re ne signifie pas grand-chose en soi, alors que c\u2019est le cas pour les mots. Toutefois, l\xE0 encore, cela diff\xE8re selon la langue. En chinois, par exemple, chaque caract\xE8re est porteur de plus d\u2019informations qu\u2019un caract\xE8re dans une langue latine."),Mo=m(),H=r("p"),ul=n("Un autre \xE9l\xE9ment \xE0 prendre en compte est que nous nous retrouverons avec une tr\xE8s grande quantit\xE9 de "),Ds=r("em"),ml=n("tokens"),pl=n(" \xE0 traiter par notre mod\xE8le. Alors qu\u2019avec un "),Ss=r("em"),cl=n("tokenizer"),dl=n(" bas\xE9 sur les mots, pour un mot donn\xE9 on aurait qu\u2019un seul "),Hs=r("em"),fl=n("token"),vl=n(", avec un "),Us=r("em"),hl=n("tokenizer"),kl=n(" bas\xE9 sur les caract\xE8res, cela peut facilement se transformer en 10 "),Os=r("em"),_l=n("tokens"),bl=n(" voire plus."),Ao=m(),De=r("p"),El=n("Pour obtenir le meilleur des deux mondes, nous pouvons utiliser une troisi\xE8me technique qui combine les deux approches : la "),Bs=r("em"),$l=n("tok\xE9nisation en sous-mots"),ql=n("."),Co=m(),$e=r("h2"),Se=r("a"),Vs=r("span"),_(vt.$$.fragment),gl=m(),Gs=r("span"),xl=n("Tok\xE9nisation en sous-mots"),Lo=m(),_(ht.$$.fragment),To=m(),Wt=r("p"),zl=n("Les algorithmes de tokenisation en sous-mots reposent sur le principe selon lequel les mots fr\xE9quemment utilis\xE9s ne doivent pas \xEAtre divis\xE9s en sous-mots plus petits, mais les mots rares doivent \xEAtre d\xE9compos\xE9s en sous-mots significatifs."),No=m(),Qt=r("p"),wl=n("Par exemple, le mot \xAB maisonnette \xBB peut \xEAtre consid\xE9r\xE9 comme un mot rare et peut \xEAtre d\xE9compos\xE9 en \xAB maison \xBB et \xAB ette \xBB. Ces deux mots sont susceptibles d\u2019appara\xEEtre plus fr\xE9quemment en tant que sous-mots autonomes, alors qu\u2019en m\xEAme temps le sens de \xAB maison \xBB est conserv\xE9 par le sens composite de \xAB maison \xBB et \xAB ette \xBB."),Io=m(),He=r("p"),Pl=n("Voici un exemple montrant comment un algorithme de tokenisation en sous-mots tokeniserait la s\xE9quence \xAB "),Js=r("em"),jl=n("Let\u2019s do tokenization"),yl=n(" ! \xBB :"),Do=m(),qe=r("div"),kt=r("img"),Ml=m(),_t=r("img"),So=m(),N=r("p"),Al=n("Ces sous-mots finissent par fournir beaucoup de sens s\xE9mantique. Par exemple, ci-dessus, \xAB "),Rs=r("em"),Cl=n("tokenization"),Ll=n(" \xBB a \xE9t\xE9 divis\xE9 en \xAB "),Fs=r("em"),Tl=n("token"),Nl=n(" \xBB et \xAB "),Ks=r("em"),Il=n("ization"),Dl=n(" \xBB : deux "),Ys=r("em"),Sl=n("tokens"),Hl=n(" qui ont un sens s\xE9mantique tout en \xE9tant peu encombrants (seuls deux "),Ws=r("em"),Ul=n("tokens"),Ol=n(" sont n\xE9cessaires pour repr\xE9senter un long mot). Cela nous permet d\u2019avoir une couverture relativement bonne avec de petits vocabulaires et presque aucun "),Qs=r("em"),Bl=n("token"),Vl=n(" inconnu."),Ho=m(),Xt=r("p"),Gl=n("Cette approche est particuli\xE8rement utile dans les langues agglutinantes comme le turc, o\xF9 l\u2019on peut former des mots complexes (presque) arbitrairement longs en encha\xEEnant des sous-mots."),Uo=m(),ge=r("h3"),Ue=r("a"),Xs=r("span"),_(bt.$$.fragment),Jl=m(),Zs=r("span"),Rl=n("Et plus encore !"),Oo=m(),Zt=r("p"),Fl=n("Il existe de nombreuses autres techniques. Pour n\u2019en citer que quelques-unes :"),Bo=m(),ae=r("ul"),Et=r("li"),Kl=n("le "),en=r("em"),Yl=n("Byte-level BPE"),Wl=n(" utilis\xE9 par exemple dans le GPT-2"),Ql=m(),$t=r("li"),Xl=n("le "),tn=r("em"),Zl=n("WordPiece"),ei=n(" utilis\xE9 par exemple dans BERT"),ti=m(),Oe=r("li"),sn=r("em"),si=n("SentencePiece"),ni=n(" ou "),nn=r("em"),oi=n("Unigram"),ri=n(", utilis\xE9s dans plusieurs mod\xE8les multilingues."),Vo=m(),es=r("p"),ai=n("Vous devriez maintenant avoir une connaissance suffisante du fonctionnement des tokenizers pour commencer \xE0 utiliser l\u2019API."),Go=m(),xe=r("h2"),Be=r("a"),on=r("span"),_(qt.$$.fragment),li=m(),rn=r("span"),ii=n("Chargement et sauvegarde"),Jo=m(),I=r("p"),ui=n("Le chargement et la sauvegarde des "),an=r("em"),mi=n("tokenizers"),pi=n(" est aussi simple que pour les mod\xE8les. En fait, c\u2019est bas\xE9 sur les deux m\xEAmes m\xE9thodes : "),ln=r("code"),ci=n("from_pretrained()"),di=n(" et "),un=r("code"),fi=n("save_pretrained()"),vi=n(". Ces m\xE9thodes vont charger ou sauvegarder l\u2019algorithme utilis\xE9 par le "),mn=r("em"),hi=n("tokenizer"),ki=n(" (un peu comme l\u2019"),pn=r("em"),_i=n("architecture"),bi=n(" du mod\xE8le) ainsi que son vocabulaire (un peu comme les "),cn=r("em"),Ei=n("poids"),$i=n(" du mod\xE8le)."),Ro=m(),X=r("p"),qi=n("Le chargement du "),dn=r("em"),gi=n("tokenizer"),xi=n(" de BERT entra\xEEn\xE9 avec le m\xEAme "),fn=r("em"),zi=n("checkpoint"),wi=n(" que BERT se fait de la m\xEAme mani\xE8re que le chargement du mod\xE8le, sauf que nous utilisons la classe "),vn=r("code"),Pi=n("BertTokenizer"),ji=n(" :"),Fo=m(),_(gt.$$.fragment),Ko=m(),ye.c(),ts=m(),_(xt.$$.fragment),Yo=m(),Ve=r("p"),yi=n("Nous pouvons \xE0 pr\xE9sent utiliser le "),hn=r("em"),Mi=n("tokenizer"),Ai=n(" comme indiqu\xE9 dans la section pr\xE9c\xE9dente :"),Wo=m(),_(zt.$$.fragment),Qo=m(),_(wt.$$.fragment),Xo=m(),ss=r("p"),Ci=n("La sauvegarde d\u2019un tokenizer est identique \xE0 celle d\u2019un mod\xE8le :"),Zo=m(),_(Pt.$$.fragment),er=m(),U=r("p"),Li=n("Nous parlerons plus en d\xE9tail des "),kn=r("code"),Ti=n("token_type_ids"),Ni=n(" au "),ns=r("a"),Ii=n("chapitre 3"),Di=n(" et nous expliquerons la cl\xE9 "),_n=r("code"),Si=n("attention_mask"),Hi=n(" un peu plus tard. Tout d\u2019abord, voyons comment les "),bn=r("code"),Ui=n("input_ids"),Oi=n(" sont g\xE9n\xE9r\xE9s. Pour ce faire, nous devons examiner les m\xE9thodes interm\xE9diaires du "),En=r("em"),Bi=n("tokenizer"),Vi=n("."),tr=m(),ze=r("h2"),Ge=r("a"),$n=r("span"),_(jt.$$.fragment),Gi=m(),qn=r("span"),Ji=n("Encodage"),sr=m(),_(yt.$$.fragment),nr=m(),Je=r("p"),Ri=n("La traduction d\u2019un texte en chiffres est connue sous le nom d\u2019"),gn=r("em"),Fi=n("encodage"),Ki=n(". L\u2019encodage se fait en deux \xE9tapes : la tokenisation, suivie de la conversion en identifiants d\u2019entr\xE9e."),or=m(),le=r("p"),Yi=n("Comme nous l\u2019avons vu, la premi\xE8re \xE9tape consiste \xE0 diviser le texte en mots (ou parties de mots, symboles de ponctuation, etc.), g\xE9n\xE9ralement appel\xE9s "),xn=r("em"),Wi=n("tokens"),Qi=n(". De nombreuses r\xE8gles peuvent r\xE9gir ce processus. C\u2019est pourquoi nous devons instancier le "),zn=r("em"),Xi=n("tokenizer"),Zi=n(" en utilisant le nom du mod\xE8le afin de nous assurer que nous utilisons les m\xEAmes r\xE8gles que celles utilis\xE9es lors du pr\xE9-entra\xEEnement du mod\xE8le."),rr=m(),J=r("p"),eu=n("La deuxi\xE8me \xE9tape consiste \xE0 convertir ces "),wn=r("em"),tu=n("tokens"),su=n(" en nombres afin de construire un tenseur \xE0 partir de ceux-ci ainsi que de les transmettre au mod\xE8le. Pour ce faire, le "),Pn=r("em"),nu=n("tokenizer"),ou=n(" poss\xE8de un "),jn=r("em"),ru=n("vocabulaire"),au=n(", qui est la partie que nous t\xE9l\xE9chargeons lorsque nous l\u2019instancions avec la m\xE9thode "),yn=r("code"),lu=n("from_pretrained()"),iu=n(". Encore une fois, nous devons utiliser le m\xEAme vocabulaire que celui utilis\xE9 lors du pr\xE9-entra\xEEnement du mod\xE8le."),ar=m(),Re=r("p"),uu=n("Pour mieux comprendre les deux \xE9tapes, nous allons les explorer s\xE9par\xE9ment. A noter que nous utilisons des m\xE9thodes effectuant s\xE9par\xE9ment des parties du pipeline de tokenisation afin de montrer les r\xE9sultats interm\xE9diaires de ces \xE9tapes. N\xE9anmoins, en pratique, il faut appeler le "),Mn=r("em"),mu=n("tokenizer"),pu=n(" directement sur vos entr\xE9es (comme indiqu\xE9 dans la section 2)."),lr=m(),we=r("h3"),Fe=r("a"),An=r("span"),_(Mt.$$.fragment),cu=m(),Cn=r("span"),du=n("Tokenisation"),ir=m(),ie=r("p"),fu=n("Le processus de tokenisation est effectu\xE9 par la m\xE9thode "),Ln=r("code"),vu=n("tokenize()"),hu=n(" du "),Tn=r("em"),ku=n("tokenizer"),_u=n(" :"),ur=m(),_(At.$$.fragment),mr=m(),Ke=r("p"),bu=n("La sortie de cette m\xE9thode est une liste de cha\xEEnes de caract\xE8res ou de "),Nn=r("em"),Eu=n("tokens"),$u=n(" :"),pr=m(),_(Ct.$$.fragment),cr=m(),A=r("p"),qu=n("Ce "),In=r("em"),gu=n("tokenizer"),xu=n(" est un "),Dn=r("em"),zu=n("tokenizer"),wu=n(" de sous-mots : il d\xE9coupe les mots jusqu\u2019\xE0 obtenir des "),Sn=r("em"),Pu=n("tokens"),ju=n(" qui peuvent \xEAtre repr\xE9sent\xE9s par son vocabulaire. C\u2019est le cas ici avec "),Hn=r("code"),yu=n("transformer"),Mu=n(" qui est divis\xE9 en deux "),Un=r("em"),Au=n("tokens"),Cu=n(" : "),On=r("code"),Lu=n("transform"),Tu=n(" et "),Bn=r("code"),Nu=n("##er"),Iu=n("."),dr=m(),Pe=r("h3"),Ye=r("a"),Vn=r("span"),_(Lt.$$.fragment),Du=m(),Tt=r("span"),Su=n("De "),Gn=r("i"),Hu=n("tokens"),Uu=n(" aux identifiants d'entr\xE9e"),fr=m(),ue=r("p"),Ou=n("La conversion en identifiants d\u2019entr\xE9e est g\xE9r\xE9e par la m\xE9thode "),Jn=r("code"),Bu=n("convert_tokens_to_ids()"),Vu=n(" du "),Rn=r("em"),Gu=n("tokenizer"),Ju=n(" :"),vr=m(),_(Nt.$$.fragment),hr=m(),_(It.$$.fragment),kr=m(),We=r("p"),Ru=n("Une fois converties en tenseur dans le "),Fn=r("em"),Fu=n("framework"),Ku=n(" appropri\xE9, ces sorties peuvent ensuite \xEAtre utilis\xE9es comme entr\xE9es d\u2019un mod\xE8le, comme nous l\u2019avons vu pr\xE9c\xE9demment dans ce chapitre."),_r=m(),_(Qe.$$.fragment),br=m(),je=r("h2"),Xe=r("a"),Kn=r("span"),_(Dt.$$.fragment),Yu=m(),Yn=r("span"),Wu=n("D\xE9codage"),Er=m(),me=r("p"),Qu=n("Le "),Wn=r("em"),Xu=n("d\xE9codage"),Zu=n(" va dans l\u2019autre sens : \xE0 partir d\u2019indices du vocabulaire nous voulons obtenir une cha\xEEne de caract\xE8res. Cela peut \xEAtre fait avec la m\xE9thode "),Qn=r("code"),em=n("decode()"),tm=n(" comme suit :"),$r=m(),_(St.$$.fragment),qr=m(),_(Ht.$$.fragment),gr=m(),R=r("p"),sm=n("Notez que la m\xE9thode "),Xn=r("code"),nm=n("decode"),om=n(" non seulement reconvertit les indices en "),Zn=r("em"),rm=n("tokens"),am=n(" mais regroupe \xE9galement les "),eo=r("em"),lm=n("tokens"),im=n(" faisant partie des m\xEAmes mots. Le but \xE9tant de produire une phrase lisible. Ce comportement sera extr\xEAmement utile lorsque dans la suite du cours nous utiliserons des mod\xE8les pouvant produire du nouveau texte (soit du texte g\xE9n\xE9r\xE9 \xE0 partir d\u2019un "),to=r("em"),um=n("prompt"),mm=n(", soit pour des probl\xE8mes de s\xE9quence \xE0 s\xE9quence comme la traduction ou le r\xE9sum\xE9 de texte)."),xr=m(),Ze=r("p"),pm=n("Vous devriez maintenant comprendre les op\xE9rations atomiques qu\u2019un "),so=r("em"),cm=n("tokenizer"),dm=n(" peut g\xE9rer : tokenisation, conversion en identifiants, et reconversion des identifiants en cha\xEEne de caract\xE8res. Cependant, nous n\u2019avons fait qu\u2019effleurer la partie \xE9merg\xE9e de l\u2019iceberg. Dans la section suivante, nous allons pousser notre approche jusqu\u2019\xE0 ses limites et voir comment les surmonter."),this.h()},l(e){const i=Oc('[data-svelte="svelte-1phssyn"]',document.head);c=a(i,"META",{name:!0,content:!0}),i.forEach(s),q=p(e),b(f.$$.fragment,e),w=p(e),y=a(e,"H1",{class:!0});var Ot=l(y);g=a(Ot,"A",{id:!0,class:!0,href:!0});var os=l(g);D=a(os,"SPAN",{});var no=l(D);b(C.$$.fragment,no),no.forEach(s),os.forEach(s),M=p(Ot),T=a(Ot,"SPAN",{});var fm=l(T);B=o(fm,"Les "),z=a(fm,"I",{});var wm=l(z);P=o(wm,"tokenizers"),wm.forEach(s),fm.forEach(s),Ot.forEach(s),V=p(e),j.l(e),G=p(e),b(L.$$.fragment,e),k=p(e),S=a(e,"P",{});var rs=l(S);fe=o(rs,"Les "),te=a(rs,"EM",{});var Pm=l(te);ve=o(Pm,"tokenizers"),Pm.forEach(s),he=o(rs," sont l\u2019un des principaux composants du pipeline de NLP. Ils ont un seul objectif : traduire le texte en donn\xE9es pouvant \xEAtre trait\xE9es par le mod\xE8le. Les mod\xE8les ne pouvant traiter que des nombres, les "),fs=a(rs,"EM",{});var jm=l(fs);sa=o(jm,"tokenizers"),jm.forEach(s),na=o(rs," doivent convertir nos entr\xE9es textuelles en donn\xE9es num\xE9riques. Dans cette section, nous allons explorer ce qui se passe exactement dans le pipeline de tok\xE9nisation."),rs.forEach(s),ao=p(e),Vt=a(e,"P",{});var ym=l(Vt);oa=o(ym,"Dans les t\xE2ches de NLP, les donn\xE9es trait\xE9es sont g\xE9n\xE9ralement du texte brut. Voici un exemple de ce type de texte :"),ym.forEach(s),lo=p(e),b(nt.$$.fragment,e),io=p(e),Me=a(e,"P",{});var Pr=l(Me);ra=o(Pr,"Les mod\xE8les ne pouvant traiter que des nombres, nous devons trouver un moyen de convertir le texte brut en nombres. C\u2019est ce que font les "),vs=a(Pr,"EM",{});var Mm=l(vs);aa=o(Mm,"tokenizers"),Mm.forEach(s),la=o(Pr," et il existe de nombreuses fa\xE7ons de proc\xE9der. L\u2019objectif est de trouver la repr\xE9sentation la plus significative, c\u2019est-\xE0-dire celle qui a le plus de sens pour le mod\xE8le, et si possible qui soit la plus petite."),Pr.forEach(s),uo=p(e),Gt=a(e,"P",{});var Am=l(Gt);ia=o(Am,"Voyons quelques exemples d\u2019algorithmes de tok\xE9nisation et essayons de r\xE9pondre \xE0 certaines des questions que vous pouvez vous poser \xE0 ce sujet."),Am.forEach(s),mo=p(e),ke=a(e,"H2",{class:!0});var jr=l(ke);Ae=a(jr,"A",{id:!0,class:!0,href:!0});var Cm=l(Ae);hs=a(Cm,"SPAN",{});var Lm=l(hs);b(ot.$$.fragment,Lm),Lm.forEach(s),Cm.forEach(s),ua=p(jr),Jt=a(jr,"SPAN",{});var vm=l(Jt);ks=a(vm,"I",{});var Tm=l(ks);ma=o(Tm,"Tokenizer"),Tm.forEach(s),pa=o(vm," bas\xE9 sur les mots"),vm.forEach(s),jr.forEach(s),po=p(e),b(rt.$$.fragment,e),co=p(e),Ce=a(e,"P",{});var yr=l(Ce);ca=o(yr,"Le premier type de "),_s=a(yr,"EM",{});var Nm=l(_s);da=o(Nm,"tokenizer"),Nm.forEach(s),fa=o(yr," qui vient \xE0 l\u2019esprit est celui bas\xE9 sur les mots. Il est g\xE9n\xE9ralement tr\xE8s facile \xE0 utiliser et configurable avec seulement quelques r\xE8gles. Il donne souvent des r\xE9sultats d\xE9cents. Par exemple, dans l\u2019image ci-dessous, l\u2019objectif est de diviser le texte brut en mots et de trouver une repr\xE9sentation num\xE9rique pour chacun d\u2019eux :"),yr.forEach(s),fo=p(e),_e=a(e,"DIV",{class:!0});var Mr=l(_e);at=a(Mr,"IMG",{class:!0,src:!0,alt:!0}),va=p(Mr),lt=a(Mr,"IMG",{class:!0,src:!0,alt:!0}),Mr.forEach(s),vo=p(e),Le=a(e,"P",{});var Ar=l(Le);ha=o(Ar,"Il existe diff\xE9rentes fa\xE7ons de diviser le texte. Par exemple, nous pouvons utiliser les espaces pour segmenter le texte en mots en appliquant la fonction "),bs=a(Ar,"CODE",{});var Im=l(bs);ka=o(Im,"split()"),Im.forEach(s),_a=o(Ar," de Python :"),Ar.forEach(s),ho=p(e),b(it.$$.fragment,e),ko=p(e),b(ut.$$.fragment,e),_o=p(e),Q=a(e,"P",{});var et=l(Q);ba=o(et,"Il existe \xE9galement des variantes des "),Es=a(et,"EM",{});var Dm=l(Es);Ea=o(Dm,"tokenizers"),Dm.forEach(s),$a=o(et," bas\xE9s sur les mots qui ont des r\xE8gles suppl\xE9mentaires pour la ponctuation. Avec ce type de "),$s=a(et,"EM",{});var Sm=l($s);qa=o(Sm,"tokenizers"),Sm.forEach(s),ga=o(et," nous pouvons nous retrouver avec des \xAB vocabulaires \xBB assez larges, o\xF9 un vocabulaire est d\xE9fini par le nombre total de "),qs=a(et,"EM",{});var Hm=l(qs);xa=o(Hm,"tokens"),Hm.forEach(s),za=o(et," ind\xE9pendants que nous avons dans notre corpus."),et.forEach(s),bo=p(e),Rt=a(e,"P",{});var Um=l(Rt);wa=o(Um,"Un identifiant est attribu\xE9 \xE0 chaque mot, en commen\xE7ant par 0 et en allant jusqu\u2019\xE0 la taille du vocabulaire. Le mod\xE8le utilise ces identifiants pour identifier chaque mot."),Um.forEach(s),Eo=p(e),oe=a(e,"P",{});var as=l(oe);Pa=o(as,"Si nous voulons couvrir compl\xE8tement une langue avec un "),gs=a(as,"EM",{});var Om=l(gs);ja=o(Om,"tokenizer"),Om.forEach(s),ya=o(as," bas\xE9 sur les mots, nous devons avoir un identifiant pour chaque mot de la langue que nous traitons, ce qui g\xE9n\xE8re une \xE9norme quantit\xE9 de "),xs=a(as,"EM",{});var Bm=l(xs);Ma=o(Bm,"tokens"),Bm.forEach(s),Aa=o(as,". Par exemple, il y a plus de 500 000 mots dans la langue anglaise. Ainsi pour associer chaque mot \xE0 un identifiant, nous devrions garder la trace d\u2019autant d\u2019identifiants. De plus, des mots comme \xAB chien \xBB sont repr\xE9sent\xE9s diff\xE9remment de mots comme \xAB chiens \xBB. Le mod\xE8le n\u2019a initialement aucun moyen de savoir que \xAB chien \xBB et \xAB chiens \xBB sont similaires : il identifie les deux mots comme non apparent\xE9s. Il en va de m\xEAme pour d\u2019autres mots similaires, comme \xAB maison \xBB et \xAB maisonnette \xBB que le mod\xE8le ne consid\xE9rera pas comme similaires au d\xE9part."),as.forEach(s),$o=p(e),se=a(e,"P",{});var Bt=l(se);Ca=o(Bt,"Enfin, nous avons besoin d\u2019un "),zs=a(Bt,"EM",{});var Vm=l(zs);La=o(Vm,"token"),Vm.forEach(s),Ta=o(Bt," personnalis\xE9 pour repr\xE9senter les mots qui ne font pas partie de notre vocabulaire. C\u2019est ce qu\u2019on appelle le "),ws=a(Bt,"EM",{});var Gm=l(ws);Na=o(Gm,"token"),Gm.forEach(s),Ia=o(Bt," \xAB inconnu \xBB souvent repr\xE9sent\xE9 par \xAB [UNK] \xBB (de l\u2019anglais \xAB unknown \xBB) ou \xAB "),ne=a(Bt,"UNK",{});var tt=l(ne);Da=o(tt,"; \xBB. C\u2019est g\xE9n\xE9ralement un mauvais signe si vous constatez que le "),Ps=a(tt,"EM",{});var Jm=l(Ps);Sa=o(Jm,"tokenizer"),Jm.forEach(s),Ha=o(tt," produit un nombre important de ce jeton sp\xE9cial. Cela signifie qu\u2019il n\u2019a pas \xE9t\xE9 en mesure de r\xE9cup\xE9rer une repr\xE9sentation sens\xE9e d\u2019un mot et que vous perdez des informations en cours de route. L\u2019objectif de l\u2019\xE9laboration du vocabulaire est de faire en sorte que le "),js=a(tt,"EM",{});var Rm=l(js);Ua=o(Rm,"tokenizer"),Rm.forEach(s),Oa=o(tt," transforme le moins de mots possible en "),ys=a(tt,"EM",{});var Fm=l(ys);Ba=o(Fm,"token"),Fm.forEach(s),Va=o(tt," inconnu."),tt.forEach(s),Bt.forEach(s),qo=p(e),re=a(e,"P",{});var ls=l(re);Ga=o(ls,"Une fa\xE7on de r\xE9duire la quantit\xE9 de "),Ms=a(ls,"EM",{});var Km=l(Ms);Ja=o(Km,"tokens"),Km.forEach(s),Ra=o(ls," inconnus est d\u2019aller un niveau plus profond, en utilisant un "),As=a(ls,"EM",{});var Ym=l(As);Fa=o(Ym,"tokenizer"),Ym.forEach(s),Ka=o(ls," bas\xE9 sur les caract\xE8res."),ls.forEach(s),go=p(e),be=a(e,"H2",{class:!0});var Cr=l(be);Te=a(Cr,"A",{id:!0,class:!0,href:!0});var Wm=l(Te);Cs=a(Wm,"SPAN",{});var Qm=l(Cs);b(mt.$$.fragment,Qm),Qm.forEach(s),Wm.forEach(s),Ya=p(Cr),Ft=a(Cr,"SPAN",{});var hm=l(Ft);Ls=a(hm,"I",{});var Xm=l(Ls);Wa=o(Xm,"Tokenizer"),Xm.forEach(s),Qa=o(hm,"  bas\xE9 sur les caract\xE8res"),hm.forEach(s),Cr.forEach(s),xo=p(e),b(pt.$$.fragment,e),zo=p(e),Ne=a(e,"P",{});var Lr=l(Ne);Xa=o(Lr,"Les "),Ts=a(Lr,"EM",{});var Zm=l(Ts);Za=o(Zm,"tokenizers"),Zm.forEach(s),el=o(Lr," bas\xE9s sur les caract\xE8res divisent le texte en caract\xE8res, plut\xF4t qu\u2019en mots. Cela pr\xE9sente deux avantages principaux :"),Lr.forEach(s),wo=p(e),Ie=a(e,"UL",{});var Tr=l(Ie);Ns=a(Tr,"LI",{});var ep=l(Ns);tl=o(ep,"le vocabulaire est beaucoup plus petit"),ep.forEach(s),sl=p(Tr),ct=a(Tr,"LI",{});var Nr=l(ct);nl=o(Nr,"il y a beaucoup moins de "),Is=a(Nr,"EM",{});var tp=l(Is);ol=o(tp,"tokens"),tp.forEach(s),rl=o(Nr," hors vocabulaire (inconnus) puisque chaque mot peut \xEAtre construit \xE0 partir de caract\xE8res."),Nr.forEach(s),Tr.forEach(s),Po=p(e),Kt=a(e,"P",{});var sp=l(Kt);al=o(sp,"Mais l\xE0 aussi, des questions se posent concernant les espaces et la ponctuation :"),sp.forEach(s),jo=p(e),Ee=a(e,"DIV",{class:!0});var Ir=l(Ee);dt=a(Ir,"IMG",{class:!0,src:!0,alt:!0}),ll=p(Ir),ft=a(Ir,"IMG",{class:!0,src:!0,alt:!0}),Ir.forEach(s),yo=p(e),Yt=a(e,"P",{});var np=l(Yt);il=o(np,"Cette approche n\u2019est pas non plus parfaite. Puisque la repr\xE9sentation est maintenant bas\xE9e sur des caract\xE8res plut\xF4t que sur des mots, on pourrait dire intuitivement qu\u2019elle est moins significative : chaque caract\xE8re ne signifie pas grand-chose en soi, alors que c\u2019est le cas pour les mots. Toutefois, l\xE0 encore, cela diff\xE8re selon la langue. En chinois, par exemple, chaque caract\xE8re est porteur de plus d\u2019informations qu\u2019un caract\xE8re dans une langue latine."),np.forEach(s),Mo=p(e),H=a(e,"P",{});var Z=l(H);ul=o(Z,"Un autre \xE9l\xE9ment \xE0 prendre en compte est que nous nous retrouverons avec une tr\xE8s grande quantit\xE9 de "),Ds=a(Z,"EM",{});var op=l(Ds);ml=o(op,"tokens"),op.forEach(s),pl=o(Z," \xE0 traiter par notre mod\xE8le. Alors qu\u2019avec un "),Ss=a(Z,"EM",{});var rp=l(Ss);cl=o(rp,"tokenizer"),rp.forEach(s),dl=o(Z," bas\xE9 sur les mots, pour un mot donn\xE9 on aurait qu\u2019un seul "),Hs=a(Z,"EM",{});var ap=l(Hs);fl=o(ap,"token"),ap.forEach(s),vl=o(Z,", avec un "),Us=a(Z,"EM",{});var lp=l(Us);hl=o(lp,"tokenizer"),lp.forEach(s),kl=o(Z," bas\xE9 sur les caract\xE8res, cela peut facilement se transformer en 10 "),Os=a(Z,"EM",{});var ip=l(Os);_l=o(ip,"tokens"),ip.forEach(s),bl=o(Z," voire plus."),Z.forEach(s),Ao=p(e),De=a(e,"P",{});var Dr=l(De);El=o(Dr,"Pour obtenir le meilleur des deux mondes, nous pouvons utiliser une troisi\xE8me technique qui combine les deux approches : la "),Bs=a(Dr,"EM",{});var up=l(Bs);$l=o(up,"tok\xE9nisation en sous-mots"),up.forEach(s),ql=o(Dr,"."),Dr.forEach(s),Co=p(e),$e=a(e,"H2",{class:!0});var Sr=l($e);Se=a(Sr,"A",{id:!0,class:!0,href:!0});var mp=l(Se);Vs=a(mp,"SPAN",{});var pp=l(Vs);b(vt.$$.fragment,pp),pp.forEach(s),mp.forEach(s),gl=p(Sr),Gs=a(Sr,"SPAN",{});var cp=l(Gs);xl=o(cp,"Tok\xE9nisation en sous-mots"),cp.forEach(s),Sr.forEach(s),Lo=p(e),b(ht.$$.fragment,e),To=p(e),Wt=a(e,"P",{});var dp=l(Wt);zl=o(dp,"Les algorithmes de tokenisation en sous-mots reposent sur le principe selon lequel les mots fr\xE9quemment utilis\xE9s ne doivent pas \xEAtre divis\xE9s en sous-mots plus petits, mais les mots rares doivent \xEAtre d\xE9compos\xE9s en sous-mots significatifs."),dp.forEach(s),No=p(e),Qt=a(e,"P",{});var fp=l(Qt);wl=o(fp,"Par exemple, le mot \xAB maisonnette \xBB peut \xEAtre consid\xE9r\xE9 comme un mot rare et peut \xEAtre d\xE9compos\xE9 en \xAB maison \xBB et \xAB ette \xBB. Ces deux mots sont susceptibles d\u2019appara\xEEtre plus fr\xE9quemment en tant que sous-mots autonomes, alors qu\u2019en m\xEAme temps le sens de \xAB maison \xBB est conserv\xE9 par le sens composite de \xAB maison \xBB et \xAB ette \xBB."),fp.forEach(s),Io=p(e),He=a(e,"P",{});var Hr=l(He);Pl=o(Hr,"Voici un exemple montrant comment un algorithme de tokenisation en sous-mots tokeniserait la s\xE9quence \xAB "),Js=a(Hr,"EM",{});var vp=l(Js);jl=o(vp,"Let\u2019s do tokenization"),vp.forEach(s),yl=o(Hr," ! \xBB :"),Hr.forEach(s),Do=p(e),qe=a(e,"DIV",{class:!0});var Ur=l(qe);kt=a(Ur,"IMG",{class:!0,src:!0,alt:!0}),Ml=p(Ur),_t=a(Ur,"IMG",{class:!0,src:!0,alt:!0}),Ur.forEach(s),So=p(e),N=a(e,"P",{});var F=l(N);Al=o(F,"Ces sous-mots finissent par fournir beaucoup de sens s\xE9mantique. Par exemple, ci-dessus, \xAB "),Rs=a(F,"EM",{});var hp=l(Rs);Cl=o(hp,"tokenization"),hp.forEach(s),Ll=o(F," \xBB a \xE9t\xE9 divis\xE9 en \xAB "),Fs=a(F,"EM",{});var kp=l(Fs);Tl=o(kp,"token"),kp.forEach(s),Nl=o(F," \xBB et \xAB "),Ks=a(F,"EM",{});var _p=l(Ks);Il=o(_p,"ization"),_p.forEach(s),Dl=o(F," \xBB : deux "),Ys=a(F,"EM",{});var bp=l(Ys);Sl=o(bp,"tokens"),bp.forEach(s),Hl=o(F," qui ont un sens s\xE9mantique tout en \xE9tant peu encombrants (seuls deux "),Ws=a(F,"EM",{});var Ep=l(Ws);Ul=o(Ep,"tokens"),Ep.forEach(s),Ol=o(F," sont n\xE9cessaires pour repr\xE9senter un long mot). Cela nous permet d\u2019avoir une couverture relativement bonne avec de petits vocabulaires et presque aucun "),Qs=a(F,"EM",{});var $p=l(Qs);Bl=o($p,"token"),$p.forEach(s),Vl=o(F," inconnu."),F.forEach(s),Ho=p(e),Xt=a(e,"P",{});var qp=l(Xt);Gl=o(qp,"Cette approche est particuli\xE8rement utile dans les langues agglutinantes comme le turc, o\xF9 l\u2019on peut former des mots complexes (presque) arbitrairement longs en encha\xEEnant des sous-mots."),qp.forEach(s),Uo=p(e),ge=a(e,"H3",{class:!0});var Or=l(ge);Ue=a(Or,"A",{id:!0,class:!0,href:!0});var gp=l(Ue);Xs=a(gp,"SPAN",{});var xp=l(Xs);b(bt.$$.fragment,xp),xp.forEach(s),gp.forEach(s),Jl=p(Or),Zs=a(Or,"SPAN",{});var zp=l(Zs);Rl=o(zp,"Et plus encore !"),zp.forEach(s),Or.forEach(s),Oo=p(e),Zt=a(e,"P",{});var wp=l(Zt);Fl=o(wp,"Il existe de nombreuses autres techniques. Pour n\u2019en citer que quelques-unes :"),wp.forEach(s),Bo=p(e),ae=a(e,"UL",{});var is=l(ae);Et=a(is,"LI",{});var Br=l(Et);Kl=o(Br,"le "),en=a(Br,"EM",{});var Pp=l(en);Yl=o(Pp,"Byte-level BPE"),Pp.forEach(s),Wl=o(Br," utilis\xE9 par exemple dans le GPT-2"),Br.forEach(s),Ql=p(is),$t=a(is,"LI",{});var Vr=l($t);Xl=o(Vr,"le "),tn=a(Vr,"EM",{});var jp=l(tn);Zl=o(jp,"WordPiece"),jp.forEach(s),ei=o(Vr," utilis\xE9 par exemple dans BERT"),Vr.forEach(s),ti=p(is),Oe=a(is,"LI",{});var oo=l(Oe);sn=a(oo,"EM",{});var yp=l(sn);si=o(yp,"SentencePiece"),yp.forEach(s),ni=o(oo," ou "),nn=a(oo,"EM",{});var Mp=l(nn);oi=o(Mp,"Unigram"),Mp.forEach(s),ri=o(oo,", utilis\xE9s dans plusieurs mod\xE8les multilingues."),oo.forEach(s),is.forEach(s),Vo=p(e),es=a(e,"P",{});var Ap=l(es);ai=o(Ap,"Vous devriez maintenant avoir une connaissance suffisante du fonctionnement des tokenizers pour commencer \xE0 utiliser l\u2019API."),Ap.forEach(s),Go=p(e),xe=a(e,"H2",{class:!0});var Gr=l(xe);Be=a(Gr,"A",{id:!0,class:!0,href:!0});var Cp=l(Be);on=a(Cp,"SPAN",{});var Lp=l(on);b(qt.$$.fragment,Lp),Lp.forEach(s),Cp.forEach(s),li=p(Gr),rn=a(Gr,"SPAN",{});var Tp=l(rn);ii=o(Tp,"Chargement et sauvegarde"),Tp.forEach(s),Gr.forEach(s),Jo=p(e),I=a(e,"P",{});var K=l(I);ui=o(K,"Le chargement et la sauvegarde des "),an=a(K,"EM",{});var Np=l(an);mi=o(Np,"tokenizers"),Np.forEach(s),pi=o(K," est aussi simple que pour les mod\xE8les. En fait, c\u2019est bas\xE9 sur les deux m\xEAmes m\xE9thodes : "),ln=a(K,"CODE",{});var Ip=l(ln);ci=o(Ip,"from_pretrained()"),Ip.forEach(s),di=o(K," et "),un=a(K,"CODE",{});var Dp=l(un);fi=o(Dp,"save_pretrained()"),Dp.forEach(s),vi=o(K,". Ces m\xE9thodes vont charger ou sauvegarder l\u2019algorithme utilis\xE9 par le "),mn=a(K,"EM",{});var Sp=l(mn);hi=o(Sp,"tokenizer"),Sp.forEach(s),ki=o(K," (un peu comme l\u2019"),pn=a(K,"EM",{});var Hp=l(pn);_i=o(Hp,"architecture"),Hp.forEach(s),bi=o(K," du mod\xE8le) ainsi que son vocabulaire (un peu comme les "),cn=a(K,"EM",{});var Up=l(cn);Ei=o(Up,"poids"),Up.forEach(s),$i=o(K," du mod\xE8le)."),K.forEach(s),Ro=p(e),X=a(e,"P",{});var st=l(X);qi=o(st,"Le chargement du "),dn=a(st,"EM",{});var Op=l(dn);gi=o(Op,"tokenizer"),Op.forEach(s),xi=o(st," de BERT entra\xEEn\xE9 avec le m\xEAme "),fn=a(st,"EM",{});var Bp=l(fn);zi=o(Bp,"checkpoint"),Bp.forEach(s),wi=o(st," que BERT se fait de la m\xEAme mani\xE8re que le chargement du mod\xE8le, sauf que nous utilisons la classe "),vn=a(st,"CODE",{});var Vp=l(vn);Pi=o(Vp,"BertTokenizer"),Vp.forEach(s),ji=o(st," :"),st.forEach(s),Fo=p(e),b(gt.$$.fragment,e),Ko=p(e),ye.l(e),ts=p(e),b(xt.$$.fragment,e),Yo=p(e),Ve=a(e,"P",{});var Jr=l(Ve);yi=o(Jr,"Nous pouvons \xE0 pr\xE9sent utiliser le "),hn=a(Jr,"EM",{});var Gp=l(hn);Mi=o(Gp,"tokenizer"),Gp.forEach(s),Ai=o(Jr," comme indiqu\xE9 dans la section pr\xE9c\xE9dente :"),Jr.forEach(s),Wo=p(e),b(zt.$$.fragment,e),Qo=p(e),b(wt.$$.fragment,e),Xo=p(e),ss=a(e,"P",{});var Jp=l(ss);Ci=o(Jp,"La sauvegarde d\u2019un tokenizer est identique \xE0 celle d\u2019un mod\xE8le :"),Jp.forEach(s),Zo=p(e),b(Pt.$$.fragment,e),er=p(e),U=a(e,"P",{});var ee=l(U);Li=o(ee,"Nous parlerons plus en d\xE9tail des "),kn=a(ee,"CODE",{});var Rp=l(kn);Ti=o(Rp,"token_type_ids"),Rp.forEach(s),Ni=o(ee," au "),ns=a(ee,"A",{href:!0});var Fp=l(ns);Ii=o(Fp,"chapitre 3"),Fp.forEach(s),Di=o(ee," et nous expliquerons la cl\xE9 "),_n=a(ee,"CODE",{});var Kp=l(_n);Si=o(Kp,"attention_mask"),Kp.forEach(s),Hi=o(ee," un peu plus tard. Tout d\u2019abord, voyons comment les "),bn=a(ee,"CODE",{});var Yp=l(bn);Ui=o(Yp,"input_ids"),Yp.forEach(s),Oi=o(ee," sont g\xE9n\xE9r\xE9s. Pour ce faire, nous devons examiner les m\xE9thodes interm\xE9diaires du "),En=a(ee,"EM",{});var Wp=l(En);Bi=o(Wp,"tokenizer"),Wp.forEach(s),Vi=o(ee,"."),ee.forEach(s),tr=p(e),ze=a(e,"H2",{class:!0});var Rr=l(ze);Ge=a(Rr,"A",{id:!0,class:!0,href:!0});var Qp=l(Ge);$n=a(Qp,"SPAN",{});var Xp=l($n);b(jt.$$.fragment,Xp),Xp.forEach(s),Qp.forEach(s),Gi=p(Rr),qn=a(Rr,"SPAN",{});var Zp=l(qn);Ji=o(Zp,"Encodage"),Zp.forEach(s),Rr.forEach(s),sr=p(e),b(yt.$$.fragment,e),nr=p(e),Je=a(e,"P",{});var Fr=l(Je);Ri=o(Fr,"La traduction d\u2019un texte en chiffres est connue sous le nom d\u2019"),gn=a(Fr,"EM",{});var ec=l(gn);Fi=o(ec,"encodage"),ec.forEach(s),Ki=o(Fr,". L\u2019encodage se fait en deux \xE9tapes : la tokenisation, suivie de la conversion en identifiants d\u2019entr\xE9e."),Fr.forEach(s),or=p(e),le=a(e,"P",{});var us=l(le);Yi=o(us,"Comme nous l\u2019avons vu, la premi\xE8re \xE9tape consiste \xE0 diviser le texte en mots (ou parties de mots, symboles de ponctuation, etc.), g\xE9n\xE9ralement appel\xE9s "),xn=a(us,"EM",{});var tc=l(xn);Wi=o(tc,"tokens"),tc.forEach(s),Qi=o(us,". De nombreuses r\xE8gles peuvent r\xE9gir ce processus. C\u2019est pourquoi nous devons instancier le "),zn=a(us,"EM",{});var sc=l(zn);Xi=o(sc,"tokenizer"),sc.forEach(s),Zi=o(us," en utilisant le nom du mod\xE8le afin de nous assurer que nous utilisons les m\xEAmes r\xE8gles que celles utilis\xE9es lors du pr\xE9-entra\xEEnement du mod\xE8le."),us.forEach(s),rr=p(e),J=a(e,"P",{});var pe=l(J);eu=o(pe,"La deuxi\xE8me \xE9tape consiste \xE0 convertir ces "),wn=a(pe,"EM",{});var nc=l(wn);tu=o(nc,"tokens"),nc.forEach(s),su=o(pe," en nombres afin de construire un tenseur \xE0 partir de ceux-ci ainsi que de les transmettre au mod\xE8le. Pour ce faire, le "),Pn=a(pe,"EM",{});var oc=l(Pn);nu=o(oc,"tokenizer"),oc.forEach(s),ou=o(pe," poss\xE8de un "),jn=a(pe,"EM",{});var rc=l(jn);ru=o(rc,"vocabulaire"),rc.forEach(s),au=o(pe,", qui est la partie que nous t\xE9l\xE9chargeons lorsque nous l\u2019instancions avec la m\xE9thode "),yn=a(pe,"CODE",{});var ac=l(yn);lu=o(ac,"from_pretrained()"),ac.forEach(s),iu=o(pe,". Encore une fois, nous devons utiliser le m\xEAme vocabulaire que celui utilis\xE9 lors du pr\xE9-entra\xEEnement du mod\xE8le."),pe.forEach(s),ar=p(e),Re=a(e,"P",{});var Kr=l(Re);uu=o(Kr,"Pour mieux comprendre les deux \xE9tapes, nous allons les explorer s\xE9par\xE9ment. A noter que nous utilisons des m\xE9thodes effectuant s\xE9par\xE9ment des parties du pipeline de tokenisation afin de montrer les r\xE9sultats interm\xE9diaires de ces \xE9tapes. N\xE9anmoins, en pratique, il faut appeler le "),Mn=a(Kr,"EM",{});var lc=l(Mn);mu=o(lc,"tokenizer"),lc.forEach(s),pu=o(Kr," directement sur vos entr\xE9es (comme indiqu\xE9 dans la section 2)."),Kr.forEach(s),lr=p(e),we=a(e,"H3",{class:!0});var Yr=l(we);Fe=a(Yr,"A",{id:!0,class:!0,href:!0});var ic=l(Fe);An=a(ic,"SPAN",{});var uc=l(An);b(Mt.$$.fragment,uc),uc.forEach(s),ic.forEach(s),cu=p(Yr),Cn=a(Yr,"SPAN",{});var mc=l(Cn);du=o(mc,"Tokenisation"),mc.forEach(s),Yr.forEach(s),ir=p(e),ie=a(e,"P",{});var ms=l(ie);fu=o(ms,"Le processus de tokenisation est effectu\xE9 par la m\xE9thode "),Ln=a(ms,"CODE",{});var pc=l(Ln);vu=o(pc,"tokenize()"),pc.forEach(s),hu=o(ms," du "),Tn=a(ms,"EM",{});var cc=l(Tn);ku=o(cc,"tokenizer"),cc.forEach(s),_u=o(ms," :"),ms.forEach(s),ur=p(e),b(At.$$.fragment,e),mr=p(e),Ke=a(e,"P",{});var Wr=l(Ke);bu=o(Wr,"La sortie de cette m\xE9thode est une liste de cha\xEEnes de caract\xE8res ou de "),Nn=a(Wr,"EM",{});var dc=l(Nn);Eu=o(dc,"tokens"),dc.forEach(s),$u=o(Wr," :"),Wr.forEach(s),pr=p(e),b(Ct.$$.fragment,e),cr=p(e),A=a(e,"P",{});var O=l(A);qu=o(O,"Ce "),In=a(O,"EM",{});var fc=l(In);gu=o(fc,"tokenizer"),fc.forEach(s),xu=o(O," est un "),Dn=a(O,"EM",{});var vc=l(Dn);zu=o(vc,"tokenizer"),vc.forEach(s),wu=o(O," de sous-mots : il d\xE9coupe les mots jusqu\u2019\xE0 obtenir des "),Sn=a(O,"EM",{});var hc=l(Sn);Pu=o(hc,"tokens"),hc.forEach(s),ju=o(O," qui peuvent \xEAtre repr\xE9sent\xE9s par son vocabulaire. C\u2019est le cas ici avec "),Hn=a(O,"CODE",{});var kc=l(Hn);yu=o(kc,"transformer"),kc.forEach(s),Mu=o(O," qui est divis\xE9 en deux "),Un=a(O,"EM",{});var _c=l(Un);Au=o(_c,"tokens"),_c.forEach(s),Cu=o(O," : "),On=a(O,"CODE",{});var bc=l(On);Lu=o(bc,"transform"),bc.forEach(s),Tu=o(O," et "),Bn=a(O,"CODE",{});var Ec=l(Bn);Nu=o(Ec,"##er"),Ec.forEach(s),Iu=o(O,"."),O.forEach(s),dr=p(e),Pe=a(e,"H3",{class:!0});var Qr=l(Pe);Ye=a(Qr,"A",{id:!0,class:!0,href:!0});var $c=l(Ye);Vn=a($c,"SPAN",{});var qc=l(Vn);b(Lt.$$.fragment,qc),qc.forEach(s),$c.forEach(s),Du=p(Qr),Tt=a(Qr,"SPAN",{});var Xr=l(Tt);Su=o(Xr,"De "),Gn=a(Xr,"I",{});var gc=l(Gn);Hu=o(gc,"tokens"),gc.forEach(s),Uu=o(Xr," aux identifiants d'entr\xE9e"),Xr.forEach(s),Qr.forEach(s),fr=p(e),ue=a(e,"P",{});var ps=l(ue);Ou=o(ps,"La conversion en identifiants d\u2019entr\xE9e est g\xE9r\xE9e par la m\xE9thode "),Jn=a(ps,"CODE",{});var xc=l(Jn);Bu=o(xc,"convert_tokens_to_ids()"),xc.forEach(s),Vu=o(ps," du "),Rn=a(ps,"EM",{});var zc=l(Rn);Gu=o(zc,"tokenizer"),zc.forEach(s),Ju=o(ps," :"),ps.forEach(s),vr=p(e),b(Nt.$$.fragment,e),hr=p(e),b(It.$$.fragment,e),kr=p(e),We=a(e,"P",{});var Zr=l(We);Ru=o(Zr,"Une fois converties en tenseur dans le "),Fn=a(Zr,"EM",{});var wc=l(Fn);Fu=o(wc,"framework"),wc.forEach(s),Ku=o(Zr," appropri\xE9, ces sorties peuvent ensuite \xEAtre utilis\xE9es comme entr\xE9es d\u2019un mod\xE8le, comme nous l\u2019avons vu pr\xE9c\xE9demment dans ce chapitre."),Zr.forEach(s),_r=p(e),b(Qe.$$.fragment,e),br=p(e),je=a(e,"H2",{class:!0});var ea=l(je);Xe=a(ea,"A",{id:!0,class:!0,href:!0});var Pc=l(Xe);Kn=a(Pc,"SPAN",{});var jc=l(Kn);b(Dt.$$.fragment,jc),jc.forEach(s),Pc.forEach(s),Yu=p(ea),Yn=a(ea,"SPAN",{});var yc=l(Yn);Wu=o(yc,"D\xE9codage"),yc.forEach(s),ea.forEach(s),Er=p(e),me=a(e,"P",{});var cs=l(me);Qu=o(cs,"Le "),Wn=a(cs,"EM",{});var Mc=l(Wn);Xu=o(Mc,"d\xE9codage"),Mc.forEach(s),Zu=o(cs," va dans l\u2019autre sens : \xE0 partir d\u2019indices du vocabulaire nous voulons obtenir une cha\xEEne de caract\xE8res. Cela peut \xEAtre fait avec la m\xE9thode "),Qn=a(cs,"CODE",{});var Ac=l(Qn);em=o(Ac,"decode()"),Ac.forEach(s),tm=o(cs," comme suit :"),cs.forEach(s),$r=p(e),b(St.$$.fragment,e),qr=p(e),b(Ht.$$.fragment,e),gr=p(e),R=a(e,"P",{});var ce=l(R);sm=o(ce,"Notez que la m\xE9thode "),Xn=a(ce,"CODE",{});var Cc=l(Xn);nm=o(Cc,"decode"),Cc.forEach(s),om=o(ce," non seulement reconvertit les indices en "),Zn=a(ce,"EM",{});var Lc=l(Zn);rm=o(Lc,"tokens"),Lc.forEach(s),am=o(ce," mais regroupe \xE9galement les "),eo=a(ce,"EM",{});var Tc=l(eo);lm=o(Tc,"tokens"),Tc.forEach(s),im=o(ce," faisant partie des m\xEAmes mots. Le but \xE9tant de produire une phrase lisible. Ce comportement sera extr\xEAmement utile lorsque dans la suite du cours nous utiliserons des mod\xE8les pouvant produire du nouveau texte (soit du texte g\xE9n\xE9r\xE9 \xE0 partir d\u2019un "),to=a(ce,"EM",{});var Nc=l(to);um=o(Nc,"prompt"),Nc.forEach(s),mm=o(ce,", soit pour des probl\xE8mes de s\xE9quence \xE0 s\xE9quence comme la traduction ou le r\xE9sum\xE9 de texte)."),ce.forEach(s),xr=p(e),Ze=a(e,"P",{});var ta=l(Ze);pm=o(ta,"Vous devriez maintenant comprendre les op\xE9rations atomiques qu\u2019un "),so=a(ta,"EM",{});var Ic=l(so);cm=o(Ic,"tokenizer"),Ic.forEach(s),dm=o(ta," peut g\xE9rer : tokenisation, conversion en identifiants, et reconversion des identifiants en cha\xEEne de caract\xE8res. Cependant, nous n\u2019avons fait qu\u2019effleurer la partie \xE9merg\xE9e de l\u2019iceberg. Dans la section suivante, nous allons pousser notre approche jusqu\u2019\xE0 ses limites et voir comment les surmonter."),ta.forEach(s),this.h()},h(){d(c,"name","hf:doc:metadata"),d(c,"content",JSON.stringify(Zc)),d(g,"id","les-itokenizersi"),d(g,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),d(g,"href","#les-itokenizersi"),d(y,"class","relative group"),d(Ae,"id","itokenizeri-bas-sur-les-mots"),d(Ae,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),d(Ae,"href","#itokenizeri-bas-sur-les-mots"),d(ke,"class","relative group"),d(at,"class","block dark:hidden"),ds(at.src,km="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter2/word_based_tokenization.svg")||d(at,"src",km),d(at,"alt","An example of word-based tokenization."),d(lt,"class","hidden dark:block"),ds(lt.src,_m="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter2/word_based_tokenization-dark.svg")||d(lt,"src",_m),d(lt,"alt","An example of word-based tokenization."),d(_e,"class","flex justify-center"),d(Te,"id","itokenizeri-bas-sur-les-caractres"),d(Te,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),d(Te,"href","#itokenizeri-bas-sur-les-caractres"),d(be,"class","relative group"),d(dt,"class","block dark:hidden"),ds(dt.src,bm="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter2/character_based_tokenization.svg")||d(dt,"src",bm),d(dt,"alt","An example of character-based tokenization."),d(ft,"class","hidden dark:block"),ds(ft.src,Em="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter2/character_based_tokenization-dark.svg")||d(ft,"src",Em),d(ft,"alt","An example of character-based tokenization."),d(Ee,"class","flex justify-center"),d(Se,"id","toknisation-en-sousmots"),d(Se,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),d(Se,"href","#toknisation-en-sousmots"),d($e,"class","relative group"),d(kt,"class","block dark:hidden"),ds(kt.src,$m="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter2/bpe_subword.svg")||d(kt,"src",$m),d(kt,"alt","A subword tokenization algorithm."),d(_t,"class","hidden dark:block"),ds(_t.src,qm="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter2/bpe_subword-dark.svg")||d(_t,"src",qm),d(_t,"alt","A subword tokenization algorithm."),d(qe,"class","flex justify-center"),d(Ue,"id","et-plus-encore"),d(Ue,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),d(Ue,"href","#et-plus-encore"),d(ge,"class","relative group"),d(Be,"id","chargement-et-sauvegarde"),d(Be,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),d(Be,"href","#chargement-et-sauvegarde"),d(xe,"class","relative group"),d(ns,"href","/course/fr/chapter3"),d(Ge,"id","encodage"),d(Ge,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),d(Ge,"href","#encodage"),d(ze,"class","relative group"),d(Fe,"id","tokenisation"),d(Fe,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),d(Fe,"href","#tokenisation"),d(we,"class","relative group"),d(Ye,"id","de-itokensi-aux-identifiants-dentre"),d(Ye,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),d(Ye,"href","#de-itokensi-aux-identifiants-dentre"),d(Pe,"class","relative group"),d(Xe,"id","dcodage"),d(Xe,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),d(Xe,"href","#dcodage"),d(je,"class","relative group")},m(e,i){t(document.head,c),u(e,q,i),E(f,e,i),u(e,w,i),u(e,y,i),t(y,g),t(g,D),E(C,D,null),t(y,M),t(y,T),t(T,B),t(T,z),t(z,P),u(e,V,i),Ut[x].m(e,i),u(e,G,i),E(L,e,i),u(e,k,i),u(e,S,i),t(S,fe),t(S,te),t(te,ve),t(S,he),t(S,fs),t(fs,sa),t(S,na),u(e,ao,i),u(e,Vt,i),t(Vt,oa),u(e,lo,i),E(nt,e,i),u(e,io,i),u(e,Me,i),t(Me,ra),t(Me,vs),t(vs,aa),t(Me,la),u(e,uo,i),u(e,Gt,i),t(Gt,ia),u(e,mo,i),u(e,ke,i),t(ke,Ae),t(Ae,hs),E(ot,hs,null),t(ke,ua),t(ke,Jt),t(Jt,ks),t(ks,ma),t(Jt,pa),u(e,po,i),E(rt,e,i),u(e,co,i),u(e,Ce,i),t(Ce,ca),t(Ce,_s),t(_s,da),t(Ce,fa),u(e,fo,i),u(e,_e,i),t(_e,at),t(_e,va),t(_e,lt),u(e,vo,i),u(e,Le,i),t(Le,ha),t(Le,bs),t(bs,ka),t(Le,_a),u(e,ho,i),E(it,e,i),u(e,ko,i),E(ut,e,i),u(e,_o,i),u(e,Q,i),t(Q,ba),t(Q,Es),t(Es,Ea),t(Q,$a),t(Q,$s),t($s,qa),t(Q,ga),t(Q,qs),t(qs,xa),t(Q,za),u(e,bo,i),u(e,Rt,i),t(Rt,wa),u(e,Eo,i),u(e,oe,i),t(oe,Pa),t(oe,gs),t(gs,ja),t(oe,ya),t(oe,xs),t(xs,Ma),t(oe,Aa),u(e,$o,i),u(e,se,i),t(se,Ca),t(se,zs),t(zs,La),t(se,Ta),t(se,ws),t(ws,Na),t(se,Ia),t(se,ne),t(ne,Da),t(ne,Ps),t(Ps,Sa),t(ne,Ha),t(ne,js),t(js,Ua),t(ne,Oa),t(ne,ys),t(ys,Ba),t(ne,Va),u(e,qo,i),u(e,re,i),t(re,Ga),t(re,Ms),t(Ms,Ja),t(re,Ra),t(re,As),t(As,Fa),t(re,Ka),u(e,go,i),u(e,be,i),t(be,Te),t(Te,Cs),E(mt,Cs,null),t(be,Ya),t(be,Ft),t(Ft,Ls),t(Ls,Wa),t(Ft,Qa),u(e,xo,i),E(pt,e,i),u(e,zo,i),u(e,Ne,i),t(Ne,Xa),t(Ne,Ts),t(Ts,Za),t(Ne,el),u(e,wo,i),u(e,Ie,i),t(Ie,Ns),t(Ns,tl),t(Ie,sl),t(Ie,ct),t(ct,nl),t(ct,Is),t(Is,ol),t(ct,rl),u(e,Po,i),u(e,Kt,i),t(Kt,al),u(e,jo,i),u(e,Ee,i),t(Ee,dt),t(Ee,ll),t(Ee,ft),u(e,yo,i),u(e,Yt,i),t(Yt,il),u(e,Mo,i),u(e,H,i),t(H,ul),t(H,Ds),t(Ds,ml),t(H,pl),t(H,Ss),t(Ss,cl),t(H,dl),t(H,Hs),t(Hs,fl),t(H,vl),t(H,Us),t(Us,hl),t(H,kl),t(H,Os),t(Os,_l),t(H,bl),u(e,Ao,i),u(e,De,i),t(De,El),t(De,Bs),t(Bs,$l),t(De,ql),u(e,Co,i),u(e,$e,i),t($e,Se),t(Se,Vs),E(vt,Vs,null),t($e,gl),t($e,Gs),t(Gs,xl),u(e,Lo,i),E(ht,e,i),u(e,To,i),u(e,Wt,i),t(Wt,zl),u(e,No,i),u(e,Qt,i),t(Qt,wl),u(e,Io,i),u(e,He,i),t(He,Pl),t(He,Js),t(Js,jl),t(He,yl),u(e,Do,i),u(e,qe,i),t(qe,kt),t(qe,Ml),t(qe,_t),u(e,So,i),u(e,N,i),t(N,Al),t(N,Rs),t(Rs,Cl),t(N,Ll),t(N,Fs),t(Fs,Tl),t(N,Nl),t(N,Ks),t(Ks,Il),t(N,Dl),t(N,Ys),t(Ys,Sl),t(N,Hl),t(N,Ws),t(Ws,Ul),t(N,Ol),t(N,Qs),t(Qs,Bl),t(N,Vl),u(e,Ho,i),u(e,Xt,i),t(Xt,Gl),u(e,Uo,i),u(e,ge,i),t(ge,Ue),t(Ue,Xs),E(bt,Xs,null),t(ge,Jl),t(ge,Zs),t(Zs,Rl),u(e,Oo,i),u(e,Zt,i),t(Zt,Fl),u(e,Bo,i),u(e,ae,i),t(ae,Et),t(Et,Kl),t(Et,en),t(en,Yl),t(Et,Wl),t(ae,Ql),t(ae,$t),t($t,Xl),t($t,tn),t(tn,Zl),t($t,ei),t(ae,ti),t(ae,Oe),t(Oe,sn),t(sn,si),t(Oe,ni),t(Oe,nn),t(nn,oi),t(Oe,ri),u(e,Vo,i),u(e,es,i),t(es,ai),u(e,Go,i),u(e,xe,i),t(xe,Be),t(Be,on),E(qt,on,null),t(xe,li),t(xe,rn),t(rn,ii),u(e,Jo,i),u(e,I,i),t(I,ui),t(I,an),t(an,mi),t(I,pi),t(I,ln),t(ln,ci),t(I,di),t(I,un),t(un,fi),t(I,vi),t(I,mn),t(mn,hi),t(I,ki),t(I,pn),t(pn,_i),t(I,bi),t(I,cn),t(cn,Ei),t(I,$i),u(e,Ro,i),u(e,X,i),t(X,qi),t(X,dn),t(dn,gi),t(X,xi),t(X,fn),t(fn,zi),t(X,wi),t(X,vn),t(vn,Pi),t(X,ji),u(e,Fo,i),E(gt,e,i),u(e,Ko,i),ye.m(e,i),u(e,ts,i),E(xt,e,i),u(e,Yo,i),u(e,Ve,i),t(Ve,yi),t(Ve,hn),t(hn,Mi),t(Ve,Ai),u(e,Wo,i),E(zt,e,i),u(e,Qo,i),E(wt,e,i),u(e,Xo,i),u(e,ss,i),t(ss,Ci),u(e,Zo,i),E(Pt,e,i),u(e,er,i),u(e,U,i),t(U,Li),t(U,kn),t(kn,Ti),t(U,Ni),t(U,ns),t(ns,Ii),t(U,Di),t(U,_n),t(_n,Si),t(U,Hi),t(U,bn),t(bn,Ui),t(U,Oi),t(U,En),t(En,Bi),t(U,Vi),u(e,tr,i),u(e,ze,i),t(ze,Ge),t(Ge,$n),E(jt,$n,null),t(ze,Gi),t(ze,qn),t(qn,Ji),u(e,sr,i),E(yt,e,i),u(e,nr,i),u(e,Je,i),t(Je,Ri),t(Je,gn),t(gn,Fi),t(Je,Ki),u(e,or,i),u(e,le,i),t(le,Yi),t(le,xn),t(xn,Wi),t(le,Qi),t(le,zn),t(zn,Xi),t(le,Zi),u(e,rr,i),u(e,J,i),t(J,eu),t(J,wn),t(wn,tu),t(J,su),t(J,Pn),t(Pn,nu),t(J,ou),t(J,jn),t(jn,ru),t(J,au),t(J,yn),t(yn,lu),t(J,iu),u(e,ar,i),u(e,Re,i),t(Re,uu),t(Re,Mn),t(Mn,mu),t(Re,pu),u(e,lr,i),u(e,we,i),t(we,Fe),t(Fe,An),E(Mt,An,null),t(we,cu),t(we,Cn),t(Cn,du),u(e,ir,i),u(e,ie,i),t(ie,fu),t(ie,Ln),t(Ln,vu),t(ie,hu),t(ie,Tn),t(Tn,ku),t(ie,_u),u(e,ur,i),E(At,e,i),u(e,mr,i),u(e,Ke,i),t(Ke,bu),t(Ke,Nn),t(Nn,Eu),t(Ke,$u),u(e,pr,i),E(Ct,e,i),u(e,cr,i),u(e,A,i),t(A,qu),t(A,In),t(In,gu),t(A,xu),t(A,Dn),t(Dn,zu),t(A,wu),t(A,Sn),t(Sn,Pu),t(A,ju),t(A,Hn),t(Hn,yu),t(A,Mu),t(A,Un),t(Un,Au),t(A,Cu),t(A,On),t(On,Lu),t(A,Tu),t(A,Bn),t(Bn,Nu),t(A,Iu),u(e,dr,i),u(e,Pe,i),t(Pe,Ye),t(Ye,Vn),E(Lt,Vn,null),t(Pe,Du),t(Pe,Tt),t(Tt,Su),t(Tt,Gn),t(Gn,Hu),t(Tt,Uu),u(e,fr,i),u(e,ue,i),t(ue,Ou),t(ue,Jn),t(Jn,Bu),t(ue,Vu),t(ue,Rn),t(Rn,Gu),t(ue,Ju),u(e,vr,i),E(Nt,e,i),u(e,hr,i),E(It,e,i),u(e,kr,i),u(e,We,i),t(We,Ru),t(We,Fn),t(Fn,Fu),t(We,Ku),u(e,_r,i),E(Qe,e,i),u(e,br,i),u(e,je,i),t(je,Xe),t(Xe,Kn),E(Dt,Kn,null),t(je,Yu),t(je,Yn),t(Yn,Wu),u(e,Er,i),u(e,me,i),t(me,Qu),t(me,Wn),t(Wn,Xu),t(me,Zu),t(me,Qn),t(Qn,em),t(me,tm),u(e,$r,i),E(St,e,i),u(e,qr,i),E(Ht,e,i),u(e,gr,i),u(e,R,i),t(R,sm),t(R,Xn),t(Xn,nm),t(R,om),t(R,Zn),t(Zn,rm),t(R,am),t(R,eo),t(eo,lm),t(R,im),t(R,to),t(to,um),t(R,mm),u(e,xr,i),u(e,Ze,i),t(Ze,pm),t(Ze,so),t(so,cm),t(Ze,dm),zr=!0},p(e,[i]){const Ot={};i&1&&(Ot.fw=e[0]),f.$set(Ot);let os=x;x=xm(e),x!==os&&(Gc(),v(Ut[os],1,1,()=>{Ut[os]=null}),Bc(),j=Ut[x],j||(j=Ut[x]=gm[x](e),j.c()),h(j,1),j.m(G.parentNode,G)),wr!==(wr=zm(e))&&(ye.d(1),ye=wr(e),ye&&(ye.c(),ye.m(ts.parentNode,ts)));const no={};i&2&&(no.$$scope={dirty:i,ctx:e}),Qe.$set(no)},i(e){zr||(h(f.$$.fragment,e),h(C.$$.fragment,e),h(j),h(L.$$.fragment,e),h(nt.$$.fragment,e),h(ot.$$.fragment,e),h(rt.$$.fragment,e),h(it.$$.fragment,e),h(ut.$$.fragment,e),h(mt.$$.fragment,e),h(pt.$$.fragment,e),h(vt.$$.fragment,e),h(ht.$$.fragment,e),h(bt.$$.fragment,e),h(qt.$$.fragment,e),h(gt.$$.fragment,e),h(xt.$$.fragment,e),h(zt.$$.fragment,e),h(wt.$$.fragment,e),h(Pt.$$.fragment,e),h(jt.$$.fragment,e),h(yt.$$.fragment,e),h(Mt.$$.fragment,e),h(At.$$.fragment,e),h(Ct.$$.fragment,e),h(Lt.$$.fragment,e),h(Nt.$$.fragment,e),h(It.$$.fragment,e),h(Qe.$$.fragment,e),h(Dt.$$.fragment,e),h(St.$$.fragment,e),h(Ht.$$.fragment,e),zr=!0)},o(e){v(f.$$.fragment,e),v(C.$$.fragment,e),v(j),v(L.$$.fragment,e),v(nt.$$.fragment,e),v(ot.$$.fragment,e),v(rt.$$.fragment,e),v(it.$$.fragment,e),v(ut.$$.fragment,e),v(mt.$$.fragment,e),v(pt.$$.fragment,e),v(vt.$$.fragment,e),v(ht.$$.fragment,e),v(bt.$$.fragment,e),v(qt.$$.fragment,e),v(gt.$$.fragment,e),v(xt.$$.fragment,e),v(zt.$$.fragment,e),v(wt.$$.fragment,e),v(Pt.$$.fragment,e),v(jt.$$.fragment,e),v(yt.$$.fragment,e),v(Mt.$$.fragment,e),v(At.$$.fragment,e),v(Ct.$$.fragment,e),v(Lt.$$.fragment,e),v(Nt.$$.fragment,e),v(It.$$.fragment,e),v(Qe.$$.fragment,e),v(Dt.$$.fragment,e),v(St.$$.fragment,e),v(Ht.$$.fragment,e),zr=!1},d(e){s(c),e&&s(q),$(f,e),e&&s(w),e&&s(y),$(C),e&&s(V),Ut[x].d(e),e&&s(G),$(L,e),e&&s(k),e&&s(S),e&&s(ao),e&&s(Vt),e&&s(lo),$(nt,e),e&&s(io),e&&s(Me),e&&s(uo),e&&s(Gt),e&&s(mo),e&&s(ke),$(ot),e&&s(po),$(rt,e),e&&s(co),e&&s(Ce),e&&s(fo),e&&s(_e),e&&s(vo),e&&s(Le),e&&s(ho),$(it,e),e&&s(ko),$(ut,e),e&&s(_o),e&&s(Q),e&&s(bo),e&&s(Rt),e&&s(Eo),e&&s(oe),e&&s($o),e&&s(se),e&&s(qo),e&&s(re),e&&s(go),e&&s(be),$(mt),e&&s(xo),$(pt,e),e&&s(zo),e&&s(Ne),e&&s(wo),e&&s(Ie),e&&s(Po),e&&s(Kt),e&&s(jo),e&&s(Ee),e&&s(yo),e&&s(Yt),e&&s(Mo),e&&s(H),e&&s(Ao),e&&s(De),e&&s(Co),e&&s($e),$(vt),e&&s(Lo),$(ht,e),e&&s(To),e&&s(Wt),e&&s(No),e&&s(Qt),e&&s(Io),e&&s(He),e&&s(Do),e&&s(qe),e&&s(So),e&&s(N),e&&s(Ho),e&&s(Xt),e&&s(Uo),e&&s(ge),$(bt),e&&s(Oo),e&&s(Zt),e&&s(Bo),e&&s(ae),e&&s(Vo),e&&s(es),e&&s(Go),e&&s(xe),$(qt),e&&s(Jo),e&&s(I),e&&s(Ro),e&&s(X),e&&s(Fo),$(gt,e),e&&s(Ko),ye.d(e),e&&s(ts),$(xt,e),e&&s(Yo),e&&s(Ve),e&&s(Wo),$(zt,e),e&&s(Qo),$(wt,e),e&&s(Xo),e&&s(ss),e&&s(Zo),$(Pt,e),e&&s(er),e&&s(U),e&&s(tr),e&&s(ze),$(jt),e&&s(sr),$(yt,e),e&&s(nr),e&&s(Je),e&&s(or),e&&s(le),e&&s(rr),e&&s(J),e&&s(ar),e&&s(Re),e&&s(lr),e&&s(we),$(Mt),e&&s(ir),e&&s(ie),e&&s(ur),$(At,e),e&&s(mr),e&&s(Ke),e&&s(pr),$(Ct,e),e&&s(cr),e&&s(A),e&&s(dr),e&&s(Pe),$(Lt),e&&s(fr),e&&s(ue),e&&s(vr),$(Nt,e),e&&s(hr),$(It,e),e&&s(kr),e&&s(We),e&&s(_r),$(Qe,e),e&&s(br),e&&s(je),$(Dt),e&&s(Er),e&&s(me),e&&s($r),$(St,e),e&&s(qr),$(Ht,e),e&&s(gr),e&&s(R),e&&s(xr),e&&s(Ze)}}}const Zc={local:"les-itokenizersi",sections:[{local:"itokenizeri-bas-sur-les-mots",title:"<i>Tokenizer</i> bas\xE9 sur les mots"},{local:"itokenizeri-bas-sur-les-caractres",title:"<i>Tokenizer</i>  bas\xE9 sur les caract\xE8res"},{local:"toknisation-en-sousmots",sections:[{local:"et-plus-encore",title:"Et plus encore !"}],title:"Tok\xE9nisation en sous-mots"},{local:"chargement-et-sauvegarde",title:"Chargement et sauvegarde"},{local:"encodage",sections:[{local:"tokenisation",title:"Tokenisation"},{local:"de-itokensi-aux-identifiants-dentre",title:"De <i>tokens</i> aux identifiants d'entr\xE9e"}],title:"Encodage"},{local:"dcodage",title:"D\xE9codage"}],title:"Les <i>tokenizers</i>"};function ed(W,c,q){let f="pt";return Vc(()=>{const w=new URLSearchParams(window.location.search);q(0,f=w.get("fw")||"pt")}),[f]}class id extends Sc{constructor(c){super();Hc(this,c,ed,Xc,Uc,{})}}export{id as default,Zc as metadata};
