Buckets:

rtrm's picture
download
raw
89.1 kB
import{s as Ut,o as Jt,n as Jl}from"../chunks/scheduler.37c15a92.js";import{S as ht,i as wt,g as p,s as t,r as c,m as ml,H as yn,A as Ct,h as M,f as a,c as e,j as jl,u as o,x as m,n as il,E as jn,k as rt,y as d,a as n,v as r,d as y,t as j,w as u}from"../chunks/index.2bf4358c.js";import{T as ul}from"../chunks/Tip.363c041f.js";import{Y as Tt}from"../chunks/Youtube.1e50a667.js";import{C as J}from"../chunks/CodeBlock.4e987730.js";import{C as dt}from"../chunks/CourseFloatingBanner.9ff4c771.js";import{H as Ul,E as gt}from"../chunks/getInferenceSnippets.24b50994.js";function It(C){let i,h="💡 В этом разделе подробно рассматривается Unigram, вплоть до демонстрации полной реализации. Вы можете пропустить его, если вам нужен только общий обзор алгоритма токенизации.";return{c(){i=p("p"),i.textContent=h},l(U){i=M(U,"P",{"data-svelte-h":!0}),m(i)!=="svelte-xcsu8n"&&(i.textContent=h)},m(U,w){n(U,i,w)},p:Jl,d(U){U&&a(i)}}}function ft(C){let i,h="✏️ <strong>Теперь ваша очередь!</strong> Напишите код для вычисления вышеуказанных частот и дважды проверьте правильность приведенных результатов, а также общую сумму.";return{c(){i=p("p"),i.innerHTML=h},l(U){i=M(U,"P",{"data-svelte-h":!0}),m(i)!=="svelte-fk9ipk"&&(i.innerHTML=h)},m(U,w){n(U,i,w)},p:Jl,d(U){U&&a(i)}}}function bt(C){let i,h="✏️ <strong>Теперь ваша очередь!</strong> Определите токенизацию слова <code>&quot; huggun&quot;</code> и его оценку.";return{c(){i=p("p"),i.innerHTML=h},l(U){i=M(U,"P",{"data-svelte-h":!0}),m(i)!=="svelte-1al7y90"&&(i.innerHTML=h)},m(U,w){n(U,i,w)},p:Jl,d(U){U&&a(i)}}}function At(C){let i,h="💡 SentencePiece использует более эффективный алгоритм под названием Enhanced Suffix Array (ESA) для создания начального словаря.";return{c(){i=p("p"),i.textContent=h},l(U){i=M(U,"P",{"data-svelte-h":!0}),m(i)!=="svelte-1fbawyj"&&(i.textContent=h)},m(U,w){n(U,i,w)},p:Jl,d(U){U&&a(i)}}}function Vt(C){let i,h="💡 Такой подход очень неэффективен, поэтому SentencePiece использует приближенную оценку потерь модели без токена X: вместо того чтобы начинать с нуля, он просто заменяет токен X его сегментацией в оставшемся словаре. Таким образом, все оценки могут быть вычислены одновременно с потерями модели.";return{c(){i=p("p"),i.textContent=h},l(U){i=M(U,"P",{"data-svelte-h":!0}),m(i)!=="svelte-ozraz9"&&(i.textContent=h)},m(U,w){n(U,i,w)},p:Jl,d(U){U&&a(i)}}}function kt(C){let i,h,U,w,q,hl,E,wl,x,un="Алгоритм Unigram часто используется в SentencePiece, который является алгоритмом токенизации, применяемым в таких моделях, как AlBERT, T5, mBART, Big Bird и XLNet.",Cl,v,Tl,f,dl,R,gl,_,Un="По сравнению с BPE и WordPiece, Unigram работает в другом направлении: он начинает с большого словарного запаса и удаляет из него токены, пока не достигнет желаемого размера словаря. Существует несколько вариантов создания базового словаря: например, мы можем взять наиболее часто встречающиеся подстроки в предварительно токенизированных словах или применить BPE к исходному корпусу с большим объемом словаря.",Il,N,Jn="На каждом шаге обучения алгоритм Unigram рассчитывает потери по корпусу с учетом текущего словарного запаса. Затем для каждого символа в словаре алгоритм вычисляет, насколько увеличится общая потеря, если этот символ будет удален, и ищет символы, которые увеличат ее меньше всего. Эти символы оказывают меньшее влияние на общую потерю по корпусу, поэтому в некотором смысле они “менее нужны” и являются лучшими кандидатами на удаление.",fl,b,pn,bl,yt='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>',Al,Vl,D,hn="Обратите внимание, что мы никогда не удаляем базовые символы, чтобы убедиться, что любое слово может быть токенизировано.",kl,Z,wn="Итак, все еще немного туманно: основная часть алгоритма заключается в том, чтобы вычислить потери по корпусу и посмотреть, как они изменяются при удалении некоторых токенов из словаря, но мы еще не объяснили, как это сделать. Этот шаг зависит от алгоритма токенизации модели Unigram, поэтому мы рассмотрим его далее.",Ql,S,Cn="Мы используем корпус текста из предыдущих примеров:",$l,B,ql,G,Tn="и для этого примера мы возьмем все подстроки из исходного словаря:",El,z,xl,H,vl,W,dn="Модель Unigram - это тип языковой модели, в которой каждый токен рассматривается как независимый от предшествующих ему. Это самая простая языковая модель в том смысле, что вероятность появления токена X с учетом предыдущего контекста - это просто вероятность появления токена X. Таким образом, если бы мы использовали модель Unigram для генерации текста, мы бы всегда предсказывали наиболее часто встречающийся токен.",Rl,X,gn="Вероятность данного токена - это его частота (количество раз, когда мы его находим) в исходном корпусе, деленная на сумму частот всех токенов в словаре (чтобы убедиться, что суммы вероятностей равны 1). Например, <code>&quot;ug&quot;</code> присутствует в <code>&quot;hug&quot;</code>, <code>&quot;pug&quot;</code> и <code>&quot;hugs&quot;</code>, поэтому его частота в нашем корпусе равна 20.",_l,F,In="Здесь приведены частоты всех возможных подслов в словаре:",Nl,Y,Dl,K,fn="Итак, сумма всех частот равна 210, а вероятность появления подслова <code>&quot;ug&quot;</code>, таким образом, составляет 20/210.",Zl,A,Sl,T,Mn,cl,bn='["p", "u", "g"]',mn,ol,An='"pug"',cn,Bl,jt='<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><mo stretchy="false">[</mo><mi mathvariant="normal">‘</mi><mi mathvariant="normal">‘</mi><mi>p</mi><mi mathvariant="normal">&quot;</mi><mo separator="true">,</mo><mi mathvariant="normal">‘</mi><mi mathvariant="normal">‘</mi><mi>u</mi><mi mathvariant="normal">&quot;</mi><mo separator="true">,</mo><mi mathvariant="normal">‘</mi><mi mathvariant="normal">‘</mi><mi>g</mi><mi mathvariant="normal">&quot;</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo><mo>=</mo><mi>P</mi><mo stretchy="false">(</mo><mi mathvariant="normal">‘</mi><mi mathvariant="normal">‘</mi><mi>p</mi><mi mathvariant="normal">&quot;</mi><mo stretchy="false">)</mo><mo>×</mo><mi>P</mi><mo stretchy="false">(</mo><mi mathvariant="normal">‘</mi><mi mathvariant="normal">‘</mi><mi>u</mi><mi mathvariant="normal">&quot;</mi><mo stretchy="false">)</mo><mo>×</mo><mi>P</mi><mo stretchy="false">(</mo><mi mathvariant="normal">‘</mi><mi mathvariant="normal">‘</mi><mi>g</mi><mi mathvariant="normal">&quot;</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>5</mn><mn>210</mn></mfrac><mo>×</mo><mfrac><mn>36</mn><mn>210</mn></mfrac><mo>×</mo><mfrac><mn>20</mn><mn>210</mn></mfrac><mo>=</mo><mn>0.000389</mn></mrow><annotation encoding="application/x-tex">P([``p&quot;, ``u&quot;, ``g&quot;]) = P(``p&quot;) \\times P(``u&quot;) \\times P(``g&quot;) = \\frac{5}{210} \\times \\frac{36}{210} \\times \\frac{20}{210} = 0.000389</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">([</span><span class="mord">‘‘</span><span class="mord mathnormal">p</span><span class="mord">&quot;</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">‘‘</span><span class="mord mathnormal">u</span><span class="mord">&quot;</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">‘‘</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord">&quot;</span><span class="mclose">])</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord">‘‘</span><span class="mord mathnormal">p</span><span class="mord">&quot;</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord">‘‘</span><span class="mord mathnormal">u</span><span class="mord">&quot;</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord">‘‘</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord">&quot;</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">210</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">5</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">210</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">36</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">210</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">20</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.000389</span></span></span></span></span>',Gl,I,on,rl,Vn='["pu", "g"]',rn,zl,ut='<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><mo stretchy="false">[</mo><mi mathvariant="normal">‘</mi><mi mathvariant="normal">‘</mi><mi>p</mi><mi>u</mi><mi mathvariant="normal">&quot;</mi><mo separator="true">,</mo><mi mathvariant="normal">‘</mi><mi mathvariant="normal">‘</mi><mi>g</mi><mi mathvariant="normal">&quot;</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo><mo>=</mo><mi>P</mi><mo stretchy="false">(</mo><mi mathvariant="normal">‘</mi><mi mathvariant="normal">‘</mi><mi>p</mi><mi>u</mi><mi mathvariant="normal">&quot;</mi><mo stretchy="false">)</mo><mo>×</mo><mi>P</mi><mo stretchy="false">(</mo><mi mathvariant="normal">‘</mi><mi mathvariant="normal">‘</mi><mi>g</mi><mi mathvariant="normal">&quot;</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>5</mn><mn>210</mn></mfrac><mo>×</mo><mfrac><mn>20</mn><mn>210</mn></mfrac><mo>=</mo><mn>0.0022676</mn></mrow><annotation encoding="application/x-tex">P([``pu&quot;, ``g&quot;]) = P(``pu&quot;) \\times P(``g&quot;) = \\frac{5}{210} \\times \\frac{20}{210} = 0.0022676</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">([</span><span class="mord">‘‘</span><span class="mord mathnormal">p</span><span class="mord mathnormal">u</span><span class="mord">&quot;</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">‘‘</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord">&quot;</span><span class="mclose">])</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord">‘‘</span><span class="mord mathnormal">p</span><span class="mord mathnormal">u</span><span class="mord">&quot;</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord">‘‘</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord">&quot;</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">210</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">5</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">210</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">20</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.0022676</span></span></span></span></span>',Hl,P,kn="так что один из них гораздо более вероятен. В целом, токенизации с наименьшим количеством токенов будут иметь наибольшую вероятность (из-за деления на 210, повторяющегося для каждого токена), что соответствует интуитивному желанию: разбить слово на наименьшее количество токенов.",Wl,L,Qn="Токенизация слова с помощью модели Unigram - это токенизация с наибольшей вероятностью. В примере с <code>&quot;pug&quot;</code> приведены вероятности, которые мы получили бы для каждой возможной сегментации:",Xl,O,Fl,ss,$n="Так, <code>&quot;pug&quot;</code> будет токенизировано как <code>[&quot;p&quot;, &quot;ug&quot;]</code> или <code>[&quot;pu&quot;, &quot;g&quot;]</code>, в зависимости от того, какая из этих сегментаций встретится первой (отметим, что в большом корпусе подобные случаи равенства будут редки).",Yl,ls,qn="В данном случае было легко найти все возможные сегментации и вычислить их вероятности, но в общем случае это будет немного сложнее. Для этого используется классический алгоритм, который называется <em>алгоритм Витерби (Viterbi algorithm)</em>. По сути, мы можем построить граф для выявления возможных сегментаций данного слова, сказав, что существует ветвь от символа <em>a</em> до символа <em>b</em>, если подслово от <em>a</em> до <em>b</em> есть в словаре, и приписать этой ветви вероятность подслова.",Kl,as,En="Чтобы найти путь в этом графе, который будет иметь наилучшую оценку, алгоритм Витерби определяет для каждой позиции в слове сегментацию с наилучшей оценкой, которая заканчивается на этой позиции. Поскольку мы идем от начала к концу, этот лучший результат можно найти, перебирая все подслова, заканчивающиеся на текущей позиции, а затем используя лучший результат токенизации с позиции, на которой начинается это подслово. Затем нужно просто развернуть путь, чтобы прийти к концу.",Pl,ns,xn="Давайте рассмотрим пример с использованием нашего словаря и слова <code>&quot;unhug&quot;</code>. Для каждой позиции подслова с наилучшими оценками заканчиваются следующим образом:",Ll,ts,Ol,es,vn="Таким образом, <code>&quot;unhug&quot;</code> будет токенизировано как <code>[&quot;un&quot;, &quot;hug&quot;]</code>.",sa,V,la,ps,aa,Ms,Rn="Теперь, когда мы увидели, как работает токенизация, мы можем немного глубже изучить потери, используемые во время обучения. На любом этапе эта потеря вычисляется путем токенизации каждого слова в корпусе с использованием текущего словаря и модели Unigram, определяемой частотами каждого токена в корпусе (как было показано ранее).",na,ms,_n="Каждое слово в корпусе имеет оценку, а потеря - это отрицательное логарифмическое правдоподобие этих оценок, то есть сумма для всех слов в корпусе всех <code>-log(P(word))</code>.",ta,is,Nn="Давайте вернемся к нашему примеру со следующим корпусом:",ea,cs,pa,os,Dn="Токенизация каждого слова с соответствующими оценками:",Ma,rs,ma,ys,Zn="Таким образом, потери будут:",ia,js,ca,us,Sn="Теперь нам нужно вычислить, как удаление каждого токена влияет на потери. Это довольно утомительно, поэтому мы просто сделаем это для двух токенов и оставим весь процесс на потом, когда у нас будет код, чтобы помочь нам. В этом (очень) конкретном случае у нас есть две эквивалентные токенизации всех слов: как мы видели ранее, например, <code>&quot;pug&quot;</code> может быть токенизировано <code>[&quot;p&quot;, &quot;ug&quot;]</code> с тем же результатом. Таким образом, удаление токена <code>&quot;pu&quot;</code> из словаря приведет к точно таким же потерям.",oa,Us,Bn="С другой стороны, удаление <code>&quot; hug&quot;</code> усугубит потери, потому что токенизация <code>&quot;hug&quot;</code> и <code>&quot;hugs&quot;</code> станет:",ra,Js,ya,hs,Gn="Эти изменения приведут к увеличению потерь:",ja,ws,ua,Cs,zn="Поэтому токен <code>&quot;pu&quot;</code>, вероятно, будет удален из словаря, но не <code>&quot;hug&quot;</code>.",Ua,Ts,Ja,ds,Hn="Теперь давайте реализуем все, что мы видели до сих пор, в коде. Как и в случае с BPE и WordPiece, это не эффективная реализация алгоритма Unigram (совсем наоборот), но она должна помочь вам понять его немного лучше.",ha,gs,Wn="В качестве примера мы будем использовать тот же корпус текста, что и раньше:",wa,Is,Ca,fs,Xn="На этот раз в качестве модели мы будем использовать <code>xlnet-base-cased</code>:",Ta,bs,da,As,Fn="Как и в случае с BPE и WordPiece, мы начинаем с подсчета количества вхождений каждого слова в корпус:",ga,Vs,Ia,ks,Yn="Затем нам нужно инициализировать наш словарь чем-то большим, чем размер словаря, который мы захотим получить в конце. Мы должны включить все основные символы (иначе мы не сможем токенизировать каждое слово), но для больших подстрок мы сохраним только самые распространенные, поэтому мы отсортируем их по частоте:",fa,Qs,ba,$s,Aa,qs,Kn="Мы группируем символы с лучшими подсловами, чтобы получить начальный словарь размером 300:",Va,Es,ka,k,Qa,xs,Pn="Далее мы вычисляем сумму всех частот, чтобы преобразовать частоты в вероятности. Для нашей модели мы будем хранить логарифмы вероятностей, потому что численно стабильнее складывать логарифмы, чем перемножать маленькие числа, и это упростит вычисление потерь модели:",$a,vs,qa,Rs,Ln="Теперь основная функция - это функция токенизации слов с помощью алгоритма Витерби. Как мы уже видели, этот алгоритм вычисляет наилучшую сегментацию каждой подстроки слова, которую мы будем хранить в переменной с именем <code>best_segmentations</code>. Мы будем хранить по одному словарю на каждую позицию в слове (от 0 до его полной длины), с двумя ключами: индекс начала последнего токена в лучшей сегментации и оценка лучшей сегментации. По индексу начала последнего токена мы сможем получить полную сегментацию, когда список будет полностью заполнен.",Ea,_s,On="Пополнение списка осуществляется с помощью двух циклов: основной цикл просматривает каждую начальную позицию, а второй цикл перебирает все подстроки, начинающиеся с этой начальной позиции. Если подстрока есть в словаре, мы получаем новую сегментацию слова до этой конечной позиции, которую сравниваем с той, что хранится в <code>best_segmentations</code>.",xa,Ns,st="После завершения основного цикла мы просто начинаем с конца и переходим от одной начальной позиции к другой, записывая токены по мере продвижения, пока не достигнем начала слова:",va,Ds,Ra,Zs,lt="Мы уже можем опробовать нашу первоначальную модель на некоторых словах:",_a,Ss,Na,Bs,Da,Gs,at="Теперь легко вычислить потери модели на корпусе!",Za,zs,Sa,Hs,nt="Мы можем проверить его работу на имеющейся у нас модели:",Ba,Ws,Ga,Xs,za,Fs,tt="Вычисление оценок для каждого токена также не представляет особой сложности; нам просто нужно вычислить потери для модели, полученные при удалении каждого токена:",Ha,Ys,Wa,Ks,et="Мы можем попробовать это на заданном токене:",Xa,Ps,Fa,Ls,pt="Поскольку <code>&quot;ll&quot;</code> используется в токенизации слова <code>&quot;Hopefully&quot;</code>, и его удаление, вероятно, заставит нас дважды использовать токен <code>&quot;l&quot;</code> вместо этого, мы ожидаем, что он будет иметь положительную потерю. <code>&quot;his&quot;</code> используется только внутри слова <code>&quot;This&quot;</code>, которое токенизируется само по себе, поэтому мы ожидаем, что потери будут нулевыми. Вот результаты:",Ya,Os,Ka,Q,Pa,sl,Mt="Когда этот процесс завершиться, останется только добавить в словарь специальные токены, используемые моделью, а затем итерироваться, пока мы не вычеркнем из словаря достаточно токенов, чтобы достичь желаемого размера:",La,ll,Oa,al,mt="Затем, чтобы токенизировать некоторый текст, нам просто нужно применить предварительную токенизацию, а затем использовать нашу функцию <code>encode_word()</code>:",sn,nl,ln,tl,an,el,it="Вот и все об Unigram! Надеемся, теперь вы чувствуете себя экспертом во всем, что касается токенизаторов. В следующем разделе мы рассмотрим блоки библиотеки 🤗 Tokenizers и покажем, как их можно использовать для создания собственного токенизатора.",nn,pl,tn,yl,en;return q=new Ul({props:{title:"Токенизация Unigram",local:"unigram-tokenization",headingTag:"h1"}}),E=new dt({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/en/chapter6/section7.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter6/section7.ipynb"}]}}),v=new Tt({props:{id:"TGZfZVuF9Yc"}}),f=new ul({props:{$$slots:{default:[It]},$$scope:{ctx:C}}}),R=new Ul({props:{title:"Алгоритм обучения",local:"training-algorithm",headingTag:"h2"}}),B=new J({props:{code:"KCUyMmh1ZyUyMiUyQyUyMDEwKSUyQyUyMCglMjJwdWclMjIlMkMlMjA1KSUyQyUyMCglMjJwdW4lMjIlMkMlMjAxMiklMkMlMjAoJTIyYnVuJTIyJTJDJTIwNCklMkMlMjAoJTIyaHVncyUyMiUyQyUyMDUp",highlighted:'(<span class="hljs-string">&quot;hug&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">10</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">&quot;pug&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">5</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">&quot;pun&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">12</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">&quot;bun&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">4</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">&quot;hugs&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">5</span>)',wrap:!1}}),z=new J({props:{code:"JTVCJTIyaCUyMiUyQyUyMCUyMnUlMjIlMkMlMjAlMjJnJTIyJTJDJTIwJTIyaHUlMjIlMkMlMjAlMjJ1ZyUyMiUyQyUyMCUyMnAlMjIlMkMlMjAlMjJwdSUyMiUyQyUyMCUyMm4lMjIlMkMlMjAlMjJ1biUyMiUyQyUyMCUyMmIlMjIlMkMlMjAlMjJidSUyMiUyQyUyMCUyMnMlMjIlMkMlMjAlMjJodWclMjIlMkMlMjAlMjJncyUyMiUyQyUyMCUyMnVncyUyMiU1RA==",highlighted:'<span class="hljs-selector-attr">[<span class="hljs-string">&quot;h&quot;</span>, <span class="hljs-string">&quot;u&quot;</span>, <span class="hljs-string">&quot;g&quot;</span>, <span class="hljs-string">&quot;hu&quot;</span>, <span class="hljs-string">&quot;ug&quot;</span>, <span class="hljs-string">&quot;p&quot;</span>, <span class="hljs-string">&quot;pu&quot;</span>, <span class="hljs-string">&quot;n&quot;</span>, <span class="hljs-string">&quot;un&quot;</span>, <span class="hljs-string">&quot;b&quot;</span>, <span class="hljs-string">&quot;bu&quot;</span>, <span class="hljs-string">&quot;s&quot;</span>, <span class="hljs-string">&quot;hug&quot;</span>, <span class="hljs-string">&quot;gs&quot;</span>, <span class="hljs-string">&quot;ugs&quot;</span>]</span>',wrap:!1}}),H=new Ul({props:{title:"Алгоритм токенизации",local:"tokenization-algorithm",headingTag:"h2"}}),Y=new J({props:{code:"KCUyMmglMjIlMkMlMjAxNSklMjAoJTIydSUyMiUyQyUyMDM2KSUyMCglMjJnJTIyJTJDJTIwMjApJTIwKCUyMmh1JTIyJTJDJTIwMTUpJTIwKCUyMnVnJTIyJTJDJTIwMjApJTIwKCUyMnAlMjIlMkMlMjAxNyklMjAoJTIycHUlMjIlMkMlMjAxNyklMjAoJTIybiUyMiUyQyUyMDE2KSUwQSglMjJ1biUyMiUyQyUyMDE2KSUyMCglMjJiJTIyJTJDJTIwNCklMjAoJTIyYnUlMjIlMkMlMjA0KSUyMCglMjJzJTIyJTJDJTIwNSklMjAoJTIyaHVnJTIyJTJDJTIwMTUpJTIwKCUyMmdzJTIyJTJDJTIwNSklMjAoJTIydWdzJTIyJTJDJTIwNSk=",highlighted:`(<span class="hljs-string">&quot;h&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">15</span>) (<span class="hljs-string">&quot;u&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">36</span>) (<span class="hljs-string">&quot;g&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">20</span>) (<span class="hljs-string">&quot;hu&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">15</span>) (<span class="hljs-string">&quot;ug&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">20</span>) (<span class="hljs-string">&quot;p&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">17</span>) (<span class="hljs-string">&quot;pu&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">17</span>) (<span class="hljs-string">&quot;n&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">16</span>)
(<span class="hljs-string">&quot;un&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">16</span>) (<span class="hljs-string">&quot;b&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">4</span>) (<span class="hljs-string">&quot;bu&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">4</span>) (<span class="hljs-string">&quot;s&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">5</span>) (<span class="hljs-string">&quot;hug&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">15</span>) (<span class="hljs-string">&quot;gs&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">5</span>) (<span class="hljs-string">&quot;ugs&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">5</span>)`,wrap:!1}}),A=new ul({props:{$$slots:{default:[ft]},$$scope:{ctx:C}}}),O=new J({props:{code:"JTVCJTIycCUyMiUyQyUyMCUyMnUlMjIlMkMlMjAlMjJnJTIyJTVEJTIwJTNBJTIwMC4wMDAzODklMEElNUIlMjJwJTIyJTJDJTIwJTIydWclMjIlNUQlMjAlM0ElMjAwLjAwMjI2NzYlMEElNUIlMjJwdSUyMiUyQyUyMCUyMmclMjIlNUQlMjAlM0ElMjAwLjAwMjI2NzY=",highlighted:`[<span class="hljs-string">&quot;p&quot;</span>, <span class="hljs-string">&quot;u&quot;</span>, <span class="hljs-string">&quot;g&quot;</span>] : 0.000389
[<span class="hljs-string">&quot;p&quot;</span>, <span class="hljs-string">&quot;ug&quot;</span>] : 0.0022676
[<span class="hljs-string">&quot;pu&quot;</span>, <span class="hljs-string">&quot;g&quot;</span>] : 0.0022676`,wrap:!1}}),ts=new J({props:{code:"Q2hhcmFjdGVyJTIwMCUyMCh1KSUzQSUyMCUyMnUlMjIlMjAoc2NvcmUlMjAwLjE3MTQyOSklMEFDaGFyYWN0ZXIlMjAxJTIwKG4pJTNBJTIwJTIydW4lMjIlMjAoc2NvcmUlMjAwLjA3NjE5MSklMEFDaGFyYWN0ZXIlMjAyJTIwKGgpJTNBJTIwJTIydW4lMjIlMjAlMjJoJTIyJTIwKHNjb3JlJTIwMC4wMDU0NDIpJTBBQ2hhcmFjdGVyJTIwMyUyMCh1KSUzQSUyMCUyMnVuJTIyJTIwJTIyaHUlMjIlMjAoc2NvcmUlMjAwLjAwNTQ0MiklMEFDaGFyYWN0ZXIlMjA0JTIwKGcpJTNBJTIwJTIydW4lMjIlMjAlMjJodWclMjIlMjAoc2NvcmUlMjAwLjAwNTQ0Mik=",highlighted:`<span class="hljs-attribute">Character</span> <span class="hljs-number">0</span> (u): <span class="hljs-string">&quot;u&quot;</span> (score <span class="hljs-number">0</span>.<span class="hljs-number">171429</span>)
<span class="hljs-attribute">Character</span> <span class="hljs-number">1</span> (n): <span class="hljs-string">&quot;un&quot;</span> (score <span class="hljs-number">0</span>.<span class="hljs-number">076191</span>)
<span class="hljs-attribute">Character</span> <span class="hljs-number">2</span> (h): <span class="hljs-string">&quot;un&quot;</span> <span class="hljs-string">&quot;h&quot;</span> (score <span class="hljs-number">0</span>.<span class="hljs-number">005442</span>)
<span class="hljs-attribute">Character</span> <span class="hljs-number">3</span> (u): <span class="hljs-string">&quot;un&quot;</span> <span class="hljs-string">&quot;hu&quot;</span> (score <span class="hljs-number">0</span>.<span class="hljs-number">005442</span>)
<span class="hljs-attribute">Character</span> <span class="hljs-number">4</span> (g): <span class="hljs-string">&quot;un&quot;</span> <span class="hljs-string">&quot;hug&quot;</span> (score <span class="hljs-number">0</span>.<span class="hljs-number">005442</span>)`,wrap:!1}}),V=new ul({props:{$$slots:{default:[bt]},$$scope:{ctx:C}}}),ps=new Ul({props:{title:"Назад к обучению",local:"back-to-training",headingTag:"h2"}}),cs=new J({props:{code:"KCUyMmh1ZyUyMiUyQyUyMDEwKSUyQyUyMCglMjJwdWclMjIlMkMlMjA1KSUyQyUyMCglMjJwdW4lMjIlMkMlMjAxMiklMkMlMjAoJTIyYnVuJTIyJTJDJTIwNCklMkMlMjAoJTIyaHVncyUyMiUyQyUyMDUp",highlighted:'(<span class="hljs-string">&quot;hug&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">10</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">&quot;pug&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">5</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">&quot;pun&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">12</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">&quot;bun&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">4</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">&quot;hugs&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-number">5</span>)',wrap:!1}}),rs=new J({props:{code:"JTIyaHVnJTIyJTNBJTIwJTVCJTIyaHVnJTIyJTVEJTIwKHNjb3JlJTIwMC4wNzE0MjgpJTBBJTIycHVnJTIyJTNBJTIwJTVCJTIycHUlMjIlMkMlMjAlMjJnJTIyJTVEJTIwKHNjb3JlJTIwMC4wMDc3MTApJTBBJTIycHVuJTIyJTNBJTIwJTVCJTIycHUlMjIlMkMlMjAlMjJuJTIyJTVEJTIwKHNjb3JlJTIwMC4wMDYxNjgpJTBBJTIyYnVuJTIyJTNBJTIwJTVCJTIyYnUlMjIlMkMlMjAlMjJuJTIyJTVEJTIwKHNjb3JlJTIwMC4wMDE0NTEpJTBBJTIyaHVncyUyMiUzQSUyMCU1QiUyMmh1ZyUyMiUyQyUyMCUyMnMlMjIlNUQlMjAoc2NvcmUlMjAwLjAwMTcwMSk=",highlighted:`<span class="hljs-string">&quot;hug&quot;</span>: [<span class="hljs-string">&quot;hug&quot;</span>] <span class="hljs-comment">(score 0.071428)</span>
<span class="hljs-string">&quot;pug&quot;</span>: [<span class="hljs-string">&quot;pu&quot;</span>, <span class="hljs-string">&quot;g&quot;</span>] <span class="hljs-comment">(score 0.007710)</span>
<span class="hljs-string">&quot;pun&quot;</span>: [<span class="hljs-string">&quot;pu&quot;</span>, <span class="hljs-string">&quot;n&quot;</span>] <span class="hljs-comment">(score 0.006168)</span>
<span class="hljs-string">&quot;bun&quot;</span>: [<span class="hljs-string">&quot;bu&quot;</span>, <span class="hljs-string">&quot;n&quot;</span>] <span class="hljs-comment">(score 0.001451)</span>
<span class="hljs-string">&quot;hugs&quot;</span>: [<span class="hljs-string">&quot;hug&quot;</span>, <span class="hljs-string">&quot;s&quot;</span>] <span class="hljs-comment">(score 0.001701)</span>`,wrap:!1}}),js=new J({props:{code:"MTAlMjAqJTIwKC1sb2coMC4wNzE0MjgpKSUyMCUyQiUyMDUlMjAqJTIwKC1sb2coMC4wMDc3MTApKSUyMCUyQiUyMDEyJTIwKiUyMCgtbG9nKDAuMDA2MTY4KSklMjAlMkIlMjA0JTIwKiUyMCgtbG9nKDAuMDAxNDUxKSklMjAlMkIlMjA1JTIwKiUyMCgtbG9nKDAuMDAxNzAxKSklMjAlM0QlMjAxNjkuOA==",highlighted:'<span class="hljs-attribute">10</span> * (-log(<span class="hljs-number">0</span>.<span class="hljs-number">071428</span>)) + <span class="hljs-number">5</span> * (-log(<span class="hljs-number">0</span>.<span class="hljs-number">007710</span>)) + <span class="hljs-number">12</span> * (-log(<span class="hljs-number">0</span>.<span class="hljs-number">006168</span>)) + <span class="hljs-number">4</span> * (-log(<span class="hljs-number">0</span>.<span class="hljs-number">001451</span>)) + <span class="hljs-number">5</span> * (-log(<span class="hljs-number">0</span>.<span class="hljs-number">001701</span>)) = <span class="hljs-number">169</span>.<span class="hljs-number">8</span>',wrap:!1}}),Js=new J({props:{code:"JTIyaHVnJTIyJTNBJTIwJTVCJTIyaHUlMjIlMkMlMjAlMjJnJTIyJTVEJTIwKHNjb3JlJTIwMC4wMDY4MDIpJTBBJTIyaHVncyUyMiUzQSUyMCU1QiUyMmh1JTIyJTJDJTIwJTIyZ3MlMjIlNUQlMjAoc2NvcmUlMjAwLjAwMTcwMSk=",highlighted:`<span class="hljs-string">&quot;hug&quot;</span>: [<span class="hljs-string">&quot;hu&quot;</span>, <span class="hljs-string">&quot;g&quot;</span>] <span class="hljs-comment">(score 0.006802)</span>
<span class="hljs-string">&quot;hugs&quot;</span>: [<span class="hljs-string">&quot;hu&quot;</span>, <span class="hljs-string">&quot;gs&quot;</span>] <span class="hljs-comment">(score 0.001701)</span>`,wrap:!1}}),ws=new J({props:{code:"LSUyMDEwJTIwKiUyMCgtbG9nKDAuMDcxNDI4KSklMjAlMkIlMjAxMCUyMColMjAoLWxvZygwLjAwNjgwMikpJTIwJTNEJTIwMjMuNQ==",highlighted:'- <span class="hljs-number">10</span> * (<span class="hljs-name">-log</span>(<span class="hljs-number">0.071428</span>)) + <span class="hljs-number">10</span> * (<span class="hljs-name">-log</span>(<span class="hljs-number">0.006802</span>)) = <span class="hljs-number">23.5</span>',wrap:!1}}),Ts=new Ul({props:{title:"Реализация Unigram",local:"implementing-unigram",headingTag:"h2"}}),Is=new J({props:{code:"Y29ycHVzJTIwJTNEJTIwJTVCJTBBJTIwJTIwJTIwJTIwJTIyVGhpcyUyMGlzJTIwdGhlJTIwSHVnZ2luZyUyMEZhY2UlMjBDb3Vyc2UuJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIyVGhpcyUyMGNoYXB0ZXIlMjBpcyUyMGFib3V0JTIwdG9rZW5pemF0aW9uLiUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMlRoaXMlMjBzZWN0aW9uJTIwc2hvd3MlMjBzZXZlcmFsJTIwdG9rZW5pemVyJTIwYWxnb3JpdGhtcy4lMjIlMkMlMEElMjAlMjAlMjAlMjAlMjJIb3BlZnVsbHklMkMlMjB5b3UlMjB3aWxsJTIwYmUlMjBhYmxlJTIwdG8lMjB1bmRlcnN0YW5kJTIwaG93JTIwdGhleSUyMGFyZSUyMHRyYWluZWQlMjBhbmQlMjBnZW5lcmF0ZSUyMHRva2Vucy4lMjIlMkMlMEElNUQ=",highlighted:`corpus = [
<span class="hljs-string">&quot;This is the Hugging Face Course.&quot;</span>,
<span class="hljs-string">&quot;This chapter is about tokenization.&quot;</span>,
<span class="hljs-string">&quot;This section shows several tokenizer algorithms.&quot;</span>,
<span class="hljs-string">&quot;Hopefully, you will be able to understand how they are trained and generate tokens.&quot;</span>,
]`,wrap:!1}}),bs=new J({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMEElMEF0b2tlbml6ZXIlMjAlM0QlMjBBdXRvVG9rZW5pemVyLmZyb21fcHJldHJhaW5lZCglMjJ4bG5ldC1iYXNlLWNhc2VkJTIyKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(<span class="hljs-string">&quot;xlnet-base-cased&quot;</span>)`,wrap:!1}}),Vs=new J({props:{code:"ZnJvbSUyMGNvbGxlY3Rpb25zJTIwaW1wb3J0JTIwZGVmYXVsdGRpY3QlMEElMEF3b3JkX2ZyZXFzJTIwJTNEJTIwZGVmYXVsdGRpY3QoaW50KSUwQWZvciUyMHRleHQlMjBpbiUyMGNvcnB1cyUzQSUwQSUyMCUyMCUyMCUyMHdvcmRzX3dpdGhfb2Zmc2V0cyUyMCUzRCUyMHRva2VuaXplci5iYWNrZW5kX3Rva2VuaXplci5wcmVfdG9rZW5pemVyLnByZV90b2tlbml6ZV9zdHIodGV4dCklMEElMjAlMjAlMjAlMjBuZXdfd29yZHMlMjAlM0QlMjAlNUJ3b3JkJTIwZm9yJTIwd29yZCUyQyUyMG9mZnNldCUyMGluJTIwd29yZHNfd2l0aF9vZmZzZXRzJTVEJTBBJTIwJTIwJTIwJTIwZm9yJTIwd29yZCUyMGluJTIwbmV3X3dvcmRzJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwd29yZF9mcmVxcyU1QndvcmQlNUQlMjAlMkIlM0QlMjAxJTBBJTBBd29yZF9mcmVxcw==",highlighted:`<span class="hljs-keyword">from</span> collections <span class="hljs-keyword">import</span> defaultdict
word_freqs = defaultdict(<span class="hljs-built_in">int</span>)
<span class="hljs-keyword">for</span> text <span class="hljs-keyword">in</span> corpus:
words_with_offsets = tokenizer.backend_tokenizer.pre_tokenizer.pre_tokenize_str(text)
new_words = [word <span class="hljs-keyword">for</span> word, offset <span class="hljs-keyword">in</span> words_with_offsets]
<span class="hljs-keyword">for</span> word <span class="hljs-keyword">in</span> new_words:
word_freqs[word] += <span class="hljs-number">1</span>
word_freqs`,wrap:!1}}),Qs=new J({props:{code:"Y2hhcl9mcmVxcyUyMCUzRCUyMGRlZmF1bHRkaWN0KGludCklMEFzdWJ3b3Jkc19mcmVxcyUyMCUzRCUyMGRlZmF1bHRkaWN0KGludCklMEFmb3IlMjB3b3JkJTJDJTIwZnJlcSUyMGluJTIwd29yZF9mcmVxcy5pdGVtcygpJTNBJTBBJTIwJTIwJTIwJTIwZm9yJTIwaSUyMGluJTIwcmFuZ2UobGVuKHdvcmQpKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNoYXJfZnJlcXMlNUJ3b3JkJTVCaSU1RCU1RCUyMCUyQiUzRCUyMGZyZXElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjAlRDAlOUYlRDAlQjUlRDElODAlRDAlQjUlRDAlQjElRDAlQjglRDElODAlRDAlQjAlRDAlQjUlRDAlQkMlMjAlRDAlQkYlRDAlQkUlRDAlQjQlRDElODElRDAlQkIlRDAlQkUlRDAlQjIlRDAlQjAlMjAlRDAlQjQlRDAlQkIlRDAlQjglRDAlQkQlRDAlQkUlRDAlQjklMjAlRDAlQkQlRDAlQjUlMjAlRDAlQkMlRDAlQjUlRDAlQkQlRDAlQjUlRDAlQjUlMjAyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZm9yJTIwaiUyMGluJTIwcmFuZ2UoaSUyMCUyQiUyMDIlMkMlMjBsZW4od29yZCklMjAlMkIlMjAxKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1YndvcmRzX2ZyZXFzJTVCd29yZCU1QmklM0FqJTVEJTVEJTIwJTJCJTNEJTIwZnJlcSUwQSUwQSUyMyUyMCVEMCVBMSVEMCVCRSVEMSU4MCVEMSU4MiVEMCVCOCVEMSU4MCVEMCVCRSVEMCVCMiVEMCVCQSVEMCVCMCUyMCVEMCVCRiVEMCVCRSVEMCVCNCVEMSU4MSVEMCVCQiVEMCVCRSVEMCVCMiUyMCVEMCVCRiVEMCVCRSUyMCVEMSU4NyVEMCVCMCVEMSU4MSVEMSU4MiVEMCVCRSVEMSU4MiVEMCVCNSUwQXNvcnRlZF9zdWJ3b3JkcyUyMCUzRCUyMHNvcnRlZChzdWJ3b3Jkc19mcmVxcy5pdGVtcygpJTJDJTIwa2V5JTNEbGFtYmRhJTIweCUzQSUyMHglNUIxJTVEJTJDJTIwcmV2ZXJzZSUzRFRydWUpJTBBc29ydGVkX3N1YndvcmRzJTVCJTNBMTAlNUQ=",highlighted:`char_freqs = defaultdict(<span class="hljs-built_in">int</span>)
subwords_freqs = defaultdict(<span class="hljs-built_in">int</span>)
<span class="hljs-keyword">for</span> word, freq <span class="hljs-keyword">in</span> word_freqs.items():
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(word)):
char_freqs[word[i]] += freq
<span class="hljs-comment"># Перебираем подслова длиной не менее 2</span>
<span class="hljs-keyword">for</span> j <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(i + <span class="hljs-number">2</span>, <span class="hljs-built_in">len</span>(word) + <span class="hljs-number">1</span>):
subwords_freqs[word[i:j]] += freq
<span class="hljs-comment"># Сортировка подслов по частоте</span>
sorted_subwords = <span class="hljs-built_in">sorted</span>(subwords_freqs.items(), key=<span class="hljs-keyword">lambda</span> x: x[<span class="hljs-number">1</span>], reverse=<span class="hljs-literal">True</span>)
sorted_subwords[:<span class="hljs-number">10</span>]`,wrap:!1}}),$s=new J({props:{code:"JTVCKCclRTIlOTYlODF0JyUyQyUyMDcpJTJDJTIwKCdpcyclMkMlMjA1KSUyQyUyMCgnZXInJTJDJTIwNSklMkMlMjAoJyVFMiU5NiU4MWEnJTJDJTIwNSklMkMlMjAoJyVFMiU5NiU4MXRvJyUyQyUyMDQpJTJDJTIwKCd0byclMkMlMjA0KSUyQyUyMCgnZW4nJTJDJTIwNCklMkMlMjAoJyVFMiU5NiU4MVQnJTJDJTIwMyklMkMlMjAoJyVFMiU5NiU4MVRoJyUyQyUyMDMpJTJDJTIwKCclRTIlOTYlODFUaGknJTJDJTIwMyklNUQ=",highlighted:'[(<span class="hljs-string">&#x27;▁t&#x27;</span>, <span class="hljs-number">7</span>), (<span class="hljs-string">&#x27;is&#x27;</span>, <span class="hljs-number">5</span>), (<span class="hljs-string">&#x27;er&#x27;</span>, <span class="hljs-number">5</span>), (<span class="hljs-string">&#x27;▁a&#x27;</span>, <span class="hljs-number">5</span>), (<span class="hljs-string">&#x27;▁to&#x27;</span>, <span class="hljs-number">4</span>), (<span class="hljs-string">&#x27;to&#x27;</span>, <span class="hljs-number">4</span>), (<span class="hljs-string">&#x27;en&#x27;</span>, <span class="hljs-number">4</span>), (<span class="hljs-string">&#x27;▁T&#x27;</span>, <span class="hljs-number">3</span>), (<span class="hljs-string">&#x27;▁Th&#x27;</span>, <span class="hljs-number">3</span>), (<span class="hljs-string">&#x27;▁Thi&#x27;</span>, <span class="hljs-number">3</span>)]',wrap:!1}}),Es=new J({props:{code:"dG9rZW5fZnJlcXMlMjAlM0QlMjBsaXN0KGNoYXJfZnJlcXMuaXRlbXMoKSklMjAlMkIlMjBzb3J0ZWRfc3Vid29yZHMlNUIlM0ElMjAzMDAlMjAtJTIwbGVuKGNoYXJfZnJlcXMpJTVEJTBBdG9rZW5fZnJlcXMlMjAlM0QlMjAlN0J0b2tlbiUzQSUyMGZyZXElMjBmb3IlMjB0b2tlbiUyQyUyMGZyZXElMjBpbiUyMHRva2VuX2ZyZXFzJTdE",highlighted:`token_freqs = <span class="hljs-built_in">list</span>(char_freqs.items()) + sorted_subwords[: <span class="hljs-number">300</span> - <span class="hljs-built_in">len</span>(char_freqs)]
token_freqs = {token: freq <span class="hljs-keyword">for</span> token, freq <span class="hljs-keyword">in</span> token_freqs}`,wrap:!1}}),k=new ul({props:{$$slots:{default:[At]},$$scope:{ctx:C}}}),vs=new J({props:{code:"ZnJvbSUyMG1hdGglMjBpbXBvcnQlMjBsb2clMEElMEF0b3RhbF9zdW0lMjAlM0QlMjBzdW0oJTVCZnJlcSUyMGZvciUyMHRva2VuJTJDJTIwZnJlcSUyMGluJTIwdG9rZW5fZnJlcXMuaXRlbXMoKSU1RCklMEFtb2RlbCUyMCUzRCUyMCU3QnRva2VuJTNBJTIwLWxvZyhmcmVxJTIwJTJGJTIwdG90YWxfc3VtKSUyMGZvciUyMHRva2VuJTJDJTIwZnJlcSUyMGluJTIwdG9rZW5fZnJlcXMuaXRlbXMoKSU3RA==",highlighted:`<span class="hljs-keyword">from</span> math <span class="hljs-keyword">import</span> log
total_sum = <span class="hljs-built_in">sum</span>([freq <span class="hljs-keyword">for</span> token, freq <span class="hljs-keyword">in</span> token_freqs.items()])
model = {token: -log(freq / total_sum) <span class="hljs-keyword">for</span> token, freq <span class="hljs-keyword">in</span> token_freqs.items()}`,wrap:!1}}),Ds=new J({props:{code:"ZGVmJTIwZW5jb2RlX3dvcmQod29yZCUyQyUyMG1vZGVsKSUzQSUwQSUyMCUyMCUyMCUyMGJlc3Rfc2VnbWVudGF0aW9ucyUyMCUzRCUyMCU1QiU3QiUyMnN0YXJ0JTIyJTNBJTIwMCUyQyUyMCUyMnNjb3JlJTIyJTNBJTIwMSU3RCU1RCUyMCUyQiUyMCU1QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUyMnN0YXJ0JTIyJTNBJTIwTm9uZSUyQyUyMCUyMnNjb3JlJTIyJTNBJTIwTm9uZSU3RCUyMGZvciUyMF8lMjBpbiUyMHJhbmdlKGxlbih3b3JkKSklMEElMjAlMjAlMjAlMjAlNUQlMEElMjAlMjAlMjAlMjBmb3IlMjBzdGFydF9pZHglMjBpbiUyMHJhbmdlKGxlbih3b3JkKSklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjAlRDAlQUQlRDElODIlRDAlQkUlMjAlRDAlQjQlRDAlQkUlRDAlQkIlRDAlQjYlRDAlQkQlRDAlQkUlMjAlRDAlQjElRDElOEIlRDElODIlRDElOEMlMjAlRDAlQkYlRDElODAlRDAlQjAlRDAlQjIlRDAlQjglRDAlQkIlRDElOEMlRDAlQkQlRDAlQkUlMjAlRDAlQjclRDAlQjAlRDAlQkYlRDAlQkUlRDAlQkIlRDAlQkQlRDAlQjUlRDAlQkQlRDAlQkUlMjAlRDAlQkYlRDElODAlRDAlQjUlRDAlQjQlRDElOEIlRDAlQjQlRDElODMlRDElODklRDAlQjglRDAlQkMlRDAlQjglMjAlRDElODglRDAlQjAlRDAlQjMlRDAlQjAlRDAlQkMlRDAlQjglMjAlRDElODYlRDAlQjglRDAlQkElRDAlQkIlRDAlQjAlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBiZXN0X3Njb3JlX2F0X3N0YXJ0JTIwJTNEJTIwYmVzdF9zZWdtZW50YXRpb25zJTVCc3RhcnRfaWR4JTVEJTVCJTIyc2NvcmUlMjIlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmb3IlMjBlbmRfaWR4JTIwaW4lMjByYW5nZShzdGFydF9pZHglMjAlMkIlMjAxJTJDJTIwbGVuKHdvcmQpJTIwJTJCJTIwMSklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB0b2tlbiUyMCUzRCUyMHdvcmQlNUJzdGFydF9pZHglM0FlbmRfaWR4JTVEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjB0b2tlbiUyMGluJTIwbW9kZWwlMjBhbmQlMjBiZXN0X3Njb3JlX2F0X3N0YXJ0JTIwaXMlMjBub3QlMjBOb25lJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2NvcmUlMjAlM0QlMjBtb2RlbCU1QnRva2VuJTVEJTIwJTJCJTIwYmVzdF9zY29yZV9hdF9zdGFydCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMCVEMCU5NSVEMSU4MSVEMCVCQiVEMCVCOCUyMCVEMCVCQyVEMSU4QiUyMCVEMCVCRCVEMCVCMCVEMSU4OCVEMCVCQiVEMCVCOCUyMCVEMCVCQiVEMSU4MyVEMSU4NyVEMSU4OCVEMSU4MyVEMSU4RSUyMCVEMSU4MSVEMCVCNSVEMCVCMyVEMCVCQyVEMCVCNSVEMCVCRCVEMSU4MiVEMCVCMCVEMSU4NiVEMCVCOCVEMSU4RSUyQyUyMCVEMCVCNyVEMCVCMCVEMCVCQSVEMCVCMCVEMCVCRCVEMSU4NyVEMCVCOCVEMCVCMiVEMCVCMCVEMSU4RSVEMSU4OSVEMSU4MyVEMSU4RSVEMSU4MSVEMSU4RiUyMCVEMCVCRCVEMCVCMCUyMGVuZF9pZHglMkMlMjAlRDAlQkMlRDElOEIlMjAlRDAlQkUlRDAlQjElRDAlQkQlRDAlQkUlRDAlQjIlRDAlQkIlRDElOEYlRDAlQjUlRDAlQkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMCglMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBiZXN0X3NlZ21lbnRhdGlvbnMlNUJlbmRfaWR4JTVEJTVCJTIyc2NvcmUlMjIlNUQlMjBpcyUyME5vbmUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvciUyMGJlc3Rfc2VnbWVudGF0aW9ucyU1QmVuZF9pZHglNUQlNUIlMjJzY29yZSUyMiU1RCUyMCUzRSUyMHNjb3JlJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJlc3Rfc2VnbWVudGF0aW9ucyU1QmVuZF9pZHglNUQlMjAlM0QlMjAlN0IlMjJzdGFydCUyMiUzQSUyMHN0YXJ0X2lkeCUyQyUyMCUyMnNjb3JlJTIyJTNBJTIwc2NvcmUlN0QlMEElMEElMjAlMjAlMjAlMjBzZWdtZW50YXRpb24lMjAlM0QlMjBiZXN0X3NlZ21lbnRhdGlvbnMlNUItMSU1RCUwQSUyMCUyMCUyMCUyMGlmJTIwc2VnbWVudGF0aW9uJTVCJTIyc2NvcmUlMjIlNUQlMjBpcyUyME5vbmUlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjAlRDAlOUMlRDElOEIlMjAlRDAlQkQlRDAlQjUlMjAlRDAlQkQlRDAlQjAlRDElODglRDAlQkIlRDAlQjglMjAlRDElODIlRDAlQkUlRDAlQkElRDAlQjUlRDAlQkQlRDAlQjglRDAlQjclRDAlQjAlRDElODYlRDAlQjglRDElOEUlMjAlRDElODElRDAlQkIlRDAlQkUlRDAlQjIlRDAlQjAlMjAtJTNFJTIwJUQwJUIyJUQwJUJFJUQwJUI3JUQwJUIyJUQxJTgwJUQwJUIwJUQxJTg5JUQwJUIwJUQwJUI1JUQwJUJDJTIwdW5rbm93biUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJldHVybiUyMCU1QiUyMiUzQ3VuayUzRSUyMiU1RCUyQyUyME5vbmUlMEElMEElMjAlMjAlMjAlMjBzY29yZSUyMCUzRCUyMHNlZ21lbnRhdGlvbiU1QiUyMnNjb3JlJTIyJTVEJTBBJTIwJTIwJTIwJTIwc3RhcnQlMjAlM0QlMjBzZWdtZW50YXRpb24lNUIlMjJzdGFydCUyMiU1RCUwQSUyMCUyMCUyMCUyMGVuZCUyMCUzRCUyMGxlbih3b3JkKSUwQSUyMCUyMCUyMCUyMHRva2VucyUyMCUzRCUyMCU1QiU1RCUwQSUyMCUyMCUyMCUyMHdoaWxlJTIwc3RhcnQlMjAhJTNEJTIwMCUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRva2Vucy5pbnNlcnQoMCUyQyUyMHdvcmQlNUJzdGFydCUzQWVuZCU1RCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBuZXh0X3N0YXJ0JTIwJTNEJTIwYmVzdF9zZWdtZW50YXRpb25zJTVCc3RhcnQlNUQlNUIlMjJzdGFydCUyMiU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGVuZCUyMCUzRCUyMHN0YXJ0JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3RhcnQlMjAlM0QlMjBuZXh0X3N0YXJ0JTBBJTIwJTIwJTIwJTIwdG9rZW5zLmluc2VydCgwJTJDJTIwd29yZCU1QnN0YXJ0JTNBZW5kJTVEKSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMHRva2VucyUyQyUyMHNjb3Jl",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">encode_word</span>(<span class="hljs-params">word, model</span>):
best_segmentations = [{<span class="hljs-string">&quot;start&quot;</span>: <span class="hljs-number">0</span>, <span class="hljs-string">&quot;score&quot;</span>: <span class="hljs-number">1</span>}] + [
{<span class="hljs-string">&quot;start&quot;</span>: <span class="hljs-literal">None</span>, <span class="hljs-string">&quot;score&quot;</span>: <span class="hljs-literal">None</span>} <span class="hljs-keyword">for</span> _ <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(word))
]
<span class="hljs-keyword">for</span> start_idx <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(word)):
<span class="hljs-comment"># Это должно быть правильно заполнено предыдущими шагами цикла</span>
best_score_at_start = best_segmentations[start_idx][<span class="hljs-string">&quot;score&quot;</span>]
<span class="hljs-keyword">for</span> end_idx <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(start_idx + <span class="hljs-number">1</span>, <span class="hljs-built_in">len</span>(word) + <span class="hljs-number">1</span>):
token = word[start_idx:end_idx]
<span class="hljs-keyword">if</span> token <span class="hljs-keyword">in</span> model <span class="hljs-keyword">and</span> best_score_at_start <span class="hljs-keyword">is</span> <span class="hljs-keyword">not</span> <span class="hljs-literal">None</span>:
score = model[token] + best_score_at_start
<span class="hljs-comment"># Если мы нашли лучшую сегментацию, заканчивающуюся на end_idx, мы обновляем</span>
<span class="hljs-keyword">if</span> (
best_segmentations[end_idx][<span class="hljs-string">&quot;score&quot;</span>] <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">or</span> best_segmentations[end_idx][<span class="hljs-string">&quot;score&quot;</span>] &gt; score
):
best_segmentations[end_idx] = {<span class="hljs-string">&quot;start&quot;</span>: start_idx, <span class="hljs-string">&quot;score&quot;</span>: score}
segmentation = best_segmentations[-<span class="hljs-number">1</span>]
<span class="hljs-keyword">if</span> segmentation[<span class="hljs-string">&quot;score&quot;</span>] <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>:
<span class="hljs-comment"># Мы не нашли токенизацию слова -&gt; возвращаем unknown</span>
<span class="hljs-keyword">return</span> [<span class="hljs-string">&quot;&lt;unk&gt;&quot;</span>], <span class="hljs-literal">None</span>
score = segmentation[<span class="hljs-string">&quot;score&quot;</span>]
start = segmentation[<span class="hljs-string">&quot;start&quot;</span>]
end = <span class="hljs-built_in">len</span>(word)
tokens = []
<span class="hljs-keyword">while</span> start != <span class="hljs-number">0</span>:
tokens.insert(<span class="hljs-number">0</span>, word[start:end])
next_start = best_segmentations[start][<span class="hljs-string">&quot;start&quot;</span>]
end = start
start = next_start
tokens.insert(<span class="hljs-number">0</span>, word[start:end])
<span class="hljs-keyword">return</span> tokens, score`,wrap:!1}}),Ss=new J({props:{code:"cHJpbnQoZW5jb2RlX3dvcmQoJTIySG9wZWZ1bGx5JTIyJTJDJTIwbW9kZWwpKSUwQXByaW50KGVuY29kZV93b3JkKCUyMlRoaXMlMjIlMkMlMjBtb2RlbCkp",highlighted:`<span class="hljs-built_in">print</span>(encode_word(<span class="hljs-string">&quot;Hopefully&quot;</span>, model))
<span class="hljs-built_in">print</span>(encode_word(<span class="hljs-string">&quot;This&quot;</span>, model))`,wrap:!1}}),Bs=new J({props:{code:"KCU1QidIJyUyQyUyMCdvJyUyQyUyMCdwJyUyQyUyMCdlJyUyQyUyMCdmJyUyQyUyMCd1JyUyQyUyMCdsbCclMkMlMjAneSclNUQlMkMlMjA0MS41MTU3NDk0NjAxNDAyKSUwQSglNUInVGhpcyclNUQlMkMlMjA2LjI4ODI2NzAzMDY5NDUzNSk=",highlighted:`([<span class="hljs-string">&#x27;H&#x27;</span>, <span class="hljs-string">&#x27;o&#x27;</span>, <span class="hljs-string">&#x27;p&#x27;</span>, <span class="hljs-string">&#x27;e&#x27;</span>, <span class="hljs-string">&#x27;f&#x27;</span>, <span class="hljs-string">&#x27;u&#x27;</span>, <span class="hljs-string">&#x27;ll&#x27;</span>, <span class="hljs-string">&#x27;y&#x27;</span>], <span class="hljs-number">41.5157494601402</span>)
([<span class="hljs-string">&#x27;This&#x27;</span>], <span class="hljs-number">6.288267030694535</span>)`,wrap:!1}}),zs=new J({props:{code:"ZGVmJTIwY29tcHV0ZV9sb3NzKG1vZGVsKSUzQSUwQSUyMCUyMCUyMCUyMGxvc3MlMjAlM0QlMjAwJTBBJTIwJTIwJTIwJTIwZm9yJTIwd29yZCUyQyUyMGZyZXElMjBpbiUyMHdvcmRfZnJlcXMuaXRlbXMoKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMF8lMkMlMjB3b3JkX2xvc3MlMjAlM0QlMjBlbmNvZGVfd29yZCh3b3JkJTJDJTIwbW9kZWwpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbG9zcyUyMCUyQiUzRCUyMGZyZXElMjAqJTIwd29yZF9sb3NzJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwbG9zcw==",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">compute_loss</span>(<span class="hljs-params">model</span>):
loss = <span class="hljs-number">0</span>
<span class="hljs-keyword">for</span> word, freq <span class="hljs-keyword">in</span> word_freqs.items():
_, word_loss = encode_word(word, model)
loss += freq * word_loss
<span class="hljs-keyword">return</span> loss`,wrap:!1}}),Ws=new J({props:{code:"Y29tcHV0ZV9sb3NzKG1vZGVsKQ==",highlighted:"compute_loss(model)",wrap:!1}}),Xs=new J({props:{code:"NDEzLjEwMzc3NjQyOTQwODc1",highlighted:'<span class="hljs-number">413.10377642940875</span>',wrap:!1}}),Ys=new J({props:{code:"aW1wb3J0JTIwY29weSUwQSUwQSUwQWRlZiUyMGNvbXB1dGVfc2NvcmVzKG1vZGVsKSUzQSUwQSUyMCUyMCUyMCUyMHNjb3JlcyUyMCUzRCUyMCU3QiU3RCUwQSUyMCUyMCUyMCUyMG1vZGVsX2xvc3MlMjAlM0QlMjBjb21wdXRlX2xvc3MobW9kZWwpJTBBJTIwJTIwJTIwJTIwZm9yJTIwdG9rZW4lMkMlMjBzY29yZSUyMGluJTIwbW9kZWwuaXRlbXMoKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMCVEMCU5QyVEMSU4QiUyMCVEMCVCMiVEMSU4MSVEMCVCNSVEMCVCMyVEMCVCNCVEMCVCMCUyMCVEMSU4NSVEMSU4MCVEMCVCMCVEMCVCRCVEMCVCOCVEMCVCQyUyMCVEMSU4MiVEMCVCRSVEMCVCQSVEMCVCNSVEMCVCRCVEMSU4QiUyMCVEMCVCNCVEMCVCQiVEMCVCOCVEMCVCRCVEMCVCRSVEMCVCOSUyMDElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMGxlbih0b2tlbiklMjAlM0QlM0QlMjAxJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY29udGludWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBtb2RlbF93aXRob3V0X3Rva2VuJTIwJTNEJTIwY29weS5kZWVwY29weShtb2RlbCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBfJTIwJTNEJTIwbW9kZWxfd2l0aG91dF90b2tlbi5wb3AodG9rZW4pJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2NvcmVzJTVCdG9rZW4lNUQlMjAlM0QlMjBjb21wdXRlX2xvc3MobW9kZWxfd2l0aG91dF90b2tlbiklMjAtJTIwbW9kZWxfbG9zcyUwQSUyMCUyMCUyMCUyMHJldHVybiUyMHNjb3Jlcw==",highlighted:`<span class="hljs-keyword">import</span> copy
<span class="hljs-keyword">def</span> <span class="hljs-title function_">compute_scores</span>(<span class="hljs-params">model</span>):
scores = {}
model_loss = compute_loss(model)
<span class="hljs-keyword">for</span> token, score <span class="hljs-keyword">in</span> model.items():
<span class="hljs-comment"># Мы всегда храним токены длиной 1</span>
<span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(token) == <span class="hljs-number">1</span>:
<span class="hljs-keyword">continue</span>
model_without_token = copy.deepcopy(model)
_ = model_without_token.pop(token)
scores[token] = compute_loss(model_without_token) - model_loss
<span class="hljs-keyword">return</span> scores`,wrap:!1}}),Ps=new J({props:{code:"c2NvcmVzJTIwJTNEJTIwY29tcHV0ZV9zY29yZXMobW9kZWwpJTBBcHJpbnQoc2NvcmVzJTVCJTIybGwlMjIlNUQpJTBBcHJpbnQoc2NvcmVzJTVCJTIyaGlzJTIyJTVEKQ==",highlighted:`scores = compute_scores(model)
<span class="hljs-built_in">print</span>(scores[<span class="hljs-string">&quot;ll&quot;</span>])
<span class="hljs-built_in">print</span>(scores[<span class="hljs-string">&quot;his&quot;</span>])`,wrap:!1}}),Os=new J({props:{code:"Ni4zNzY0MTI0MDM2MjM4NzQlMEEwLjA=",highlighted:`<span class="hljs-number">6.376412403623874</span>
<span class="hljs-number">0.0</span>`,wrap:!1}}),Q=new ul({props:{$$slots:{default:[Vt]},$$scope:{ctx:C}}}),ll=new J({props:{code:"cGVyY2VudF90b19yZW1vdmUlMjAlM0QlMjAwLjElMEF3aGlsZSUyMGxlbihtb2RlbCklMjAlM0UlMjAxMDAlM0ElMEElMjAlMjAlMjAlMjBzY29yZXMlMjAlM0QlMjBjb21wdXRlX3Njb3Jlcyhtb2RlbCklMEElMjAlMjAlMjAlMjBzb3J0ZWRfc2NvcmVzJTIwJTNEJTIwc29ydGVkKHNjb3Jlcy5pdGVtcygpJTJDJTIwa2V5JTNEbGFtYmRhJTIweCUzQSUyMHglNUIxJTVEKSUwQSUyMCUyMCUyMCUyMCUyMyUyMCVEMCVBMyVEMCVCNCVEMCVCMCVEMCVCQiVEMCVCOCVEMSU4MiVEMCVCNSUyMCVEMSU4MiVEMCVCRSVEMCVCQSVEMCVCNSVEMCVCRCVEMSU4QiUyMHBlcmNlbnRfdG9fcmVtb3ZlJTIwJUQxJTgxJTIwJUQwJUJEJUQwJUIwJUQwJUI4JUQwJUJDJUQwJUI1JUQwJUJEJUQxJThDJUQxJTg4JUQwJUI4JUQwJUJDJUQwJUI4JTIwJUQwJUJFJUQxJTg2JUQwJUI1JUQwJUJEJUQwJUJBJUQwJUIwJUQwJUJDJUQwJUI4JTBBJTIwJTIwJTIwJTIwZm9yJTIwaSUyMGluJTIwcmFuZ2UoaW50KGxlbihtb2RlbCklMjAqJTIwcGVyY2VudF90b19yZW1vdmUpKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMF8lMjAlM0QlMjB0b2tlbl9mcmVxcy5wb3Aoc29ydGVkX3Njb3JlcyU1QmklNUQlNUIwJTVEKSUwQSUwQSUyMCUyMCUyMCUyMHRvdGFsX3N1bSUyMCUzRCUyMHN1bSglNUJmcmVxJTIwZm9yJTIwdG9rZW4lMkMlMjBmcmVxJTIwaW4lMjB0b2tlbl9mcmVxcy5pdGVtcygpJTVEKSUwQSUyMCUyMCUyMCUyMG1vZGVsJTIwJTNEJTIwJTdCdG9rZW4lM0ElMjAtbG9nKGZyZXElMjAlMkYlMjB0b3RhbF9zdW0pJTIwZm9yJTIwdG9rZW4lMkMlMjBmcmVxJTIwaW4lMjB0b2tlbl9mcmVxcy5pdGVtcygpJTdE",highlighted:`percent_to_remove = <span class="hljs-number">0.1</span>
<span class="hljs-keyword">while</span> <span class="hljs-built_in">len</span>(model) &gt; <span class="hljs-number">100</span>:
scores = compute_scores(model)
sorted_scores = <span class="hljs-built_in">sorted</span>(scores.items(), key=<span class="hljs-keyword">lambda</span> x: x[<span class="hljs-number">1</span>])
<span class="hljs-comment"># Удалите токены percent_to_remove с наименьшими оценками</span>
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">int</span>(<span class="hljs-built_in">len</span>(model) * percent_to_remove)):
_ = token_freqs.pop(sorted_scores[i][<span class="hljs-number">0</span>])
total_sum = <span class="hljs-built_in">sum</span>([freq <span class="hljs-keyword">for</span> token, freq <span class="hljs-keyword">in</span> token_freqs.items()])
model = {token: -log(freq / total_sum) <span class="hljs-keyword">for</span> token, freq <span class="hljs-keyword">in</span> token_freqs.items()}`,wrap:!1}}),nl=new J({props:{code:"ZGVmJTIwdG9rZW5pemUodGV4dCUyQyUyMG1vZGVsKSUzQSUwQSUyMCUyMCUyMCUyMHdvcmRzX3dpdGhfb2Zmc2V0cyUyMCUzRCUyMHRva2VuaXplci5iYWNrZW5kX3Rva2VuaXplci5wcmVfdG9rZW5pemVyLnByZV90b2tlbml6ZV9zdHIodGV4dCklMEElMjAlMjAlMjAlMjBwcmVfdG9rZW5pemVkX3RleHQlMjAlM0QlMjAlNUJ3b3JkJTIwZm9yJTIwd29yZCUyQyUyMG9mZnNldCUyMGluJTIwd29yZHNfd2l0aF9vZmZzZXRzJTVEJTBBJTIwJTIwJTIwJTIwZW5jb2RlZF93b3JkcyUyMCUzRCUyMCU1QmVuY29kZV93b3JkKHdvcmQlMkMlMjBtb2RlbCklNUIwJTVEJTIwZm9yJTIwd29yZCUyMGluJTIwcHJlX3Rva2VuaXplZF90ZXh0JTVEJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwc3VtKGVuY29kZWRfd29yZHMlMkMlMjAlNUIlNUQpJTBBJTBBJTBBdG9rZW5pemUoJTIyVGhpcyUyMGlzJTIwdGhlJTIwSHVnZ2luZyUyMEZhY2UlMjBjb3Vyc2UuJTIyJTJDJTIwbW9kZWwp",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">tokenize</span>(<span class="hljs-params">text, model</span>):
words_with_offsets = tokenizer.backend_tokenizer.pre_tokenizer.pre_tokenize_str(text)
pre_tokenized_text = [word <span class="hljs-keyword">for</span> word, offset <span class="hljs-keyword">in</span> words_with_offsets]
encoded_words = [encode_word(word, model)[<span class="hljs-number">0</span>] <span class="hljs-keyword">for</span> word <span class="hljs-keyword">in</span> pre_tokenized_text]
<span class="hljs-keyword">return</span> <span class="hljs-built_in">sum</span>(encoded_words, [])
tokenize(<span class="hljs-string">&quot;This is the Hugging Face course.&quot;</span>, model)`,wrap:!1}}),tl=new J({props:{code:"JTVCJyVFMiU5NiU4MVRoaXMnJTJDJTIwJyVFMiU5NiU4MWlzJyUyQyUyMCclRTIlOTYlODF0aGUnJTJDJTIwJyVFMiU5NiU4MUh1Z2dpbmcnJTJDJTIwJyVFMiU5NiU4MUZhY2UnJTJDJTIwJyVFMiU5NiU4MSclMkMlMjAnYyclMkMlMjAnb3UnJTJDJTIwJ3InJTJDJTIwJ3MnJTJDJTIwJ2UnJTJDJTIwJy4nJTVE",highlighted:'[<span class="hljs-string">&#x27;▁This&#x27;</span>, <span class="hljs-string">&#x27;▁is&#x27;</span>, <span class="hljs-string">&#x27;▁the&#x27;</span>, <span class="hljs-string">&#x27;▁Hugging&#x27;</span>, <span class="hljs-string">&#x27;▁Face&#x27;</span>, <span class="hljs-string">&#x27;▁&#x27;</span>, <span class="hljs-string">&#x27;c&#x27;</span>, <span class="hljs-string">&#x27;ou&#x27;</span>, <span class="hljs-string">&#x27;r&#x27;</span>, <span class="hljs-string">&#x27;s&#x27;</span>, <span class="hljs-string">&#x27;e&#x27;</span>, <span class="hljs-string">&#x27;.&#x27;</span>]',wrap:!1}}),pl=new gt({props:{source:"https://github.com/huggingface/course/blob/main/chapters/ru/chapter6/7.mdx"}}),{c(){i=p("meta"),h=t(),U=p("p"),w=t(),c(q.$$.fragment),hl=t(),c(E.$$.fragment),wl=t(),x=p("p"),x.textContent=un,Cl=t(),c(v.$$.fragment),Tl=t(),c(f.$$.fragment),dl=t(),c(R.$$.fragment),gl=t(),_=p("p"),_.textContent=Un,Il=t(),N=p("p"),N.textContent=Jn,fl=t(),b=p("p"),pn=ml("Это очень дорогостоящая операция, поэтому мы удаляем не просто один символ, связанный с наименьшим увеличением потерь, а"),bl=new yn(!1),Al=ml(" (\\(p\\) - гиперпараметр, которым вы можете управлять, обычно 10 или 20) процентов символов, связанных с наименьшим увеличением потерь. Этот процесс повторяется до тех пор, пока словарь не достигнет желаемого размера."),Vl=t(),D=p("p"),D.textContent=hn,kl=t(),Z=p("p"),Z.textContent=wn,Ql=t(),S=p("p"),S.textContent=Cn,$l=t(),c(B.$$.fragment),ql=t(),G=p("p"),G.textContent=Tn,El=t(),c(z.$$.fragment),xl=t(),c(H.$$.fragment),vl=t(),W=p("p"),W.textContent=dn,Rl=t(),X=p("p"),X.innerHTML=gn,_l=t(),F=p("p"),F.textContent=In,Nl=t(),c(Y.$$.fragment),Dl=t(),K=p("p"),K.innerHTML=fn,Zl=t(),c(A.$$.fragment),Sl=t(),T=p("p"),Mn=ml("Теперь для токенизации данного слова мы рассматриваем все возможные сегментации на токены и вычисляем вероятность каждого из них в соответствии с моделью Unigram. Поскольку все токены считаются независимыми, эта вероятность равна произведению вероятностей появления каждого токена. Например, при токенизации "),cl=p("code"),cl.textContent=bn,mn=ml(" слова "),ol=p("code"),ol.textContent=An,cn=ml(` вероятность составляет:
`),Bl=new yn(!1),Gl=t(),I=p("p"),on=ml("Для сравнения, токен "),rl=p("code"),rl.textContent=Vn,rn=ml(` имеет вероятность:
`),zl=new yn(!1),Hl=t(),P=p("p"),P.textContent=kn,Wl=t(),L=p("p"),L.innerHTML=Qn,Xl=t(),c(O.$$.fragment),Fl=t(),ss=p("p"),ss.innerHTML=$n,Yl=t(),ls=p("p"),ls.innerHTML=qn,Kl=t(),as=p("p"),as.textContent=En,Pl=t(),ns=p("p"),ns.innerHTML=xn,Ll=t(),c(ts.$$.fragment),Ol=t(),es=p("p"),es.innerHTML=vn,sa=t(),c(V.$$.fragment),la=t(),c(ps.$$.fragment),aa=t(),Ms=p("p"),Ms.textContent=Rn,na=t(),ms=p("p"),ms.innerHTML=_n,ta=t(),is=p("p"),is.textContent=Nn,ea=t(),c(cs.$$.fragment),pa=t(),os=p("p"),os.textContent=Dn,Ma=t(),c(rs.$$.fragment),ma=t(),ys=p("p"),ys.textContent=Zn,ia=t(),c(js.$$.fragment),ca=t(),us=p("p"),us.innerHTML=Sn,oa=t(),Us=p("p"),Us.innerHTML=Bn,ra=t(),c(Js.$$.fragment),ya=t(),hs=p("p"),hs.textContent=Gn,ja=t(),c(ws.$$.fragment),ua=t(),Cs=p("p"),Cs.innerHTML=zn,Ua=t(),c(Ts.$$.fragment),Ja=t(),ds=p("p"),ds.textContent=Hn,ha=t(),gs=p("p"),gs.textContent=Wn,wa=t(),c(Is.$$.fragment),Ca=t(),fs=p("p"),fs.innerHTML=Xn,Ta=t(),c(bs.$$.fragment),da=t(),As=p("p"),As.textContent=Fn,ga=t(),c(Vs.$$.fragment),Ia=t(),ks=p("p"),ks.textContent=Yn,fa=t(),c(Qs.$$.fragment),ba=t(),c($s.$$.fragment),Aa=t(),qs=p("p"),qs.textContent=Kn,Va=t(),c(Es.$$.fragment),ka=t(),c(k.$$.fragment),Qa=t(),xs=p("p"),xs.textContent=Pn,$a=t(),c(vs.$$.fragment),qa=t(),Rs=p("p"),Rs.innerHTML=Ln,Ea=t(),_s=p("p"),_s.innerHTML=On,xa=t(),Ns=p("p"),Ns.textContent=st,va=t(),c(Ds.$$.fragment),Ra=t(),Zs=p("p"),Zs.textContent=lt,_a=t(),c(Ss.$$.fragment),Na=t(),c(Bs.$$.fragment),Da=t(),Gs=p("p"),Gs.textContent=at,Za=t(),c(zs.$$.fragment),Sa=t(),Hs=p("p"),Hs.textContent=nt,Ba=t(),c(Ws.$$.fragment),Ga=t(),c(Xs.$$.fragment),za=t(),Fs=p("p"),Fs.textContent=tt,Ha=t(),c(Ys.$$.fragment),Wa=t(),Ks=p("p"),Ks.textContent=et,Xa=t(),c(Ps.$$.fragment),Fa=t(),Ls=p("p"),Ls.innerHTML=pt,Ya=t(),c(Os.$$.fragment),Ka=t(),c(Q.$$.fragment),Pa=t(),sl=p("p"),sl.textContent=Mt,La=t(),c(ll.$$.fragment),Oa=t(),al=p("p"),al.innerHTML=mt,sn=t(),c(nl.$$.fragment),ln=t(),c(tl.$$.fragment),an=t(),el=p("p"),el.textContent=it,nn=t(),c(pl.$$.fragment),tn=t(),yl=p("p"),this.h()},l(s){const l=Ct("svelte-u9bgzb",document.head);i=M(l,"META",{name:!0,content:!0}),l.forEach(a),h=e(s),U=M(s,"P",{}),jl(U).forEach(a),w=e(s),o(q.$$.fragment,s),hl=e(s),o(E.$$.fragment,s),wl=e(s),x=M(s,"P",{"data-svelte-h":!0}),m(x)!=="svelte-ztfl7b"&&(x.textContent=un),Cl=e(s),o(v.$$.fragment,s),Tl=e(s),o(f.$$.fragment,s),dl=e(s),o(R.$$.fragment,s),gl=e(s),_=M(s,"P",{"data-svelte-h":!0}),m(_)!=="svelte-38wf8v"&&(_.textContent=Un),Il=e(s),N=M(s,"P",{"data-svelte-h":!0}),m(N)!=="svelte-9m1yzd"&&(N.textContent=Jn),fl=e(s),b=M(s,"P",{});var Ml=jl(b);pn=il(Ml,"Это очень дорогостоящая операция, поэтому мы удаляем не просто один символ, связанный с наименьшим увеличением потерь, а"),bl=jn(Ml,!1),Al=il(Ml," (\\(p\\) - гиперпараметр, которым вы можете управлять, обычно 10 или 20) процентов символов, связанных с наименьшим увеличением потерь. Этот процесс повторяется до тех пор, пока словарь не достигнет желаемого размера."),Ml.forEach(a),Vl=e(s),D=M(s,"P",{"data-svelte-h":!0}),m(D)!=="svelte-6aybad"&&(D.textContent=hn),kl=e(s),Z=M(s,"P",{"data-svelte-h":!0}),m(Z)!=="svelte-1kd5ss2"&&(Z.textContent=wn),Ql=e(s),S=M(s,"P",{"data-svelte-h":!0}),m(S)!=="svelte-11p2t2p"&&(S.textContent=Cn),$l=e(s),o(B.$$.fragment,s),ql=e(s),G=M(s,"P",{"data-svelte-h":!0}),m(G)!=="svelte-1vs2ac9"&&(G.textContent=Tn),El=e(s),o(z.$$.fragment,s),xl=e(s),o(H.$$.fragment,s),vl=e(s),W=M(s,"P",{"data-svelte-h":!0}),m(W)!=="svelte-d2q239"&&(W.textContent=dn),Rl=e(s),X=M(s,"P",{"data-svelte-h":!0}),m(X)!=="svelte-1bxcwfe"&&(X.innerHTML=gn),_l=e(s),F=M(s,"P",{"data-svelte-h":!0}),m(F)!=="svelte-3bq9li"&&(F.textContent=In),Nl=e(s),o(Y.$$.fragment,s),Dl=e(s),K=M(s,"P",{"data-svelte-h":!0}),m(K)!=="svelte-im93lg"&&(K.innerHTML=fn),Zl=e(s),o(A.$$.fragment,s),Sl=e(s),T=M(s,"P",{});var g=jl(T);Mn=il(g,"Теперь для токенизации данного слова мы рассматриваем все возможные сегментации на токены и вычисляем вероятность каждого из них в соответствии с моделью Unigram. Поскольку все токены считаются независимыми, эта вероятность равна произведению вероятностей появления каждого токена. Например, при токенизации "),cl=M(g,"CODE",{"data-svelte-h":!0}),m(cl)!=="svelte-1n2m4po"&&(cl.textContent=bn),mn=il(g," слова "),ol=M(g,"CODE",{"data-svelte-h":!0}),m(ol)!=="svelte-1gjdq76"&&(ol.textContent=An),cn=il(g,` вероятность составляет:
`),Bl=jn(g,!1),g.forEach(a),Gl=e(s),I=M(s,"P",{});var $=jl(I);on=il($,"Для сравнения, токен "),rl=M($,"CODE",{"data-svelte-h":!0}),m(rl)!=="svelte-42m5r0"&&(rl.textContent=Vn),rn=il($,` имеет вероятность:
`),zl=jn($,!1),$.forEach(a),Hl=e(s),P=M(s,"P",{"data-svelte-h":!0}),m(P)!=="svelte-1t4lryo"&&(P.textContent=kn),Wl=e(s),L=M(s,"P",{"data-svelte-h":!0}),m(L)!=="svelte-x62a9z"&&(L.innerHTML=Qn),Xl=e(s),o(O.$$.fragment,s),Fl=e(s),ss=M(s,"P",{"data-svelte-h":!0}),m(ss)!=="svelte-825n4p"&&(ss.innerHTML=$n),Yl=e(s),ls=M(s,"P",{"data-svelte-h":!0}),m(ls)!=="svelte-1d4638c"&&(ls.innerHTML=qn),Kl=e(s),as=M(s,"P",{"data-svelte-h":!0}),m(as)!=="svelte-cnoenp"&&(as.textContent=En),Pl=e(s),ns=M(s,"P",{"data-svelte-h":!0}),m(ns)!=="svelte-14pw0oa"&&(ns.innerHTML=xn),Ll=e(s),o(ts.$$.fragment,s),Ol=e(s),es=M(s,"P",{"data-svelte-h":!0}),m(es)!=="svelte-12uxsr1"&&(es.innerHTML=vn),sa=e(s),o(V.$$.fragment,s),la=e(s),o(ps.$$.fragment,s),aa=e(s),Ms=M(s,"P",{"data-svelte-h":!0}),m(Ms)!=="svelte-tcwcgb"&&(Ms.textContent=Rn),na=e(s),ms=M(s,"P",{"data-svelte-h":!0}),m(ms)!=="svelte-1vdkm7"&&(ms.innerHTML=_n),ta=e(s),is=M(s,"P",{"data-svelte-h":!0}),m(is)!=="svelte-9v0eeq"&&(is.textContent=Nn),ea=e(s),o(cs.$$.fragment,s),pa=e(s),os=M(s,"P",{"data-svelte-h":!0}),m(os)!=="svelte-1xzvd9h"&&(os.textContent=Dn),Ma=e(s),o(rs.$$.fragment,s),ma=e(s),ys=M(s,"P",{"data-svelte-h":!0}),m(ys)!=="svelte-1chhfbr"&&(ys.textContent=Zn),ia=e(s),o(js.$$.fragment,s),ca=e(s),us=M(s,"P",{"data-svelte-h":!0}),m(us)!=="svelte-51rubi"&&(us.innerHTML=Sn),oa=e(s),Us=M(s,"P",{"data-svelte-h":!0}),m(Us)!=="svelte-u3c0y6"&&(Us.innerHTML=Bn),ra=e(s),o(Js.$$.fragment,s),ya=e(s),hs=M(s,"P",{"data-svelte-h":!0}),m(hs)!=="svelte-122nrhg"&&(hs.textContent=Gn),ja=e(s),o(ws.$$.fragment,s),ua=e(s),Cs=M(s,"P",{"data-svelte-h":!0}),m(Cs)!=="svelte-quha3z"&&(Cs.innerHTML=zn),Ua=e(s),o(Ts.$$.fragment,s),Ja=e(s),ds=M(s,"P",{"data-svelte-h":!0}),m(ds)!=="svelte-1ypl538"&&(ds.textContent=Hn),ha=e(s),gs=M(s,"P",{"data-svelte-h":!0}),m(gs)!=="svelte-11wpc69"&&(gs.textContent=Wn),wa=e(s),o(Is.$$.fragment,s),Ca=e(s),fs=M(s,"P",{"data-svelte-h":!0}),m(fs)!=="svelte-1wore2o"&&(fs.innerHTML=Xn),Ta=e(s),o(bs.$$.fragment,s),da=e(s),As=M(s,"P",{"data-svelte-h":!0}),m(As)!=="svelte-114dh07"&&(As.textContent=Fn),ga=e(s),o(Vs.$$.fragment,s),Ia=e(s),ks=M(s,"P",{"data-svelte-h":!0}),m(ks)!=="svelte-pnwlm1"&&(ks.textContent=Yn),fa=e(s),o(Qs.$$.fragment,s),ba=e(s),o($s.$$.fragment,s),Aa=e(s),qs=M(s,"P",{"data-svelte-h":!0}),m(qs)!=="svelte-1hgj0lr"&&(qs.textContent=Kn),Va=e(s),o(Es.$$.fragment,s),ka=e(s),o(k.$$.fragment,s),Qa=e(s),xs=M(s,"P",{"data-svelte-h":!0}),m(xs)!=="svelte-1qzj9gd"&&(xs.textContent=Pn),$a=e(s),o(vs.$$.fragment,s),qa=e(s),Rs=M(s,"P",{"data-svelte-h":!0}),m(Rs)!=="svelte-73tw6p"&&(Rs.innerHTML=Ln),Ea=e(s),_s=M(s,"P",{"data-svelte-h":!0}),m(_s)!=="svelte-1f89qpo"&&(_s.innerHTML=On),xa=e(s),Ns=M(s,"P",{"data-svelte-h":!0}),m(Ns)!=="svelte-1gujlqm"&&(Ns.textContent=st),va=e(s),o(Ds.$$.fragment,s),Ra=e(s),Zs=M(s,"P",{"data-svelte-h":!0}),m(Zs)!=="svelte-1mshvqh"&&(Zs.textContent=lt),_a=e(s),o(Ss.$$.fragment,s),Na=e(s),o(Bs.$$.fragment,s),Da=e(s),Gs=M(s,"P",{"data-svelte-h":!0}),m(Gs)!=="svelte-obvrxs"&&(Gs.textContent=at),Za=e(s),o(zs.$$.fragment,s),Sa=e(s),Hs=M(s,"P",{"data-svelte-h":!0}),m(Hs)!=="svelte-1pk5f76"&&(Hs.textContent=nt),Ba=e(s),o(Ws.$$.fragment,s),Ga=e(s),o(Xs.$$.fragment,s),za=e(s),Fs=M(s,"P",{"data-svelte-h":!0}),m(Fs)!=="svelte-1qh2n66"&&(Fs.textContent=tt),Ha=e(s),o(Ys.$$.fragment,s),Wa=e(s),Ks=M(s,"P",{"data-svelte-h":!0}),m(Ks)!=="svelte-12dq90h"&&(Ks.textContent=et),Xa=e(s),o(Ps.$$.fragment,s),Fa=e(s),Ls=M(s,"P",{"data-svelte-h":!0}),m(Ls)!=="svelte-pcm8dz"&&(Ls.innerHTML=pt),Ya=e(s),o(Os.$$.fragment,s),Ka=e(s),o(Q.$$.fragment,s),Pa=e(s),sl=M(s,"P",{"data-svelte-h":!0}),m(sl)!=="svelte-1cc5cfv"&&(sl.textContent=Mt),La=e(s),o(ll.$$.fragment,s),Oa=e(s),al=M(s,"P",{"data-svelte-h":!0}),m(al)!=="svelte-147fp2n"&&(al.innerHTML=mt),sn=e(s),o(nl.$$.fragment,s),ln=e(s),o(tl.$$.fragment,s),an=e(s),el=M(s,"P",{"data-svelte-h":!0}),m(el)!=="svelte-uhnvvo"&&(el.textContent=it),nn=e(s),o(pl.$$.fragment,s),tn=e(s),yl=M(s,"P",{}),jl(yl).forEach(a),this.h()},h(){rt(i,"name","hf:doc:metadata"),rt(i,"content",Qt),bl.a=Al,Bl.a=null,zl.a=null},m(s,l){d(document.head,i),n(s,h,l),n(s,U,l),n(s,w,l),r(q,s,l),n(s,hl,l),r(E,s,l),n(s,wl,l),n(s,x,l),n(s,Cl,l),r(v,s,l),n(s,Tl,l),r(f,s,l),n(s,dl,l),r(R,s,l),n(s,gl,l),n(s,_,l),n(s,Il,l),n(s,N,l),n(s,fl,l),n(s,b,l),d(b,pn),bl.m(yt,b),d(b,Al),n(s,Vl,l),n(s,D,l),n(s,kl,l),n(s,Z,l),n(s,Ql,l),n(s,S,l),n(s,$l,l),r(B,s,l),n(s,ql,l),n(s,G,l),n(s,El,l),r(z,s,l),n(s,xl,l),r(H,s,l),n(s,vl,l),n(s,W,l),n(s,Rl,l),n(s,X,l),n(s,_l,l),n(s,F,l),n(s,Nl,l),r(Y,s,l),n(s,Dl,l),n(s,K,l),n(s,Zl,l),r(A,s,l),n(s,Sl,l),n(s,T,l),d(T,Mn),d(T,cl),d(T,mn),d(T,ol),d(T,cn),Bl.m(jt,T),n(s,Gl,l),n(s,I,l),d(I,on),d(I,rl),d(I,rn),zl.m(ut,I),n(s,Hl,l),n(s,P,l),n(s,Wl,l),n(s,L,l),n(s,Xl,l),r(O,s,l),n(s,Fl,l),n(s,ss,l),n(s,Yl,l),n(s,ls,l),n(s,Kl,l),n(s,as,l),n(s,Pl,l),n(s,ns,l),n(s,Ll,l),r(ts,s,l),n(s,Ol,l),n(s,es,l),n(s,sa,l),r(V,s,l),n(s,la,l),r(ps,s,l),n(s,aa,l),n(s,Ms,l),n(s,na,l),n(s,ms,l),n(s,ta,l),n(s,is,l),n(s,ea,l),r(cs,s,l),n(s,pa,l),n(s,os,l),n(s,Ma,l),r(rs,s,l),n(s,ma,l),n(s,ys,l),n(s,ia,l),r(js,s,l),n(s,ca,l),n(s,us,l),n(s,oa,l),n(s,Us,l),n(s,ra,l),r(Js,s,l),n(s,ya,l),n(s,hs,l),n(s,ja,l),r(ws,s,l),n(s,ua,l),n(s,Cs,l),n(s,Ua,l),r(Ts,s,l),n(s,Ja,l),n(s,ds,l),n(s,ha,l),n(s,gs,l),n(s,wa,l),r(Is,s,l),n(s,Ca,l),n(s,fs,l),n(s,Ta,l),r(bs,s,l),n(s,da,l),n(s,As,l),n(s,ga,l),r(Vs,s,l),n(s,Ia,l),n(s,ks,l),n(s,fa,l),r(Qs,s,l),n(s,ba,l),r($s,s,l),n(s,Aa,l),n(s,qs,l),n(s,Va,l),r(Es,s,l),n(s,ka,l),r(k,s,l),n(s,Qa,l),n(s,xs,l),n(s,$a,l),r(vs,s,l),n(s,qa,l),n(s,Rs,l),n(s,Ea,l),n(s,_s,l),n(s,xa,l),n(s,Ns,l),n(s,va,l),r(Ds,s,l),n(s,Ra,l),n(s,Zs,l),n(s,_a,l),r(Ss,s,l),n(s,Na,l),r(Bs,s,l),n(s,Da,l),n(s,Gs,l),n(s,Za,l),r(zs,s,l),n(s,Sa,l),n(s,Hs,l),n(s,Ba,l),r(Ws,s,l),n(s,Ga,l),r(Xs,s,l),n(s,za,l),n(s,Fs,l),n(s,Ha,l),r(Ys,s,l),n(s,Wa,l),n(s,Ks,l),n(s,Xa,l),r(Ps,s,l),n(s,Fa,l),n(s,Ls,l),n(s,Ya,l),r(Os,s,l),n(s,Ka,l),r(Q,s,l),n(s,Pa,l),n(s,sl,l),n(s,La,l),r(ll,s,l),n(s,Oa,l),n(s,al,l),n(s,sn,l),r(nl,s,l),n(s,ln,l),r(tl,s,l),n(s,an,l),n(s,el,l),n(s,nn,l),r(pl,s,l),n(s,tn,l),n(s,yl,l),en=!0},p(s,[l]){const Ml={};l&2&&(Ml.$$scope={dirty:l,ctx:s}),f.$set(Ml);const g={};l&2&&(g.$$scope={dirty:l,ctx:s}),A.$set(g);const $={};l&2&&($.$$scope={dirty:l,ctx:s}),V.$set($);const ct={};l&2&&(ct.$$scope={dirty:l,ctx:s}),k.$set(ct);const ot={};l&2&&(ot.$$scope={dirty:l,ctx:s}),Q.$set(ot)},i(s){en||(y(q.$$.fragment,s),y(E.$$.fragment,s),y(v.$$.fragment,s),y(f.$$.fragment,s),y(R.$$.fragment,s),y(B.$$.fragment,s),y(z.$$.fragment,s),y(H.$$.fragment,s),y(Y.$$.fragment,s),y(A.$$.fragment,s),y(O.$$.fragment,s),y(ts.$$.fragment,s),y(V.$$.fragment,s),y(ps.$$.fragment,s),y(cs.$$.fragment,s),y(rs.$$.fragment,s),y(js.$$.fragment,s),y(Js.$$.fragment,s),y(ws.$$.fragment,s),y(Ts.$$.fragment,s),y(Is.$$.fragment,s),y(bs.$$.fragment,s),y(Vs.$$.fragment,s),y(Qs.$$.fragment,s),y($s.$$.fragment,s),y(Es.$$.fragment,s),y(k.$$.fragment,s),y(vs.$$.fragment,s),y(Ds.$$.fragment,s),y(Ss.$$.fragment,s),y(Bs.$$.fragment,s),y(zs.$$.fragment,s),y(Ws.$$.fragment,s),y(Xs.$$.fragment,s),y(Ys.$$.fragment,s),y(Ps.$$.fragment,s),y(Os.$$.fragment,s),y(Q.$$.fragment,s),y(ll.$$.fragment,s),y(nl.$$.fragment,s),y(tl.$$.fragment,s),y(pl.$$.fragment,s),en=!0)},o(s){j(q.$$.fragment,s),j(E.$$.fragment,s),j(v.$$.fragment,s),j(f.$$.fragment,s),j(R.$$.fragment,s),j(B.$$.fragment,s),j(z.$$.fragment,s),j(H.$$.fragment,s),j(Y.$$.fragment,s),j(A.$$.fragment,s),j(O.$$.fragment,s),j(ts.$$.fragment,s),j(V.$$.fragment,s),j(ps.$$.fragment,s),j(cs.$$.fragment,s),j(rs.$$.fragment,s),j(js.$$.fragment,s),j(Js.$$.fragment,s),j(ws.$$.fragment,s),j(Ts.$$.fragment,s),j(Is.$$.fragment,s),j(bs.$$.fragment,s),j(Vs.$$.fragment,s),j(Qs.$$.fragment,s),j($s.$$.fragment,s),j(Es.$$.fragment,s),j(k.$$.fragment,s),j(vs.$$.fragment,s),j(Ds.$$.fragment,s),j(Ss.$$.fragment,s),j(Bs.$$.fragment,s),j(zs.$$.fragment,s),j(Ws.$$.fragment,s),j(Xs.$$.fragment,s),j(Ys.$$.fragment,s),j(Ps.$$.fragment,s),j(Os.$$.fragment,s),j(Q.$$.fragment,s),j(ll.$$.fragment,s),j(nl.$$.fragment,s),j(tl.$$.fragment,s),j(pl.$$.fragment,s),en=!1},d(s){s&&(a(h),a(U),a(w),a(hl),a(wl),a(x),a(Cl),a(Tl),a(dl),a(gl),a(_),a(Il),a(N),a(fl),a(b),a(Vl),a(D),a(kl),a(Z),a(Ql),a(S),a($l),a(ql),a(G),a(El),a(xl),a(vl),a(W),a(Rl),a(X),a(_l),a(F),a(Nl),a(Dl),a(K),a(Zl),a(Sl),a(T),a(Gl),a(I),a(Hl),a(P),a(Wl),a(L),a(Xl),a(Fl),a(ss),a(Yl),a(ls),a(Kl),a(as),a(Pl),a(ns),a(Ll),a(Ol),a(es),a(sa),a(la),a(aa),a(Ms),a(na),a(ms),a(ta),a(is),a(ea),a(pa),a(os),a(Ma),a(ma),a(ys),a(ia),a(ca),a(us),a(oa),a(Us),a(ra),a(ya),a(hs),a(ja),a(ua),a(Cs),a(Ua),a(Ja),a(ds),a(ha),a(gs),a(wa),a(Ca),a(fs),a(Ta),a(da),a(As),a(ga),a(Ia),a(ks),a(fa),a(ba),a(Aa),a(qs),a(Va),a(ka),a(Qa),a(xs),a($a),a(qa),a(Rs),a(Ea),a(_s),a(xa),a(Ns),a(va),a(Ra),a(Zs),a(_a),a(Na),a(Da),a(Gs),a(Za),a(Sa),a(Hs),a(Ba),a(Ga),a(za),a(Fs),a(Ha),a(Wa),a(Ks),a(Xa),a(Fa),a(Ls),a(Ya),a(Ka),a(Pa),a(sl),a(La),a(Oa),a(al),a(sn),a(ln),a(an),a(el),a(nn),a(tn),a(yl)),a(i),u(q,s),u(E,s),u(v,s),u(f,s),u(R,s),u(B,s),u(z,s),u(H,s),u(Y,s),u(A,s),u(O,s),u(ts,s),u(V,s),u(ps,s),u(cs,s),u(rs,s),u(js,s),u(Js,s),u(ws,s),u(Ts,s),u(Is,s),u(bs,s),u(Vs,s),u(Qs,s),u($s,s),u(Es,s),u(k,s),u(vs,s),u(Ds,s),u(Ss,s),u(Bs,s),u(zs,s),u(Ws,s),u(Xs,s),u(Ys,s),u(Ps,s),u(Os,s),u(Q,s),u(ll,s),u(nl,s),u(tl,s),u(pl,s)}}}const Qt='{"title":"Токенизация Unigram","local":"unigram-tokenization","sections":[{"title":"Алгоритм обучения","local":"training-algorithm","sections":[],"depth":2},{"title":"Алгоритм токенизации","local":"tokenization-algorithm","sections":[],"depth":2},{"title":"Назад к обучению","local":"back-to-training","sections":[],"depth":2},{"title":"Реализация Unigram","local":"implementing-unigram","sections":[],"depth":2}],"depth":1}';function $t(C){return Jt(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class Dt extends ht{constructor(i){super(),wt(this,i,$t,kt,Ut,{})}}export{Dt as component};

Xet Storage Details

Size:
89.1 kB
·
Xet hash:
bba0171619fc96500c7293f6eda179f658cd31f10af962103983bad9f5b54337

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.