import{S as $c,i as zc,s as wc,e as r,k as p,w as m,t as n,M as Pc,c as o,d as t,m as c,a as l,x as d,h as a,b as g,G as s,g as u,y as f,q as h,o as v,B as _,v as yc}from"../../chunks/vendor-hf-doc-builder.js";import{T as Cc}from"../../chunks/Tip-hf-doc-builder.js";import{Y as Mc}from"../../chunks/Youtube-hf-doc-builder.js";import{I as Sa}from"../../chunks/IconCopyLink-hf-doc-builder.js";import{C as j}from"../../chunks/CodeBlock-hf-doc-builder.js";import{C as Ac}from"../../chunks/CourseFloatingBanner-hf-doc-builder.js";function Lc(_n){let z,ie,D,R,ne,G,ge,K;return{c(){z=r("p"),ie=n("\u26A0\uFE0F Entra\xEEner un "),D=r("em"),R=n("tokenizer"),ne=n(" n\u2019est pas la m\xEAme chose qu\u2019entra\xEEner un mod\xE8le ! L\u2019entra\xEEnement du mod\xE8le utilise la descente de gradient stochastique pour r\xE9duire un peu plus la perte \xE0 chaque batch. Il est par nature al\xE9atoire (ce qui signifie que vous devez d\xE9finir des graines pour obtenir les m\xEAmes r\xE9sultats lorsque vous effectuez deux fois le m\xEAme entra\xEEnement). Entra\xEEner un "),G=r("em"),ge=n("tokenizer"),K=n(" est un processus statistique qui identifie les meilleurs sous-mots \xE0 choisir pour un corpus donn\xE9. Les r\xE8gles exactes utilis\xE9es pour les choisir d\xE9pendent de l\u2019algorithme de tok\xE9nisation. Le processus est d\xE9terministe, ce qui signifie que vous obtenez toujours les m\xEAmes r\xE9sultats lorsque vous vous entra\xEEnez avec le m\xEAme algorithme sur le m\xEAme corpus.")},l(ae){z=o(ae,"P",{});var N=l(z);ie=a(N,"\u26A0\uFE0F Entra\xEEner un "),D=o(N,"EM",{});var ts=l(D);R=a(ts,"tokenizer"),ts.forEach(t),ne=a(N," n\u2019est pas la m\xEAme chose qu\u2019entra\xEEner un mod\xE8le ! L\u2019entra\xEEnement du mod\xE8le utilise la descente de gradient stochastique pour r\xE9duire un peu plus la perte \xE0 chaque batch. Il est par nature al\xE9atoire (ce qui signifie que vous devez d\xE9finir des graines pour obtenir les m\xEAmes r\xE9sultats lorsque vous effectuez deux fois le m\xEAme entra\xEEnement). Entra\xEEner un "),G=o(N,"EM",{});var ns=l(G);ge=a(ns,"tokenizer"),ns.forEach(t),K=a(N," est un processus statistique qui identifie les meilleurs sous-mots \xE0 choisir pour un corpus donn\xE9. Les r\xE8gles exactes utilis\xE9es pour les choisir d\xE9pendent de l\u2019algorithme de tok\xE9nisation. Le processus est d\xE9terministe, ce qui signifie que vous obtenez toujours les m\xEAmes r\xE9sultats lorsque vous vous entra\xEEnez avec le m\xEAme algorithme sur le m\xEAme corpus."),N.forEach(t)},m(ae,N){u(ae,z,N),s(z,ie),s(z,D),s(D,R),s(z,ne),s(z,G),s(G,ge),s(z,K)},d(ae){ae&&t(z)}}}function Dc(_n){let z,ie,D,R,ne,G,ge,K,ae,N,ts,ns,xn,qe,gn,k,Ta,zs,Ia,Ga,ws,Ra,Ua,Ps,Ha,Va,as,Fa,Ka,ys,Ya,Ba,Cs,Xa,Ja,Ms,Qa,Za,As,Wa,er,Ls,sr,tr,qn,Ee,En,ue,jn,re,pe,Ds,je,nr,Ns,ar,kn,U,rr,Os,or,lr,Ss,ir,ur,Ts,pr,cr,bn,O,mr,ce,dr,Is,fr,hr,Gs,vr,_r,ke,xr,gr,be,qr,Er,$n,$e,zn,rs,jr,wn,ze,Pn,we,yn,Y,kr,Rs,br,$r,Us,zr,wr,Cn,Pe,Mn,os,Pr,An,ye,Ln,H,yr,Hs,Cr,Mr,Vs,Ar,Lr,Fs,Dr,Nr,Dn,ls,Or,Nn,Ce,On,is,Sr,Sn,Me,Tn,B,Tr,Ks,Ir,Gr,Ys,Rr,Ur,In,us,Hr,Gn,Ae,Rn,ps,Vr,Un,Le,Hn,cs,Fr,Vn,De,Fn,X,Kr,Bs,Yr,Br,Xs,Xr,Jr,Kn,Ne,Yn,ms,Qr,Bn,oe,me,Js,Oe,Zr,ds,Wr,Qs,eo,Xn,J,so,Zs,to,no,Ws,ao,ro,Jn,Se,Qn,Q,oo,et,lo,io,st,uo,po,Zn,de,co,tt,mo,fo,Wn,Te,ea,Ie,sa,M,ho,nt,vo,_o,at,xo,go,rt,qo,Eo,ot,jo,ko,lt,bo,$o,ta,Z,zo,it,wo,Po,ut,yo,Co,na,Ge,aa,fs,Mo,ra,w,Ao,pt,Lo,Do,ct,No,Oo,mt,So,To,dt,Io,Go,ft,Ro,Uo,ht,Ho,Vo,Re,Fo,Ko,oa,y,Yo,vt,Bo,Xo,_t,Jo,Qo,xt,Zo,Wo,gt,el,sl,qt,tl,nl,hs,al,rl,la,$,ol,Et,ll,il,jt,ul,pl,Ue,cl,ml,kt,dl,fl,bt,hl,vl,$t,_l,xl,zt,gl,ql,wt,El,jl,ia,He,ua,Ve,pa,q,kl,Pt,bl,$l,yt,zl,wl,Ct,Pl,yl,Mt,Cl,Ml,At,Al,Ll,Lt,Dl,Nl,Dt,Ol,Sl,Nt,Tl,Il,Ot,Gl,Rl,St,Ul,Hl,Tt,Vl,Fl,ca,Fe,ma,Ke,da,vs,Kl,fa,Ye,ha,Be,va,x,Yl,It,Bl,Xl,Gt,Jl,Ql,Rt,Zl,Wl,Ut,ei,si,Ht,ti,ni,Vt,ai,ri,Ft,oi,li,Kt,ii,ui,Yt,pi,ci,Bt,mi,di,Xt,fi,hi,Jt,vi,_i,Qt,xi,gi,_a,le,fe,Zt,Xe,qi,_s,Ei,Wt,ji,xa,W,ki,en,bi,$i,sn,zi,wi,ga,Je,qa,A,Pi,tn,yi,Ci,nn,Mi,Ai,an,Li,Di,rn,Ni,Oi,on,Si,Ti,Ea,Qe,ja,he,Ii,ln,Gi,Ri,ka,Ze,ba,ve,Ui,un,Hi,Vi,$a,We,za,S,Fi,pn,Ki,Yi,cn,Bi,Xi,mn,Ji,Qi,dn,Zi,Wi,wa,es,Pa,T,eu,fn,su,tu,xs,nu,au,hn,ru,ou,vn,lu,iu,ya;return G=new Sa({}),qe=new Ac({props:{chapter:6,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/fr/chapter6/section2.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/fr/chapter6/section2.ipynb"}]}}),Ee=new Mc({props:{id:"DJimQynXZsQ"}}),ue=new Cc({props:{warning:!0,$$slots:{default:[Lc]},$$scope:{ctx:_n}}}),je=new Sa({}),$e=new j({props:{code:`from datasets import load_dataset

# Cela peut prendre quelques minutes alors prenez un th\xE9 ou un caf\xE9 pendant que vous patientez !
raw_datasets = load_dataset("code_search_net", "python")`,highlighted:`<span class="hljs-keyword">from</span> datasets <span class="hljs-keyword">import</span> load_dataset

<span class="hljs-comment"># Cela peut prendre quelques minutes alors prenez un th\xE9 ou un caf\xE9 pendant que vous patientez !</span>
raw_datasets = load_dataset(<span class="hljs-string">&quot;code_search_net&quot;</span>, <span class="hljs-string">&quot;python&quot;</span>)`}}),ze=new j({props:{code:'raw_datasets["train"]',highlighted:'raw_datasets[<span class="hljs-string">&quot;train&quot;</span>]'}}),we=new j({props:{code:`Dataset({
    features: ['repository_name', 'func_path_in_repository', 'func_name', 'whole_func_string', 'language', 
      'func_code_string', 'func_code_tokens', 'func_documentation_string', 'func_documentation_tokens', 'split_name', 
      'func_code_url'
    ],
    num_rows: 412178
})`,highlighted:`Dataset({
    features: [<span class="hljs-string">&#x27;repository_name&#x27;</span>, <span class="hljs-string">&#x27;func_path_in_repository&#x27;</span>, <span class="hljs-string">&#x27;func_name&#x27;</span>, <span class="hljs-string">&#x27;whole_func_string&#x27;</span>, <span class="hljs-string">&#x27;language&#x27;</span>, 
      <span class="hljs-string">&#x27;func_code_string&#x27;</span>, <span class="hljs-string">&#x27;func_code_tokens&#x27;</span>, <span class="hljs-string">&#x27;func_documentation_string&#x27;</span>, <span class="hljs-string">&#x27;func_documentation_tokens&#x27;</span>, <span class="hljs-string">&#x27;split_name&#x27;</span>, 
      <span class="hljs-string">&#x27;func_code_url&#x27;</span>
    ],
    num_rows: <span class="hljs-number">412178</span>
})`}}),Pe=new j({props:{code:'print(raw_datasets["train"][123456]["whole_func_string"])',highlighted:'<span class="hljs-built_in">print</span>(raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">123456</span>][<span class="hljs-string">&quot;whole_func_string&quot;</span>])'}}),ye=new j({props:{code:`def handle_simple_responses(
      self, timeout_ms=None, info_cb=DEFAULT_MESSAGE_CALLBACK):
    """Accepts normal responses from the device.

    Args:
      timeout_ms: Timeout in milliseconds to wait for each response.
      info_cb: Optional callback for text sent from the bootloader.

    Returns:
      OKAY packet's message.
    """
    return self._accept_responses('OKAY', info_cb, timeout_ms=timeout_ms)`,highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">handle_simple_responses</span>(<span class="hljs-params">
      self, timeout_ms=<span class="hljs-literal">None</span>, info_cb=DEFAULT_MESSAGE_CALLBACK</span>):
    <span class="hljs-string">&quot;&quot;&quot;Accepts normal responses from the device.

    Args:
      timeout_ms: Timeout in milliseconds to wait for each response.
      info_cb: Optional callback for text sent from the bootloader.

    Returns:
      OKAY packet&#x27;s message.
    &quot;&quot;&quot;</span>
    <span class="hljs-keyword">return</span> self._accept_responses(<span class="hljs-string">&#x27;OKAY&#x27;</span>, info_cb, timeout_ms=timeout_ms)`}}),Ce=new j({props:{code:`# Ne d\xE9commentez pas la ligne suivante \xE0 moins que votre jeu de donn\xE9es soit petit !
# training_corpus = [raw_datasets["train"][i: i + 1000]["whole_func_string"] for i in range(0, len(raw_datasets["train"]), 1000)]`,highlighted:`<span class="hljs-comment"># Ne d\xE9commentez pas la ligne suivante \xE0 moins que votre jeu de donn\xE9es soit petit !</span>
<span class="hljs-comment"># training_corpus = [raw_datasets[&quot;train&quot;][i: i + 1000][&quot;whole_func_string&quot;] for i in range(0, len(raw_datasets[&quot;train&quot;]), 1000)]</span>`}}),Me=new j({props:{code:`training_corpus = (
    raw_datasets["train"][i : i + 1000]["whole_func_string"]
    for i in range(0, len(raw_datasets["train"]), 1000)
)`,highlighted:`training_corpus = (
    raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][i : i + <span class="hljs-number">1000</span>][<span class="hljs-string">&quot;whole_func_string&quot;</span>]
    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">0</span>, <span class="hljs-built_in">len</span>(raw_datasets[<span class="hljs-string">&quot;train&quot;</span>]), <span class="hljs-number">1000</span>)
)`}}),Ae=new j({props:{code:`gen = (i for i in range(10))
print(list(gen))
print(list(gen))`,highlighted:`gen = (i <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">10</span>))
<span class="hljs-built_in">print</span>(<span class="hljs-built_in">list</span>(gen))
<span class="hljs-built_in">print</span>(<span class="hljs-built_in">list</span>(gen))`}}),Le=new j({props:{code:`[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[]`,highlighted:`[<span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">6</span>, <span class="hljs-number">7</span>, <span class="hljs-number">8</span>, <span class="hljs-number">9</span>]
[]`}}),De=new j({props:{code:`def get_training_corpus():
    return (
        raw_datasets["train"][i : i + 1000]["whole_func_string"]
        for i in range(0, len(raw_datasets["train"]), 1000)
    )


training_corpus = get_training_corpus()`,highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_training_corpus</span>():
    <span class="hljs-keyword">return</span> (
        raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][i : i + <span class="hljs-number">1000</span>][<span class="hljs-string">&quot;whole_func_string&quot;</span>]
        <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">0</span>, <span class="hljs-built_in">len</span>(raw_datasets[<span class="hljs-string">&quot;train&quot;</span>]), <span class="hljs-number">1000</span>)
    )


training_corpus = get_training_corpus()`}}),Ne=new j({props:{code:`def get_training_corpus():
    dataset = raw_datasets["train"]
    for start_idx in range(0, len(dataset), 1000):
        samples = dataset[start_idx : start_idx + 1000]
        yield samples["whole_func_string"]`,highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_training_corpus</span>():
    dataset = raw_datasets[<span class="hljs-string">&quot;train&quot;</span>]
    <span class="hljs-keyword">for</span> start_idx <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">0</span>, <span class="hljs-built_in">len</span>(dataset), <span class="hljs-number">1000</span>):
        samples = dataset[start_idx : start_idx + <span class="hljs-number">1000</span>]
        <span class="hljs-keyword">yield</span> samples[<span class="hljs-string">&quot;whole_func_string&quot;</span>]`}}),Oe=new Sa({}),Se=new j({props:{code:`from transformers import AutoTokenizer

old_tokenizer = AutoTokenizer.from_pretrained("gpt2")`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer

old_tokenizer = AutoTokenizer.from_pretrained(<span class="hljs-string">&quot;gpt2&quot;</span>)`}}),Te=new j({props:{code:`example = '''def add_numbers(a, b):
    """Add the two numbers \`a\` and \`b\`."""
    return a + b'''

tokens = old_tokenizer.tokenize(example)
tokens`,highlighted:`example = <span class="hljs-string">&#x27;&#x27;&#x27;def add_numbers(a, b):
    &quot;&quot;&quot;Add the two numbers \`a\` and \`b\`.&quot;&quot;&quot;
    return a + b&#x27;&#x27;&#x27;</span>

tokens = old_tokenizer.tokenize(example)
tokens`}}),Ie=new j({props:{code:`['def', '\u0120add', '_', 'n', 'umbers', '(', 'a', ',', '\u0120b', '):', '\u010A', '\u0120', '\u0120', '\u0120', '\u0120"""', 'Add', '\u0120the', '\u0120two',
 '\u0120numbers', '\u0120\`', 'a', '\`', '\u0120and', '\u0120\`', 'b', '\`', '."', '""', '\u010A', '\u0120', '\u0120', '\u0120', '\u0120return', '\u0120a', '\u0120+', '\u0120b']`,highlighted:'[<span class="hljs-string">&#x27;def&#x27;</span>, <span class="hljs-string">&#x27;\u0120add&#x27;</span>, <span class="hljs-string">&#x27;_&#x27;</span>, <span class="hljs-string">&#x27;n&#x27;</span>, <span class="hljs-string">&#x27;umbers&#x27;</span>, <span class="hljs-string">&#x27;(&#x27;</span>, <span class="hljs-string">&#x27;a&#x27;</span>, <span class="hljs-string">&#x27;,&#x27;</span>, <span class="hljs-string">&#x27;\u0120b&#x27;</span>, <span class="hljs-string">&#x27;):&#x27;</span>, <span class="hljs-string">&#x27;\u010A&#x27;</span>, <span class="hljs-string">&#x27;\u0120&#x27;</span>, <span class="hljs-string">&#x27;\u0120&#x27;</span>, <span class="hljs-string">&#x27;\u0120&#x27;</span>, <span class="hljs-string">&#x27;\u0120&quot;&quot;&quot;&#x27;</span>, <span class="hljs-string">&#x27;Add&#x27;</span>, <span class="hljs-string">&#x27;\u0120the&#x27;</span>, <span class="hljs-string">&#x27;\u0120two&#x27;</span>,\n <span class="hljs-string">&#x27;\u0120numbers&#x27;</span>, <span class="hljs-string">&#x27;\u0120`&#x27;</span>, <span class="hljs-string">&#x27;a&#x27;</span>, <span class="hljs-string">&#x27;`&#x27;</span>, <span class="hljs-string">&#x27;\u0120and&#x27;</span>, <span class="hljs-string">&#x27;\u0120`&#x27;</span>, <span class="hljs-string">&#x27;b&#x27;</span>, <span class="hljs-string">&#x27;`&#x27;</span>, <span class="hljs-string">&#x27;.&quot;&#x27;</span>, <span class="hljs-string">&#x27;&quot;&quot;&#x27;</span>, <span class="hljs-string">&#x27;\u010A&#x27;</span>, <span class="hljs-string">&#x27;\u0120&#x27;</span>, <span class="hljs-string">&#x27;\u0120&#x27;</span>, <span class="hljs-string">&#x27;\u0120&#x27;</span>, <span class="hljs-string">&#x27;\u0120return&#x27;</span>, <span class="hljs-string">&#x27;\u0120a&#x27;</span>, <span class="hljs-string">&#x27;\u0120+&#x27;</span>, <span class="hljs-string">&#x27;\u0120b&#x27;</span>]'}}),Ge=new j({props:{code:"tokenizer = old_tokenizer.train_new_from_iterator(training_corpus, 52000)",highlighted:'tokenizer = old_tokenizer.train_new_from_iterator(training_corpus, <span class="hljs-number">52000</span>)'}}),He=new j({props:{code:`tokens = tokenizer.tokenize(example)
tokens`,highlighted:`tokens = tokenizer.tokenize(example)
tokens`}}),Ve=new j({props:{code:`['def', '\u0120add', '_', 'numbers', '(', 'a', ',', '\u0120b', '):', '\u010A\u0120\u0120\u0120', '\u0120"""', 'Add', '\u0120the', '\u0120two', '\u0120numbers', '\u0120\`',
 'a', '\`', '\u0120and', '\u0120\`', 'b', '\`."""', '\u010A\u0120\u0120\u0120', '\u0120return', '\u0120a', '\u0120+', '\u0120b']`,highlighted:'[<span class="hljs-string">&#x27;def&#x27;</span>, <span class="hljs-string">&#x27;\u0120add&#x27;</span>, <span class="hljs-string">&#x27;_&#x27;</span>, <span class="hljs-string">&#x27;numbers&#x27;</span>, <span class="hljs-string">&#x27;(&#x27;</span>, <span class="hljs-string">&#x27;a&#x27;</span>, <span class="hljs-string">&#x27;,&#x27;</span>, <span class="hljs-string">&#x27;\u0120b&#x27;</span>, <span class="hljs-string">&#x27;):&#x27;</span>, <span class="hljs-string">&#x27;\u010A\u0120\u0120\u0120&#x27;</span>, <span class="hljs-string">&#x27;\u0120&quot;&quot;&quot;&#x27;</span>, <span class="hljs-string">&#x27;Add&#x27;</span>, <span class="hljs-string">&#x27;\u0120the&#x27;</span>, <span class="hljs-string">&#x27;\u0120two&#x27;</span>, <span class="hljs-string">&#x27;\u0120numbers&#x27;</span>, <span class="hljs-string">&#x27;\u0120`&#x27;</span>,\n <span class="hljs-string">&#x27;a&#x27;</span>, <span class="hljs-string">&#x27;`&#x27;</span>, <span class="hljs-string">&#x27;\u0120and&#x27;</span>, <span class="hljs-string">&#x27;\u0120`&#x27;</span>, <span class="hljs-string">&#x27;b&#x27;</span>, <span class="hljs-string">&#x27;`.&quot;&quot;&quot;&#x27;</span>, <span class="hljs-string">&#x27;\u010A\u0120\u0120\u0120&#x27;</span>, <span class="hljs-string">&#x27;\u0120return&#x27;</span>, <span class="hljs-string">&#x27;\u0120a&#x27;</span>, <span class="hljs-string">&#x27;\u0120+&#x27;</span>, <span class="hljs-string">&#x27;\u0120b&#x27;</span>]'}}),Fe=new j({props:{code:`print(len(tokens))
print(len(old_tokenizer.tokenize(example)))`,highlighted:`<span class="hljs-built_in">print</span>(<span class="hljs-built_in">len</span>(tokens))
<span class="hljs-built_in">print</span>(<span class="hljs-built_in">len</span>(old_tokenizer.tokenize(example)))`}}),Ke=new j({props:{code:`27
36`,highlighted:`<span class="hljs-number">27</span>
<span class="hljs-number">36</span>`}}),Ye=new j({props:{code:`example = """class LinearLayer():
    def __init__(self, input_size, output_size):
        self.weight = torch.randn(input_size, output_size)
        self.bias = torch.zeros(output_size)

    def __call__(self, x):
        return x @ self.weights + self.bias
    """
tokenizer.tokenize(example)`,highlighted:`example = <span class="hljs-string">&quot;&quot;&quot;class LinearLayer():
    def __init__(self, input_size, output_size):
        self.weight = torch.randn(input_size, output_size)
        self.bias = torch.zeros(output_size)

    def __call__(self, x):
        return x @ self.weights + self.bias
    &quot;&quot;&quot;</span>
tokenizer.tokenize(example)`}}),Be=new j({props:{code:`['class', '\u0120Linear', 'Layer', '():', '\u010A\u0120\u0120\u0120', '\u0120def', '\u0120__', 'init', '__(', 'self', ',', '\u0120input', '_', 'size', ',',
 '\u0120output', '_', 'size', '):', '\u010A\u0120\u0120\u0120\u0120\u0120\u0120\u0120', '\u0120self', '.', 'weight', '\u0120=', '\u0120torch', '.', 'randn', '(', 'input', '_',
 'size', ',', '\u0120output', '_', 'size', ')', '\u010A\u0120\u0120\u0120\u0120\u0120\u0120\u0120', '\u0120self', '.', 'bias', '\u0120=', '\u0120torch', '.', 'zeros', '(',
 'output', '_', 'size', ')', '\u010A\u010A\u0120\u0120\u0120', '\u0120def', '\u0120__', 'call', '__(', 'self', ',', '\u0120x', '):', '\u010A\u0120\u0120\u0120\u0120\u0120\u0120\u0120',
 '\u0120return', '\u0120x', '\u0120@', '\u0120self', '.', 'weights', '\u0120+', '\u0120self', '.', 'bias', '\u010A\u0120\u0120\u0120\u0120']`,highlighted:`[<span class="hljs-string">&#x27;class&#x27;</span>, <span class="hljs-string">&#x27;\u0120Linear&#x27;</span>, <span class="hljs-string">&#x27;Layer&#x27;</span>, <span class="hljs-string">&#x27;():&#x27;</span>, <span class="hljs-string">&#x27;\u010A\u0120\u0120\u0120&#x27;</span>, <span class="hljs-string">&#x27;\u0120def&#x27;</span>, <span class="hljs-string">&#x27;\u0120__&#x27;</span>, <span class="hljs-string">&#x27;init&#x27;</span>, <span class="hljs-string">&#x27;__(&#x27;</span>, <span class="hljs-string">&#x27;self&#x27;</span>, <span class="hljs-string">&#x27;,&#x27;</span>, <span class="hljs-string">&#x27;\u0120input&#x27;</span>, <span class="hljs-string">&#x27;_&#x27;</span>, <span class="hljs-string">&#x27;size&#x27;</span>, <span class="hljs-string">&#x27;,&#x27;</span>,
 <span class="hljs-string">&#x27;\u0120output&#x27;</span>, <span class="hljs-string">&#x27;_&#x27;</span>, <span class="hljs-string">&#x27;size&#x27;</span>, <span class="hljs-string">&#x27;):&#x27;</span>, <span class="hljs-string">&#x27;\u010A\u0120\u0120\u0120\u0120\u0120\u0120\u0120&#x27;</span>, <span class="hljs-string">&#x27;\u0120self&#x27;</span>, <span class="hljs-string">&#x27;.&#x27;</span>, <span class="hljs-string">&#x27;weight&#x27;</span>, <span class="hljs-string">&#x27;\u0120=&#x27;</span>, <span class="hljs-string">&#x27;\u0120torch&#x27;</span>, <span class="hljs-string">&#x27;.&#x27;</span>, <span class="hljs-string">&#x27;randn&#x27;</span>, <span class="hljs-string">&#x27;(&#x27;</span>, <span class="hljs-string">&#x27;input&#x27;</span>, <span class="hljs-string">&#x27;_&#x27;</span>,
 <span class="hljs-string">&#x27;size&#x27;</span>, <span class="hljs-string">&#x27;,&#x27;</span>, <span class="hljs-string">&#x27;\u0120output&#x27;</span>, <span class="hljs-string">&#x27;_&#x27;</span>, <span class="hljs-string">&#x27;size&#x27;</span>, <span class="hljs-string">&#x27;)&#x27;</span>, <span class="hljs-string">&#x27;\u010A\u0120\u0120\u0120\u0120\u0120\u0120\u0120&#x27;</span>, <span class="hljs-string">&#x27;\u0120self&#x27;</span>, <span class="hljs-string">&#x27;.&#x27;</span>, <span class="hljs-string">&#x27;bias&#x27;</span>, <span class="hljs-string">&#x27;\u0120=&#x27;</span>, <span class="hljs-string">&#x27;\u0120torch&#x27;</span>, <span class="hljs-string">&#x27;.&#x27;</span>, <span class="hljs-string">&#x27;zeros&#x27;</span>, <span class="hljs-string">&#x27;(&#x27;</span>,
 <span class="hljs-string">&#x27;output&#x27;</span>, <span class="hljs-string">&#x27;_&#x27;</span>, <span class="hljs-string">&#x27;size&#x27;</span>, <span class="hljs-string">&#x27;)&#x27;</span>, <span class="hljs-string">&#x27;\u010A\u010A\u0120\u0120\u0120&#x27;</span>, <span class="hljs-string">&#x27;\u0120def&#x27;</span>, <span class="hljs-string">&#x27;\u0120__&#x27;</span>, <span class="hljs-string">&#x27;call&#x27;</span>, <span class="hljs-string">&#x27;__(&#x27;</span>, <span class="hljs-string">&#x27;self&#x27;</span>, <span class="hljs-string">&#x27;,&#x27;</span>, <span class="hljs-string">&#x27;\u0120x&#x27;</span>, <span class="hljs-string">&#x27;):&#x27;</span>, <span class="hljs-string">&#x27;\u010A\u0120\u0120\u0120\u0120\u0120\u0120\u0120&#x27;</span>,
 <span class="hljs-string">&#x27;\u0120return&#x27;</span>, <span class="hljs-string">&#x27;\u0120x&#x27;</span>, <span class="hljs-string">&#x27;\u0120@&#x27;</span>, <span class="hljs-string">&#x27;\u0120self&#x27;</span>, <span class="hljs-string">&#x27;.&#x27;</span>, <span class="hljs-string">&#x27;weights&#x27;</span>, <span class="hljs-string">&#x27;\u0120+&#x27;</span>, <span class="hljs-string">&#x27;\u0120self&#x27;</span>, <span class="hljs-string">&#x27;.&#x27;</span>, <span class="hljs-string">&#x27;bias&#x27;</span>, <span class="hljs-string">&#x27;\u010A\u0120\u0120\u0120\u0120&#x27;</span>]`}}),Xe=new Sa({}),Je=new j({props:{code:'tokenizer.save_pretrained("code-search-net-tokenizer")',highlighted:'tokenizer.save_pretrained(<span class="hljs-string">&quot;code-search-net-tokenizer&quot;</span>)'}}),Qe=new j({props:{code:`from huggingface_hub import notebook_login

notebook_login()`,highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> notebook_login

notebook_login()`}}),Ze=new j({props:{code:"huggingface-cli login",highlighted:"huggingface-cli login"}}),We=new j({props:{code:'tokenizer.push_to_hub("code-search-net-tokenizer")',highlighted:'tokenizer.push_to_hub(<span class="hljs-string">&quot;code-search-net-tokenizer&quot;</span>)'}}),es=new j({props:{code:`# Remplacez "huggingface-course" ci-dessous par votre espace r\xE9el pour utiliser votre propre tokenizer
tokenizer = AutoTokenizer.from_pretrained("huggingface-course/code-search-net-tokenizer")`,highlighted:`<span class="hljs-comment"># Remplacez &quot;huggingface-course&quot; ci-dessous par votre espace r\xE9el pour utiliser votre propre tokenizer</span>
tokenizer = AutoTokenizer.from_pretrained(<span class="hljs-string">&quot;huggingface-course/code-search-net-tokenizer&quot;</span>)`}}),{c(){z=r("meta"),ie=p(),D=r("h1"),R=r("a"),ne=r("span"),m(G.$$.fragment),ge=p(),K=r("span"),ae=n("Entra\xEEner un nouveau "),N=r("i"),ts=n("tokenizer"),ns=n(" \xE0 partir d'un ancien"),xn=p(),m(qe.$$.fragment),gn=p(),k=r("p"),Ta=n("Si un mod\xE8le de langue n\u2019est pas disponible dans la langue qui vous int\xE9resse ou si votre corpus est tr\xE8s diff\xE9rent de celui sur lequel votre mod\xE8le de langue a \xE9t\xE9 entra\xEEn\xE9, vous voudrez tr\xE8s probablement r\xE9entra\xEEner le mod\xE8le \xE0 partir de z\xE9ro en utilisant un "),zs=r("em"),Ia=n("tokenizer"),Ga=n(" adapt\xE9 \xE0 vos donn\xE9es. Pour ce faire, vous devrez entra\xEEner un nouveau "),ws=r("em"),Ra=n("tokenizer"),Ua=n(" sur votre jeu de donn\xE9es. Mais qu\u2019est-ce que cela signifie exactement ? Lorsque nous avons examin\xE9 pour la premi\xE8re fois les "),Ps=r("em"),Ha=n("tokenizers"),Va=n(" dans le "),as=r("a"),Fa=n("chapitre 2"),Ka=n(", nous avons vu que la plupart des "),ys=r("em"),Ya=n("transformers"),Ba=n(" utilisent un "),Cs=r("em"),Xa=n("algorithme de tokenisation en sous-mots"),Ja=n(". Pour identifier les sous-mots qui sont int\xE9ressants et qui apparaissent le plus fr\xE9quemment dans un corpus donn\xE9, le "),Ms=r("em"),Qa=n("tokenizer"),Za=n(" doit examiner attentivement tous les textes du corpus. C\u2019est un processus que nous appelons "),As=r("em"),Wa=n("entra\xEEnement"),er=n(". Les r\xE8gles exactes qui r\xE9gissent cet apprentissage d\xE9pendent du type de "),Ls=r("em"),sr=n("tokenizer"),tr=n(" utilis\xE9. Nous passerons en revue les trois principaux algorithmes plus loin dans ce chapitre."),qn=p(),m(Ee.$$.fragment),En=p(),m(ue.$$.fragment),jn=p(),re=r("h2"),pe=r("a"),Ds=r("span"),m(je.$$.fragment),nr=p(),Ns=r("span"),ar=n("Assemblage d'un corpus"),kn=p(),U=r("p"),rr=n("Il y a une API tr\xE8s simple dans \u{1F917} "),Os=r("em"),or=n("Transformers"),lr=n(" que vous pouvez utiliser pour entra\xEEner un nouveau "),Ss=r("em"),ir=n("tokenizer"),ur=n(" avec les m\xEAmes caract\xE9ristiques qu\u2019un d\xE9j\xE0 existant : "),Ts=r("code"),pr=n("AutoTokenizer.train_new_from_iterator()"),cr=n(". Pour illustrer cela, disons que nous voulons entra\xEEner GPT-2 \xE0 partir de z\xE9ro mais dans une langue autre que l\u2019anglais. Notre premi\xE8re t\xE2che est de rassembler des batchs de donn\xE9es dans cette langue dans un corpus d\u2019entra\xEEnement. Pour avoir des exemples que tout le monde puisse comprendre, nous n\u2019utiliserons pas ici une langue comme le russe ou le chinois mais plut\xF4t une langue anglaise sp\xE9cialis\xE9e : le langage Python."),bn=p(),O=r("p"),mr=n("La biblioth\xE8que "),ce=r("a"),dr=n("\u{1F917} "),Is=r("em"),fr=n("Datasets"),hr=n(" peut nous aider \xE0 assembler un corpus de code source Python. Nous allons utiliser la fonction habituelle "),Gs=r("code"),vr=n("load_dataset()"),_r=n(" pour t\xE9l\xE9charger et mettre en cache le jeu de donn\xE9es "),ke=r("a"),xr=n("CodeSearchNet"),gr=n(". Ce jeu de donn\xE9es a \xE9t\xE9 cr\xE9\xE9 pour le "),be=r("a"),qr=n("CodeSearchNet challenge"),Er=n(" et contient des millions de fonctions provenant de biblioth\xE8ques open source sur GitHub dans plusieurs langages de programmation. Ici, nous allons charger la partie Python de ce jeu de donn\xE9es :"),$n=p(),m($e.$$.fragment),zn=p(),rs=r("p"),jr=n("Nous pouvons jeter un coup d\u2019\u0153il au jeu d\u2019entra\xEEnement pour voir quelles sont les colonnes auxquelles nous avons acc\xE8s :"),wn=p(),m(ze.$$.fragment),Pn=p(),m(we.$$.fragment),yn=p(),Y=r("p"),kr=n("Nous pouvons voir que le jeu de donn\xE9es s\xE9pare les cha\xEEnes de documents du code et sugg\xE8re une tokenization des deux. Ici, nous utiliserons simplement la colonne "),Rs=r("code"),br=n("whole_func_string"),$r=n(" pour entra\xEEner notre "),Us=r("em"),zr=n("tokenizer"),wr=n(". Nous pouvons regarder un exemple de la fa\xE7on suivante :"),Cn=p(),m(Pe.$$.fragment),Mn=p(),os=r("p"),Pr=n("qui nous affiche ce qui suit :"),An=p(),m(ye.$$.fragment),Ln=p(),H=r("p"),yr=n("La premi\xE8re chose \xE0 faire est de transformer le jeu de donn\xE9es en un "),Hs=r("em"),Cr=n("it\xE9rateur"),Mr=n(" de listes de textes. Par exemple, une liste de listes de textes. L\u2019utilisation de listes de textes permet \xE0 notre "),Vs=r("em"),Ar=n("tokenizer"),Lr=n(" d\u2019aller plus vite (l\u2019entra\xEEnement a alors lieu sur des batchs de textes au lieu de traiter des textes un par un). Et le fait que ce soit un it\xE9rateur permet d\u2019\xE9viter d\u2019avoir tout en m\xE9moire en m\xEAme temps. Si votre corpus est \xE9norme, vous voudrez profiter du fait que \u{1F917} "),Fs=r("em"),Dr=n("Datasets"),Nr=n(" ne charge pas tout en RAM mais stocke les \xE9l\xE9ments du jeu de donn\xE9es sur le disque."),Dn=p(),ls=r("p"),Or=n("Faire ce qui suit cr\xE9erait une liste de listes de 1 000 textes chacune mais chargerait tout en m\xE9moire :"),Nn=p(),m(Ce.$$.fragment),On=p(),is=r("p"),Sr=n("En utilisant un g\xE9n\xE9rateur, nous pouvons \xE9viter que Python ne charge quoi que ce soit en m\xE9moire \xE0 moins que cela soit r\xE9ellement n\xE9cessaire. Pour cr\xE9er un tel g\xE9n\xE9rateur, il suffit de remplacer les crochets par des parenth\xE8ses :"),Sn=p(),m(Me.$$.fragment),Tn=p(),B=r("p"),Tr=n("Cette ligne de code ne r\xE9cup\xE8re aucun \xE9l\xE9ment du jeu de donn\xE9es. Elle cr\xE9e simplement un objet que vous pouvez utiliser dans une boucle "),Ks=r("code"),Ir=n("for"),Gr=n(" Python. Les textes ne seront charg\xE9s que lorsque vous en aurez besoin (c\u2019est-\xE0-dire lorsque vous serez \xE0 l\u2019\xE9tape de la boucle "),Ys=r("code"),Rr=n("for"),Ur=n(" qui les requiert) et seulement 1 000 textes \xE0 la fois. De cette fa\xE7on, vous n\u2019\xE9puiserez pas toute votre m\xE9moire, m\xEAme si vous traitez un \xE9norme jeu de donn\xE9es."),In=p(),us=r("p"),Hr=n("Le probl\xE8me avec un objet g\xE9n\xE9rateur est qu\u2019il ne peut \xEAtre utilis\xE9 qu\u2019une seule fois. Ainsi, au lieu que cet objet nous donne deux fois la liste des 10 premiers chiffres :"),Gn=p(),m(Ae.$$.fragment),Rn=p(),ps=r("p"),Vr=n("on les re\xE7oit une fois et ensuite une liste vide :"),Un=p(),m(Le.$$.fragment),Hn=p(),cs=r("p"),Fr=n("C\u2019est pourquoi nous d\xE9finissons une fonction qui renvoie un g\xE9n\xE9rateur \xE0 la place :"),Vn=p(),m(De.$$.fragment),Fn=p(),X=r("p"),Kr=n("Vous pouvez \xE9galement d\xE9finir votre g\xE9n\xE9rateur \xE0 l\u2019int\xE9rieur d\u2019une boucle "),Bs=r("code"),Yr=n("for"),Br=n(" en utilisant l\u2019instruction "),Xs=r("code"),Xr=n("yield"),Jr=n(" :"),Kn=p(),m(Ne.$$.fragment),Yn=p(),ms=r("p"),Qr=n("qui produit exactement le m\xEAme g\xE9n\xE9rateur que pr\xE9c\xE9demment mais  permet d\u2019utiliser une logique plus complexe que celle que vous pouvez utiliser dans une compr\xE9hension de liste."),Bn=p(),oe=r("h2"),me=r("a"),Js=r("span"),m(Oe.$$.fragment),Zr=p(),ds=r("span"),Wr=n("Entra\xEEnement d'un nouveau "),Qs=r("i"),eo=n("tokenizer"),Xn=p(),J=r("p"),so=n("Maintenant que nous avons notre corpus sous la forme d\u2019un it\xE9rateur de batchs de textes, nous sommes pr\xEAts \xE0 entra\xEEner un nouveau "),Zs=r("em"),to=n("tokenizer"),no=n(". Pour ce faire, nous devons d\u2019abord charger le "),Ws=r("em"),ao=n("tokenizer"),ro=n(" que nous voulons coupler avec notre mod\xE8le (ici, le GPT-2) :"),Jn=p(),m(Se.$$.fragment),Qn=p(),Q=r("p"),oo=n("M\xEAme si nous allons entra\xEEner un nouveau "),et=r("em"),lo=n("tokenizer"),io=n(", c\u2019est une bonne id\xE9e de faire \xE7a pour \xE9viter de partir enti\xE8rement de z\xE9ro. De cette fa\xE7on, nous n\u2019aurons pas \xE0 sp\xE9cifier l\u2019algorithme de tok\xE9nisation ou les jetons sp\xE9ciaux que nous voulons utiliser. Notre nouveau "),st=r("em"),uo=n("tokenizer"),po=n(" sera exactement le m\xEAme que celui du GPT-2. La seule chose qui changera sera le vocabulaire qui sera d\xE9termin\xE9 lors de l\u2019entra\xEEnement sur notre corpus."),Zn=p(),de=r("p"),co=n("Voyons d\u2019abord comment ce "),tt=r("em"),mo=n("tokenizer"),fo=n(" traiterait un exemple de fonction :"),Wn=p(),m(Te.$$.fragment),ea=p(),m(Ie.$$.fragment),sa=p(),M=r("p"),ho=n("Ce "),nt=r("em"),vo=n("tokenizer"),_o=n(" poss\xE8de quelques symboles sp\xE9ciaux, comme "),at=r("code"),xo=n("\u0120"),go=n(" et "),rt=r("code"),qo=n("\u010A"),Eo=n(", qui d\xE9signent respectivement les espaces et les retours \xE0 la ligne. Comme on peut le voir, ce n\u2019est pas tr\xE8s efficace. Le "),ot=r("em"),jo=n("tokenizer"),ko=n(" renvoie des jetons individuels pour chaque espace alors qu\u2019il pourrait regrouper ceux des indentations (puisqu\u2019avoir des ensembles de quatre ou huit espaces est tr\xE8s courant dans du code). Il divise \xE9galement le nom de la fonction de fa\xE7on un peu bizarre car pas habitu\xE9 \xE0 voir des mots avec le caract\xE8re "),lt=r("code"),bo=n("_"),$o=n("."),ta=p(),Z=r("p"),zo=n("Entra\xEEnons un nouveau "),it=r("em"),wo=n("tokenizer"),Po=n(" et voyons s\u2019il r\xE9sout ces probl\xE8mes. Pour cela, nous allons utiliser la m\xE9thode "),ut=r("code"),yo=n("train_new_from_iterator()"),Co=n(" :"),na=p(),m(Ge.$$.fragment),aa=p(),fs=r("p"),Mo=n("Cette commande peut prendre un peu de temps si votre corpus est tr\xE8s grand. Pour ce jeu de donn\xE9es de 1,6 Go de textes, elle est tr\xE8s rapide (1 minute 16 secondes sur un CPU AMD Ryzen 9 3900X avec 12 c\u0153urs)."),ra=p(),w=r("p"),Ao=n("Notez que "),pt=r("code"),Lo=n("AutoTokenizer.train_new_from_iterator()"),Do=n(" ne fonctionne que si le "),ct=r("em"),No=n("tokenizer"),Oo=n(" que vous utilisez est un "),mt=r("em"),So=n("tokenizer"),To=n(" \xAB rapide \xBB. Comme vous le verrez dans la section suivante, la biblioth\xE8que \u{1F917} "),dt=r("em"),Io=n("Transformers"),Go=n(" contient deux types de "),ft=r("em"),Ro=n("tokenizers"),Uo=n(" : certains sont \xE9crits en pur Python et d\u2019autres (les rapides) sont soutenus par la biblioth\xE8que \u{1F917} "),ht=r("em"),Ho=n("Tokenizers"),Vo=n(" qui est \xE9crite dans le langage "),Re=r("a"),Fo=n("Rust"),Ko=n(". Python est le langage le plus souvent utilis\xE9 pour les applications de science des donn\xE9es et d\u2019apprentissage profond, mais lorsque quelque chose doit \xEAtre parall\xE9lis\xE9 pour \xEAtre rapide, il faut que cela soit \xE9crit dans un autre langage. Par exemple, les multiplications matricielles qui sont au c\u0153ur du calcul du mod\xE8le sont \xE9crites en CUDA, une biblioth\xE8que en C optimis\xE9e pour les GPUs."),oa=p(),y=r("p"),Yo=n("Entra\xEEner un tout nouveau "),vt=r("em"),Bo=n("tokenizer"),Xo=n(" en Python pur est atrocement lent, c\u2019est pourquoi nous avons d\xE9velopp\xE9 la biblioth\xE8que \u{1F917} "),_t=r("em"),Jo=n("Tokenizers"),Qo=n(". Notez que, tout comme vous n\u2019avez pas eu \xE0 apprendre le langage CUDA pour pouvoir ex\xE9cuter votre mod\xE8le sur un batch d\u2019entr\xE9es sur un GPU, vous n\u2019aurez pas besoin d\u2019apprendre Rust pour utiliser un "),xt=r("em"),Zo=n("tokenizer"),Wo=n(" rapide. La biblioth\xE8que \u{1F917} "),gt=r("em"),el=n("Tokenizers"),sl=n(" fournit des liaisons Python pour de nombreuses m\xE9thodes qui appellent en interne un morceau de code en Rust. Par exemple, pour parall\xE9liser l\u2019entra\xEEnement de votre nouveau "),qt=r("em"),tl=n("tokenizer"),nl=n(" ou, comme nous l\u2019avons vu dans le "),hs=r("a"),al=n("chapitre 3"),rl=n(", la tokenisation d\u2019un lot d\u2019entr\xE9es."),la=p(),$=r("p"),ol=n("La plupart des "),Et=r("em"),ll=n("transformers"),il=n(" ont un "),jt=r("em"),ul=n("tokenizer"),pl=n(" rapide de disponible. Il y a quelques exceptions que vous pouvez v\xE9rifier "),Ue=r("a"),cl=n("ici"),ml=n(". S\u2019il est disponible, l\u2019API "),kt=r("code"),dl=n("AutoTokenizer"),fl=n(" s\xE9lectionne toujours pour vous le "),bt=r("em"),hl=n("tokenizer"),vl=n(" rapide. Dans la prochaine section, nous allons jeter un coup d\u2019oeil \xE0 certaines des autres caract\xE9ristiques sp\xE9ciales des "),$t=r("em"),_l=n("tokenizers"),xl=n(" rapides, qui seront tr\xE8s utiles pour des t\xE2ches comme la classification de "),zt=r("em"),gl=n("tokens"),ql=n(" et la r\xE9ponse aux questions. Mais avant cela, essayons notre tout nouveau "),wt=r("em"),El=n("tokenizer"),jl=n(" sur l\u2019exemple pr\xE9c\xE9dent :"),ia=p(),m(He.$$.fragment),ua=p(),m(Ve.$$.fragment),pa=p(),q=r("p"),kl=n("Ici, nous voyons \xE0 nouveau les symboles sp\xE9ciaux "),Pt=r("code"),bl=n("\u0120"),$l=n(" et "),yt=r("code"),zl=n("\u010A"),wl=n(" qui indiquent les espaces et les retours \xE0 la ligne. Nous pouvons \xE9galement voir que notre "),Ct=r("em"),Pl=n("tokenizer"),yl=n(" a appris certains "),Mt=r("em"),Cl=n("tokens"),Ml=n(" qui sont tr\xE8s sp\xE9cifiques \xE0 un corpus de fonctions Python. Par exemple, il y a un token "),At=r("code"),Al=n("\u010A\u0120\u0120\u0120"),Ll=n(" qui repr\xE9sente une indentation et un "),Lt=r("em"),Dl=n("token"),Nl=p(),Dt=r("code"),Ol=n('\u0120"""'),Sl=n(" qui repr\xE9sente les trois guillemets qui commencent une "),Nt=r("em"),Tl=n("docstring"),Il=n(". Le "),Ot=r("em"),Gl=n("tokenizer"),Rl=n(" divise \xE9galement correctement le nom de la fonction sur "),St=r("code"),Ul=n("_"),Hl=n(". Il s\u2019agit d\u2019une repr\xE9sentation assez compacte. En comparaison, l\u2019utilisation du "),Tt=r("em"),Vl=n("tokenizer"),Fl=n(" en anglais \xAB simple \xBB sur le m\xEAme exemple nous donnera une phrase plus longue :"),ca=p(),m(Fe.$$.fragment),ma=p(),m(Ke.$$.fragment),da=p(),vs=r("p"),Kl=n("Prenons un autre exemple :"),fa=p(),m(Ye.$$.fragment),ha=p(),m(Be.$$.fragment),va=p(),x=r("p"),Yl=n("En plus du "),It=r("em"),Bl=n("token"),Xl=n(" correspondant \xE0 une indentation, on peut \xE9galement voir ici un "),Gt=r("em"),Jl=n("token"),Ql=n(" pour une double indentation : "),Rt=r("code"),Zl=n("\u010A\u0120\u0120\u0120\u0120\u0120\u0120\u0120\u0120\u0120"),Wl=n(". Les mots sp\xE9ciaux de Python comme "),Ut=r("code"),ei=n("class"),si=n(", "),Ht=r("code"),ti=n("init"),ni=n(", "),Vt=r("code"),ai=n("call"),ri=n(", "),Ft=r("code"),oi=n("self"),li=n(", et "),Kt=r("code"),ii=n("return"),ui=n(" sont tous tokeniz\xE9s comme un seul "),Yt=r("em"),pi=n("token"),ci=n(". Nous pouvons voir qu\u2019en plus de s\xE9parer sur "),Bt=r("code"),mi=n("_"),di=n(" et "),Xt=r("code"),fi=n("."),hi=n(" le tokenizer s\xE9pare correctement m\xEAme les noms en minuscules. Par exemple "),Jt=r("code"),vi=n("LinearLayer"),_i=n(" est tokenis\xE9 comme "),Qt=r("code"),xi=n('["\u0120Linear", "Layer"]'),gi=n("."),_a=p(),le=r("h2"),fe=r("a"),Zt=r("span"),m(Xe.$$.fragment),qi=p(),_s=r("span"),Ei=n("Sauvegarde du "),Wt=r("i"),ji=n("tokenizer"),xa=p(),W=r("p"),ki=n("Pour \xEAtre s\xFBr de pouvoir l\u2019utiliser plus tard, nous devons sauvegarder notre nouveau "),en=r("em"),bi=n("tokenizer"),$i=n(". Comme pour les mod\xE8les, ceci est fait avec la m\xE9thode "),sn=r("code"),zi=n("save_pretrained()"),wi=n(" :"),ga=p(),m(Je.$$.fragment),qa=p(),A=r("p"),Pi=n("Cela cr\xE9era un nouveau dossier nomm\xE9 "),tn=r("em"),yi=n("code-search-net-tokenizer"),Ci=n(" contenant tous les fichiers dont le "),nn=r("em"),Mi=n("tokenizer"),Ai=n(" a besoin pour \xEAtre recharg\xE9. Si vous souhaitez partager ce "),an=r("em"),Li=n("tokenizer"),Di=n(" avec vos coll\xE8gues et amis, vous pouvez le t\xE9l\xE9charger sur le "),rn=r("em"),Ni=n("Hub"),Oi=n(" en vous connectant \xE0 votre compte. Si vous travaillez dans un "),on=r("em"),Si=n("notebook"),Ti=n(", il existe une fonction pratique pour vous aider \xE0 le faire :"),Ea=p(),m(Qe.$$.fragment),ja=p(),he=r("p"),Ii=n("Cela affichera un "),ln=r("em"),Gi=n("widget"),Ri=n(" o\xF9 vous pourrez entrer vos identifiants de connexion \xE0 Hugging Face. Si vous ne travaillez pas sur un ordinateur portable, tapez simplement la ligne suivante dans votre terminal :"),ka=p(),m(Ze.$$.fragment),ba=p(),ve=r("p"),Ui=n("Une fois connect\xE9, vous pouvez pousser votre "),un=r("em"),Hi=n("tokenizer"),Vi=n(" en ex\xE9cutant la commande suivante :"),$a=p(),m(We.$$.fragment),za=p(),S=r("p"),Fi=n("Cela cr\xE9era un nouveau d\xE9p\xF4t dans votre espace avec le nom "),pn=r("code"),Ki=n("code-search-net-tokenizer"),Yi=n(" contenant le fichier "),cn=r("em"),Bi=n("tokenizer"),Xi=n(". Vous pouvez ensuite charger le "),mn=r("em"),Ji=n("tokenizer"),Qi=n(" de n\u2019importe o\xF9 avec la m\xE9thode "),dn=r("code"),Zi=n("from_pretrained()"),Wi=n(" :"),wa=p(),m(es.$$.fragment),Pa=p(),T=r("p"),eu=n("Vous \xEAtes maintenant pr\xEAt \xE0 entra\xEEner un mod\xE8le de langue \xE0 partir de z\xE9ro et \xE0 le "),fn=r("em"),su=n("finetuner"),tu=n(" sur votre t\xE2che ! Nous verrons cela dans le "),xs=r("a"),nu=n("chapitre 7"),au=n(", mais d\u2019abord, dans le reste de ce chapitre, nous allons examiner de plus pr\xE8s les "),hn=r("em"),ru=n("tokenizers"),ou=n(" rapides et explorer en d\xE9tail ce qui se passe lorsque nous appelons la m\xE9thode "),vn=r("code"),lu=n("train_new_from_iterator()"),iu=n("."),this.h()},l(e){const i=Pc('[data-svelte="svelte-1phssyn"]',document.head);z=o(i,"META",{name:!0,content:!0}),i.forEach(t),ie=c(e),D=o(e,"H1",{class:!0});var ss=l(D);R=o(ss,"A",{id:!0,class:!0,href:!0});var mu=l(R);ne=o(mu,"SPAN",{});var du=l(ne);d(G.$$.fragment,du),du.forEach(t),mu.forEach(t),ge=c(ss),K=o(ss,"SPAN",{});var Ca=l(K);ae=a(Ca,"Entra\xEEner un nouveau "),N=o(Ca,"I",{});var fu=l(N);ts=a(fu,"tokenizer"),fu.forEach(t),ns=a(Ca," \xE0 partir d'un ancien"),Ca.forEach(t),ss.forEach(t),xn=c(e),d(qe.$$.fragment,e),gn=c(e),k=o(e,"P",{});var P=l(k);Ta=a(P,"Si un mod\xE8le de langue n\u2019est pas disponible dans la langue qui vous int\xE9resse ou si votre corpus est tr\xE8s diff\xE9rent de celui sur lequel votre mod\xE8le de langue a \xE9t\xE9 entra\xEEn\xE9, vous voudrez tr\xE8s probablement r\xE9entra\xEEner le mod\xE8le \xE0 partir de z\xE9ro en utilisant un "),zs=o(P,"EM",{});var hu=l(zs);Ia=a(hu,"tokenizer"),hu.forEach(t),Ga=a(P," adapt\xE9 \xE0 vos donn\xE9es. Pour ce faire, vous devrez entra\xEEner un nouveau "),ws=o(P,"EM",{});var vu=l(ws);Ra=a(vu,"tokenizer"),vu.forEach(t),Ua=a(P," sur votre jeu de donn\xE9es. Mais qu\u2019est-ce que cela signifie exactement ? Lorsque nous avons examin\xE9 pour la premi\xE8re fois les "),Ps=o(P,"EM",{});var _u=l(Ps);Ha=a(_u,"tokenizers"),_u.forEach(t),Va=a(P," dans le "),as=o(P,"A",{href:!0});var xu=l(as);Fa=a(xu,"chapitre 2"),xu.forEach(t),Ka=a(P,", nous avons vu que la plupart des "),ys=o(P,"EM",{});var gu=l(ys);Ya=a(gu,"transformers"),gu.forEach(t),Ba=a(P," utilisent un "),Cs=o(P,"EM",{});var qu=l(Cs);Xa=a(qu,"algorithme de tokenisation en sous-mots"),qu.forEach(t),Ja=a(P,". Pour identifier les sous-mots qui sont int\xE9ressants et qui apparaissent le plus fr\xE9quemment dans un corpus donn\xE9, le "),Ms=o(P,"EM",{});var Eu=l(Ms);Qa=a(Eu,"tokenizer"),Eu.forEach(t),Za=a(P," doit examiner attentivement tous les textes du corpus. C\u2019est un processus que nous appelons "),As=o(P,"EM",{});var ju=l(As);Wa=a(ju,"entra\xEEnement"),ju.forEach(t),er=a(P,". Les r\xE8gles exactes qui r\xE9gissent cet apprentissage d\xE9pendent du type de "),Ls=o(P,"EM",{});var ku=l(Ls);sr=a(ku,"tokenizer"),ku.forEach(t),tr=a(P," utilis\xE9. Nous passerons en revue les trois principaux algorithmes plus loin dans ce chapitre."),P.forEach(t),qn=c(e),d(Ee.$$.fragment,e),En=c(e),d(ue.$$.fragment,e),jn=c(e),re=o(e,"H2",{class:!0});var Ma=l(re);pe=o(Ma,"A",{id:!0,class:!0,href:!0});var bu=l(pe);Ds=o(bu,"SPAN",{});var $u=l(Ds);d(je.$$.fragment,$u),$u.forEach(t),bu.forEach(t),nr=c(Ma),Ns=o(Ma,"SPAN",{});var zu=l(Ns);ar=a(zu,"Assemblage d'un corpus"),zu.forEach(t),Ma.forEach(t),kn=c(e),U=o(e,"P",{});var _e=l(U);rr=a(_e,"Il y a une API tr\xE8s simple dans \u{1F917} "),Os=o(_e,"EM",{});var wu=l(Os);or=a(wu,"Transformers"),wu.forEach(t),lr=a(_e," que vous pouvez utiliser pour entra\xEEner un nouveau "),Ss=o(_e,"EM",{});var Pu=l(Ss);ir=a(Pu,"tokenizer"),Pu.forEach(t),ur=a(_e," avec les m\xEAmes caract\xE9ristiques qu\u2019un d\xE9j\xE0 existant : "),Ts=o(_e,"CODE",{});var yu=l(Ts);pr=a(yu,"AutoTokenizer.train_new_from_iterator()"),yu.forEach(t),cr=a(_e,". Pour illustrer cela, disons que nous voulons entra\xEEner GPT-2 \xE0 partir de z\xE9ro mais dans une langue autre que l\u2019anglais. Notre premi\xE8re t\xE2che est de rassembler des batchs de donn\xE9es dans cette langue dans un corpus d\u2019entra\xEEnement. Pour avoir des exemples que tout le monde puisse comprendre, nous n\u2019utiliserons pas ici une langue comme le russe ou le chinois mais plut\xF4t une langue anglaise sp\xE9cialis\xE9e : le langage Python."),_e.forEach(t),bn=c(e),O=o(e,"P",{});var ee=l(O);mr=a(ee,"La biblioth\xE8que "),ce=o(ee,"A",{href:!0,rel:!0});var uu=l(ce);dr=a(uu,"\u{1F917} "),Is=o(uu,"EM",{});var Cu=l(Is);fr=a(Cu,"Datasets"),Cu.forEach(t),uu.forEach(t),hr=a(ee," peut nous aider \xE0 assembler un corpus de code source Python. Nous allons utiliser la fonction habituelle "),Gs=o(ee,"CODE",{});var Mu=l(Gs);vr=a(Mu,"load_dataset()"),Mu.forEach(t),_r=a(ee," pour t\xE9l\xE9charger et mettre en cache le jeu de donn\xE9es "),ke=o(ee,"A",{href:!0,rel:!0});var Au=l(ke);xr=a(Au,"CodeSearchNet"),Au.forEach(t),gr=a(ee,". Ce jeu de donn\xE9es a \xE9t\xE9 cr\xE9\xE9 pour le "),be=o(ee,"A",{href:!0,rel:!0});var Lu=l(be);qr=a(Lu,"CodeSearchNet challenge"),Lu.forEach(t),Er=a(ee," et contient des millions de fonctions provenant de biblioth\xE8ques open source sur GitHub dans plusieurs langages de programmation. Ici, nous allons charger la partie Python de ce jeu de donn\xE9es :"),ee.forEach(t),$n=c(e),d($e.$$.fragment,e),zn=c(e),rs=o(e,"P",{});var Du=l(rs);jr=a(Du,"Nous pouvons jeter un coup d\u2019\u0153il au jeu d\u2019entra\xEEnement pour voir quelles sont les colonnes auxquelles nous avons acc\xE8s :"),Du.forEach(t),wn=c(e),d(ze.$$.fragment,e),Pn=c(e),d(we.$$.fragment,e),yn=c(e),Y=o(e,"P",{});var gs=l(Y);kr=a(gs,"Nous pouvons voir que le jeu de donn\xE9es s\xE9pare les cha\xEEnes de documents du code et sugg\xE8re une tokenization des deux. Ici, nous utiliserons simplement la colonne "),Rs=o(gs,"CODE",{});var Nu=l(Rs);br=a(Nu,"whole_func_string"),Nu.forEach(t),$r=a(gs," pour entra\xEEner notre "),Us=o(gs,"EM",{});var Ou=l(Us);zr=a(Ou,"tokenizer"),Ou.forEach(t),wr=a(gs,". Nous pouvons regarder un exemple de la fa\xE7on suivante :"),gs.forEach(t),Cn=c(e),d(Pe.$$.fragment,e),Mn=c(e),os=o(e,"P",{});var Su=l(os);Pr=a(Su,"qui nous affiche ce qui suit :"),Su.forEach(t),An=c(e),d(ye.$$.fragment,e),Ln=c(e),H=o(e,"P",{});var xe=l(H);yr=a(xe,"La premi\xE8re chose \xE0 faire est de transformer le jeu de donn\xE9es en un "),Hs=o(xe,"EM",{});var Tu=l(Hs);Cr=a(Tu,"it\xE9rateur"),Tu.forEach(t),Mr=a(xe," de listes de textes. Par exemple, une liste de listes de textes. L\u2019utilisation de listes de textes permet \xE0 notre "),Vs=o(xe,"EM",{});var Iu=l(Vs);Ar=a(Iu,"tokenizer"),Iu.forEach(t),Lr=a(xe," d\u2019aller plus vite (l\u2019entra\xEEnement a alors lieu sur des batchs de textes au lieu de traiter des textes un par un). Et le fait que ce soit un it\xE9rateur permet d\u2019\xE9viter d\u2019avoir tout en m\xE9moire en m\xEAme temps. Si votre corpus est \xE9norme, vous voudrez profiter du fait que \u{1F917} "),Fs=o(xe,"EM",{});var Gu=l(Fs);Dr=a(Gu,"Datasets"),Gu.forEach(t),Nr=a(xe," ne charge pas tout en RAM mais stocke les \xE9l\xE9ments du jeu de donn\xE9es sur le disque."),xe.forEach(t),Dn=c(e),ls=o(e,"P",{});var Ru=l(ls);Or=a(Ru,"Faire ce qui suit cr\xE9erait une liste de listes de 1 000 textes chacune mais chargerait tout en m\xE9moire :"),Ru.forEach(t),Nn=c(e),d(Ce.$$.fragment,e),On=c(e),is=o(e,"P",{});var Uu=l(is);Sr=a(Uu,"En utilisant un g\xE9n\xE9rateur, nous pouvons \xE9viter que Python ne charge quoi que ce soit en m\xE9moire \xE0 moins que cela soit r\xE9ellement n\xE9cessaire. Pour cr\xE9er un tel g\xE9n\xE9rateur, il suffit de remplacer les crochets par des parenth\xE8ses :"),Uu.forEach(t),Sn=c(e),d(Me.$$.fragment,e),Tn=c(e),B=o(e,"P",{});var qs=l(B);Tr=a(qs,"Cette ligne de code ne r\xE9cup\xE8re aucun \xE9l\xE9ment du jeu de donn\xE9es. Elle cr\xE9e simplement un objet que vous pouvez utiliser dans une boucle "),Ks=o(qs,"CODE",{});var Hu=l(Ks);Ir=a(Hu,"for"),Hu.forEach(t),Gr=a(qs," Python. Les textes ne seront charg\xE9s que lorsque vous en aurez besoin (c\u2019est-\xE0-dire lorsque vous serez \xE0 l\u2019\xE9tape de la boucle "),Ys=o(qs,"CODE",{});var Vu=l(Ys);Rr=a(Vu,"for"),Vu.forEach(t),Ur=a(qs," qui les requiert) et seulement 1 000 textes \xE0 la fois. De cette fa\xE7on, vous n\u2019\xE9puiserez pas toute votre m\xE9moire, m\xEAme si vous traitez un \xE9norme jeu de donn\xE9es."),qs.forEach(t),In=c(e),us=o(e,"P",{});var Fu=l(us);Hr=a(Fu,"Le probl\xE8me avec un objet g\xE9n\xE9rateur est qu\u2019il ne peut \xEAtre utilis\xE9 qu\u2019une seule fois. Ainsi, au lieu que cet objet nous donne deux fois la liste des 10 premiers chiffres :"),Fu.forEach(t),Gn=c(e),d(Ae.$$.fragment,e),Rn=c(e),ps=o(e,"P",{});var Ku=l(ps);Vr=a(Ku,"on les re\xE7oit une fois et ensuite une liste vide :"),Ku.forEach(t),Un=c(e),d(Le.$$.fragment,e),Hn=c(e),cs=o(e,"P",{});var Yu=l(cs);Fr=a(Yu,"C\u2019est pourquoi nous d\xE9finissons une fonction qui renvoie un g\xE9n\xE9rateur \xE0 la place :"),Yu.forEach(t),Vn=c(e),d(De.$$.fragment,e),Fn=c(e),X=o(e,"P",{});var Es=l(X);Kr=a(Es,"Vous pouvez \xE9galement d\xE9finir votre g\xE9n\xE9rateur \xE0 l\u2019int\xE9rieur d\u2019une boucle "),Bs=o(Es,"CODE",{});var Bu=l(Bs);Yr=a(Bu,"for"),Bu.forEach(t),Br=a(Es," en utilisant l\u2019instruction "),Xs=o(Es,"CODE",{});var Xu=l(Xs);Xr=a(Xu,"yield"),Xu.forEach(t),Jr=a(Es," :"),Es.forEach(t),Kn=c(e),d(Ne.$$.fragment,e),Yn=c(e),ms=o(e,"P",{});var Ju=l(ms);Qr=a(Ju,"qui produit exactement le m\xEAme g\xE9n\xE9rateur que pr\xE9c\xE9demment mais  permet d\u2019utiliser une logique plus complexe que celle que vous pouvez utiliser dans une compr\xE9hension de liste."),Ju.forEach(t),Bn=c(e),oe=o(e,"H2",{class:!0});var Aa=l(oe);me=o(Aa,"A",{id:!0,class:!0,href:!0});var Qu=l(me);Js=o(Qu,"SPAN",{});var Zu=l(Js);d(Oe.$$.fragment,Zu),Zu.forEach(t),Qu.forEach(t),Zr=c(Aa),ds=o(Aa,"SPAN",{});var pu=l(ds);Wr=a(pu,"Entra\xEEnement d'un nouveau "),Qs=o(pu,"I",{});var Wu=l(Qs);eo=a(Wu,"tokenizer"),Wu.forEach(t),pu.forEach(t),Aa.forEach(t),Xn=c(e),J=o(e,"P",{});var js=l(J);so=a(js,"Maintenant que nous avons notre corpus sous la forme d\u2019un it\xE9rateur de batchs de textes, nous sommes pr\xEAts \xE0 entra\xEEner un nouveau "),Zs=o(js,"EM",{});var ep=l(Zs);to=a(ep,"tokenizer"),ep.forEach(t),no=a(js,". Pour ce faire, nous devons d\u2019abord charger le "),Ws=o(js,"EM",{});var sp=l(Ws);ao=a(sp,"tokenizer"),sp.forEach(t),ro=a(js," que nous voulons coupler avec notre mod\xE8le (ici, le GPT-2) :"),js.forEach(t),Jn=c(e),d(Se.$$.fragment,e),Qn=c(e),Q=o(e,"P",{});var ks=l(Q);oo=a(ks,"M\xEAme si nous allons entra\xEEner un nouveau "),et=o(ks,"EM",{});var tp=l(et);lo=a(tp,"tokenizer"),tp.forEach(t),io=a(ks,", c\u2019est une bonne id\xE9e de faire \xE7a pour \xE9viter de partir enti\xE8rement de z\xE9ro. De cette fa\xE7on, nous n\u2019aurons pas \xE0 sp\xE9cifier l\u2019algorithme de tok\xE9nisation ou les jetons sp\xE9ciaux que nous voulons utiliser. Notre nouveau "),st=o(ks,"EM",{});var np=l(st);uo=a(np,"tokenizer"),np.forEach(t),po=a(ks," sera exactement le m\xEAme que celui du GPT-2. La seule chose qui changera sera le vocabulaire qui sera d\xE9termin\xE9 lors de l\u2019entra\xEEnement sur notre corpus."),ks.forEach(t),Zn=c(e),de=o(e,"P",{});var La=l(de);co=a(La,"Voyons d\u2019abord comment ce "),tt=o(La,"EM",{});var ap=l(tt);mo=a(ap,"tokenizer"),ap.forEach(t),fo=a(La," traiterait un exemple de fonction :"),La.forEach(t),Wn=c(e),d(Te.$$.fragment,e),ea=c(e),d(Ie.$$.fragment,e),sa=c(e),M=o(e,"P",{});var V=l(M);ho=a(V,"Ce "),nt=o(V,"EM",{});var rp=l(nt);vo=a(rp,"tokenizer"),rp.forEach(t),_o=a(V," poss\xE8de quelques symboles sp\xE9ciaux, comme "),at=o(V,"CODE",{});var op=l(at);xo=a(op,"\u0120"),op.forEach(t),go=a(V," et "),rt=o(V,"CODE",{});var lp=l(rt);qo=a(lp,"\u010A"),lp.forEach(t),Eo=a(V,", qui d\xE9signent respectivement les espaces et les retours \xE0 la ligne. Comme on peut le voir, ce n\u2019est pas tr\xE8s efficace. Le "),ot=o(V,"EM",{});var ip=l(ot);jo=a(ip,"tokenizer"),ip.forEach(t),ko=a(V," renvoie des jetons individuels pour chaque espace alors qu\u2019il pourrait regrouper ceux des indentations (puisqu\u2019avoir des ensembles de quatre ou huit espaces est tr\xE8s courant dans du code). Il divise \xE9galement le nom de la fonction de fa\xE7on un peu bizarre car pas habitu\xE9 \xE0 voir des mots avec le caract\xE8re "),lt=o(V,"CODE",{});var up=l(lt);bo=a(up,"_"),up.forEach(t),$o=a(V,"."),V.forEach(t),ta=c(e),Z=o(e,"P",{});var bs=l(Z);zo=a(bs,"Entra\xEEnons un nouveau "),it=o(bs,"EM",{});var pp=l(it);wo=a(pp,"tokenizer"),pp.forEach(t),Po=a(bs," et voyons s\u2019il r\xE9sout ces probl\xE8mes. Pour cela, nous allons utiliser la m\xE9thode "),ut=o(bs,"CODE",{});var cp=l(ut);yo=a(cp,"train_new_from_iterator()"),cp.forEach(t),Co=a(bs," :"),bs.forEach(t),na=c(e),d(Ge.$$.fragment,e),aa=c(e),fs=o(e,"P",{});var mp=l(fs);Mo=a(mp,"Cette commande peut prendre un peu de temps si votre corpus est tr\xE8s grand. Pour ce jeu de donn\xE9es de 1,6 Go de textes, elle est tr\xE8s rapide (1 minute 16 secondes sur un CPU AMD Ryzen 9 3900X avec 12 c\u0153urs)."),mp.forEach(t),ra=c(e),w=o(e,"P",{});var L=l(w);Ao=a(L,"Notez que "),pt=o(L,"CODE",{});var dp=l(pt);Lo=a(dp,"AutoTokenizer.train_new_from_iterator()"),dp.forEach(t),Do=a(L," ne fonctionne que si le "),ct=o(L,"EM",{});var fp=l(ct);No=a(fp,"tokenizer"),fp.forEach(t),Oo=a(L," que vous utilisez est un "),mt=o(L,"EM",{});var hp=l(mt);So=a(hp,"tokenizer"),hp.forEach(t),To=a(L," \xAB rapide \xBB. Comme vous le verrez dans la section suivante, la biblioth\xE8que \u{1F917} "),dt=o(L,"EM",{});var vp=l(dt);Io=a(vp,"Transformers"),vp.forEach(t),Go=a(L," contient deux types de "),ft=o(L,"EM",{});var _p=l(ft);Ro=a(_p,"tokenizers"),_p.forEach(t),Uo=a(L," : certains sont \xE9crits en pur Python et d\u2019autres (les rapides) sont soutenus par la biblioth\xE8que \u{1F917} "),ht=o(L,"EM",{});var xp=l(ht);Ho=a(xp,"Tokenizers"),xp.forEach(t),Vo=a(L," qui est \xE9crite dans le langage "),Re=o(L,"A",{href:!0,rel:!0});var gp=l(Re);Fo=a(gp,"Rust"),gp.forEach(t),Ko=a(L,". Python est le langage le plus souvent utilis\xE9 pour les applications de science des donn\xE9es et d\u2019apprentissage profond, mais lorsque quelque chose doit \xEAtre parall\xE9lis\xE9 pour \xEAtre rapide, il faut que cela soit \xE9crit dans un autre langage. Par exemple, les multiplications matricielles qui sont au c\u0153ur du calcul du mod\xE8le sont \xE9crites en CUDA, une biblioth\xE8que en C optimis\xE9e pour les GPUs."),L.forEach(t),oa=c(e),y=o(e,"P",{});var I=l(y);Yo=a(I,"Entra\xEEner un tout nouveau "),vt=o(I,"EM",{});var qp=l(vt);Bo=a(qp,"tokenizer"),qp.forEach(t),Xo=a(I," en Python pur est atrocement lent, c\u2019est pourquoi nous avons d\xE9velopp\xE9 la biblioth\xE8que \u{1F917} "),_t=o(I,"EM",{});var Ep=l(_t);Jo=a(Ep,"Tokenizers"),Ep.forEach(t),Qo=a(I,". Notez que, tout comme vous n\u2019avez pas eu \xE0 apprendre le langage CUDA pour pouvoir ex\xE9cuter votre mod\xE8le sur un batch d\u2019entr\xE9es sur un GPU, vous n\u2019aurez pas besoin d\u2019apprendre Rust pour utiliser un "),xt=o(I,"EM",{});var jp=l(xt);Zo=a(jp,"tokenizer"),jp.forEach(t),Wo=a(I," rapide. La biblioth\xE8que \u{1F917} "),gt=o(I,"EM",{});var kp=l(gt);el=a(kp,"Tokenizers"),kp.forEach(t),sl=a(I," fournit des liaisons Python pour de nombreuses m\xE9thodes qui appellent en interne un morceau de code en Rust. Par exemple, pour parall\xE9liser l\u2019entra\xEEnement de votre nouveau "),qt=o(I,"EM",{});var bp=l(qt);tl=a(bp,"tokenizer"),bp.forEach(t),nl=a(I," ou, comme nous l\u2019avons vu dans le "),hs=o(I,"A",{href:!0});var $p=l(hs);al=a($p,"chapitre 3"),$p.forEach(t),rl=a(I,", la tokenisation d\u2019un lot d\u2019entr\xE9es."),I.forEach(t),la=c(e),$=o(e,"P",{});var C=l($);ol=a(C,"La plupart des "),Et=o(C,"EM",{});var zp=l(Et);ll=a(zp,"transformers"),zp.forEach(t),il=a(C," ont un "),jt=o(C,"EM",{});var wp=l(jt);ul=a(wp,"tokenizer"),wp.forEach(t),pl=a(C," rapide de disponible. Il y a quelques exceptions que vous pouvez v\xE9rifier "),Ue=o(C,"A",{href:!0,rel:!0});var Pp=l(Ue);cl=a(Pp,"ici"),Pp.forEach(t),ml=a(C,". S\u2019il est disponible, l\u2019API "),kt=o(C,"CODE",{});var yp=l(kt);dl=a(yp,"AutoTokenizer"),yp.forEach(t),fl=a(C," s\xE9lectionne toujours pour vous le "),bt=o(C,"EM",{});var Cp=l(bt);hl=a(Cp,"tokenizer"),Cp.forEach(t),vl=a(C," rapide. Dans la prochaine section, nous allons jeter un coup d\u2019oeil \xE0 certaines des autres caract\xE9ristiques sp\xE9ciales des "),$t=o(C,"EM",{});var Mp=l($t);_l=a(Mp,"tokenizers"),Mp.forEach(t),xl=a(C," rapides, qui seront tr\xE8s utiles pour des t\xE2ches comme la classification de "),zt=o(C,"EM",{});var Ap=l(zt);gl=a(Ap,"tokens"),Ap.forEach(t),ql=a(C," et la r\xE9ponse aux questions. Mais avant cela, essayons notre tout nouveau "),wt=o(C,"EM",{});var Lp=l(wt);El=a(Lp,"tokenizer"),Lp.forEach(t),jl=a(C," sur l\u2019exemple pr\xE9c\xE9dent :"),C.forEach(t),ia=c(e),d(He.$$.fragment,e),ua=c(e),d(Ve.$$.fragment,e),pa=c(e),q=o(e,"P",{});var b=l(q);kl=a(b,"Ici, nous voyons \xE0 nouveau les symboles sp\xE9ciaux "),Pt=o(b,"CODE",{});var Dp=l(Pt);bl=a(Dp,"\u0120"),Dp.forEach(t),$l=a(b," et "),yt=o(b,"CODE",{});var Np=l(yt);zl=a(Np,"\u010A"),Np.forEach(t),wl=a(b," qui indiquent les espaces et les retours \xE0 la ligne. Nous pouvons \xE9galement voir que notre "),Ct=o(b,"EM",{});var Op=l(Ct);Pl=a(Op,"tokenizer"),Op.forEach(t),yl=a(b," a appris certains "),Mt=o(b,"EM",{});var Sp=l(Mt);Cl=a(Sp,"tokens"),Sp.forEach(t),Ml=a(b," qui sont tr\xE8s sp\xE9cifiques \xE0 un corpus de fonctions Python. Par exemple, il y a un token "),At=o(b,"CODE",{});var Tp=l(At);Al=a(Tp,"\u010A\u0120\u0120\u0120"),Tp.forEach(t),Ll=a(b," qui repr\xE9sente une indentation et un "),Lt=o(b,"EM",{});var Ip=l(Lt);Dl=a(Ip,"token"),Ip.forEach(t),Nl=c(b),Dt=o(b,"CODE",{});var Gp=l(Dt);Ol=a(Gp,'\u0120"""'),Gp.forEach(t),Sl=a(b," qui repr\xE9sente les trois guillemets qui commencent une "),Nt=o(b,"EM",{});var Rp=l(Nt);Tl=a(Rp,"docstring"),Rp.forEach(t),Il=a(b,". Le "),Ot=o(b,"EM",{});var Up=l(Ot);Gl=a(Up,"tokenizer"),Up.forEach(t),Rl=a(b," divise \xE9galement correctement le nom de la fonction sur "),St=o(b,"CODE",{});var Hp=l(St);Ul=a(Hp,"_"),Hp.forEach(t),Hl=a(b,". Il s\u2019agit d\u2019une repr\xE9sentation assez compacte. En comparaison, l\u2019utilisation du "),Tt=o(b,"EM",{});var Vp=l(Tt);Vl=a(Vp,"tokenizer"),Vp.forEach(t),Fl=a(b," en anglais \xAB simple \xBB sur le m\xEAme exemple nous donnera une phrase plus longue :"),b.forEach(t),ca=c(e),d(Fe.$$.fragment,e),ma=c(e),d(Ke.$$.fragment,e),da=c(e),vs=o(e,"P",{});var Fp=l(vs);Kl=a(Fp,"Prenons un autre exemple :"),Fp.forEach(t),fa=c(e),d(Ye.$$.fragment,e),ha=c(e),d(Be.$$.fragment,e),va=c(e),x=o(e,"P",{});var E=l(x);Yl=a(E,"En plus du "),It=o(E,"EM",{});var Kp=l(It);Bl=a(Kp,"token"),Kp.forEach(t),Xl=a(E," correspondant \xE0 une indentation, on peut \xE9galement voir ici un "),Gt=o(E,"EM",{});var Yp=l(Gt);Jl=a(Yp,"token"),Yp.forEach(t),Ql=a(E," pour une double indentation : "),Rt=o(E,"CODE",{});var Bp=l(Rt);Zl=a(Bp,"\u010A\u0120\u0120\u0120\u0120\u0120\u0120\u0120\u0120\u0120"),Bp.forEach(t),Wl=a(E,". Les mots sp\xE9ciaux de Python comme "),Ut=o(E,"CODE",{});var Xp=l(Ut);ei=a(Xp,"class"),Xp.forEach(t),si=a(E,", "),Ht=o(E,"CODE",{});var Jp=l(Ht);ti=a(Jp,"init"),Jp.forEach(t),ni=a(E,", "),Vt=o(E,"CODE",{});var Qp=l(Vt);ai=a(Qp,"call"),Qp.forEach(t),ri=a(E,", "),Ft=o(E,"CODE",{});var Zp=l(Ft);oi=a(Zp,"self"),Zp.forEach(t),li=a(E,", et "),Kt=o(E,"CODE",{});var Wp=l(Kt);ii=a(Wp,"return"),Wp.forEach(t),ui=a(E," sont tous tokeniz\xE9s comme un seul "),Yt=o(E,"EM",{});var ec=l(Yt);pi=a(ec,"token"),ec.forEach(t),ci=a(E,". Nous pouvons voir qu\u2019en plus de s\xE9parer sur "),Bt=o(E,"CODE",{});var sc=l(Bt);mi=a(sc,"_"),sc.forEach(t),di=a(E," et "),Xt=o(E,"CODE",{});var tc=l(Xt);fi=a(tc,"."),tc.forEach(t),hi=a(E," le tokenizer s\xE9pare correctement m\xEAme les noms en minuscules. Par exemple "),Jt=o(E,"CODE",{});var nc=l(Jt);vi=a(nc,"LinearLayer"),nc.forEach(t),_i=a(E," est tokenis\xE9 comme "),Qt=o(E,"CODE",{});var ac=l(Qt);xi=a(ac,'["\u0120Linear", "Layer"]'),ac.forEach(t),gi=a(E,"."),E.forEach(t),_a=c(e),le=o(e,"H2",{class:!0});var Da=l(le);fe=o(Da,"A",{id:!0,class:!0,href:!0});var rc=l(fe);Zt=o(rc,"SPAN",{});var oc=l(Zt);d(Xe.$$.fragment,oc),oc.forEach(t),rc.forEach(t),qi=c(Da),_s=o(Da,"SPAN",{});var cu=l(_s);Ei=a(cu,"Sauvegarde du "),Wt=o(cu,"I",{});var lc=l(Wt);ji=a(lc,"tokenizer"),lc.forEach(t),cu.forEach(t),Da.forEach(t),xa=c(e),W=o(e,"P",{});var $s=l(W);ki=a($s,"Pour \xEAtre s\xFBr de pouvoir l\u2019utiliser plus tard, nous devons sauvegarder notre nouveau "),en=o($s,"EM",{});var ic=l(en);bi=a(ic,"tokenizer"),ic.forEach(t),$i=a($s,". Comme pour les mod\xE8les, ceci est fait avec la m\xE9thode "),sn=o($s,"CODE",{});var uc=l(sn);zi=a(uc,"save_pretrained()"),uc.forEach(t),wi=a($s," :"),$s.forEach(t),ga=c(e),d(Je.$$.fragment,e),qa=c(e),A=o(e,"P",{});var F=l(A);Pi=a(F,"Cela cr\xE9era un nouveau dossier nomm\xE9 "),tn=o(F,"EM",{});var pc=l(tn);yi=a(pc,"code-search-net-tokenizer"),pc.forEach(t),Ci=a(F," contenant tous les fichiers dont le "),nn=o(F,"EM",{});var cc=l(nn);Mi=a(cc,"tokenizer"),cc.forEach(t),Ai=a(F," a besoin pour \xEAtre recharg\xE9. Si vous souhaitez partager ce "),an=o(F,"EM",{});var mc=l(an);Li=a(mc,"tokenizer"),mc.forEach(t),Di=a(F," avec vos coll\xE8gues et amis, vous pouvez le t\xE9l\xE9charger sur le "),rn=o(F,"EM",{});var dc=l(rn);Ni=a(dc,"Hub"),dc.forEach(t),Oi=a(F," en vous connectant \xE0 votre compte. Si vous travaillez dans un "),on=o(F,"EM",{});var fc=l(on);Si=a(fc,"notebook"),fc.forEach(t),Ti=a(F,", il existe une fonction pratique pour vous aider \xE0 le faire :"),F.forEach(t),Ea=c(e),d(Qe.$$.fragment,e),ja=c(e),he=o(e,"P",{});var Na=l(he);Ii=a(Na,"Cela affichera un "),ln=o(Na,"EM",{});var hc=l(ln);Gi=a(hc,"widget"),hc.forEach(t),Ri=a(Na," o\xF9 vous pourrez entrer vos identifiants de connexion \xE0 Hugging Face. Si vous ne travaillez pas sur un ordinateur portable, tapez simplement la ligne suivante dans votre terminal :"),Na.forEach(t),ka=c(e),d(Ze.$$.fragment,e),ba=c(e),ve=o(e,"P",{});var Oa=l(ve);Ui=a(Oa,"Une fois connect\xE9, vous pouvez pousser votre "),un=o(Oa,"EM",{});var vc=l(un);Hi=a(vc,"tokenizer"),vc.forEach(t),Vi=a(Oa," en ex\xE9cutant la commande suivante :"),Oa.forEach(t),$a=c(e),d(We.$$.fragment,e),za=c(e),S=o(e,"P",{});var se=l(S);Fi=a(se,"Cela cr\xE9era un nouveau d\xE9p\xF4t dans votre espace avec le nom "),pn=o(se,"CODE",{});var _c=l(pn);Ki=a(_c,"code-search-net-tokenizer"),_c.forEach(t),Yi=a(se," contenant le fichier "),cn=o(se,"EM",{});var xc=l(cn);Bi=a(xc,"tokenizer"),xc.forEach(t),Xi=a(se,". Vous pouvez ensuite charger le "),mn=o(se,"EM",{});var gc=l(mn);Ji=a(gc,"tokenizer"),gc.forEach(t),Qi=a(se," de n\u2019importe o\xF9 avec la m\xE9thode "),dn=o(se,"CODE",{});var qc=l(dn);Zi=a(qc,"from_pretrained()"),qc.forEach(t),Wi=a(se," :"),se.forEach(t),wa=c(e),d(es.$$.fragment,e),Pa=c(e),T=o(e,"P",{});var te=l(T);eu=a(te,"Vous \xEAtes maintenant pr\xEAt \xE0 entra\xEEner un mod\xE8le de langue \xE0 partir de z\xE9ro et \xE0 le "),fn=o(te,"EM",{});var Ec=l(fn);su=a(Ec,"finetuner"),Ec.forEach(t),tu=a(te," sur votre t\xE2che ! Nous verrons cela dans le "),xs=o(te,"A",{href:!0});var jc=l(xs);nu=a(jc,"chapitre 7"),jc.forEach(t),au=a(te,", mais d\u2019abord, dans le reste de ce chapitre, nous allons examiner de plus pr\xE8s les "),hn=o(te,"EM",{});var kc=l(hn);ru=a(kc,"tokenizers"),kc.forEach(t),ou=a(te," rapides et explorer en d\xE9tail ce qui se passe lorsque nous appelons la m\xE9thode "),vn=o(te,"CODE",{});var bc=l(vn);lu=a(bc,"train_new_from_iterator()"),bc.forEach(t),iu=a(te,"."),te.forEach(t),this.h()},h(){g(z,"name","hf:doc:metadata"),g(z,"content",JSON.stringify(Nc)),g(R,"id","entraner-un-nouveau-itokenizeri-partir-dun-ancien"),g(R,"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"),g(R,"href","#entraner-un-nouveau-itokenizeri-partir-dun-ancien"),g(D,"class","relative group"),g(as,"href","/course/fr/chapter2"),g(pe,"id","assemblage-dun-corpus"),g(pe,"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"),g(pe,"href","#assemblage-dun-corpus"),g(re,"class","relative group"),g(ce,"href","https://github.com/huggingface/datasets"),g(ce,"rel","nofollow"),g(ke,"href","https://huggingface.co/datasets/code_search_net"),g(ke,"rel","nofollow"),g(be,"href","https://wandb.ai/github/CodeSearchNet/benchmark"),g(be,"rel","nofollow"),g(me,"id","entranement-dun-nouveau-itokenizeri"),g(me,"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"),g(me,"href","#entranement-dun-nouveau-itokenizeri"),g(oe,"class","relative group"),g(Re,"href","https://www.rust-lang.org"),g(Re,"rel","nofollow"),g(hs,"href","/course/fr/chapter3"),g(Ue,"href","https://huggingface.co/transformers/#supported-frameworks"),g(Ue,"rel","nofollow"),g(fe,"id","sauvegarde-du-itokenizeri"),g(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"),g(fe,"href","#sauvegarde-du-itokenizeri"),g(le,"class","relative group"),g(xs,"href","/course/fr/chapter7")},m(e,i){s(document.head,z),u(e,ie,i),u(e,D,i),s(D,R),s(R,ne),f(G,ne,null),s(D,ge),s(D,K),s(K,ae),s(K,N),s(N,ts),s(K,ns),u(e,xn,i),f(qe,e,i),u(e,gn,i),u(e,k,i),s(k,Ta),s(k,zs),s(zs,Ia),s(k,Ga),s(k,ws),s(ws,Ra),s(k,Ua),s(k,Ps),s(Ps,Ha),s(k,Va),s(k,as),s(as,Fa),s(k,Ka),s(k,ys),s(ys,Ya),s(k,Ba),s(k,Cs),s(Cs,Xa),s(k,Ja),s(k,Ms),s(Ms,Qa),s(k,Za),s(k,As),s(As,Wa),s(k,er),s(k,Ls),s(Ls,sr),s(k,tr),u(e,qn,i),f(Ee,e,i),u(e,En,i),f(ue,e,i),u(e,jn,i),u(e,re,i),s(re,pe),s(pe,Ds),f(je,Ds,null),s(re,nr),s(re,Ns),s(Ns,ar),u(e,kn,i),u(e,U,i),s(U,rr),s(U,Os),s(Os,or),s(U,lr),s(U,Ss),s(Ss,ir),s(U,ur),s(U,Ts),s(Ts,pr),s(U,cr),u(e,bn,i),u(e,O,i),s(O,mr),s(O,ce),s(ce,dr),s(ce,Is),s(Is,fr),s(O,hr),s(O,Gs),s(Gs,vr),s(O,_r),s(O,ke),s(ke,xr),s(O,gr),s(O,be),s(be,qr),s(O,Er),u(e,$n,i),f($e,e,i),u(e,zn,i),u(e,rs,i),s(rs,jr),u(e,wn,i),f(ze,e,i),u(e,Pn,i),f(we,e,i),u(e,yn,i),u(e,Y,i),s(Y,kr),s(Y,Rs),s(Rs,br),s(Y,$r),s(Y,Us),s(Us,zr),s(Y,wr),u(e,Cn,i),f(Pe,e,i),u(e,Mn,i),u(e,os,i),s(os,Pr),u(e,An,i),f(ye,e,i),u(e,Ln,i),u(e,H,i),s(H,yr),s(H,Hs),s(Hs,Cr),s(H,Mr),s(H,Vs),s(Vs,Ar),s(H,Lr),s(H,Fs),s(Fs,Dr),s(H,Nr),u(e,Dn,i),u(e,ls,i),s(ls,Or),u(e,Nn,i),f(Ce,e,i),u(e,On,i),u(e,is,i),s(is,Sr),u(e,Sn,i),f(Me,e,i),u(e,Tn,i),u(e,B,i),s(B,Tr),s(B,Ks),s(Ks,Ir),s(B,Gr),s(B,Ys),s(Ys,Rr),s(B,Ur),u(e,In,i),u(e,us,i),s(us,Hr),u(e,Gn,i),f(Ae,e,i),u(e,Rn,i),u(e,ps,i),s(ps,Vr),u(e,Un,i),f(Le,e,i),u(e,Hn,i),u(e,cs,i),s(cs,Fr),u(e,Vn,i),f(De,e,i),u(e,Fn,i),u(e,X,i),s(X,Kr),s(X,Bs),s(Bs,Yr),s(X,Br),s(X,Xs),s(Xs,Xr),s(X,Jr),u(e,Kn,i),f(Ne,e,i),u(e,Yn,i),u(e,ms,i),s(ms,Qr),u(e,Bn,i),u(e,oe,i),s(oe,me),s(me,Js),f(Oe,Js,null),s(oe,Zr),s(oe,ds),s(ds,Wr),s(ds,Qs),s(Qs,eo),u(e,Xn,i),u(e,J,i),s(J,so),s(J,Zs),s(Zs,to),s(J,no),s(J,Ws),s(Ws,ao),s(J,ro),u(e,Jn,i),f(Se,e,i),u(e,Qn,i),u(e,Q,i),s(Q,oo),s(Q,et),s(et,lo),s(Q,io),s(Q,st),s(st,uo),s(Q,po),u(e,Zn,i),u(e,de,i),s(de,co),s(de,tt),s(tt,mo),s(de,fo),u(e,Wn,i),f(Te,e,i),u(e,ea,i),f(Ie,e,i),u(e,sa,i),u(e,M,i),s(M,ho),s(M,nt),s(nt,vo),s(M,_o),s(M,at),s(at,xo),s(M,go),s(M,rt),s(rt,qo),s(M,Eo),s(M,ot),s(ot,jo),s(M,ko),s(M,lt),s(lt,bo),s(M,$o),u(e,ta,i),u(e,Z,i),s(Z,zo),s(Z,it),s(it,wo),s(Z,Po),s(Z,ut),s(ut,yo),s(Z,Co),u(e,na,i),f(Ge,e,i),u(e,aa,i),u(e,fs,i),s(fs,Mo),u(e,ra,i),u(e,w,i),s(w,Ao),s(w,pt),s(pt,Lo),s(w,Do),s(w,ct),s(ct,No),s(w,Oo),s(w,mt),s(mt,So),s(w,To),s(w,dt),s(dt,Io),s(w,Go),s(w,ft),s(ft,Ro),s(w,Uo),s(w,ht),s(ht,Ho),s(w,Vo),s(w,Re),s(Re,Fo),s(w,Ko),u(e,oa,i),u(e,y,i),s(y,Yo),s(y,vt),s(vt,Bo),s(y,Xo),s(y,_t),s(_t,Jo),s(y,Qo),s(y,xt),s(xt,Zo),s(y,Wo),s(y,gt),s(gt,el),s(y,sl),s(y,qt),s(qt,tl),s(y,nl),s(y,hs),s(hs,al),s(y,rl),u(e,la,i),u(e,$,i),s($,ol),s($,Et),s(Et,ll),s($,il),s($,jt),s(jt,ul),s($,pl),s($,Ue),s(Ue,cl),s($,ml),s($,kt),s(kt,dl),s($,fl),s($,bt),s(bt,hl),s($,vl),s($,$t),s($t,_l),s($,xl),s($,zt),s(zt,gl),s($,ql),s($,wt),s(wt,El),s($,jl),u(e,ia,i),f(He,e,i),u(e,ua,i),f(Ve,e,i),u(e,pa,i),u(e,q,i),s(q,kl),s(q,Pt),s(Pt,bl),s(q,$l),s(q,yt),s(yt,zl),s(q,wl),s(q,Ct),s(Ct,Pl),s(q,yl),s(q,Mt),s(Mt,Cl),s(q,Ml),s(q,At),s(At,Al),s(q,Ll),s(q,Lt),s(Lt,Dl),s(q,Nl),s(q,Dt),s(Dt,Ol),s(q,Sl),s(q,Nt),s(Nt,Tl),s(q,Il),s(q,Ot),s(Ot,Gl),s(q,Rl),s(q,St),s(St,Ul),s(q,Hl),s(q,Tt),s(Tt,Vl),s(q,Fl),u(e,ca,i),f(Fe,e,i),u(e,ma,i),f(Ke,e,i),u(e,da,i),u(e,vs,i),s(vs,Kl),u(e,fa,i),f(Ye,e,i),u(e,ha,i),f(Be,e,i),u(e,va,i),u(e,x,i),s(x,Yl),s(x,It),s(It,Bl),s(x,Xl),s(x,Gt),s(Gt,Jl),s(x,Ql),s(x,Rt),s(Rt,Zl),s(x,Wl),s(x,Ut),s(Ut,ei),s(x,si),s(x,Ht),s(Ht,ti),s(x,ni),s(x,Vt),s(Vt,ai),s(x,ri),s(x,Ft),s(Ft,oi),s(x,li),s(x,Kt),s(Kt,ii),s(x,ui),s(x,Yt),s(Yt,pi),s(x,ci),s(x,Bt),s(Bt,mi),s(x,di),s(x,Xt),s(Xt,fi),s(x,hi),s(x,Jt),s(Jt,vi),s(x,_i),s(x,Qt),s(Qt,xi),s(x,gi),u(e,_a,i),u(e,le,i),s(le,fe),s(fe,Zt),f(Xe,Zt,null),s(le,qi),s(le,_s),s(_s,Ei),s(_s,Wt),s(Wt,ji),u(e,xa,i),u(e,W,i),s(W,ki),s(W,en),s(en,bi),s(W,$i),s(W,sn),s(sn,zi),s(W,wi),u(e,ga,i),f(Je,e,i),u(e,qa,i),u(e,A,i),s(A,Pi),s(A,tn),s(tn,yi),s(A,Ci),s(A,nn),s(nn,Mi),s(A,Ai),s(A,an),s(an,Li),s(A,Di),s(A,rn),s(rn,Ni),s(A,Oi),s(A,on),s(on,Si),s(A,Ti),u(e,Ea,i),f(Qe,e,i),u(e,ja,i),u(e,he,i),s(he,Ii),s(he,ln),s(ln,Gi),s(he,Ri),u(e,ka,i),f(Ze,e,i),u(e,ba,i),u(e,ve,i),s(ve,Ui),s(ve,un),s(un,Hi),s(ve,Vi),u(e,$a,i),f(We,e,i),u(e,za,i),u(e,S,i),s(S,Fi),s(S,pn),s(pn,Ki),s(S,Yi),s(S,cn),s(cn,Bi),s(S,Xi),s(S,mn),s(mn,Ji),s(S,Qi),s(S,dn),s(dn,Zi),s(S,Wi),u(e,wa,i),f(es,e,i),u(e,Pa,i),u(e,T,i),s(T,eu),s(T,fn),s(fn,su),s(T,tu),s(T,xs),s(xs,nu),s(T,au),s(T,hn),s(hn,ru),s(T,ou),s(T,vn),s(vn,lu),s(T,iu),ya=!0},p(e,[i]){const ss={};i&2&&(ss.$$scope={dirty:i,ctx:e}),ue.$set(ss)},i(e){ya||(h(G.$$.fragment,e),h(qe.$$.fragment,e),h(Ee.$$.fragment,e),h(ue.$$.fragment,e),h(je.$$.fragment,e),h($e.$$.fragment,e),h(ze.$$.fragment,e),h(we.$$.fragment,e),h(Pe.$$.fragment,e),h(ye.$$.fragment,e),h(Ce.$$.fragment,e),h(Me.$$.fragment,e),h(Ae.$$.fragment,e),h(Le.$$.fragment,e),h(De.$$.fragment,e),h(Ne.$$.fragment,e),h(Oe.$$.fragment,e),h(Se.$$.fragment,e),h(Te.$$.fragment,e),h(Ie.$$.fragment,e),h(Ge.$$.fragment,e),h(He.$$.fragment,e),h(Ve.$$.fragment,e),h(Fe.$$.fragment,e),h(Ke.$$.fragment,e),h(Ye.$$.fragment,e),h(Be.$$.fragment,e),h(Xe.$$.fragment,e),h(Je.$$.fragment,e),h(Qe.$$.fragment,e),h(Ze.$$.fragment,e),h(We.$$.fragment,e),h(es.$$.fragment,e),ya=!0)},o(e){v(G.$$.fragment,e),v(qe.$$.fragment,e),v(Ee.$$.fragment,e),v(ue.$$.fragment,e),v(je.$$.fragment,e),v($e.$$.fragment,e),v(ze.$$.fragment,e),v(we.$$.fragment,e),v(Pe.$$.fragment,e),v(ye.$$.fragment,e),v(Ce.$$.fragment,e),v(Me.$$.fragment,e),v(Ae.$$.fragment,e),v(Le.$$.fragment,e),v(De.$$.fragment,e),v(Ne.$$.fragment,e),v(Oe.$$.fragment,e),v(Se.$$.fragment,e),v(Te.$$.fragment,e),v(Ie.$$.fragment,e),v(Ge.$$.fragment,e),v(He.$$.fragment,e),v(Ve.$$.fragment,e),v(Fe.$$.fragment,e),v(Ke.$$.fragment,e),v(Ye.$$.fragment,e),v(Be.$$.fragment,e),v(Xe.$$.fragment,e),v(Je.$$.fragment,e),v(Qe.$$.fragment,e),v(Ze.$$.fragment,e),v(We.$$.fragment,e),v(es.$$.fragment,e),ya=!1},d(e){t(z),e&&t(ie),e&&t(D),_(G),e&&t(xn),_(qe,e),e&&t(gn),e&&t(k),e&&t(qn),_(Ee,e),e&&t(En),_(ue,e),e&&t(jn),e&&t(re),_(je),e&&t(kn),e&&t(U),e&&t(bn),e&&t(O),e&&t($n),_($e,e),e&&t(zn),e&&t(rs),e&&t(wn),_(ze,e),e&&t(Pn),_(we,e),e&&t(yn),e&&t(Y),e&&t(Cn),_(Pe,e),e&&t(Mn),e&&t(os),e&&t(An),_(ye,e),e&&t(Ln),e&&t(H),e&&t(Dn),e&&t(ls),e&&t(Nn),_(Ce,e),e&&t(On),e&&t(is),e&&t(Sn),_(Me,e),e&&t(Tn),e&&t(B),e&&t(In),e&&t(us),e&&t(Gn),_(Ae,e),e&&t(Rn),e&&t(ps),e&&t(Un),_(Le,e),e&&t(Hn),e&&t(cs),e&&t(Vn),_(De,e),e&&t(Fn),e&&t(X),e&&t(Kn),_(Ne,e),e&&t(Yn),e&&t(ms),e&&t(Bn),e&&t(oe),_(Oe),e&&t(Xn),e&&t(J),e&&t(Jn),_(Se,e),e&&t(Qn),e&&t(Q),e&&t(Zn),e&&t(de),e&&t(Wn),_(Te,e),e&&t(ea),_(Ie,e),e&&t(sa),e&&t(M),e&&t(ta),e&&t(Z),e&&t(na),_(Ge,e),e&&t(aa),e&&t(fs),e&&t(ra),e&&t(w),e&&t(oa),e&&t(y),e&&t(la),e&&t($),e&&t(ia),_(He,e),e&&t(ua),_(Ve,e),e&&t(pa),e&&t(q),e&&t(ca),_(Fe,e),e&&t(ma),_(Ke,e),e&&t(da),e&&t(vs),e&&t(fa),_(Ye,e),e&&t(ha),_(Be,e),e&&t(va),e&&t(x),e&&t(_a),e&&t(le),_(Xe),e&&t(xa),e&&t(W),e&&t(ga),_(Je,e),e&&t(qa),e&&t(A),e&&t(Ea),_(Qe,e),e&&t(ja),e&&t(he),e&&t(ka),_(Ze,e),e&&t(ba),e&&t(ve),e&&t($a),_(We,e),e&&t(za),e&&t(S),e&&t(wa),_(es,e),e&&t(Pa),e&&t(T)}}}const Nc={local:"entraner-un-nouveau-itokenizeri-partir-dun-ancien",sections:[{local:"assemblage-dun-corpus",title:"Assemblage d'un corpus"},{local:"entranement-dun-nouveau-itokenizeri",title:"Entra\xEEnement d'un nouveau <i>tokenizer</i>"},{local:"sauvegarde-du-itokenizeri",title:"Sauvegarde du <i>tokenizer</i>"}],title:"Entra\xEEner un nouveau <i>tokenizer</i> \xE0 partir d'un ancien"};function Oc(_n){return yc(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class Hc extends $c{constructor(z){super();zc(this,z,Oc,Dc,wc,{})}}export{Hc as default,Nc as metadata};
