Buckets:
| import{s as tt,o as et,n as ya}from"../chunks/scheduler.37c15a92.js";import{S as pt,i as ot,g as p,s as t,r as M,m as ta,H as tn,A as mt,h as o,f as l,c as e,j as Ma,u as c,x as m,n as ea,E as en,k as st,y as C,a as n,v as r,d as y,t as u,w as j}from"../chunks/index.2bf4358c.js";import{T as ca}from"../chunks/Tip.363c041f.js";import{Y as it}from"../chunks/Youtube.1e50a667.js";import{C as h}from"../chunks/CodeBlock.4e987730.js";import{C as Mt}from"../chunks/CourseFloatingBanner.6add7356.js";import{H as ra,E as ct}from"../chunks/getInferenceSnippets.ebf8be91.js";function rt(T){let i,J="💡 บทนี้จะพูดถึง Unigram อย่างละเอียด เราจะเจาะลึกถึงไปถึงการ implement อัลกอริทึมนี้ คุณสามารถข้ามไปตอนท้ายได้ ถ้าคุณสนใจเพียงแค่ภาพรวมคร่าวๆเท่านั้น";return{c(){i=p("p"),i.textContent=J},l(U){i=o(U,"P",{"data-svelte-h":!0}),m(i)!=="svelte-1molaub"&&(i.textContent=J)},m(U,w){n(U,i,w)},p:ya,d(U){U&&l(i)}}}function yt(T){let i,J="✏️ <strong>ตาคุณบ้างแล้ว!</strong> ลองเขียนโค้ดเพื่อคำนวณความถี่ของแต่ละ token แบบตัวอย่างข้างบน และคำนวณผลรวมของทุกความถี่ด้วย แล้วเช็คว่าผลลัพธ์ของคุณถูกหรือไม่";return{c(){i=p("p"),i.innerHTML=J},l(U){i=o(U,"P",{"data-svelte-h":!0}),m(i)!=="svelte-1dyzxiq"&&(i.innerHTML=J)},m(U,w){n(U,i,w)},p:ya,d(U){U&&l(i)}}}function ut(T){let i,J="✏️ <strong>ตาคุณบ้างแล้ว!</strong> ลองคำนวณการแบ่งคำของ <code>"huggun"</code>และ score ของมัน";return{c(){i=p("p"),i.innerHTML=J},l(U){i=o(U,"P",{"data-svelte-h":!0}),m(i)!=="svelte-u5126a"&&(i.innerHTML=J)},m(U,w){n(U,i,w)},p:ya,d(U){U&&l(i)}}}function jt(T){let i,J="💡 SentencePiece ใช้อัลกอริทึม ชื่อ Enhanced Suffix Array (ESA) ซึ่งมีประสิทธิภาพมากกว่า Ngram ในการสร้าง vocabulary ตั้งต้น";return{c(){i=p("p"),i.textContent=J},l(U){i=o(U,"P",{"data-svelte-h":!0}),m(i)!=="svelte-1lcnp5j"&&(i.textContent=J)},m(U,w){n(U,i,w)},p:ya,d(U){U&&l(i)}}}function Ut(T){let i,J=`💡 วิธีการคำนวณแบบข้างบนนี้ถือว่าไม่มีประสิทธิภาพนัก ดังนั้น SentencePiece จะคำนวณค่า loss แบบคร่าวๆเท่านั้น เวลาที่เราลองลบ token แต่ละตัวออก โดยมันจะแทนที่ token นั้นด้วย segmentation ของมันแทนที่จะใช้ token เต็มๆ | |
| การทำแบบนี้ช่วยให้เราสามารถคำนวณ score ของทุกๆตัวได้ภายในครั้งเดียว และยังสามารถคำนวณไปพร้อมๆกับค่า loss ได้อีกด้วย`;return{c(){i=p("p"),i.textContent=J},l(U){i=o(U,"P",{"data-svelte-h":!0}),m(i)!=="svelte-1nggbnc"&&(i.textContent=J)},m(U,w){n(U,i,w)},p:ya,d(U){U&&l(i)}}}function ht(T){let i,J,U,w,Z,ua,A,ja,_,pn="อัลกอริทึม Unigram มักจะถูกใช้บ่อยใน SentencePiece ซึ่งเป็นอีกอัลกอริทึมสำหรับการ tokenization ที่ใช้ในโมเดลเช่น AlBERT, T5, mBART, Big Bird, และ XLNet",Ua,V,ha,f,Ja,N,wa,Q,on=`เมื่อเทียบกับ BPE และ WordPiece การตัดคำแบบ Unigram ทำงานกลับกันคือ เริ่มจาก vocabulary ตั้งต้นขนาดใหญ่ แล้วอัลกอริทึมจะพยายามลบ token ออกจาก vocabulary จนกว่าจะได้ขนาด vocabulary ที่เราต้องการ | |
| การสร้าง vocabulary ตั้งต้นทำได้หลายวิธี คุณอาจจะใช้คำย่อยที่พบบ่อยที่สุด หรือคุณอาจจะใช้ BPE เพื่อสร้าง vocabulary ตั้งต้น โดยตั้งค่าขนาด vocabulary ให้มีขนาดค่อนข้างใหญ่ | |
| ในการเทรนแต่ละครั้ง อัลกอริทึม Unigram จะคำนวณค่า loss ของ training corpus ซึ่งขึ้นกับ vocabulary ที่มีในขณะนั้น | |
| จากนั้น มันจะลองลบ แต่ละ token ออกจาก vocabulary แล้วคำนวณค่า loss อีกที`,Ta,I,Ll,da,at='<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>',Ca,ga,z,mn=`ขั้นตอนนี้จะใช้อัลกอริทึมสำหรับ tokenization ของโมเดล Unigram | |
| เราจะใช้ corpus เดียวกันกับในตัวอย่างก่อนๆ :`,ba,G,fa,B,Mn="โดยที่เราจะใช้ทุกๆคำย่อยของแต่ละคำ มาสร้าง vocabulary ตั้งต้น :",Ia,S,ka,R,$a,E,cn=`โมเดล Unigram เป็น language model ประเภทหนึ่งที่ประมวลผลแต่ละ token ในข้อความ โดยมองว่ามันไม่มีส่วนเกี่ยวข้องกับ token ตัวอื่นๆ (not dependent) | |
| Unigram ถือว่าเป็น language model ประเภทที่ซับซ้อนน้อยที่สุด เพราะว่าเวลาที่เราคำนวณความน่าจะเป็น(probability)ของ token ที่อยู่ในข้อความใดข้อความหนึ่ง เราไม่ต้องพิจารณา token ตัวอื่นๆในข้อความด้วย | |
| ดังนั้น ถ้าเราใช้ Unigram language model เพื่อผลิตข้อความ มันก็จะผลิตคำที่พบบ่อยที่สุดทุกๆครั้ง (language model จะ predict คำที่มีความน่าจะเป็นสูงที่สุดเวลาที่มันผลิตข้อความ)`,va,H,rn="ความน่าจะเป็นของ token หนึ่งจะเท่ากับความถี่ของคำนั้นๆที่เราพบใน corpus หารกับ ผลรวมของความถี่ของ token ทุกตัวใน vocabulary (ส่วนหารนี้จะช่วยทำให้ค่าความน่าจะเป็นของแต่ละ token รวมกันได้ 1)",qa,X,yn="ตัวอย่างเช่น <code>"ug"</code> เป็นคำย่อย (subword) ที่อยู่ใน <code>"hug"</code>, <code>"pug"</code>, และ <code>"hugs"</code> ดังนั้นความถี่ของมันก็คือ 20",xa,W,un="ข้างล่างนี้คือความถี่ของคำย่อยทุกๆตัวใน vocabulary ของเรา :",Za,K,Aa,Y,jn="และผลรวมของทุกๆความถี่ก็คือ 210 ดังนั้นความน่าจะเป็นของ <code>"ug"</code> ก็คือ 20/210",_a,k,Va,D,Un=`ในการ tokenize คำๆหนึ่งนั้น เราจะคำนวณทุกๆการตัดคำที่เป็นไปได้ (segmentation) และคำนวณความน่าจะเป็นของแต่ละ segmentation ด้วย โดยใช้วิธีการคำนวณตามโมเดล Unigram | |
| เนื่องจากแต่ละ token ไม่ได้ขึ้นกับ token ตัวอื่น ค่าความน่าจะเป็นของแต่ละ segmentation สามารถคำนวณได้โดย นำค่าความน่าจะเป็นของแต่ละ token ย่อยใน segmentation นั้นมาคูณกัน`,Na,d,Ol,pa,hn='"pug"',sn,oa,Jn='["p", "u", "g"]',an,Qa,lt='<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">"</mi><mo separator="true">,</mo><mi mathvariant="normal">‘</mi><mi mathvariant="normal">‘</mi><mi>u</mi><mi mathvariant="normal">"</mi><mo separator="true">,</mo><mi mathvariant="normal">‘</mi><mi mathvariant="normal">‘</mi><mi>g</mi><mi mathvariant="normal">"</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">"</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">"</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">"</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", ``u", ``g"]) = P(``p") \\times P(``u") \\times P(``g") = \\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">"</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">"</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">"</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">"</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">"</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">"</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>',za,b,ln,ma,wn='["pu", "g"]',nn,Ga,nt='<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">"</mi><mo separator="true">,</mo><mi mathvariant="normal">‘</mi><mi mathvariant="normal">‘</mi><mi>g</mi><mi mathvariant="normal">"</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">"</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">"</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", ``g"]) = P(``pu") \\times P(``g") = \\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">"</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">"</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">"</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">"</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>',Ba,F,Tn=`ปกติแล้วถ้า segmentation มีจำนวนคำย่อยน้อย มันจะมีค่าความน่าจะเป็นที่สูง (เพราะว่า ในการคำนวณความน่าจะเป็นของแต่ละ token ทุกตัวจะถูกหารด้วยค่าเดียวกันคือ 210) | |
| ผลลัพธ์แบบนี้ถือว่าดี เพราะสอดคล้องกับสิ่งที่เราต้องการ นั่นคือเราต้องการแยกคำออกเป็นคำย่อยๆ โดยให้มีจำนวนคำย่อยน้อยที่สุดเท่าที่จะเป็นไปได้`,Sa,P,dn="สำหรับตัวอย่าง <code>"pug"</code> เราจะได้ความน่าจะเป็นของแต่ละ segmentation ดังนี้ :",Ra,L,Ea,O,Cn=`จะเห็นว่า <code>["p", "ug"]</code> หรือ <code>["pu", "g"]</code> มีความน่าจะเป็นเท่ากัน ดังนั้นโปรแกรมของเราจะเลือก segmentation ใดก็ได้ ขึ้นกับว่าโปรแกรมของเราจะอ่านเจอผลลัพธ์ใดก่อน (อย่างไรก็ตามใน corpus ใหญ่ๆ เราจะไม่ค่อยเห็นกรณีแบบนี้ ที่หลาย segmentation มีความน่าจะเป็นเท่ากัน) | |
| เนื่องจากเราใช้ตัวอย่างสั้นๆง่ายๆ อาจจะทำให้ดูเหมือนการคำนวณ segmentation ทั้งหมด รวมถึงค่าความน่าจะเป็น ทำได้อย่างง่ายดาย แต่ปกติแล้วการคำนวณจะยากกว่านี้`,Ha,ss,gn=`อัลกอริทึมหนึ่งที่จะช่วยหา segmentation ที่ดีที่สุดให้เรา ก็คือ <em>Viterbi algorithm</em> | |
| มันจะสร้างกราฟที่สามารถคำนวณหา segmentation ที่เป็นไปได้ทั้งหมดของคำที่เราต้องการจะ tokenize ตัวอย่างเช่น ถ้า <em>a</em> และ <em>b</em> เป็นคำย่อยที่มีอยู่ใน vocabulary อัลกอริทึมก็จะสร้างกราฟเชื่อมจาก <em>a</em> ไปหา <em>b</em> และมันก็จะคำนวณค่าความน่าจะเป็นของคำย่อยพวกนี้และบันทึกลงไปในกราฟเพื่อการคำนวณต่อไป | |
| เป้าหมายของเราคือการหาเส้นทางในกราฟที่แสดงถึง segmentation ที่ดีที่สุด ซึ่งก็คือ segmentation ที่มี score สูงที่สุด | |
| เราจะคำนวณ score จากต้นกราฟไปยังปลายกราฟ ในแต่ละตำแหน่งเราจะ loop ตัวอักษรสุดท้ายของแต่ละคำย่อยทุกๆตัวที่เป็นไปได้ในตำแหน่งนั้น และเลือกคำย่อยที่มี score สูงที่สุด | |
| และต่อแบบนี้ไปเรื่อยๆจนถึงตำแหน่งสุดท้าย`,Xa,as,bn="มาดูตัวอย่างกับคำว่า <code>"unhug"</code> กัน ในแต่ละตำแหน่ง เราได้คำนวณเพื่อหาคำย่อยที่ตัวอักษรสุดท้ายมี score สูงที่สุด :",Wa,ls,Ka,ns,fn="ดังนั้น <code>"unhug"</code> ก็จะถูกแบ่งเป็น <code>["un", "hug"]</code>",Ya,$,Da,ts,Fa,es,In=`หลังจากที่คุณได้รู้แล้วว่าอัลกอริทึมนี้ tokenize คำอย่างไร ในหัวข้อนี้ เราจะมาดูกันอย่างละเอียดว่า เราจะคำนวณค่า loss เพื่อการเทรนได้อย่างไร | |
| ในทุกๆรอบของการเทรน เราจะคำนวณค่า loss โดยเราจะ tokenize แต่ละคำใน corpus ตามข้อมูลใน vocabulary และโมเดล Unigram ที่เราสร้างจากการคำนวณความถี่ของแต่ละ token ใน corpus (อย่างที่เราได้เรียนกันแล้วข้างบน) | |
| แต่ละคำใน corpus จะมีค่า score ของมัน ส่วนค่า loss เราจะคำนวณจาก negative log likelihood ของ score พวกนี้ ซึ่งเท่ากับ ผลรวมของ <code>-log(P(word))</code> ของทุกๆคำ`,Pa,ps,kn="กลับมาดูตัวอย่างกัน นี่คือ corpus ของเรา :",La,os,Oa,ms,$n="ข้างล่างนี้คือ segmentation ที่ดีที่สุดของแต่ละคำ และ score ของมัน ที่เราใช้โมเดล Ngram คำนวณ :",sl,is,al,Ms,vn="ดังนั้นค่า loss ก็คือ :",ll,cs,nl,rs,qn=`จากนั้นเราจะคำนวณว่า ถ้าเราลบคำใดคำหนึ่งออก มันจะกระทบค่า loss อย่างไร | |
| ขั้นตอนนี้ค่อนข้างซับซ้อน ดังนั้นเราใช้แค่ token สองตัวเป็นตัวอย่าง และจะเขียนโค้ดเพื่อช่วยคำนวณภายหลัง | |
| ถ้าคุณยังจำได้ เรามีสอง segmentation ที่มี score เท่ากัน ตัวอย่างเช่น <code>"pug"</code> สามารถถูกแบ่งเป็น <code>["p", "ug"]</code> ได้ด้วย | |
| ดังนั้น ถ้าเราลบ <code>"pu"</code> ออกจาก vocabulary เราก็จะยังได้ค่า loss เท่าเดิม | |
| ในทางกลับกัน ถ้าเราลบ <code>"hug"</code> ออก ค่า loss จะเพิ่มสูงขึ้นมาก นั่นก็เพราะว่า ผลลัพธ์ของ <code>"hug"</code> และ <code>"hugs"</code> จะเปลี่ยนเป็น`,tl,ys,el,us,xn="การเปลี่ยนแปลงนี้ทำให้ score เปลี่ยนไป และค่า loss รวมก็จะสูงขึ้น :",pl,js,ol,Us,Zn="ดังนั้นเราจึงควรจะลบ <code>"pu"</code> ออก แต่เก็บ <code>"hug"</code> ไว้",ml,hs,il,Js,An=`ในหัวข้อนี้ เราจะมา implement ทุกอย่างกัน | |
| เช่นเดียวกับในตัวอย่างของ BPE และ WordPiece โค้ดที่เราจะสอนต่อไปนี้ไม่ใช่โค้ดที่มีประสิทธิภาพที่สุด เราเพียงต้องการให้คุณเข้าในการทำงานของอัลกอริทึมเท่านั้น | |
| เราจะใช้ corpus เดียวกับตัวอย่างก่อนๆ :`,Ml,ws,cl,Ts,_n="ครั้งนี้เราจะใช้โมเดล <code>xlnet-base-cased</code> :",rl,ds,yl,Cs,Vn="เช่นเดียวกันกับ BPE และ WordPiece เราเริ่มจากการนับจำนวน(ความถี่)ของแต่ละคำใน corpus :",ul,gs,jl,bs,Nn="จากนั้น เราจะต้องสร้าง vocabulary ตั้งต้นให้ใหญ่กว่า ขนาด vocabulary ที่เราต้องการ",Ul,fs,Qn="vocabulary จะต้องมีตัวอักษรพื้นฐาน ไม่เช่นนั้นเราจะ tokenize ไม่ได้เลย ส่วน token ที่ใหญ่ขึ้น(subwords) เราจะใช้เฉพาะตัวที่พบบ่อยๆเท่านั้น ซึ่งเราจะเรียงลำดับพวกมันตามความถี่ ดังนี้ :",hl,Is,Jl,ks,wl,$s,zn="เราจะนำตัวอักษรและ subwords ที่มีความถี่สูงพวกนี้ มารวมกันเพื่อสร้าง vocabulary ตั้งต้น ขนาด 300 token :",Tl,vs,dl,v,Cl,qs,Gn="ขั้นตอนต่อไป เราจะคำนวณผลรวมของความถี่ของทุกๆคำ เพื่อแปลงความถี่เป็นค่าความน่าจะเป็น",gl,xs,Bn="สำหรับโมเดลของเรา เราจะคำนวณค่าลอการิทึมของความน่าจะเป็น แทนที่จะใช้ความน่าจะเป็นเท่านั้น เพราะว่ามันจะทำให้การคำนวณมีความเสถียรมากกว่า เมื่อเทียบกับการคูณจำนวนน้อยๆหลายๆจำนวน และมันยังช่วยทำให้การคำนวณค่า loss ทำได้ง่ายขึ้นด้วย :",bl,Zs,fl,As,Sn=`ฟังก์ชันหลักของ tokenizer นี้คือการ tokenize คำ โดยใช้อัลกอริทึม Viterbi ช่วย | |
| อย่างที่คุณได้เห็นมาแล้ว อัลกอริทึม Viterbi จะคำนวณหาการแบ่งคำที่ดีที่สุดให้กับแต่ละคำใน corpus ซึ่ง segmentation พวกนี้จะถูกเซฟไว้ใน list ชื่อ <code>best_segmentations</code> | |
| สำหรับคำที่เราต้องการจะ tokenize ในแต่ละตำแหน่ง (เริ่มจาก 0 ถึง ความยาวของคำ) เราจะสร้าง dictionary ขึ้นมา ซึ่งมีคีย์สองตัว ตัวแรกคือ index ของตัวอักษรแรกของ token สุดท้ายใน segmentation ที่ดีที่สุดของคำนั้น และคีย์ตัวที่สองคือค่า score ของ segmentation ที่ดีที่สุด | |
| คีย์ที่เก็บ index นี้ จะช่วยให้เราสามารถคำนวณ segmentation เต็มๆได้ หลังจากที่เราเพิ่มข้อมูลลงใน list แล้ว`,Il,_s,Rn=`เริ่มจากเราจะ for loop สองครั้ง เพื่อค้นหาคำย่อยในคำหลักที่อาจจะอยู่ใน vocabulary โดย loop แรกเอาไว้หาตำแหน่งเริ่มต้นของคำย่อย ส่วน loop ที่สองเอาไว้หาตำแหน่งจบของคำย่อยนั้น | |
| ถ้าเราเจอคำย่อยที่อยู่ใน vocabulary เราจะสร้าง segmentation ใหม่ขึ้นมาโดยแบ่งคำหลักตรงคำย่อยนี้ และก่อนที่จะบันทึก segmentation นี้ลงไป เราจะเทียบกับ score ของมันกับ score ของ segmentation ที่มีอยู่แล้วใน <code>best_segmentations</code> | |
| หลังจาก loop จบ เราจะคำนวณหา segmentation ที่ดีที่สุดของคำ input โดยอ่านจากตำแหน่งสุดท้ายของคำไปหาต้นคำ และบันทึกคำย่อยที่ดีที่สุดเอาไว้สำหรับทุกๆตำแหน่ง :`,kl,Vs,$l,Ns,En="ตอนนี้เราก็สามารถลองใช้โมเดลได้แล้ว :",vl,Qs,ql,zs,xl,Gs,Hn="และเราก็ยังสามารถคำนวณค่า loss ได้อย่างง่ายดายอีกด้วย :",Zl,Bs,Al,Ss,Xn="มาเช็คผลลัพธ์การคำนวณ loss จากโมเดลของเรากัน :",_l,Rs,Vl,Es,Nl,Hs,Wn="การคำนวณ score ให้แต่ละ token ก็ไม่ยากเช่นกัน โดยเราจะคำนวณค่า loss หลังจากที่เราลบ token นั้นออก :",Ql,Xs,zl,Ws,Kn="ลองรันโค้ดกับ token ตัวอย่างดังนี้ :",Gl,Ks,Bl,Ys,Yn=`เนื่องจาก <code>"ll"</code> ถูกใช้ในการ tokenize คำว่า <code>"Hopefully"</code> ถ้าเราลบมันออก เราจะต้องใช้ <code>"l"</code> สองครั้งแทน ในกรณีนี้ ค่า loss จะสูงขึ้น | |
| ส่วน <code>"his"</code> ถูกใช้แค่ในคำว่า <code>"This"</code> ซึ่งคำนี้ถูก tokenize ให้เป็นตัวมันเอง(ไม่มีการแบ่ง) หากเราลบมันออก <code>"his"</code> ก็จะไม่มีผลต่อค่า loss มาดูผลลัพธ์กัน :`,Sl,Ds,Rl,q,El,Fs,Dn="สิ่งสุดท้ายที่เราจะต้องทำก็คือ เพิ่ม token พิเศษที่โมเดลใช้ลงไปใน vocabulary จากนั้น loop จนกว่าเราจะลบ token ออกจาก vocabulary จนได้ขนาดที่เราพอใจ :",Hl,Ps,Xl,Ls,Fn="เมื่อเราต้องการจะ tokenize ประโยคหรือข้อความ สิ่งที่เราต้องทำก็คือทำการ pre-tokenization ข้อความนั้น แล้วรันฟังก์ชัน <code>encode_word()</code> ของเรา :",Wl,Os,Kl,sa,Yl,aa,Pn="จบแล้วสำหรับอัลกอริทึม Unigram หวังว่าถึงตอนนี้คุณจะรู้สึกว่าคุณเป็นผู้เชี่ยวชาญด้าน tokenizer ในระดับหนึ่งแล้ว ในบทถัดไปเราจะพูดถึงส่วนประกอบสำคัญของ 🤗 Tokenizers library และมาดูกันว่าคุณจะใช้มันเพื่อสร้าง tokenizer ของคุณเองได้อย่างไร",Dl,la,Fl,ia,Pl;return Z=new ra({props:{title:"Unigram tokenization",local:"unigram-tokenization",headingTag:"h1"}}),A=new Mt({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/th/chapter6/section7.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/th/chapter6/section7.ipynb"}]}}),V=new it({props:{id:"TGZfZVuF9Yc"}}),f=new ca({props:{$$slots:{default:[rt]},$$scope:{ctx:T}}}),N=new ra({props:{title:"Training algorithm",local:"training-algorithm",headingTag:"h2"}}),G=new h({props:{code:"KCUyMmh1ZyUyMiUyQyUyMDEwKSUyQyUyMCglMjJwdWclMjIlMkMlMjA1KSUyQyUyMCglMjJwdW4lMjIlMkMlMjAxMiklMkMlMjAoJTIyYnVuJTIyJTJDJTIwNCklMkMlMjAoJTIyaHVncyUyMiUyQyUyMDUp",highlighted:'(<span class="hljs-string">"hug"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">10</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">"pug"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">5</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">"pun"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">12</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">"bun"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">4</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">"hugs"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">5</span>)',wrap:!1}}),S=new h({props:{code:"JTVCJTIyaCUyMiUyQyUyMCUyMnUlMjIlMkMlMjAlMjJnJTIyJTJDJTIwJTIyaHUlMjIlMkMlMjAlMjJ1ZyUyMiUyQyUyMCUyMnAlMjIlMkMlMjAlMjJwdSUyMiUyQyUyMCUyMm4lMjIlMkMlMjAlMjJ1biUyMiUyQyUyMCUyMmIlMjIlMkMlMjAlMjJidSUyMiUyQyUyMCUyMnMlMjIlMkMlMjAlMjJodWclMjIlMkMlMjAlMjJncyUyMiUyQyUyMCUyMnVncyUyMiU1RA==",highlighted:'<span class="hljs-selector-attr">[<span class="hljs-string">"h"</span>, <span class="hljs-string">"u"</span>, <span class="hljs-string">"g"</span>, <span class="hljs-string">"hu"</span>, <span class="hljs-string">"ug"</span>, <span class="hljs-string">"p"</span>, <span class="hljs-string">"pu"</span>, <span class="hljs-string">"n"</span>, <span class="hljs-string">"un"</span>, <span class="hljs-string">"b"</span>, <span class="hljs-string">"bu"</span>, <span class="hljs-string">"s"</span>, <span class="hljs-string">"hug"</span>, <span class="hljs-string">"gs"</span>, <span class="hljs-string">"ugs"</span>]</span>',wrap:!1}}),R=new ra({props:{title:"Tokenization algorithm",local:"tokenization-algorithm",headingTag:"h2"}}),K=new h({props:{code:"KCUyMmglMjIlMkMlMjAxNSklMjAoJTIydSUyMiUyQyUyMDM2KSUyMCglMjJnJTIyJTJDJTIwMjApJTIwKCUyMmh1JTIyJTJDJTIwMTUpJTIwKCUyMnVnJTIyJTJDJTIwMjApJTIwKCUyMnAlMjIlMkMlMjAxNyklMjAoJTIycHUlMjIlMkMlMjAxNyklMjAoJTIybiUyMiUyQyUyMDE2KSUwQSglMjJ1biUyMiUyQyUyMDE2KSUyMCglMjJiJTIyJTJDJTIwNCklMjAoJTIyYnUlMjIlMkMlMjA0KSUyMCglMjJzJTIyJTJDJTIwNSklMjAoJTIyaHVnJTIyJTJDJTIwMTUpJTIwKCUyMmdzJTIyJTJDJTIwNSklMjAoJTIydWdzJTIyJTJDJTIwNSk=",highlighted:`(<span class="hljs-string">"h"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">15</span>) (<span class="hljs-string">"u"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">36</span>) (<span class="hljs-string">"g"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">20</span>) (<span class="hljs-string">"hu"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">15</span>) (<span class="hljs-string">"ug"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">20</span>) (<span class="hljs-string">"p"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">17</span>) (<span class="hljs-string">"pu"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">17</span>) (<span class="hljs-string">"n"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">16</span>) | |
| (<span class="hljs-string">"un"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">16</span>) (<span class="hljs-string">"b"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">4</span>) (<span class="hljs-string">"bu"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">4</span>) (<span class="hljs-string">"s"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">5</span>) (<span class="hljs-string">"hug"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">15</span>) (<span class="hljs-string">"gs"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">5</span>) (<span class="hljs-string">"ugs"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">5</span>)`,wrap:!1}}),k=new ca({props:{$$slots:{default:[yt]},$$scope:{ctx:T}}}),L=new h({props:{code:"JTVCJTIycCUyMiUyQyUyMCUyMnUlMjIlMkMlMjAlMjJnJTIyJTVEJTIwJTNBJTIwMC4wMDAzODklMEElNUIlMjJwJTIyJTJDJTIwJTIydWclMjIlNUQlMjAlM0ElMjAwLjAwMjI2NzYlMEElNUIlMjJwdSUyMiUyQyUyMCUyMmclMjIlNUQlMjAlM0ElMjAwLjAwMjI2NzY=",highlighted:`[<span class="hljs-string">"p"</span>, <span class="hljs-string">"u"</span>, <span class="hljs-string">"g"</span>] : 0.000389 | |
| [<span class="hljs-string">"p"</span>, <span class="hljs-string">"ug"</span>] : 0.0022676 | |
| [<span class="hljs-string">"pu"</span>, <span class="hljs-string">"g"</span>] : 0.0022676`,wrap:!1}}),ls=new h({props:{code:"Q2hhcmFjdGVyJTIwMCUyMCh1KSUzQSUyMCUyMnUlMjIlMjAoc2NvcmUlMjAwLjE3MTQyOSklMEFDaGFyYWN0ZXIlMjAxJTIwKG4pJTNBJTIwJTIydW4lMjIlMjAoc2NvcmUlMjAwLjA3NjE5MSklMEFDaGFyYWN0ZXIlMjAyJTIwKGgpJTNBJTIwJTIydW4lMjIlMjAlMjJoJTIyJTIwKHNjb3JlJTIwMC4wMDU0NDIpJTBBQ2hhcmFjdGVyJTIwMyUyMCh1KSUzQSUyMCUyMnVuJTIyJTIwJTIyaHUlMjIlMjAoc2NvcmUlMjAwLjAwNTQ0MiklMEFDaGFyYWN0ZXIlMjA0JTIwKGcpJTNBJTIwJTIydW4lMjIlMjAlMjJodWclMjIlMjAoc2NvcmUlMjAwLjAwNTQ0Mik=",highlighted:`<span class="hljs-attribute">Character</span> <span class="hljs-number">0</span> (u): <span class="hljs-string">"u"</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">"un"</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">"un"</span> <span class="hljs-string">"h"</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">"un"</span> <span class="hljs-string">"hu"</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">"un"</span> <span class="hljs-string">"hug"</span> (score <span class="hljs-number">0</span>.<span class="hljs-number">005442</span>)`,wrap:!1}}),$=new ca({props:{$$slots:{default:[ut]},$$scope:{ctx:T}}}),ts=new ra({props:{title:"กลับมาสู่การเทรน",local:"กลบมาสการเทรน",headingTag:"h2"}}),os=new h({props:{code:"KCUyMmh1ZyUyMiUyQyUyMDEwKSUyQyUyMCglMjJwdWclMjIlMkMlMjA1KSUyQyUyMCglMjJwdW4lMjIlMkMlMjAxMiklMkMlMjAoJTIyYnVuJTIyJTJDJTIwNCklMkMlMjAoJTIyaHVncyUyMiUyQyUyMDUp",highlighted:'(<span class="hljs-string">"hug"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">10</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">"pug"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">5</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">"pun"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">12</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">"bun"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">4</span>)<span class="hljs-punctuation">,</span> (<span class="hljs-string">"hugs"</span><span class="hljs-punctuation">,</span> <span class="hljs-number">5</span>)',wrap:!1}}),is=new h({props:{code:"JTIyaHVnJTIyJTNBJTIwJTVCJTIyaHVnJTIyJTVEJTIwKHNjb3JlJTIwMC4wNzE0MjgpJTBBJTIycHVnJTIyJTNBJTIwJTVCJTIycHUlMjIlMkMlMjAlMjJnJTIyJTVEJTIwKHNjb3JlJTIwMC4wMDc3MTApJTBBJTIycHVuJTIyJTNBJTIwJTVCJTIycHUlMjIlMkMlMjAlMjJuJTIyJTVEJTIwKHNjb3JlJTIwMC4wMDYxNjgpJTBBJTIyYnVuJTIyJTNBJTIwJTVCJTIyYnUlMjIlMkMlMjAlMjJuJTIyJTVEJTIwKHNjb3JlJTIwMC4wMDE0NTEpJTBBJTIyaHVncyUyMiUzQSUyMCU1QiUyMmh1ZyUyMiUyQyUyMCUyMnMlMjIlNUQlMjAoc2NvcmUlMjAwLjAwMTcwMSk=",highlighted:`<span class="hljs-string">"hug"</span>: [<span class="hljs-string">"hug"</span>] <span class="hljs-comment">(score 0.071428)</span> | |
| <span class="hljs-string">"pug"</span>: [<span class="hljs-string">"pu"</span>, <span class="hljs-string">"g"</span>] <span class="hljs-comment">(score 0.007710)</span> | |
| <span class="hljs-string">"pun"</span>: [<span class="hljs-string">"pu"</span>, <span class="hljs-string">"n"</span>] <span class="hljs-comment">(score 0.006168)</span> | |
| <span class="hljs-string">"bun"</span>: [<span class="hljs-string">"bu"</span>, <span class="hljs-string">"n"</span>] <span class="hljs-comment">(score 0.001451)</span> | |
| <span class="hljs-string">"hugs"</span>: [<span class="hljs-string">"hug"</span>, <span class="hljs-string">"s"</span>] <span class="hljs-comment">(score 0.001701)</span>`,wrap:!1}}),cs=new h({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}}),ys=new h({props:{code:"JTIyaHVnJTIyJTNBJTIwJTVCJTIyaHUlMjIlMkMlMjAlMjJnJTIyJTVEJTIwKHNjb3JlJTIwMC4wMDY4MDIpJTBBJTIyaHVncyUyMiUzQSUyMCU1QiUyMmh1JTIyJTJDJTIwJTIyZ3MlMjIlNUQlMjAoc2NvcmUlMjAwLjAwMTcwMSk=",highlighted:`<span class="hljs-string">"hug"</span>: [<span class="hljs-string">"hu"</span>, <span class="hljs-string">"g"</span>] <span class="hljs-comment">(score 0.006802)</span> | |
| <span class="hljs-string">"hugs"</span>: [<span class="hljs-string">"hu"</span>, <span class="hljs-string">"gs"</span>] <span class="hljs-comment">(score 0.001701)</span>`,wrap:!1}}),js=new h({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}}),hs=new ra({props:{title:"Implementing Unigram",local:"implementing-unigram",headingTag:"h2"}}),ws=new h({props:{code:"Y29ycHVzJTIwJTNEJTIwJTVCJTBBJTIwJTIwJTIwJTIwJTIyVGhpcyUyMGlzJTIwdGhlJTIwSHVnZ2luZyUyMEZhY2UlMjBjb3Vyc2UuJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIyVGhpcyUyMGNoYXB0ZXIlMjBpcyUyMGFib3V0JTIwdG9rZW5pemF0aW9uLiUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMlRoaXMlMjBzZWN0aW9uJTIwc2hvd3MlMjBzZXZlcmFsJTIwdG9rZW5pemVyJTIwYWxnb3JpdGhtcy4lMjIlMkMlMEElMjAlMjAlMjAlMjAlMjJIb3BlZnVsbHklMkMlMjB5b3UlMjB3aWxsJTIwYmUlMjBhYmxlJTIwdG8lMjB1bmRlcnN0YW5kJTIwaG93JTIwdGhleSUyMGFyZSUyMHRyYWluZWQlMjBhbmQlMjBnZW5lcmF0ZSUyMHRva2Vucy4lMjIlMkMlMEElNUQ=",highlighted:`corpus = [ | |
| <span class="hljs-string">"This is the Hugging Face course."</span>, | |
| <span class="hljs-string">"This chapter is about tokenization."</span>, | |
| <span class="hljs-string">"This section shows several tokenizer algorithms."</span>, | |
| <span class="hljs-string">"Hopefully, you will be able to understand how they are trained and generate tokens."</span>, | |
| ]`,wrap:!1}}),ds=new h({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">"xlnet-base-cased"</span>)`,wrap:!1}}),gs=new h({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}}),Is=new h({props:{code:"Y2hhcl9mcmVxcyUyMCUzRCUyMGRlZmF1bHRkaWN0KGludCklMEFzdWJ3b3Jkc19mcmVxcyUyMCUzRCUyMGRlZmF1bHRkaWN0KGludCklMEFmb3IlMjB3b3JkJTJDJTIwZnJlcSUyMGluJTIwd29yZF9mcmVxcy5pdGVtcygpJTNBJTBBJTIwJTIwJTIwJTIwZm9yJTIwaSUyMGluJTIwcmFuZ2UobGVuKHdvcmQpKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNoYXJfZnJlcXMlNUJ3b3JkJTVCaSU1RCU1RCUyMCUyQiUzRCUyMGZyZXElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBMb29wJTIwdGhyb3VnaCUyMHRoZSUyMHN1YndvcmRzJTIwb2YlMjBsZW5ndGglMjBhdCUyMGxlYXN0JTIwMiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMGolMjBpbiUyMHJhbmdlKGklMjAlMkIlMjAyJTJDJTIwbGVuKHdvcmQpJTIwJTJCJTIwMSklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzdWJ3b3Jkc19mcmVxcyU1QndvcmQlNUJpJTNBaiU1RCU1RCUyMCUyQiUzRCUyMGZyZXElMEElMEElMjMlMjBTb3J0JTIwc3Vid29yZHMlMjBieSUyMGZyZXF1ZW5jeSUwQXNvcnRlZF9zdWJ3b3JkcyUyMCUzRCUyMHNvcnRlZChzdWJ3b3Jkc19mcmVxcy5pdGVtcygpJTJDJTIwa2V5JTNEbGFtYmRhJTIweCUzQSUyMHglNUIxJTVEJTJDJTIwcmV2ZXJzZSUzRFRydWUpJTBBc29ydGVkX3N1YndvcmRzJTVCJTNBMTAlNUQ=",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"># Loop through the subwords of length at least 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"># Sort subwords by frequency</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}}),ks=new h({props:{code:"JTVCKCclRTIlOTYlODF0JyUyQyUyMDcpJTJDJTIwKCdpcyclMkMlMjA1KSUyQyUyMCgnZXInJTJDJTIwNSklMkMlMjAoJyVFMiU5NiU4MWEnJTJDJTIwNSklMkMlMjAoJyVFMiU5NiU4MXRvJyUyQyUyMDQpJTJDJTIwKCd0byclMkMlMjA0KSUyQyUyMCgnZW4nJTJDJTIwNCklMkMlMjAoJyVFMiU5NiU4MVQnJTJDJTIwMyklMkMlMjAoJyVFMiU5NiU4MVRoJyUyQyUyMDMpJTJDJTIwKCclRTIlOTYlODFUaGknJTJDJTIwMyklNUQ=",highlighted:'[(<span class="hljs-string">'▁t'</span>, <span class="hljs-number">7</span>), (<span class="hljs-string">'is'</span>, <span class="hljs-number">5</span>), (<span class="hljs-string">'er'</span>, <span class="hljs-number">5</span>), (<span class="hljs-string">'▁a'</span>, <span class="hljs-number">5</span>), (<span class="hljs-string">'▁to'</span>, <span class="hljs-number">4</span>), (<span class="hljs-string">'to'</span>, <span class="hljs-number">4</span>), (<span class="hljs-string">'en'</span>, <span class="hljs-number">4</span>), (<span class="hljs-string">'▁T'</span>, <span class="hljs-number">3</span>), (<span class="hljs-string">'▁Th'</span>, <span class="hljs-number">3</span>), (<span class="hljs-string">'▁Thi'</span>, <span class="hljs-number">3</span>)]',wrap:!1}}),vs=new h({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}}),v=new ca({props:{$$slots:{default:[jt]},$$scope:{ctx:T}}}),Zs=new h({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}}),Vs=new h({props:{code:"ZGVmJTIwZW5jb2RlX3dvcmQod29yZCUyQyUyMG1vZGVsKSUzQSUwQSUyMCUyMCUyMCUyMGJlc3Rfc2VnbWVudGF0aW9ucyUyMCUzRCUyMCU1QiU3QiUyMnN0YXJ0JTIyJTNBJTIwMCUyQyUyMCUyMnNjb3JlJTIyJTNBJTIwMSU3RCU1RCUyMCUyQiUyMCU1QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUyMnN0YXJ0JTIyJTNBJTIwTm9uZSUyQyUyMCUyMnNjb3JlJTIyJTNBJTIwTm9uZSU3RCUyMGZvciUyMF8lMjBpbiUyMHJhbmdlKGxlbih3b3JkKSklMEElMjAlMjAlMjAlMjAlNUQlMEElMjAlMjAlMjAlMjBmb3IlMjBzdGFydF9pZHglMjBpbiUyMHJhbmdlKGxlbih3b3JkKSklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBUaGlzJTIwc2hvdWxkJTIwYmUlMjBwcm9wZXJseSUyMGZpbGxlZCUyMGJ5JTIwdGhlJTIwcHJldmlvdXMlMjBzdGVwcyUyMG9mJTIwdGhlJTIwbG9vcCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJlc3Rfc2NvcmVfYXRfc3RhcnQlMjAlM0QlMjBiZXN0X3NlZ21lbnRhdGlvbnMlNUJzdGFydF9pZHglNUQlNUIlMjJzY29yZSUyMiU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMGVuZF9pZHglMjBpbiUyMHJhbmdlKHN0YXJ0X2lkeCUyMCUyQiUyMDElMkMlMjBsZW4od29yZCklMjAlMkIlMjAxKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRva2VuJTIwJTNEJTIwd29yZCU1QnN0YXJ0X2lkeCUzQWVuZF9pZHglNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMHRva2VuJTIwaW4lMjBtb2RlbCUyMGFuZCUyMGJlc3Rfc2NvcmVfYXRfc3RhcnQlMjBpcyUyMG5vdCUyME5vbmUlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzY29yZSUyMCUzRCUyMG1vZGVsJTVCdG9rZW4lNUQlMjAlMkIlMjBiZXN0X3Njb3JlX2F0X3N0YXJ0JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwSWYlMjB3ZSUyMGhhdmUlMjBmb3VuZCUyMGElMjBiZXR0ZXIlMjBzZWdtZW50YXRpb24lMjBlbmRpbmclMjBhdCUyMGVuZF9pZHglMkMlMjB3ZSUyMHVwZGF0ZSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJlc3Rfc2VnbWVudGF0aW9ucyU1QmVuZF9pZHglNUQlNUIlMjJzY29yZSUyMiU1RCUyMGlzJTIwTm9uZSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG9yJTIwYmVzdF9zZWdtZW50YXRpb25zJTVCZW5kX2lkeCU1RCU1QiUyMnNjb3JlJTIyJTVEJTIwJTNFJTIwc2NvcmUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjApJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYmVzdF9zZWdtZW50YXRpb25zJTVCZW5kX2lkeCU1RCUyMCUzRCUyMCU3QiUyMnN0YXJ0JTIyJTNBJTIwc3RhcnRfaWR4JTJDJTIwJTIyc2NvcmUlMjIlM0ElMjBzY29yZSU3RCUwQSUwQSUyMCUyMCUyMCUyMHNlZ21lbnRhdGlvbiUyMCUzRCUyMGJlc3Rfc2VnbWVudGF0aW9ucyU1Qi0xJTVEJTBBJTIwJTIwJTIwJTIwaWYlMjBzZWdtZW50YXRpb24lNUIlMjJzY29yZSUyMiU1RCUyMGlzJTIwTm9uZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFdlJTIwZGlkJTIwbm90JTIwZmluZCUyMGElMjB0b2tlbml6YXRpb24lMjBvZiUyMHRoZSUyMHdvcmQlMjAtJTNFJTIwdW5rbm93biUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJldHVybiUyMCU1QiUyMiUzQ3VuayUzRSUyMiU1RCUyQyUyME5vbmUlMEElMEElMjAlMjAlMjAlMjBzY29yZSUyMCUzRCUyMHNlZ21lbnRhdGlvbiU1QiUyMnNjb3JlJTIyJTVEJTBBJTIwJTIwJTIwJTIwc3RhcnQlMjAlM0QlMjBzZWdtZW50YXRpb24lNUIlMjJzdGFydCUyMiU1RCUwQSUyMCUyMCUyMCUyMGVuZCUyMCUzRCUyMGxlbih3b3JkKSUwQSUyMCUyMCUyMCUyMHRva2VucyUyMCUzRCUyMCU1QiU1RCUwQSUyMCUyMCUyMCUyMHdoaWxlJTIwc3RhcnQlMjAhJTNEJTIwMCUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRva2Vucy5pbnNlcnQoMCUyQyUyMHdvcmQlNUJzdGFydCUzQWVuZCU1RCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBuZXh0X3N0YXJ0JTIwJTNEJTIwYmVzdF9zZWdtZW50YXRpb25zJTVCc3RhcnQlNUQlNUIlMjJzdGFydCUyMiU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGVuZCUyMCUzRCUyMHN0YXJ0JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3RhcnQlMjAlM0QlMjBuZXh0X3N0YXJ0JTBBJTIwJTIwJTIwJTIwdG9rZW5zLmluc2VydCgwJTJDJTIwd29yZCU1QnN0YXJ0JTNBZW5kJTVEKSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMHRva2VucyUyQyUyMHNjb3Jl",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">"start"</span>: <span class="hljs-number">0</span>, <span class="hljs-string">"score"</span>: <span class="hljs-number">1</span>}] + [ | |
| {<span class="hljs-string">"start"</span>: <span class="hljs-literal">None</span>, <span class="hljs-string">"score"</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"># This should be properly filled by the previous steps of the loop</span> | |
| best_score_at_start = best_segmentations[start_idx][<span class="hljs-string">"score"</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"># If we have found a better segmentation ending at end_idx, we update</span> | |
| <span class="hljs-keyword">if</span> ( | |
| best_segmentations[end_idx][<span class="hljs-string">"score"</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">"score"</span>] > score | |
| ): | |
| best_segmentations[end_idx] = {<span class="hljs-string">"start"</span>: start_idx, <span class="hljs-string">"score"</span>: score} | |
| segmentation = best_segmentations[-<span class="hljs-number">1</span>] | |
| <span class="hljs-keyword">if</span> segmentation[<span class="hljs-string">"score"</span>] <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>: | |
| <span class="hljs-comment"># We did not find a tokenization of the word -> unknown</span> | |
| <span class="hljs-keyword">return</span> [<span class="hljs-string">"<unk>"</span>], <span class="hljs-literal">None</span> | |
| score = segmentation[<span class="hljs-string">"score"</span>] | |
| start = segmentation[<span class="hljs-string">"start"</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">"start"</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}}),Qs=new h({props:{code:"cHJpbnQoZW5jb2RlX3dvcmQoJTIySG9wZWZ1bGx5JTIyJTJDJTIwbW9kZWwpKSUwQXByaW50KGVuY29kZV93b3JkKCUyMlRoaXMlMjIlMkMlMjBtb2RlbCkp",highlighted:`<span class="hljs-built_in">print</span>(encode_word(<span class="hljs-string">"Hopefully"</span>, model)) | |
| <span class="hljs-built_in">print</span>(encode_word(<span class="hljs-string">"This"</span>, model))`,wrap:!1}}),zs=new h({props:{code:"KCU1QidIJyUyQyUyMCdvJyUyQyUyMCdwJyUyQyUyMCdlJyUyQyUyMCdmJyUyQyUyMCd1JyUyQyUyMCdsbCclMkMlMjAneSclNUQlMkMlMjA0MS41MTU3NDk0NjAxNDAyKSUwQSglNUInVGhpcyclNUQlMkMlMjA2LjI4ODI2NzAzMDY5NDUzNSk=",highlighted:`([<span class="hljs-string">'H'</span>, <span class="hljs-string">'o'</span>, <span class="hljs-string">'p'</span>, <span class="hljs-string">'e'</span>, <span class="hljs-string">'f'</span>, <span class="hljs-string">'u'</span>, <span class="hljs-string">'ll'</span>, <span class="hljs-string">'y'</span>], <span class="hljs-number">41.5157494601402</span>) | |
| ([<span class="hljs-string">'This'</span>], <span class="hljs-number">6.288267030694535</span>)`,wrap:!1}}),Bs=new h({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}}),Rs=new h({props:{code:"Y29tcHV0ZV9sb3NzKG1vZGVsKQ==",highlighted:"compute_loss(model)",wrap:!1}}),Es=new h({props:{code:"NDEzLjEwMzc3NjQyOTQwODc1",highlighted:'<span class="hljs-number">413.10377642940875</span>',wrap:!1}}),Xs=new h({props:{code:"aW1wb3J0JTIwY29weSUwQSUwQSUwQWRlZiUyMGNvbXB1dGVfc2NvcmVzKG1vZGVsKSUzQSUwQSUyMCUyMCUyMCUyMHNjb3JlcyUyMCUzRCUyMCU3QiU3RCUwQSUyMCUyMCUyMCUyMG1vZGVsX2xvc3MlMjAlM0QlMjBjb21wdXRlX2xvc3MobW9kZWwpJTBBJTIwJTIwJTIwJTIwZm9yJTIwdG9rZW4lMkMlMjBzY29yZSUyMGluJTIwbW9kZWwuaXRlbXMoKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFdlJTIwYWx3YXlzJTIwa2VlcCUyMHRva2VucyUyMG9mJTIwbGVuZ3RoJTIwMSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwbGVuKHRva2VuKSUyMCUzRCUzRCUyMDElM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBjb250aW51ZSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG1vZGVsX3dpdGhvdXRfdG9rZW4lMjAlM0QlMjBjb3B5LmRlZXBjb3B5KG1vZGVsKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMF8lMjAlM0QlMjBtb2RlbF93aXRob3V0X3Rva2VuLnBvcCh0b2tlbiklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzY29yZXMlNUJ0b2tlbiU1RCUyMCUzRCUyMGNvbXB1dGVfbG9zcyhtb2RlbF93aXRob3V0X3Rva2VuKSUyMC0lMjBtb2RlbF9sb3NzJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwc2NvcmVz",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"># We always keep tokens of length 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}}),Ks=new h({props:{code:"c2NvcmVzJTIwJTNEJTIwY29tcHV0ZV9zY29yZXMobW9kZWwpJTBBcHJpbnQoc2NvcmVzJTVCJTIybGwlMjIlNUQpJTBBcHJpbnQoc2NvcmVzJTVCJTIyaGlzJTIyJTVEKQ==",highlighted:`scores = compute_scores(model) | |
| <span class="hljs-built_in">print</span>(scores[<span class="hljs-string">"ll"</span>]) | |
| <span class="hljs-built_in">print</span>(scores[<span class="hljs-string">"his"</span>])`,wrap:!1}}),Ds=new h({props:{code:"Ni4zNzY0MTI0MDM2MjM4NzQlMEEwLjA=",highlighted:`<span class="hljs-number">6.376412403623874</span> | |
| <span class="hljs-number">0.0</span>`,wrap:!1}}),q=new ca({props:{$$slots:{default:[Ut]},$$scope:{ctx:T}}}),Ps=new h({props:{code:"cGVyY2VudF90b19yZW1vdmUlMjAlM0QlMjAwLjElMEF3aGlsZSUyMGxlbihtb2RlbCklMjAlM0UlMjAxMDAlM0ElMEElMjAlMjAlMjAlMjBzY29yZXMlMjAlM0QlMjBjb21wdXRlX3Njb3Jlcyhtb2RlbCklMEElMjAlMjAlMjAlMjBzb3J0ZWRfc2NvcmVzJTIwJTNEJTIwc29ydGVkKHNjb3Jlcy5pdGVtcygpJTJDJTIwa2V5JTNEbGFtYmRhJTIweCUzQSUyMHglNUIxJTVEKSUwQSUyMCUyMCUyMCUyMCUyMyUyMFJlbW92ZSUyMHBlcmNlbnRfdG9fcmVtb3ZlJTIwdG9rZW5zJTIwd2l0aCUyMHRoZSUyMGxvd2VzdCUyMHNjb3Jlcy4lMEElMjAlMjAlMjAlMjBmb3IlMjBpJTIwaW4lMjByYW5nZShpbnQobGVuKG1vZGVsKSUyMColMjBwZXJjZW50X3RvX3JlbW92ZSkpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwXyUyMCUzRCUyMHRva2VuX2ZyZXFzLnBvcChzb3J0ZWRfc2NvcmVzJTVCaSU1RCU1QjAlNUQpJTBBJTBBJTIwJTIwJTIwJTIwdG90YWxfc3VtJTIwJTNEJTIwc3VtKCU1QmZyZXElMjBmb3IlMjB0b2tlbiUyQyUyMGZyZXElMjBpbiUyMHRva2VuX2ZyZXFzLml0ZW1zKCklNUQpJTBBJTIwJTIwJTIwJTIwbW9kZWwlMjAlM0QlMjAlN0J0b2tlbiUzQSUyMC1sb2coZnJlcSUyMCUyRiUyMHRvdGFsX3N1bSklMjBmb3IlMjB0b2tlbiUyQyUyMGZyZXElMjBpbiUyMHRva2VuX2ZyZXFzLml0ZW1zKCklN0Q=",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) > <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"># Remove percent_to_remove tokens with the lowest scores.</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}}),Os=new h({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">"This is the Hugging Face course."</span>, model)`,wrap:!1}}),sa=new h({props:{code:"JTVCJyVFMiU5NiU4MVRoaXMnJTJDJTIwJyVFMiU5NiU4MWlzJyUyQyUyMCclRTIlOTYlODF0aGUnJTJDJTIwJyVFMiU5NiU4MUh1Z2dpbmcnJTJDJTIwJyVFMiU5NiU4MUZhY2UnJTJDJTIwJyVFMiU5NiU4MSclMkMlMjAnYyclMkMlMjAnb3UnJTJDJTIwJ3InJTJDJTIwJ3MnJTJDJTIwJ2UnJTJDJTIwJy4nJTVE",highlighted:'[<span class="hljs-string">'▁This'</span>, <span class="hljs-string">'▁is'</span>, <span class="hljs-string">'▁the'</span>, <span class="hljs-string">'▁Hugging'</span>, <span class="hljs-string">'▁Face'</span>, <span class="hljs-string">'▁'</span>, <span class="hljs-string">'c'</span>, <span class="hljs-string">'ou'</span>, <span class="hljs-string">'r'</span>, <span class="hljs-string">'s'</span>, <span class="hljs-string">'e'</span>, <span class="hljs-string">'.'</span>]',wrap:!1}}),la=new ct({props:{source:"https://github.com/huggingface/course/blob/main/chapters/th/chapter6/7.mdx"}}),{c(){i=p("meta"),J=t(),U=p("p"),w=t(),M(Z.$$.fragment),ua=t(),M(A.$$.fragment),ja=t(),_=p("p"),_.textContent=pn,Ua=t(),M(V.$$.fragment),ha=t(),M(f.$$.fragment),Ja=t(),M(N.$$.fragment),wa=t(),Q=p("p"),Q.textContent=on,Ta=t(),I=p("p"),Ll=ta(`เป้าหมายคือการค้นหา token ที่เมื่อลบออกแล้วจะทำให้ค่า loss เพิ่มน้อยที่สุด | |
| token พวกนี้คือตัวที่ไม่มีผลต่อค่า loss มาก แปลว่า มันไม่มีประโยชน์มาก ทำให้เราสามารถลบมันออกได้ | |
| การคำนวณแบบนี้ค่อนข้างใช้การประมวลผลสูง เราไม่เพียงแค่ลบสัญลักษณ์ออกหนึ่งตัวเท่านั้น แต่เราลบ`),da=new tn(!1),Ca=ta(` เปอร์เซ็นของ token ที่เพิ่มค่าloss น้อยที่สุด (\\(p\\) คือ hyperparameter ที่เราสามารถตั้งค่าได้ ปกติค่าจะอยู่ที่ 10 หรือ 20) | |
| เราจะรันขั้นตอนนี้จนกว่าจะได้ขนาด vocabulary ที่ต้องการ | |
| อย่างไรก็ตาม เราจะไม่ลบตัวอักษรตั้งต้น (base characters) เพื่อที่จะได้มั่นใจว่าเราจะยังสามารถ tokenize ทุกคำได้ | |
| ส่วนหลักของอัลกอริทึมนี้คือการคำนวณค่า loss ของ corpus และดูว่าค่า loss มีการเปลี่ยนแปลงอย่างไรถ้าเราลบ token ตัวใดตัวหนึ่งออกจาก vocabulary เราจะมาอธิบายว่ามันทำงานอย่างไรกัน`),ga=t(),z=p("p"),z.textContent=mn,ba=t(),M(G.$$.fragment),fa=t(),B=p("p"),B.textContent=Mn,Ia=t(),M(S.$$.fragment),ka=t(),M(R.$$.fragment),$a=t(),E=p("p"),E.textContent=cn,va=t(),H=p("p"),H.textContent=rn,qa=t(),X=p("p"),X.innerHTML=yn,xa=t(),W=p("p"),W.textContent=un,Za=t(),M(K.$$.fragment),Aa=t(),Y=p("p"),Y.innerHTML=jn,_a=t(),M(k.$$.fragment),Va=t(),D=p("p"),D.textContent=Un,Na=t(),d=p("p"),Ol=ta("ตัวอย่างเช่น ถ้าเรา tokenize คำว่า "),pa=p("code"),pa.textContent=hn,sn=ta(" แล้วได้ "),oa=p("code"),oa.textContent=Jn,an=ta(` ความน่าจะเป็นของ segmentation นี้ก็คือ | |
| `),Qa=new tn(!1),za=t(),b=p("p"),ln=ta("แต่หากเราแบ่งมันออกเป็น "),ma=p("code"),ma.textContent=wn,nn=ta(` ค่าความน่าจะเป็น ก็จะเท่ากับ : | |
| `),Ga=new tn(!1),Ba=t(),F=p("p"),F.textContent=Tn,Sa=t(),P=p("p"),P.innerHTML=dn,Ra=t(),M(L.$$.fragment),Ea=t(),O=p("p"),O.innerHTML=Cn,Ha=t(),ss=p("p"),ss.innerHTML=gn,Xa=t(),as=p("p"),as.innerHTML=bn,Wa=t(),M(ls.$$.fragment),Ka=t(),ns=p("p"),ns.innerHTML=fn,Ya=t(),M($.$$.fragment),Da=t(),M(ts.$$.fragment),Fa=t(),es=p("p"),es.innerHTML=In,Pa=t(),ps=p("p"),ps.textContent=kn,La=t(),M(os.$$.fragment),Oa=t(),ms=p("p"),ms.textContent=$n,sl=t(),M(is.$$.fragment),al=t(),Ms=p("p"),Ms.textContent=vn,ll=t(),M(cs.$$.fragment),nl=t(),rs=p("p"),rs.innerHTML=qn,tl=t(),M(ys.$$.fragment),el=t(),us=p("p"),us.textContent=xn,pl=t(),M(js.$$.fragment),ol=t(),Us=p("p"),Us.innerHTML=Zn,ml=t(),M(hs.$$.fragment),il=t(),Js=p("p"),Js.textContent=An,Ml=t(),M(ws.$$.fragment),cl=t(),Ts=p("p"),Ts.innerHTML=_n,rl=t(),M(ds.$$.fragment),yl=t(),Cs=p("p"),Cs.textContent=Vn,ul=t(),M(gs.$$.fragment),jl=t(),bs=p("p"),bs.textContent=Nn,Ul=t(),fs=p("p"),fs.textContent=Qn,hl=t(),M(Is.$$.fragment),Jl=t(),M(ks.$$.fragment),wl=t(),$s=p("p"),$s.textContent=zn,Tl=t(),M(vs.$$.fragment),dl=t(),M(v.$$.fragment),Cl=t(),qs=p("p"),qs.textContent=Gn,gl=t(),xs=p("p"),xs.textContent=Bn,bl=t(),M(Zs.$$.fragment),fl=t(),As=p("p"),As.innerHTML=Sn,Il=t(),_s=p("p"),_s.innerHTML=Rn,kl=t(),M(Vs.$$.fragment),$l=t(),Ns=p("p"),Ns.textContent=En,vl=t(),M(Qs.$$.fragment),ql=t(),M(zs.$$.fragment),xl=t(),Gs=p("p"),Gs.textContent=Hn,Zl=t(),M(Bs.$$.fragment),Al=t(),Ss=p("p"),Ss.textContent=Xn,_l=t(),M(Rs.$$.fragment),Vl=t(),M(Es.$$.fragment),Nl=t(),Hs=p("p"),Hs.textContent=Wn,Ql=t(),M(Xs.$$.fragment),zl=t(),Ws=p("p"),Ws.textContent=Kn,Gl=t(),M(Ks.$$.fragment),Bl=t(),Ys=p("p"),Ys.innerHTML=Yn,Sl=t(),M(Ds.$$.fragment),Rl=t(),M(q.$$.fragment),El=t(),Fs=p("p"),Fs.textContent=Dn,Hl=t(),M(Ps.$$.fragment),Xl=t(),Ls=p("p"),Ls.innerHTML=Fn,Wl=t(),M(Os.$$.fragment),Kl=t(),M(sa.$$.fragment),Yl=t(),aa=p("p"),aa.textContent=Pn,Dl=t(),M(la.$$.fragment),Fl=t(),ia=p("p"),this.h()},l(s){const a=mt("svelte-u9bgzb",document.head);i=o(a,"META",{name:!0,content:!0}),a.forEach(l),J=e(s),U=o(s,"P",{}),Ma(U).forEach(l),w=e(s),c(Z.$$.fragment,s),ua=e(s),c(A.$$.fragment,s),ja=e(s),_=o(s,"P",{"data-svelte-h":!0}),m(_)!=="svelte-lvqg9d"&&(_.textContent=pn),Ua=e(s),c(V.$$.fragment,s),ha=e(s),c(f.$$.fragment,s),Ja=e(s),c(N.$$.fragment,s),wa=e(s),Q=o(s,"P",{"data-svelte-h":!0}),m(Q)!=="svelte-nofqfq"&&(Q.textContent=on),Ta=e(s),I=o(s,"P",{});var na=Ma(I);Ll=ea(na,`เป้าหมายคือการค้นหา token ที่เมื่อลบออกแล้วจะทำให้ค่า loss เพิ่มน้อยที่สุด | |
| token พวกนี้คือตัวที่ไม่มีผลต่อค่า loss มาก แปลว่า มันไม่มีประโยชน์มาก ทำให้เราสามารถลบมันออกได้ | |
| การคำนวณแบบนี้ค่อนข้างใช้การประมวลผลสูง เราไม่เพียงแค่ลบสัญลักษณ์ออกหนึ่งตัวเท่านั้น แต่เราลบ`),da=en(na,!1),Ca=ea(na,` เปอร์เซ็นของ token ที่เพิ่มค่าloss น้อยที่สุด (\\(p\\) คือ hyperparameter ที่เราสามารถตั้งค่าได้ ปกติค่าจะอยู่ที่ 10 หรือ 20) | |
| เราจะรันขั้นตอนนี้จนกว่าจะได้ขนาด vocabulary ที่ต้องการ | |
| อย่างไรก็ตาม เราจะไม่ลบตัวอักษรตั้งต้น (base characters) เพื่อที่จะได้มั่นใจว่าเราจะยังสามารถ tokenize ทุกคำได้ | |
| ส่วนหลักของอัลกอริทึมนี้คือการคำนวณค่า loss ของ corpus และดูว่าค่า loss มีการเปลี่ยนแปลงอย่างไรถ้าเราลบ token ตัวใดตัวหนึ่งออกจาก vocabulary เราจะมาอธิบายว่ามันทำงานอย่างไรกัน`),na.forEach(l),ga=e(s),z=o(s,"P",{"data-svelte-h":!0}),m(z)!=="svelte-wrz9a3"&&(z.textContent=mn),ba=e(s),c(G.$$.fragment,s),fa=e(s),B=o(s,"P",{"data-svelte-h":!0}),m(B)!=="svelte-1y1wzic"&&(B.textContent=Mn),Ia=e(s),c(S.$$.fragment,s),ka=e(s),c(R.$$.fragment,s),$a=e(s),E=o(s,"P",{"data-svelte-h":!0}),m(E)!=="svelte-vjacvc"&&(E.textContent=cn),va=e(s),H=o(s,"P",{"data-svelte-h":!0}),m(H)!=="svelte-7wjdzr"&&(H.textContent=rn),qa=e(s),X=o(s,"P",{"data-svelte-h":!0}),m(X)!=="svelte-1lohhmf"&&(X.innerHTML=yn),xa=e(s),W=o(s,"P",{"data-svelte-h":!0}),m(W)!=="svelte-14txu2u"&&(W.textContent=un),Za=e(s),c(K.$$.fragment,s),Aa=e(s),Y=o(s,"P",{"data-svelte-h":!0}),m(Y)!=="svelte-11wziob"&&(Y.innerHTML=jn),_a=e(s),c(k.$$.fragment,s),Va=e(s),D=o(s,"P",{"data-svelte-h":!0}),m(D)!=="svelte-s5c1z2"&&(D.textContent=Un),Na=e(s),d=o(s,"P",{});var g=Ma(d);Ol=ea(g,"ตัวอย่างเช่น ถ้าเรา tokenize คำว่า "),pa=o(g,"CODE",{"data-svelte-h":!0}),m(pa)!=="svelte-1gjdq76"&&(pa.textContent=hn),sn=ea(g," แล้วได้ "),oa=o(g,"CODE",{"data-svelte-h":!0}),m(oa)!=="svelte-1n2m4po"&&(oa.textContent=Jn),an=ea(g,` ความน่าจะเป็นของ segmentation นี้ก็คือ | |
| `),Qa=en(g,!1),g.forEach(l),za=e(s),b=o(s,"P",{});var x=Ma(b);ln=ea(x,"แต่หากเราแบ่งมันออกเป็น "),ma=o(x,"CODE",{"data-svelte-h":!0}),m(ma)!=="svelte-42m5r0"&&(ma.textContent=wn),nn=ea(x,` ค่าความน่าจะเป็น ก็จะเท่ากับ : | |
| `),Ga=en(x,!1),x.forEach(l),Ba=e(s),F=o(s,"P",{"data-svelte-h":!0}),m(F)!=="svelte-17f9t3y"&&(F.textContent=Tn),Sa=e(s),P=o(s,"P",{"data-svelte-h":!0}),m(P)!=="svelte-11zmyzc"&&(P.innerHTML=dn),Ra=e(s),c(L.$$.fragment,s),Ea=e(s),O=o(s,"P",{"data-svelte-h":!0}),m(O)!=="svelte-smg12e"&&(O.innerHTML=Cn),Ha=e(s),ss=o(s,"P",{"data-svelte-h":!0}),m(ss)!=="svelte-13jtm7m"&&(ss.innerHTML=gn),Xa=e(s),as=o(s,"P",{"data-svelte-h":!0}),m(as)!=="svelte-9jf79w"&&(as.innerHTML=bn),Wa=e(s),c(ls.$$.fragment,s),Ka=e(s),ns=o(s,"P",{"data-svelte-h":!0}),m(ns)!=="svelte-8u0x9t"&&(ns.innerHTML=fn),Ya=e(s),c($.$$.fragment,s),Da=e(s),c(ts.$$.fragment,s),Fa=e(s),es=o(s,"P",{"data-svelte-h":!0}),m(es)!=="svelte-pd60dh"&&(es.innerHTML=In),Pa=e(s),ps=o(s,"P",{"data-svelte-h":!0}),m(ps)!=="svelte-sisy1a"&&(ps.textContent=kn),La=e(s),c(os.$$.fragment,s),Oa=e(s),ms=o(s,"P",{"data-svelte-h":!0}),m(ms)!=="svelte-1mmgf43"&&(ms.textContent=$n),sl=e(s),c(is.$$.fragment,s),al=e(s),Ms=o(s,"P",{"data-svelte-h":!0}),m(Ms)!=="svelte-1fkp3t3"&&(Ms.textContent=vn),ll=e(s),c(cs.$$.fragment,s),nl=e(s),rs=o(s,"P",{"data-svelte-h":!0}),m(rs)!=="svelte-1a1ih8g"&&(rs.innerHTML=qn),tl=e(s),c(ys.$$.fragment,s),el=e(s),us=o(s,"P",{"data-svelte-h":!0}),m(us)!=="svelte-tgat6t"&&(us.textContent=xn),pl=e(s),c(js.$$.fragment,s),ol=e(s),Us=o(s,"P",{"data-svelte-h":!0}),m(Us)!=="svelte-1ledmup"&&(Us.innerHTML=Zn),ml=e(s),c(hs.$$.fragment,s),il=e(s),Js=o(s,"P",{"data-svelte-h":!0}),m(Js)!=="svelte-uy7q33"&&(Js.textContent=An),Ml=e(s),c(ws.$$.fragment,s),cl=e(s),Ts=o(s,"P",{"data-svelte-h":!0}),m(Ts)!=="svelte-1bzwm0z"&&(Ts.innerHTML=_n),rl=e(s),c(ds.$$.fragment,s),yl=e(s),Cs=o(s,"P",{"data-svelte-h":!0}),m(Cs)!=="svelte-1sn18u5"&&(Cs.textContent=Vn),ul=e(s),c(gs.$$.fragment,s),jl=e(s),bs=o(s,"P",{"data-svelte-h":!0}),m(bs)!=="svelte-1gcuv6u"&&(bs.textContent=Nn),Ul=e(s),fs=o(s,"P",{"data-svelte-h":!0}),m(fs)!=="svelte-1jrgt56"&&(fs.textContent=Qn),hl=e(s),c(Is.$$.fragment,s),Jl=e(s),c(ks.$$.fragment,s),wl=e(s),$s=o(s,"P",{"data-svelte-h":!0}),m($s)!=="svelte-1xa0nvu"&&($s.textContent=zn),Tl=e(s),c(vs.$$.fragment,s),dl=e(s),c(v.$$.fragment,s),Cl=e(s),qs=o(s,"P",{"data-svelte-h":!0}),m(qs)!=="svelte-1pq3zpe"&&(qs.textContent=Gn),gl=e(s),xs=o(s,"P",{"data-svelte-h":!0}),m(xs)!=="svelte-102558m"&&(xs.textContent=Bn),bl=e(s),c(Zs.$$.fragment,s),fl=e(s),As=o(s,"P",{"data-svelte-h":!0}),m(As)!=="svelte-1ghsafd"&&(As.innerHTML=Sn),Il=e(s),_s=o(s,"P",{"data-svelte-h":!0}),m(_s)!=="svelte-xns0w1"&&(_s.innerHTML=Rn),kl=e(s),c(Vs.$$.fragment,s),$l=e(s),Ns=o(s,"P",{"data-svelte-h":!0}),m(Ns)!=="svelte-kvr6fb"&&(Ns.textContent=En),vl=e(s),c(Qs.$$.fragment,s),ql=e(s),c(zs.$$.fragment,s),xl=e(s),Gs=o(s,"P",{"data-svelte-h":!0}),m(Gs)!=="svelte-tz4cg5"&&(Gs.textContent=Hn),Zl=e(s),c(Bs.$$.fragment,s),Al=e(s),Ss=o(s,"P",{"data-svelte-h":!0}),m(Ss)!=="svelte-1kglao1"&&(Ss.textContent=Xn),_l=e(s),c(Rs.$$.fragment,s),Vl=e(s),c(Es.$$.fragment,s),Nl=e(s),Hs=o(s,"P",{"data-svelte-h":!0}),m(Hs)!=="svelte-1pxoe0y"&&(Hs.textContent=Wn),Ql=e(s),c(Xs.$$.fragment,s),zl=e(s),Ws=o(s,"P",{"data-svelte-h":!0}),m(Ws)!=="svelte-yso9yu"&&(Ws.textContent=Kn),Gl=e(s),c(Ks.$$.fragment,s),Bl=e(s),Ys=o(s,"P",{"data-svelte-h":!0}),m(Ys)!=="svelte-16m695y"&&(Ys.innerHTML=Yn),Sl=e(s),c(Ds.$$.fragment,s),Rl=e(s),c(q.$$.fragment,s),El=e(s),Fs=o(s,"P",{"data-svelte-h":!0}),m(Fs)!=="svelte-y6d1dj"&&(Fs.textContent=Dn),Hl=e(s),c(Ps.$$.fragment,s),Xl=e(s),Ls=o(s,"P",{"data-svelte-h":!0}),m(Ls)!=="svelte-1lc68tr"&&(Ls.innerHTML=Fn),Wl=e(s),c(Os.$$.fragment,s),Kl=e(s),c(sa.$$.fragment,s),Yl=e(s),aa=o(s,"P",{"data-svelte-h":!0}),m(aa)!=="svelte-1bhivh2"&&(aa.textContent=Pn),Dl=e(s),c(la.$$.fragment,s),Fl=e(s),ia=o(s,"P",{}),Ma(ia).forEach(l),this.h()},h(){st(i,"name","hf:doc:metadata"),st(i,"content",Jt),da.a=Ca,Qa.a=null,Ga.a=null},m(s,a){C(document.head,i),n(s,J,a),n(s,U,a),n(s,w,a),r(Z,s,a),n(s,ua,a),r(A,s,a),n(s,ja,a),n(s,_,a),n(s,Ua,a),r(V,s,a),n(s,ha,a),r(f,s,a),n(s,Ja,a),r(N,s,a),n(s,wa,a),n(s,Q,a),n(s,Ta,a),n(s,I,a),C(I,Ll),da.m(at,I),C(I,Ca),n(s,ga,a),n(s,z,a),n(s,ba,a),r(G,s,a),n(s,fa,a),n(s,B,a),n(s,Ia,a),r(S,s,a),n(s,ka,a),r(R,s,a),n(s,$a,a),n(s,E,a),n(s,va,a),n(s,H,a),n(s,qa,a),n(s,X,a),n(s,xa,a),n(s,W,a),n(s,Za,a),r(K,s,a),n(s,Aa,a),n(s,Y,a),n(s,_a,a),r(k,s,a),n(s,Va,a),n(s,D,a),n(s,Na,a),n(s,d,a),C(d,Ol),C(d,pa),C(d,sn),C(d,oa),C(d,an),Qa.m(lt,d),n(s,za,a),n(s,b,a),C(b,ln),C(b,ma),C(b,nn),Ga.m(nt,b),n(s,Ba,a),n(s,F,a),n(s,Sa,a),n(s,P,a),n(s,Ra,a),r(L,s,a),n(s,Ea,a),n(s,O,a),n(s,Ha,a),n(s,ss,a),n(s,Xa,a),n(s,as,a),n(s,Wa,a),r(ls,s,a),n(s,Ka,a),n(s,ns,a),n(s,Ya,a),r($,s,a),n(s,Da,a),r(ts,s,a),n(s,Fa,a),n(s,es,a),n(s,Pa,a),n(s,ps,a),n(s,La,a),r(os,s,a),n(s,Oa,a),n(s,ms,a),n(s,sl,a),r(is,s,a),n(s,al,a),n(s,Ms,a),n(s,ll,a),r(cs,s,a),n(s,nl,a),n(s,rs,a),n(s,tl,a),r(ys,s,a),n(s,el,a),n(s,us,a),n(s,pl,a),r(js,s,a),n(s,ol,a),n(s,Us,a),n(s,ml,a),r(hs,s,a),n(s,il,a),n(s,Js,a),n(s,Ml,a),r(ws,s,a),n(s,cl,a),n(s,Ts,a),n(s,rl,a),r(ds,s,a),n(s,yl,a),n(s,Cs,a),n(s,ul,a),r(gs,s,a),n(s,jl,a),n(s,bs,a),n(s,Ul,a),n(s,fs,a),n(s,hl,a),r(Is,s,a),n(s,Jl,a),r(ks,s,a),n(s,wl,a),n(s,$s,a),n(s,Tl,a),r(vs,s,a),n(s,dl,a),r(v,s,a),n(s,Cl,a),n(s,qs,a),n(s,gl,a),n(s,xs,a),n(s,bl,a),r(Zs,s,a),n(s,fl,a),n(s,As,a),n(s,Il,a),n(s,_s,a),n(s,kl,a),r(Vs,s,a),n(s,$l,a),n(s,Ns,a),n(s,vl,a),r(Qs,s,a),n(s,ql,a),r(zs,s,a),n(s,xl,a),n(s,Gs,a),n(s,Zl,a),r(Bs,s,a),n(s,Al,a),n(s,Ss,a),n(s,_l,a),r(Rs,s,a),n(s,Vl,a),r(Es,s,a),n(s,Nl,a),n(s,Hs,a),n(s,Ql,a),r(Xs,s,a),n(s,zl,a),n(s,Ws,a),n(s,Gl,a),r(Ks,s,a),n(s,Bl,a),n(s,Ys,a),n(s,Sl,a),r(Ds,s,a),n(s,Rl,a),r(q,s,a),n(s,El,a),n(s,Fs,a),n(s,Hl,a),r(Ps,s,a),n(s,Xl,a),n(s,Ls,a),n(s,Wl,a),r(Os,s,a),n(s,Kl,a),r(sa,s,a),n(s,Yl,a),n(s,aa,a),n(s,Dl,a),r(la,s,a),n(s,Fl,a),n(s,ia,a),Pl=!0},p(s,[a]){const na={};a&2&&(na.$$scope={dirty:a,ctx:s}),f.$set(na);const g={};a&2&&(g.$$scope={dirty:a,ctx:s}),k.$set(g);const x={};a&2&&(x.$$scope={dirty:a,ctx:s}),$.$set(x);const Ln={};a&2&&(Ln.$$scope={dirty:a,ctx:s}),v.$set(Ln);const On={};a&2&&(On.$$scope={dirty:a,ctx:s}),q.$set(On)},i(s){Pl||(y(Z.$$.fragment,s),y(A.$$.fragment,s),y(V.$$.fragment,s),y(f.$$.fragment,s),y(N.$$.fragment,s),y(G.$$.fragment,s),y(S.$$.fragment,s),y(R.$$.fragment,s),y(K.$$.fragment,s),y(k.$$.fragment,s),y(L.$$.fragment,s),y(ls.$$.fragment,s),y($.$$.fragment,s),y(ts.$$.fragment,s),y(os.$$.fragment,s),y(is.$$.fragment,s),y(cs.$$.fragment,s),y(ys.$$.fragment,s),y(js.$$.fragment,s),y(hs.$$.fragment,s),y(ws.$$.fragment,s),y(ds.$$.fragment,s),y(gs.$$.fragment,s),y(Is.$$.fragment,s),y(ks.$$.fragment,s),y(vs.$$.fragment,s),y(v.$$.fragment,s),y(Zs.$$.fragment,s),y(Vs.$$.fragment,s),y(Qs.$$.fragment,s),y(zs.$$.fragment,s),y(Bs.$$.fragment,s),y(Rs.$$.fragment,s),y(Es.$$.fragment,s),y(Xs.$$.fragment,s),y(Ks.$$.fragment,s),y(Ds.$$.fragment,s),y(q.$$.fragment,s),y(Ps.$$.fragment,s),y(Os.$$.fragment,s),y(sa.$$.fragment,s),y(la.$$.fragment,s),Pl=!0)},o(s){u(Z.$$.fragment,s),u(A.$$.fragment,s),u(V.$$.fragment,s),u(f.$$.fragment,s),u(N.$$.fragment,s),u(G.$$.fragment,s),u(S.$$.fragment,s),u(R.$$.fragment,s),u(K.$$.fragment,s),u(k.$$.fragment,s),u(L.$$.fragment,s),u(ls.$$.fragment,s),u($.$$.fragment,s),u(ts.$$.fragment,s),u(os.$$.fragment,s),u(is.$$.fragment,s),u(cs.$$.fragment,s),u(ys.$$.fragment,s),u(js.$$.fragment,s),u(hs.$$.fragment,s),u(ws.$$.fragment,s),u(ds.$$.fragment,s),u(gs.$$.fragment,s),u(Is.$$.fragment,s),u(ks.$$.fragment,s),u(vs.$$.fragment,s),u(v.$$.fragment,s),u(Zs.$$.fragment,s),u(Vs.$$.fragment,s),u(Qs.$$.fragment,s),u(zs.$$.fragment,s),u(Bs.$$.fragment,s),u(Rs.$$.fragment,s),u(Es.$$.fragment,s),u(Xs.$$.fragment,s),u(Ks.$$.fragment,s),u(Ds.$$.fragment,s),u(q.$$.fragment,s),u(Ps.$$.fragment,s),u(Os.$$.fragment,s),u(sa.$$.fragment,s),u(la.$$.fragment,s),Pl=!1},d(s){s&&(l(J),l(U),l(w),l(ua),l(ja),l(_),l(Ua),l(ha),l(Ja),l(wa),l(Q),l(Ta),l(I),l(ga),l(z),l(ba),l(fa),l(B),l(Ia),l(ka),l($a),l(E),l(va),l(H),l(qa),l(X),l(xa),l(W),l(Za),l(Aa),l(Y),l(_a),l(Va),l(D),l(Na),l(d),l(za),l(b),l(Ba),l(F),l(Sa),l(P),l(Ra),l(Ea),l(O),l(Ha),l(ss),l(Xa),l(as),l(Wa),l(Ka),l(ns),l(Ya),l(Da),l(Fa),l(es),l(Pa),l(ps),l(La),l(Oa),l(ms),l(sl),l(al),l(Ms),l(ll),l(nl),l(rs),l(tl),l(el),l(us),l(pl),l(ol),l(Us),l(ml),l(il),l(Js),l(Ml),l(cl),l(Ts),l(rl),l(yl),l(Cs),l(ul),l(jl),l(bs),l(Ul),l(fs),l(hl),l(Jl),l(wl),l($s),l(Tl),l(dl),l(Cl),l(qs),l(gl),l(xs),l(bl),l(fl),l(As),l(Il),l(_s),l(kl),l($l),l(Ns),l(vl),l(ql),l(xl),l(Gs),l(Zl),l(Al),l(Ss),l(_l),l(Vl),l(Nl),l(Hs),l(Ql),l(zl),l(Ws),l(Gl),l(Bl),l(Ys),l(Sl),l(Rl),l(El),l(Fs),l(Hl),l(Xl),l(Ls),l(Wl),l(Kl),l(Yl),l(aa),l(Dl),l(Fl),l(ia)),l(i),j(Z,s),j(A,s),j(V,s),j(f,s),j(N,s),j(G,s),j(S,s),j(R,s),j(K,s),j(k,s),j(L,s),j(ls,s),j($,s),j(ts,s),j(os,s),j(is,s),j(cs,s),j(ys,s),j(js,s),j(hs,s),j(ws,s),j(ds,s),j(gs,s),j(Is,s),j(ks,s),j(vs,s),j(v,s),j(Zs,s),j(Vs,s),j(Qs,s),j(zs,s),j(Bs,s),j(Rs,s),j(Es,s),j(Xs,s),j(Ks,s),j(Ds,s),j(q,s),j(Ps,s),j(Os,s),j(sa,s),j(la,s)}}}const Jt='{"title":"Unigram tokenization","local":"unigram-tokenization","sections":[{"title":"Training algorithm","local":"training-algorithm","sections":[],"depth":2},{"title":"Tokenization algorithm","local":"tokenization-algorithm","sections":[],"depth":2},{"title":"กลับมาสู่การเทรน","local":"กลบมาสการเทรน","sections":[],"depth":2},{"title":"Implementing Unigram","local":"implementing-unigram","sections":[],"depth":2}],"depth":1}';function wt(T){return et(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class kt extends pt{constructor(i){super(),ot(this,i,wt,ht,tt,{})}}export{kt as component}; | |
Xet Storage Details
- Size:
- 93 kB
- Xet hash:
- 022b9ab0c7c7a16ae5c930d61e5198a445103fcbf223d519129fd686589ca977
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.