Buckets:

rtrm's picture
download
raw
88.3 kB
import{s as wt,n as Ct,o as Tt}from"../chunks/scheduler.893fe8c9.js";import{S as dt,i as It,e as p,s as t,c as i,v as nl,H as yn,h as gt,a as M,d as a,b as e,f as rl,g as c,j as m,w as tl,x as jn,k as el,l as J,m as n,n as o,t as r,o as y,p as j}from"../chunks/index.2d09ebb4.js";import{C as bt,H as yl,E as ft}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.72c4b310.js";import{Y as At}from"../chunks/Youtube.b7012d06.js";import{C as u}from"../chunks/CodeBlock.72d55ede.js";import{C as Vt}from"../chunks/CourseFloatingBanner.e3aeab73.js";function kt(un){let h,jl,il,ul,f,Ul,A,Jl,V,hl,k,Un="Алгоритм Unigram часто используется в SentencePiece, который является алгоритмом токенизации, применяемым в таких моделях, как AlBERT, T5, mBART, Big Bird и XLNet.",wl,Q,Cl,C,Jn="<p>💡 В этом разделе подробно рассматривается Unigram, вплоть до демонстрации полной реализации. Вы можете пропустить его, если вам нужен только общий обзор алгоритма токенизации.</p>",Tl,q,dl,E,hn="По сравнению с BPE и WordPiece, Unigram работает в другом направлении: он начинает с большого словарного запаса и удаляет из него токены, пока не достигнет желаемого размера словаря. Существует несколько вариантов создания базового словаря: например, мы можем взять наиболее часто встречающиеся подстроки в предварительно токенизированных словах или применить BPE к исходному корпусу с большим объемом словаря.",Il,x,wn="На каждом шаге обучения алгоритм Unigram рассчитывает потери по корпусу с учетом текущего словарного запаса. Затем для каждого символа в словаре алгоритм вычисляет, насколько увеличится общая потеря, если этот символ будет удален, и ищет символы, которые увеличат ее меньше всего. Эти символы оказывают меньшее влияние на общую потерю по корпусу, поэтому в некотором смысле они “менее нужны” и являются лучшими кандидатами на удаление.",gl,T,pn,bl,Ut='<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>',fl,Al,$,Cn="Обратите внимание, что мы никогда не удаляем базовые символы, чтобы убедиться, что любое слово может быть токенизировано.",Vl,v,Tn="Итак, все еще немного туманно: основная часть алгоритма заключается в том, чтобы вычислить потери по корпусу и посмотреть, как они изменяются при удалении некоторых токенов из словаря, но мы еще не объяснили, как это сделать. Этот шаг зависит от алгоритма токенизации модели Unigram, поэтому мы рассмотрим его далее.",kl,R,dn="Мы используем корпус текста из предыдущих примеров:",Ql,N,ql,D,In="и для этого примера мы возьмем все подстроки из исходного словаря:",El,Z,xl,_,$l,S,gn="Модель Unigram - это тип языковой модели, в которой каждый токен рассматривается как независимый от предшествующих ему. Это самая простая языковая модель в том смысле, что вероятность появления токена X с учетом предыдущего контекста - это просто вероятность появления токена X. Таким образом, если бы мы использовали модель Unigram для генерации текста, мы бы всегда предсказывали наиболее часто встречающийся токен.",vl,B,bn="Вероятность данного токена - это его частота (количество раз, когда мы его находим) в исходном корпусе, деленная на сумму частот всех токенов в словаре (чтобы убедиться, что суммы вероятностей равны 1). Например, <code>&quot;ug&quot;</code> присутствует в <code>&quot;hug&quot;</code>, <code>&quot;pug&quot;</code> и <code>&quot;hugs&quot;</code>, поэтому его частота в нашем корпусе равна 20.",Rl,G,fn="Здесь приведены частоты всех возможных подслов в словаре:",Nl,z,Dl,H,An="Итак, сумма всех частот равна 210, а вероятность появления подслова <code>&quot;ug&quot;</code>, таким образом, составляет 20/210.",Zl,d,Vn="<p>✏️ <strong>Теперь ваша очередь!</strong> Напишите код для вычисления вышеуказанных частот и дважды проверьте правильность приведенных результатов, а также общую сумму.</p>",_l,U,Mn,pl,kn='["p", "u", "g"]',mn,Ml,Qn='"pug"',cn,Sl,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>',Bl,w,on,ml,qn='["pu", "g"]',rn,Gl,ht='<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>',zl,W,En="так что один из них гораздо более вероятен. В целом, токенизации с наименьшим количеством токенов будут иметь наибольшую вероятность (из-за деления на 210, повторяющегося для каждого токена), что соответствует интуитивному желанию: разбить слово на наименьшее количество токенов.",Hl,X,xn="Токенизация слова с помощью модели Unigram - это токенизация с наибольшей вероятностью. В примере с <code>&quot;pug&quot;</code> приведены вероятности, которые мы получили бы для каждой возможной сегментации:",Wl,K,Xl,F,$n="Так, <code>&quot;pug&quot;</code> будет токенизировано как <code>[&quot;p&quot;, &quot;ug&quot;]</code> или <code>[&quot;pu&quot;, &quot;g&quot;]</code>, в зависимости от того, какая из этих сегментаций встретится первой (отметим, что в большом корпусе подобные случаи равенства будут редки).",Kl,Y,vn="В данном случае было легко найти все возможные сегментации и вычислить их вероятности, но в общем случае это будет немного сложнее. Для этого используется классический алгоритм, который называется <em>алгоритм Витерби (Viterbi algorithm)</em>. По сути, мы можем построить граф для выявления возможных сегментаций данного слова, сказав, что существует ветвь от символа <em>a</em> до символа <em>b</em>, если подслово от <em>a</em> до <em>b</em> есть в словаре, и приписать этой ветви вероятность подслова.",Fl,P,Rn="Чтобы найти путь в этом графе, который будет иметь наилучшую оценку, алгоритм Витерби определяет для каждой позиции в слове сегментацию с наилучшей оценкой, которая заканчивается на этой позиции. Поскольку мы идем от начала к концу, этот лучший результат можно найти, перебирая все подслова, заканчивающиеся на текущей позиции, а затем используя лучший результат токенизации с позиции, на которой начинается это подслово. Затем нужно просто развернуть путь, чтобы прийти к концу.",Yl,L,Nn="Давайте рассмотрим пример с использованием нашего словаря и слова <code>&quot;unhug&quot;</code>. Для каждой позиции подслова с наилучшими оценками заканчиваются следующим образом:",Pl,O,Ll,ss,Dn="Таким образом, <code>&quot;unhug&quot;</code> будет токенизировано как <code>[&quot;un&quot;, &quot;hug&quot;]</code>.",Ol,I,Zn="<p>✏️ <strong>Теперь ваша очередь!</strong> Определите токенизацию слова <code>&quot; huggun&quot;</code> и его оценку.</p>",sa,ls,la,as,_n="Теперь, когда мы увидели, как работает токенизация, мы можем немного глубже изучить потери, используемые во время обучения. На любом этапе эта потеря вычисляется путем токенизации каждого слова в корпусе с использованием текущего словаря и модели Unigram, определяемой частотами каждого токена в корпусе (как было показано ранее).",aa,ns,Sn="Каждое слово в корпусе имеет оценку, а потеря - это отрицательное логарифмическое правдоподобие этих оценок, то есть сумма для всех слов в корпусе всех <code>-log(P(word))</code>.",na,ts,Bn="Давайте вернемся к нашему примеру со следующим корпусом:",ta,es,ea,ps,Gn="Токенизация каждого слова с соответствующими оценками:",pa,Ms,Ma,ms,zn="Таким образом, потери будут:",ma,is,ia,cs,Hn="Теперь нам нужно вычислить, как удаление каждого токена влияет на потери. Это довольно утомительно, поэтому мы просто сделаем это для двух токенов и оставим весь процесс на потом, когда у нас будет код, чтобы помочь нам. В этом (очень) конкретном случае у нас есть две эквивалентные токенизации всех слов: как мы видели ранее, например, <code>&quot;pug&quot;</code> может быть токенизировано <code>[&quot;p&quot;, &quot;ug&quot;]</code> с тем же результатом. Таким образом, удаление токена <code>&quot;pu&quot;</code> из словаря приведет к точно таким же потерям.",ca,os,Wn="С другой стороны, удаление <code>&quot; hug&quot;</code> усугубит потери, потому что токенизация <code>&quot;hug&quot;</code> и <code>&quot;hugs&quot;</code> станет:",oa,rs,ra,ys,Xn="Эти изменения приведут к увеличению потерь:",ya,js,ja,us,Kn="Поэтому токен <code>&quot;pu&quot;</code>, вероятно, будет удален из словаря, но не <code>&quot;hug&quot;</code>.",ua,Us,Ua,Js,Fn="Теперь давайте реализуем все, что мы видели до сих пор, в коде. Как и в случае с BPE и WordPiece, это не эффективная реализация алгоритма Unigram (совсем наоборот), но она должна помочь вам понять его немного лучше.",Ja,hs,Yn="В качестве примера мы будем использовать тот же корпус текста, что и раньше:",ha,ws,wa,Cs,Pn="На этот раз в качестве модели мы будем использовать <code>xlnet-base-cased</code>:",Ca,Ts,Ta,ds,Ln="Как и в случае с BPE и WordPiece, мы начинаем с подсчета количества вхождений каждого слова в корпус:",da,Is,Ia,gs,On="Затем нам нужно инициализировать наш словарь чем-то большим, чем размер словаря, который мы захотим получить в конце. Мы должны включить все основные символы (иначе мы не сможем токенизировать каждое слово), но для больших подстрок мы сохраним только самые распространенные, поэтому мы отсортируем их по частоте:",ga,bs,ba,fs,fa,As,st="Мы группируем символы с лучшими подсловами, чтобы получить начальный словарь размером 300:",Aa,Vs,Va,g,lt="<p>💡 SentencePiece использует более эффективный алгоритм под названием Enhanced Suffix Array (ESA) для создания начального словаря.</p>",ka,ks,at="Далее мы вычисляем сумму всех частот, чтобы преобразовать частоты в вероятности. Для нашей модели мы будем хранить логарифмы вероятностей, потому что численно стабильнее складывать логарифмы, чем перемножать маленькие числа, и это упростит вычисление потерь модели:",Qa,Qs,qa,qs,nt="Теперь основная функция - это функция токенизации слов с помощью алгоритма Витерби. Как мы уже видели, этот алгоритм вычисляет наилучшую сегментацию каждой подстроки слова, которую мы будем хранить в переменной с именем <code>best_segmentations</code>. Мы будем хранить по одному словарю на каждую позицию в слове (от 0 до его полной длины), с двумя ключами: индекс начала последнего токена в лучшей сегментации и оценка лучшей сегментации. По индексу начала последнего токена мы сможем получить полную сегментацию, когда список будет полностью заполнен.",Ea,Es,tt="Пополнение списка осуществляется с помощью двух циклов: основной цикл просматривает каждую начальную позицию, а второй цикл перебирает все подстроки, начинающиеся с этой начальной позиции. Если подстрока есть в словаре, мы получаем новую сегментацию слова до этой конечной позиции, которую сравниваем с той, что хранится в <code>best_segmentations</code>.",xa,xs,et="После завершения основного цикла мы просто начинаем с конца и переходим от одной начальной позиции к другой, записывая токены по мере продвижения, пока не достигнем начала слова:",$a,$s,va,vs,pt="Мы уже можем опробовать нашу первоначальную модель на некоторых словах:",Ra,Rs,Na,Ns,Da,Ds,Mt="Теперь легко вычислить потери модели на корпусе!",Za,Zs,_a,_s,mt="Мы можем проверить его работу на имеющейся у нас модели:",Sa,Ss,Ba,Bs,Ga,Gs,it="Вычисление оценок для каждого токена также не представляет особой сложности; нам просто нужно вычислить потери для модели, полученные при удалении каждого токена:",za,zs,Ha,Hs,ct="Мы можем попробовать это на заданном токене:",Wa,Ws,Xa,Xs,ot="Поскольку <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>, которое токенизируется само по себе, поэтому мы ожидаем, что потери будут нулевыми. Вот результаты:",Ka,Ks,Fa,b,rt="<p>💡 Такой подход очень неэффективен, поэтому SentencePiece использует приближенную оценку потерь модели без токена X: вместо того чтобы начинать с нуля, он просто заменяет токен X его сегментацией в оставшемся словаре. Таким образом, все оценки могут быть вычислены одновременно с потерями модели.</p>",Ya,Fs,yt="Когда этот процесс завершиться, останется только добавить в словарь специальные токены, используемые моделью, а затем итерироваться, пока мы не вычеркнем из словаря достаточно токенов, чтобы достичь желаемого размера:",Pa,Ys,La,Ps,jt="Затем, чтобы токенизировать некоторый текст, нам просто нужно применить предварительную токенизацию, а затем использовать нашу функцию <code>encode_word()</code>:",Oa,Ls,sn,Os,ln,sl,ut="Вот и все об Unigram! Надеемся, теперь вы чувствуете себя экспертом во всем, что касается токенизаторов. В следующем разделе мы рассмотрим блоки библиотеки 🤗 Tokenizers и покажем, как их можно использовать для создания собственного токенизатора.",an,ll,nn,cl,tn;return f=new bt({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),A=new yl({props:{title:"Токенизация Unigram",local:"unigram-tokenization",headingTag:"h1"}}),V=new Vt({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"}]}}),Q=new At({props:{id:"TGZfZVuF9Yc"}}),q=new yl({props:{title:"Алгоритм обучения",local:"training-algorithm",headingTag:"h2"}}),N=new u({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 u({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}}),_=new yl({props:{title:"Алгоритм токенизации",local:"tokenization-algorithm",headingTag:"h2"}}),z=new u({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}}),K=new u({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}}),O=new u({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}}),ls=new yl({props:{title:"Назад к обучению",local:"back-to-training",headingTag:"h2"}}),es=new u({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}}),Ms=new u({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}}),is=new u({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}}),rs=new u({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}}),js=new u({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}}),Us=new yl({props:{title:"Реализация Unigram",local:"implementing-unigram",headingTag:"h2"}}),ws=new u({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}}),Ts=new u({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}}),Is=new u({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}}),bs=new u({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}}),fs=new u({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}}),Vs=new u({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}}),Qs=new u({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}}),$s=new u({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}}),Rs=new u({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}}),Ns=new u({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 u({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}}),Ss=new u({props:{code:"Y29tcHV0ZV9sb3NzKG1vZGVsKQ==",highlighted:"compute_loss(model)",wrap:!1}}),Bs=new u({props:{code:"NDEzLjEwMzc3NjQyOTQwODc1",highlighted:'<span class="hljs-number">413.10377642940875</span>',wrap:!1}}),zs=new u({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}}),Ws=new u({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}}),Ks=new u({props:{code:"Ni4zNzY0MTI0MDM2MjM4NzQlMEEwLjA=",highlighted:`<span class="hljs-number">6.376412403623874</span>
<span class="hljs-number">0.0</span>`,wrap:!1}}),Ys=new u({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}}),Ls=new u({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}}),Os=new u({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}}),ll=new ft({props:{source:"https://github.com/huggingface/course/blob/main/chapters/ru/chapter6/7.mdx"}}),{c(){h=p("meta"),jl=t(),il=p("p"),ul=t(),i(f.$$.fragment),Ul=t(),i(A.$$.fragment),Jl=t(),i(V.$$.fragment),hl=t(),k=p("p"),k.textContent=Un,wl=t(),i(Q.$$.fragment),Cl=t(),C=p("blockquote"),C.innerHTML=Jn,Tl=t(),i(q.$$.fragment),dl=t(),E=p("p"),E.textContent=hn,Il=t(),x=p("p"),x.textContent=wn,gl=t(),T=p("p"),pn=nl("Это очень дорогостоящая операция, поэтому мы удаляем не просто один символ, связанный с наименьшим увеличением потерь, а"),bl=new yn(!1),fl=nl(" (\\(p\\) - гиперпараметр, которым вы можете управлять, обычно 10 или 20) процентов символов, связанных с наименьшим увеличением потерь. Этот процесс повторяется до тех пор, пока словарь не достигнет желаемого размера."),Al=t(),$=p("p"),$.textContent=Cn,Vl=t(),v=p("p"),v.textContent=Tn,kl=t(),R=p("p"),R.textContent=dn,Ql=t(),i(N.$$.fragment),ql=t(),D=p("p"),D.textContent=In,El=t(),i(Z.$$.fragment),xl=t(),i(_.$$.fragment),$l=t(),S=p("p"),S.textContent=gn,vl=t(),B=p("p"),B.innerHTML=bn,Rl=t(),G=p("p"),G.textContent=fn,Nl=t(),i(z.$$.fragment),Dl=t(),H=p("p"),H.innerHTML=An,Zl=t(),d=p("blockquote"),d.innerHTML=Vn,_l=t(),U=p("p"),Mn=nl("Теперь для токенизации данного слова мы рассматриваем все возможные сегментации на токены и вычисляем вероятность каждого из них в соответствии с моделью Unigram. Поскольку все токены считаются независимыми, эта вероятность равна произведению вероятностей появления каждого токена. Например, при токенизации "),pl=p("code"),pl.textContent=kn,mn=nl(" слова "),Ml=p("code"),Ml.textContent=Qn,cn=nl(` вероятность составляет:
`),Sl=new yn(!1),Bl=t(),w=p("p"),on=nl("Для сравнения, токен "),ml=p("code"),ml.textContent=qn,rn=nl(` имеет вероятность:
`),Gl=new yn(!1),zl=t(),W=p("p"),W.textContent=En,Hl=t(),X=p("p"),X.innerHTML=xn,Wl=t(),i(K.$$.fragment),Xl=t(),F=p("p"),F.innerHTML=$n,Kl=t(),Y=p("p"),Y.innerHTML=vn,Fl=t(),P=p("p"),P.textContent=Rn,Yl=t(),L=p("p"),L.innerHTML=Nn,Pl=t(),i(O.$$.fragment),Ll=t(),ss=p("p"),ss.innerHTML=Dn,Ol=t(),I=p("blockquote"),I.innerHTML=Zn,sa=t(),i(ls.$$.fragment),la=t(),as=p("p"),as.textContent=_n,aa=t(),ns=p("p"),ns.innerHTML=Sn,na=t(),ts=p("p"),ts.textContent=Bn,ta=t(),i(es.$$.fragment),ea=t(),ps=p("p"),ps.textContent=Gn,pa=t(),i(Ms.$$.fragment),Ma=t(),ms=p("p"),ms.textContent=zn,ma=t(),i(is.$$.fragment),ia=t(),cs=p("p"),cs.innerHTML=Hn,ca=t(),os=p("p"),os.innerHTML=Wn,oa=t(),i(rs.$$.fragment),ra=t(),ys=p("p"),ys.textContent=Xn,ya=t(),i(js.$$.fragment),ja=t(),us=p("p"),us.innerHTML=Kn,ua=t(),i(Us.$$.fragment),Ua=t(),Js=p("p"),Js.textContent=Fn,Ja=t(),hs=p("p"),hs.textContent=Yn,ha=t(),i(ws.$$.fragment),wa=t(),Cs=p("p"),Cs.innerHTML=Pn,Ca=t(),i(Ts.$$.fragment),Ta=t(),ds=p("p"),ds.textContent=Ln,da=t(),i(Is.$$.fragment),Ia=t(),gs=p("p"),gs.textContent=On,ga=t(),i(bs.$$.fragment),ba=t(),i(fs.$$.fragment),fa=t(),As=p("p"),As.textContent=st,Aa=t(),i(Vs.$$.fragment),Va=t(),g=p("blockquote"),g.innerHTML=lt,ka=t(),ks=p("p"),ks.textContent=at,Qa=t(),i(Qs.$$.fragment),qa=t(),qs=p("p"),qs.innerHTML=nt,Ea=t(),Es=p("p"),Es.innerHTML=tt,xa=t(),xs=p("p"),xs.textContent=et,$a=t(),i($s.$$.fragment),va=t(),vs=p("p"),vs.textContent=pt,Ra=t(),i(Rs.$$.fragment),Na=t(),i(Ns.$$.fragment),Da=t(),Ds=p("p"),Ds.textContent=Mt,Za=t(),i(Zs.$$.fragment),_a=t(),_s=p("p"),_s.textContent=mt,Sa=t(),i(Ss.$$.fragment),Ba=t(),i(Bs.$$.fragment),Ga=t(),Gs=p("p"),Gs.textContent=it,za=t(),i(zs.$$.fragment),Ha=t(),Hs=p("p"),Hs.textContent=ct,Wa=t(),i(Ws.$$.fragment),Xa=t(),Xs=p("p"),Xs.innerHTML=ot,Ka=t(),i(Ks.$$.fragment),Fa=t(),b=p("blockquote"),b.innerHTML=rt,Ya=t(),Fs=p("p"),Fs.textContent=yt,Pa=t(),i(Ys.$$.fragment),La=t(),Ps=p("p"),Ps.innerHTML=jt,Oa=t(),i(Ls.$$.fragment),sn=t(),i(Os.$$.fragment),ln=t(),sl=p("p"),sl.textContent=ut,an=t(),i(ll.$$.fragment),nn=t(),cl=p("p"),this.h()},l(s){const l=gt("svelte-u9bgzb",document.head);h=M(l,"META",{name:!0,content:!0}),l.forEach(a),jl=e(s),il=M(s,"P",{}),rl(il).forEach(a),ul=e(s),c(f.$$.fragment,s),Ul=e(s),c(A.$$.fragment,s),Jl=e(s),c(V.$$.fragment,s),hl=e(s),k=M(s,"P",{"data-svelte-h":!0}),m(k)!=="svelte-ztfl7b"&&(k.textContent=Un),wl=e(s),c(Q.$$.fragment,s),Cl=e(s),C=M(s,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),m(C)!=="svelte-ev1noc"&&(C.innerHTML=Jn),Tl=e(s),c(q.$$.fragment,s),dl=e(s),E=M(s,"P",{"data-svelte-h":!0}),m(E)!=="svelte-38wf8v"&&(E.textContent=hn),Il=e(s),x=M(s,"P",{"data-svelte-h":!0}),m(x)!=="svelte-9m1yzd"&&(x.textContent=wn),gl=e(s),T=M(s,"P",{});var en=rl(T);pn=tl(en,"Это очень дорогостоящая операция, поэтому мы удаляем не просто один символ, связанный с наименьшим увеличением потерь, а"),bl=jn(en,!1),fl=tl(en," (\\(p\\) - гиперпараметр, которым вы можете управлять, обычно 10 или 20) процентов символов, связанных с наименьшим увеличением потерь. Этот процесс повторяется до тех пор, пока словарь не достигнет желаемого размера."),en.forEach(a),Al=e(s),$=M(s,"P",{"data-svelte-h":!0}),m($)!=="svelte-6aybad"&&($.textContent=Cn),Vl=e(s),v=M(s,"P",{"data-svelte-h":!0}),m(v)!=="svelte-1kd5ss2"&&(v.textContent=Tn),kl=e(s),R=M(s,"P",{"data-svelte-h":!0}),m(R)!=="svelte-11p2t2p"&&(R.textContent=dn),Ql=e(s),c(N.$$.fragment,s),ql=e(s),D=M(s,"P",{"data-svelte-h":!0}),m(D)!=="svelte-1vs2ac9"&&(D.textContent=In),El=e(s),c(Z.$$.fragment,s),xl=e(s),c(_.$$.fragment,s),$l=e(s),S=M(s,"P",{"data-svelte-h":!0}),m(S)!=="svelte-d2q239"&&(S.textContent=gn),vl=e(s),B=M(s,"P",{"data-svelte-h":!0}),m(B)!=="svelte-1bxcwfe"&&(B.innerHTML=bn),Rl=e(s),G=M(s,"P",{"data-svelte-h":!0}),m(G)!=="svelte-3bq9li"&&(G.textContent=fn),Nl=e(s),c(z.$$.fragment,s),Dl=e(s),H=M(s,"P",{"data-svelte-h":!0}),m(H)!=="svelte-im93lg"&&(H.innerHTML=An),Zl=e(s),d=M(s,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),m(d)!=="svelte-qe736t"&&(d.innerHTML=Vn),_l=e(s),U=M(s,"P",{});var al=rl(U);Mn=tl(al,"Теперь для токенизации данного слова мы рассматриваем все возможные сегментации на токены и вычисляем вероятность каждого из них в соответствии с моделью Unigram. Поскольку все токены считаются независимыми, эта вероятность равна произведению вероятностей появления каждого токена. Например, при токенизации "),pl=M(al,"CODE",{"data-svelte-h":!0}),m(pl)!=="svelte-1n2m4po"&&(pl.textContent=kn),mn=tl(al," слова "),Ml=M(al,"CODE",{"data-svelte-h":!0}),m(Ml)!=="svelte-1gjdq76"&&(Ml.textContent=Qn),cn=tl(al,` вероятность составляет:
`),Sl=jn(al,!1),al.forEach(a),Bl=e(s),w=M(s,"P",{});var ol=rl(w);on=tl(ol,"Для сравнения, токен "),ml=M(ol,"CODE",{"data-svelte-h":!0}),m(ml)!=="svelte-42m5r0"&&(ml.textContent=qn),rn=tl(ol,` имеет вероятность:
`),Gl=jn(ol,!1),ol.forEach(a),zl=e(s),W=M(s,"P",{"data-svelte-h":!0}),m(W)!=="svelte-1t4lryo"&&(W.textContent=En),Hl=e(s),X=M(s,"P",{"data-svelte-h":!0}),m(X)!=="svelte-x62a9z"&&(X.innerHTML=xn),Wl=e(s),c(K.$$.fragment,s),Xl=e(s),F=M(s,"P",{"data-svelte-h":!0}),m(F)!=="svelte-825n4p"&&(F.innerHTML=$n),Kl=e(s),Y=M(s,"P",{"data-svelte-h":!0}),m(Y)!=="svelte-1d4638c"&&(Y.innerHTML=vn),Fl=e(s),P=M(s,"P",{"data-svelte-h":!0}),m(P)!=="svelte-cnoenp"&&(P.textContent=Rn),Yl=e(s),L=M(s,"P",{"data-svelte-h":!0}),m(L)!=="svelte-14pw0oa"&&(L.innerHTML=Nn),Pl=e(s),c(O.$$.fragment,s),Ll=e(s),ss=M(s,"P",{"data-svelte-h":!0}),m(ss)!=="svelte-12uxsr1"&&(ss.innerHTML=Dn),Ol=e(s),I=M(s,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),m(I)!=="svelte-8are85"&&(I.innerHTML=Zn),sa=e(s),c(ls.$$.fragment,s),la=e(s),as=M(s,"P",{"data-svelte-h":!0}),m(as)!=="svelte-tcwcgb"&&(as.textContent=_n),aa=e(s),ns=M(s,"P",{"data-svelte-h":!0}),m(ns)!=="svelte-1vdkm7"&&(ns.innerHTML=Sn),na=e(s),ts=M(s,"P",{"data-svelte-h":!0}),m(ts)!=="svelte-9v0eeq"&&(ts.textContent=Bn),ta=e(s),c(es.$$.fragment,s),ea=e(s),ps=M(s,"P",{"data-svelte-h":!0}),m(ps)!=="svelte-1xzvd9h"&&(ps.textContent=Gn),pa=e(s),c(Ms.$$.fragment,s),Ma=e(s),ms=M(s,"P",{"data-svelte-h":!0}),m(ms)!=="svelte-1chhfbr"&&(ms.textContent=zn),ma=e(s),c(is.$$.fragment,s),ia=e(s),cs=M(s,"P",{"data-svelte-h":!0}),m(cs)!=="svelte-51rubi"&&(cs.innerHTML=Hn),ca=e(s),os=M(s,"P",{"data-svelte-h":!0}),m(os)!=="svelte-u3c0y6"&&(os.innerHTML=Wn),oa=e(s),c(rs.$$.fragment,s),ra=e(s),ys=M(s,"P",{"data-svelte-h":!0}),m(ys)!=="svelte-122nrhg"&&(ys.textContent=Xn),ya=e(s),c(js.$$.fragment,s),ja=e(s),us=M(s,"P",{"data-svelte-h":!0}),m(us)!=="svelte-quha3z"&&(us.innerHTML=Kn),ua=e(s),c(Us.$$.fragment,s),Ua=e(s),Js=M(s,"P",{"data-svelte-h":!0}),m(Js)!=="svelte-1ypl538"&&(Js.textContent=Fn),Ja=e(s),hs=M(s,"P",{"data-svelte-h":!0}),m(hs)!=="svelte-11wpc69"&&(hs.textContent=Yn),ha=e(s),c(ws.$$.fragment,s),wa=e(s),Cs=M(s,"P",{"data-svelte-h":!0}),m(Cs)!=="svelte-1wore2o"&&(Cs.innerHTML=Pn),Ca=e(s),c(Ts.$$.fragment,s),Ta=e(s),ds=M(s,"P",{"data-svelte-h":!0}),m(ds)!=="svelte-114dh07"&&(ds.textContent=Ln),da=e(s),c(Is.$$.fragment,s),Ia=e(s),gs=M(s,"P",{"data-svelte-h":!0}),m(gs)!=="svelte-pnwlm1"&&(gs.textContent=On),ga=e(s),c(bs.$$.fragment,s),ba=e(s),c(fs.$$.fragment,s),fa=e(s),As=M(s,"P",{"data-svelte-h":!0}),m(As)!=="svelte-1hgj0lr"&&(As.textContent=st),Aa=e(s),c(Vs.$$.fragment,s),Va=e(s),g=M(s,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),m(g)!=="svelte-1yqt578"&&(g.innerHTML=lt),ka=e(s),ks=M(s,"P",{"data-svelte-h":!0}),m(ks)!=="svelte-1qzj9gd"&&(ks.textContent=at),Qa=e(s),c(Qs.$$.fragment,s),qa=e(s),qs=M(s,"P",{"data-svelte-h":!0}),m(qs)!=="svelte-73tw6p"&&(qs.innerHTML=nt),Ea=e(s),Es=M(s,"P",{"data-svelte-h":!0}),m(Es)!=="svelte-1f89qpo"&&(Es.innerHTML=tt),xa=e(s),xs=M(s,"P",{"data-svelte-h":!0}),m(xs)!=="svelte-1gujlqm"&&(xs.textContent=et),$a=e(s),c($s.$$.fragment,s),va=e(s),vs=M(s,"P",{"data-svelte-h":!0}),m(vs)!=="svelte-1mshvqh"&&(vs.textContent=pt),Ra=e(s),c(Rs.$$.fragment,s),Na=e(s),c(Ns.$$.fragment,s),Da=e(s),Ds=M(s,"P",{"data-svelte-h":!0}),m(Ds)!=="svelte-obvrxs"&&(Ds.textContent=Mt),Za=e(s),c(Zs.$$.fragment,s),_a=e(s),_s=M(s,"P",{"data-svelte-h":!0}),m(_s)!=="svelte-1pk5f76"&&(_s.textContent=mt),Sa=e(s),c(Ss.$$.fragment,s),Ba=e(s),c(Bs.$$.fragment,s),Ga=e(s),Gs=M(s,"P",{"data-svelte-h":!0}),m(Gs)!=="svelte-1qh2n66"&&(Gs.textContent=it),za=e(s),c(zs.$$.fragment,s),Ha=e(s),Hs=M(s,"P",{"data-svelte-h":!0}),m(Hs)!=="svelte-12dq90h"&&(Hs.textContent=ct),Wa=e(s),c(Ws.$$.fragment,s),Xa=e(s),Xs=M(s,"P",{"data-svelte-h":!0}),m(Xs)!=="svelte-pcm8dz"&&(Xs.innerHTML=ot),Ka=e(s),c(Ks.$$.fragment,s),Fa=e(s),b=M(s,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),m(b)!=="svelte-1mf2jpm"&&(b.innerHTML=rt),Ya=e(s),Fs=M(s,"P",{"data-svelte-h":!0}),m(Fs)!=="svelte-1cc5cfv"&&(Fs.textContent=yt),Pa=e(s),c(Ys.$$.fragment,s),La=e(s),Ps=M(s,"P",{"data-svelte-h":!0}),m(Ps)!=="svelte-147fp2n"&&(Ps.innerHTML=jt),Oa=e(s),c(Ls.$$.fragment,s),sn=e(s),c(Os.$$.fragment,s),ln=e(s),sl=M(s,"P",{"data-svelte-h":!0}),m(sl)!=="svelte-uhnvvo"&&(sl.textContent=ut),an=e(s),c(ll.$$.fragment,s),nn=e(s),cl=M(s,"P",{}),rl(cl).forEach(a),this.h()},h(){el(h,"name","hf:doc:metadata"),el(h,"content",Qt),el(C,"class","tip"),bl.a=fl,el(d,"class","tip"),Sl.a=null,Gl.a=null,el(I,"class","tip"),el(g,"class","tip"),el(b,"class","tip")},m(s,l){J(document.head,h),n(s,jl,l),n(s,il,l),n(s,ul,l),o(f,s,l),n(s,Ul,l),o(A,s,l),n(s,Jl,l),o(V,s,l),n(s,hl,l),n(s,k,l),n(s,wl,l),o(Q,s,l),n(s,Cl,l),n(s,C,l),n(s,Tl,l),o(q,s,l),n(s,dl,l),n(s,E,l),n(s,Il,l),n(s,x,l),n(s,gl,l),n(s,T,l),J(T,pn),bl.m(Ut,T),J(T,fl),n(s,Al,l),n(s,$,l),n(s,Vl,l),n(s,v,l),n(s,kl,l),n(s,R,l),n(s,Ql,l),o(N,s,l),n(s,ql,l),n(s,D,l),n(s,El,l),o(Z,s,l),n(s,xl,l),o(_,s,l),n(s,$l,l),n(s,S,l),n(s,vl,l),n(s,B,l),n(s,Rl,l),n(s,G,l),n(s,Nl,l),o(z,s,l),n(s,Dl,l),n(s,H,l),n(s,Zl,l),n(s,d,l),n(s,_l,l),n(s,U,l),J(U,Mn),J(U,pl),J(U,mn),J(U,Ml),J(U,cn),Sl.m(Jt,U),n(s,Bl,l),n(s,w,l),J(w,on),J(w,ml),J(w,rn),Gl.m(ht,w),n(s,zl,l),n(s,W,l),n(s,Hl,l),n(s,X,l),n(s,Wl,l),o(K,s,l),n(s,Xl,l),n(s,F,l),n(s,Kl,l),n(s,Y,l),n(s,Fl,l),n(s,P,l),n(s,Yl,l),n(s,L,l),n(s,Pl,l),o(O,s,l),n(s,Ll,l),n(s,ss,l),n(s,Ol,l),n(s,I,l),n(s,sa,l),o(ls,s,l),n(s,la,l),n(s,as,l),n(s,aa,l),n(s,ns,l),n(s,na,l),n(s,ts,l),n(s,ta,l),o(es,s,l),n(s,ea,l),n(s,ps,l),n(s,pa,l),o(Ms,s,l),n(s,Ma,l),n(s,ms,l),n(s,ma,l),o(is,s,l),n(s,ia,l),n(s,cs,l),n(s,ca,l),n(s,os,l),n(s,oa,l),o(rs,s,l),n(s,ra,l),n(s,ys,l),n(s,ya,l),o(js,s,l),n(s,ja,l),n(s,us,l),n(s,ua,l),o(Us,s,l),n(s,Ua,l),n(s,Js,l),n(s,Ja,l),n(s,hs,l),n(s,ha,l),o(ws,s,l),n(s,wa,l),n(s,Cs,l),n(s,Ca,l),o(Ts,s,l),n(s,Ta,l),n(s,ds,l),n(s,da,l),o(Is,s,l),n(s,Ia,l),n(s,gs,l),n(s,ga,l),o(bs,s,l),n(s,ba,l),o(fs,s,l),n(s,fa,l),n(s,As,l),n(s,Aa,l),o(Vs,s,l),n(s,Va,l),n(s,g,l),n(s,ka,l),n(s,ks,l),n(s,Qa,l),o(Qs,s,l),n(s,qa,l),n(s,qs,l),n(s,Ea,l),n(s,Es,l),n(s,xa,l),n(s,xs,l),n(s,$a,l),o($s,s,l),n(s,va,l),n(s,vs,l),n(s,Ra,l),o(Rs,s,l),n(s,Na,l),o(Ns,s,l),n(s,Da,l),n(s,Ds,l),n(s,Za,l),o(Zs,s,l),n(s,_a,l),n(s,_s,l),n(s,Sa,l),o(Ss,s,l),n(s,Ba,l),o(Bs,s,l),n(s,Ga,l),n(s,Gs,l),n(s,za,l),o(zs,s,l),n(s,Ha,l),n(s,Hs,l),n(s,Wa,l),o(Ws,s,l),n(s,Xa,l),n(s,Xs,l),n(s,Ka,l),o(Ks,s,l),n(s,Fa,l),n(s,b,l),n(s,Ya,l),n(s,Fs,l),n(s,Pa,l),o(Ys,s,l),n(s,La,l),n(s,Ps,l),n(s,Oa,l),o(Ls,s,l),n(s,sn,l),o(Os,s,l),n(s,ln,l),n(s,sl,l),n(s,an,l),o(ll,s,l),n(s,nn,l),n(s,cl,l),tn=!0},p:Ct,i(s){tn||(r(f.$$.fragment,s),r(A.$$.fragment,s),r(V.$$.fragment,s),r(Q.$$.fragment,s),r(q.$$.fragment,s),r(N.$$.fragment,s),r(Z.$$.fragment,s),r(_.$$.fragment,s),r(z.$$.fragment,s),r(K.$$.fragment,s),r(O.$$.fragment,s),r(ls.$$.fragment,s),r(es.$$.fragment,s),r(Ms.$$.fragment,s),r(is.$$.fragment,s),r(rs.$$.fragment,s),r(js.$$.fragment,s),r(Us.$$.fragment,s),r(ws.$$.fragment,s),r(Ts.$$.fragment,s),r(Is.$$.fragment,s),r(bs.$$.fragment,s),r(fs.$$.fragment,s),r(Vs.$$.fragment,s),r(Qs.$$.fragment,s),r($s.$$.fragment,s),r(Rs.$$.fragment,s),r(Ns.$$.fragment,s),r(Zs.$$.fragment,s),r(Ss.$$.fragment,s),r(Bs.$$.fragment,s),r(zs.$$.fragment,s),r(Ws.$$.fragment,s),r(Ks.$$.fragment,s),r(Ys.$$.fragment,s),r(Ls.$$.fragment,s),r(Os.$$.fragment,s),r(ll.$$.fragment,s),tn=!0)},o(s){y(f.$$.fragment,s),y(A.$$.fragment,s),y(V.$$.fragment,s),y(Q.$$.fragment,s),y(q.$$.fragment,s),y(N.$$.fragment,s),y(Z.$$.fragment,s),y(_.$$.fragment,s),y(z.$$.fragment,s),y(K.$$.fragment,s),y(O.$$.fragment,s),y(ls.$$.fragment,s),y(es.$$.fragment,s),y(Ms.$$.fragment,s),y(is.$$.fragment,s),y(rs.$$.fragment,s),y(js.$$.fragment,s),y(Us.$$.fragment,s),y(ws.$$.fragment,s),y(Ts.$$.fragment,s),y(Is.$$.fragment,s),y(bs.$$.fragment,s),y(fs.$$.fragment,s),y(Vs.$$.fragment,s),y(Qs.$$.fragment,s),y($s.$$.fragment,s),y(Rs.$$.fragment,s),y(Ns.$$.fragment,s),y(Zs.$$.fragment,s),y(Ss.$$.fragment,s),y(Bs.$$.fragment,s),y(zs.$$.fragment,s),y(Ws.$$.fragment,s),y(Ks.$$.fragment,s),y(Ys.$$.fragment,s),y(Ls.$$.fragment,s),y(Os.$$.fragment,s),y(ll.$$.fragment,s),tn=!1},d(s){s&&(a(jl),a(il),a(ul),a(Ul),a(Jl),a(hl),a(k),a(wl),a(Cl),a(C),a(Tl),a(dl),a(E),a(Il),a(x),a(gl),a(T),a(Al),a($),a(Vl),a(v),a(kl),a(R),a(Ql),a(ql),a(D),a(El),a(xl),a($l),a(S),a(vl),a(B),a(Rl),a(G),a(Nl),a(Dl),a(H),a(Zl),a(d),a(_l),a(U),a(Bl),a(w),a(zl),a(W),a(Hl),a(X),a(Wl),a(Xl),a(F),a(Kl),a(Y),a(Fl),a(P),a(Yl),a(L),a(Pl),a(Ll),a(ss),a(Ol),a(I),a(sa),a(la),a(as),a(aa),a(ns),a(na),a(ts),a(ta),a(ea),a(ps),a(pa),a(Ma),a(ms),a(ma),a(ia),a(cs),a(ca),a(os),a(oa),a(ra),a(ys),a(ya),a(ja),a(us),a(ua),a(Ua),a(Js),a(Ja),a(hs),a(ha),a(wa),a(Cs),a(Ca),a(Ta),a(ds),a(da),a(Ia),a(gs),a(ga),a(ba),a(fa),a(As),a(Aa),a(Va),a(g),a(ka),a(ks),a(Qa),a(qa),a(qs),a(Ea),a(Es),a(xa),a(xs),a($a),a(va),a(vs),a(Ra),a(Na),a(Da),a(Ds),a(Za),a(_a),a(_s),a(Sa),a(Ba),a(Ga),a(Gs),a(za),a(Ha),a(Hs),a(Wa),a(Xa),a(Xs),a(Ka),a(Fa),a(b),a(Ya),a(Fs),a(Pa),a(La),a(Ps),a(Oa),a(sn),a(ln),a(sl),a(an),a(nn),a(cl)),a(h),j(f,s),j(A,s),j(V,s),j(Q,s),j(q,s),j(N,s),j(Z,s),j(_,s),j(z,s),j(K,s),j(O,s),j(ls,s),j(es,s),j(Ms,s),j(is,s),j(rs,s),j(js,s),j(Us,s),j(ws,s),j(Ts,s),j(Is,s),j(bs,s),j(fs,s),j(Vs,s),j(Qs,s),j($s,s),j(Rs,s),j(Ns,s),j(Zs,s),j(Ss,s),j(Bs,s),j(zs,s),j(Ws,s),j(Ks,s),j(Ys,s),j(Ls,s),j(Os,s),j(ll,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 qt(un){return Tt(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class Dt extends dt{constructor(h){super(),It(this,h,qt,kt,wt,{})}}export{Dt as component};

Xet Storage Details

Size:
88.3 kB
·
Xet hash:
042a4613833c7977a4ee3356f2b2916ce5d83aaba2a167832f865799a454d074

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