import{s as Qe,f as Re,o as Ee,n as Ol}from"../chunks/scheduler.37c15a92.js";import{S as Ye,i as Ne,g as m,s as a,r as J,A as Xe,h as u,f as t,c,j as se,u as T,x as o,k as Bl,y as He,a as s,v as j,t as y,b as it,d as r,w as b,p as pt}from"../chunks/index.2bf4358c.js";import{T as Mt}from"../chunks/Tip.363c041f.js";import{Y as Ze}from"../chunks/Youtube.1e50a667.js";import{C as f}from"../chunks/CodeBlock.4f5fc1ad.js";import{D as We}from"../chunks/DocNotebookDropdown.d9dfeb24.js";import{F as Fe}from"../chunks/FrameworkSwitchCourse.8d4d4ab6.js";import{H as on}from"../chunks/Heading.8ada512a.js";function ze(v){let h,g;return h=new We({props:{classNames:"absolute z-10 right-0 top-0",options:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/vi/chapter7/section2_tf.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/vi/chapter7/section2_tf.ipynb"}]}}),{c(){J(h.$$.fragment)},l(i){T(h.$$.fragment,i)},m(i,U){j(h,i,U),g=!0},i(i){g||(r(h.$$.fragment,i),g=!0)},o(i){y(h.$$.fragment,i),g=!1},d(i){b(h,i)}}}function Se(v){let h,g;return h=new We({props:{classNames:"absolute z-10 right-0 top-0",options:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/vi/chapter7/section2_pt.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/vi/chapter7/section2_pt.ipynb"}]}}),{c(){J(h.$$.fragment)},l(i){T(h.$$.fragment,i)},m(i,U){j(h,i,U),g=!0},i(i){g||(r(h.$$.fragment,i),g=!0)},o(i){y(h.$$.fragment,i),g=!1},d(i){b(h,i)}}}function Le(v){let h,g='💡 Miễn là tập dữ liệu của bạn bao gồm các văn bản được chia thành các từ với nhãn tương ứng của chúng, bạn sẽ có thể điều chỉnh các quy trình xử lý dữ liệu được mô tả ở đây với tập dữ liệu của riêng bạn. Tham khảo lại <a href="/course/chapter5">Chapter 5</a> nếu bạn cần cập nhật về cách tải dữ liệu tùy chỉnh của riêng bạn trong <code>Dataset</code>.';return{c(){h=m("p"),h.innerHTML=g},l(i){h=u(i,"P",{"data-svelte-h":!0}),o(h)!=="svelte-1sk26kv"&&(h.innerHTML=g)},m(i,U){s(i,h,U)},p:Ol,d(i){i&&t(h)}}}function De(v){let h,g="✏️ <strong>Đến lượt bạn!</strong> In hai câu giống nhau bằng nhãn POS hoặc phân khúc của chúng.";return{c(){h=m("p"),h.innerHTML=g},l(i){h=u(i,"P",{"data-svelte-h":!0}),o(h)!=="svelte-6ovxul"&&(h.innerHTML=g)},m(i,U){s(i,h,U)},p:Ol,d(i){i&&t(h)}}}function qe(v){let h,g="✏️ <strong>Đến lượt bạn!</strong> Một số nhà nghiên cứu chỉ thích gán một nhãn cho mỗi từ và gán <code>-100</code> cho các token con khác trong một từ nhất định. Điều này là để tránh các từ dài được chia thành nhiều token phụ góp phần lớn vào hàm mất mát. Thay đổi chức năng trước đó để căn chỉnh nhãn với ID đầu vào bằng cách tuân theo quy tắc này.";return{c(){h=m("p"),h.innerHTML=g},l(i){h=u(i,"P",{"data-svelte-h":!0}),o(h)!=="svelte-1y6meja"&&(h.innerHTML=g)},m(i,U){s(i,h,U)},p:Ol,d(i){i&&t(h)}}}function Pe(v){let h,g,i,U="Mã thực sử dụng Keras sẽ giống như trước đây; những thay đổi duy nhất là cách dữ liệu được đối chiếu thành một lô và chức năng tính toán số liệu.",x;return h=new on({props:{title:"Tinh chỉnh mô hình với Keras",local:"tinh-chỉnh-mô-hình-với-keras",headingTag:"h2"}}),{c(){J(h.$$.fragment),g=a(),i=m("p"),i.textContent=U},l(w){T(h.$$.fragment,w),g=c(w),i=u(w,"P",{"data-svelte-h":!0}),o(i)!=="svelte-1rlv18x"&&(i.textContent=U)},m(w,k){j(h,w,k),s(w,g,k),s(w,i,k),x=!0},i(w){x||(r(h.$$.fragment,w),x=!0)},o(w){y(h.$$.fragment,w),x=!1},d(w){w&&(t(g),t(i)),b(h,w)}}}function Oe(v){let h,g,i,U="Mã thực sử dụng <code>Trainer</code> sẽ giống như trước đây; những thay đổi duy nhất là cách dữ liệu được đối chiếu thành một lô và chức năng tính toán số liệu.",x;return h=new on({props:{title:"Tinh chỉnh mô hình trong API Trainer",local:"tinh-chỉnh-mô-hình-trong-api-trainer",headingTag:"h2"}}),{c(){J(h.$$.fragment),g=a(),i=m("p"),i.innerHTML=U},l(w){T(h.$$.fragment,w),g=c(w),i=u(w,"P",{"data-svelte-h":!0}),o(i)!=="svelte-1cuh4a9"&&(i.innerHTML=U)},m(w,k){j(h,w,k),s(w,g,k),s(w,i,k),x=!0},i(w){x||(r(h.$$.fragment,w),x=!0)},o(w){y(h.$$.fragment,w),x=!1},d(w){w&&(t(g),t(i)),b(h,w)}}}function Ke(v){let h,g;return h=new f({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMERhdGFDb2xsYXRvckZvclRva2VuQ2xhc3NpZmljYXRpb24lMEElMEFkYXRhX2NvbGxhdG9yJTIwJTNEJTIwRGF0YUNvbGxhdG9yRm9yVG9rZW5DbGFzc2lmaWNhdGlvbiglMEElMjAlMjAlMjAlMjB0b2tlbml6ZXIlM0R0b2tlbml6ZXIlMkMlMjByZXR1cm5fdGVuc29ycyUzRCUyMnRmJTIyJTBBKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> DataCollatorForTokenClassification

data_collator = DataCollatorForTokenClassification(
    tokenizer=tokenizer, return_tensors=<span class="hljs-string">&quot;tf&quot;</span>
)`,wrap:!1}}),{c(){J(h.$$.fragment)},l(i){T(h.$$.fragment,i)},m(i,U){j(h,i,U),g=!0},i(i){g||(r(h.$$.fragment,i),g=!0)},o(i){y(h.$$.fragment,i),g=!1},d(i){b(h,i)}}}function na(v){let h,g;return h=new f({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMERhdGFDb2xsYXRvckZvclRva2VuQ2xhc3NpZmljYXRpb24lMEElMEFkYXRhX2NvbGxhdG9yJTIwJTNEJTIwRGF0YUNvbGxhdG9yRm9yVG9rZW5DbGFzc2lmaWNhdGlvbih0b2tlbml6ZXIlM0R0b2tlbml6ZXIp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> DataCollatorForTokenClassification

data_collator = DataCollatorForTokenClassification(tokenizer=tokenizer)`,wrap:!1}}),{c(){J(h.$$.fragment)},l(i){T(h.$$.fragment,i)},m(i,U){j(h,i,U),g=!0},i(i){g||(r(h.$$.fragment,i),g=!0)},o(i){y(h.$$.fragment,i),g=!1},d(i){b(h,i)}}}function la(v){let h,g="Trình đối chiếu dữ liệu của chúng ta đã sẵn sàng hoạt động! Bây giờ hãy sử dụng nó để tạo một <code>tf.data.Dataset</code> với phương thức <code>to_tf_dataset()</code>.",i,U,x,w,k="Điểm dừng tiếp theo: chính là mô hình.",V;return U=new f({props:{code:"dGZfdHJhaW5fZGF0YXNldCUyMCUzRCUyMHRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVELnRvX3RmX2RhdGFzZXQoJTBBJTIwJTIwJTIwJTIwY29sdW1ucyUzRCU1QiUyMmF0dGVudGlvbl9tYXNrJTIyJTJDJTIwJTIyaW5wdXRfaWRzJTIyJTJDJTIwJTIybGFiZWxzJTIyJTJDJTIwJTIydG9rZW5fdHlwZV9pZHMlMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBjb2xsYXRlX2ZuJTNEZGF0YV9jb2xsYXRvciUyQyUwQSUyMCUyMCUyMCUyMHNodWZmbGUlM0RUcnVlJTJDJTBBJTIwJTIwJTIwJTIwYmF0Y2hfc2l6ZSUzRDE2JTJDJTBBKSUwQSUwQXRmX2V2YWxfZGF0YXNldCUyMCUzRCUyMHRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnZhbGlkYXRpb24lMjIlNUQudG9fdGZfZGF0YXNldCglMEElMjAlMjAlMjAlMjBjb2x1bW5zJTNEJTVCJTIyYXR0ZW50aW9uX21hc2slMjIlMkMlMjAlMjJpbnB1dF9pZHMlMjIlMkMlMjAlMjJsYWJlbHMlMjIlMkMlMjAlMjJ0b2tlbl90eXBlX2lkcyUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMGNvbGxhdGVfZm4lM0RkYXRhX2NvbGxhdG9yJTJDJTBBJTIwJTIwJTIwJTIwc2h1ZmZsZSUzREZhbHNlJTJDJTBBJTIwJTIwJTIwJTIwYmF0Y2hfc2l6ZSUzRDE2JTJDJTBBKQ==",highlighted:`tf_train_dataset = tokenized_datasets[<span class="hljs-string">&quot;train&quot;</span>].to_tf_dataset(
    columns=[<span class="hljs-string">&quot;attention_mask&quot;</span>, <span class="hljs-string">&quot;input_ids&quot;</span>, <span class="hljs-string">&quot;labels&quot;</span>, <span class="hljs-string">&quot;token_type_ids&quot;</span>],
    collate_fn=data_collator,
    shuffle=<span class="hljs-literal">True</span>,
    batch_size=<span class="hljs-number">16</span>,
)

tf_eval_dataset = tokenized_datasets[<span class="hljs-string">&quot;validation&quot;</span>].to_tf_dataset(
    columns=[<span class="hljs-string">&quot;attention_mask&quot;</span>, <span class="hljs-string">&quot;input_ids&quot;</span>, <span class="hljs-string">&quot;labels&quot;</span>, <span class="hljs-string">&quot;token_type_ids&quot;</span>],
    collate_fn=data_collator,
    shuffle=<span class="hljs-literal">False</span>,
    batch_size=<span class="hljs-number">16</span>,
)`,wrap:!1}}),{c(){h=m("p"),h.innerHTML=g,i=a(),J(U.$$.fragment),x=a(),w=m("p"),w.textContent=k},l(d){h=u(d,"P",{"data-svelte-h":!0}),o(h)!=="svelte-1pdarwa"&&(h.innerHTML=g),i=c(d),T(U.$$.fragment,d),x=c(d),w=u(d,"P",{"data-svelte-h":!0}),o(w)!=="svelte-blij7e"&&(w.textContent=k)},m(d,_){s(d,h,_),s(d,i,_),j(U,d,_),s(d,x,_),s(d,w,_),V=!0},i(d){V||(r(U.$$.fragment,d),V=!0)},o(d){y(U.$$.fragment,d),V=!1},d(d){d&&(t(h),t(i),t(x),t(w)),b(U,d)}}}function ta(v){let h,g="Như chúng ta có thể thấy, tập hợp nhãn thứ hai đã được đệm bằng độ dài của tập đầu tiên bằng cách sử dụng <code>-100</code>.";return{c(){h=m("p"),h.innerHTML=g},l(i){h=u(i,"P",{"data-svelte-h":!0}),o(h)!=="svelte-rk7qyp"&&(h.innerHTML=g)},m(i,U){s(i,h,U)},i:Ol,o:Ol,d(i){i&&t(h)}}}function Ae(v){let h,g,i,U="Vì chúng tôi đang giải quyết vấn đề phân loại token, chúng ta sẽ sử dụng lớp <code>TFAutoModelForTokenClassification</code>. Điều chính cần nhớ khi xác định mô hình này là truyền một số thông tin về số lượng nhãn mà chúng ta có. Cách dễ nhất để làm điều này là truyền vào tham số <code>num_labels</code>, nhưng nếu chúng ta muốn một tiện ích luận suy đẹp hoạt động giống như tiện ích chúng ta đã thấy ở đầu phần này, tốt hơn nên đặt các nhãn tương ứng chính xác thay thế.",x,w,k="Chúng phải được đặt bởi hai từ điển, <code>id2label</code> và <code>label2id</code>, chứa ánh xạ từ ID đến nhãn và ngược lại:",V,d,_,B,C="Bây giờ chúng ta có thể chuyển chúng đến phương thức <code>TFAutoModelForTokenClassification.from_pretrained()</code> và chúng sẽ được đặt trong cấu hình của mô hình, sau đó được lưu và tải lên Hub một cách chính xác:",Z,$,G,O,Vl='Giống như khi chúng tôi định nghĩa <code>TFAutoModelForSequenceClassification</code> của mình trong <a href="/course/chapter3">Chương 3</a>, việc tạo mô hình đưa ra cảnh báo rằng một số trọng số không được sử dụng (những trọng số từ đầu huấn luyện trước) và một số trọng số khác được khởi tạo ngẫu nhiên (những trọng số từ đầu phân loại token mới) và mô hình này nên được huấn luyện. Chúng ta sẽ làm điều đó sau một phút, nhưng trước tiên hãy kiểm tra kỹ xem mô hình của chúng ta có đúng số lượng nhãn hay không:',cn,E,hn,K,In,A,Zn,Y,D,nn,Zl="Bây giờ chúng tôi đã sẵn sàng để huấn luyện mô hình của mình! Tuy nhiên, chúng ta chỉ cần làm thêm một chút công việc trước tiên: chúng ta nên đăng nhập vào Hugging Face và xác định các siêu tham số huấn luyện của mình. Nếu bạn đang làm việc trên notebook, có một chức năng tiện lợi để giúp bạn làm điều này:",pn,ln,kn,W,Al="Thao tác này sẽ hiển thị một tiện ích mà bạn có thể nhập thông tin đăng nhập  Hugging Face của mình.",Mn,tn,Gl="Nếu bạn không làm việc trong notebook, chỉ cần nhập dòng sau vào thiết bị đầu cuối của bạn:",sn,N,rn,X,xn="Sau khi đăng nhập, chúng ta có thể chuẩn bị mọi thứ cần thiết để biên dịch mô hình của mình. 🤗 Transformers cung cấp một hàm <code>create_optimizer()</code> thuận tiện sẽ cung cấp cho bạn trình tối ưu hóa <code>AdamW</code> với các cài đặt thích hợp cho giảm trọng lượng và giảm tốc độ học tập, cả hai đều sẽ cải thiện hiệu suất mô hình của bạn so với trình tối ưu hóa <code>Adam</code> tích hợp sẵn:",An,H,yn,F,_n="Cũng lưu ý rằng chúng ta không cung cấp tham số <code>loss</code> cho <code>compile()</code>. Điều này là do các mô hình thực sự có thể tính toán mất mát bên trong - nếu bạn biên dịch mà không mất mát và cung cấp các nhãn của bạn trong từ điển đầu vào (như chúng ta làm trong bộ dữ liệu của mình), thì mô hình sẽ huấn luyện bằng cách sử dụng mất mát nội bộ đó, điều này sẽ thích hợp cho tác vụ và loại mô hình bạn đã chọn.",Gn,z,Jn="Tiếp theo, chúng ta xác định một <code>PushToHubCallback</code> để tải mô hình lên Hub trong quá trình huấn luyện và phù hợp với mô hình với lệnh gọi lại đó:",mn,en,$n,Q,Wl='Bạn có thể chỉ định tên đầy đủ của kho lưu trữ mà bạn muốn đẩy đến bằng tham số <code>hub_model_id</code> (đặc biệt, bạn sẽ phải sử dụng tham số này để đẩy đến một tổ chức). Ví dụ: khi chúng ta đẩy mô hình vào tổ chức <a href="https://huggingface.co/huggingface-course" rel="nofollow"><code>huggingface-course</code></a>, chúng ta đã thêm <code>hub_model_id=&quot;huggingface-course/bert-finetuned-ner&quot;</code>. Theo mặc định, kho lưu trữ được sử dụng sẽ nằm trong không gian tên của bạn và được đặt tên theo thư mục đầu ra mà bạn đã đặt, ví dụ: <code>&quot;cool_huggingface_user/bert-finetuned-ner&quot;</code>.',un,an,Wn,S,Bn="Lưu ý rằng trong khi quá trình huấn luyện diễn ra, mỗi khi mô hình được lưu (ở đây, mỗi epoch), nó sẽ được tải lên Hub ở chế độ nền. Bằng cách này, bạn sẽ có thể tiếp tục quá trình huấn luyện của mình trên một máy khác nếu cần.",vn,R,Qn="Ở giai đoạn này, bạn có thể sử dụng tiện ích luận suy trên Model Hub để kiểm tra mô hình của mình và chia sẻ với bạn bè. Bạn đã tinh chỉnh thành công một mô hình trong tác vụ phân loại token - xin chúc mừng! Nhưng mô hình của chúng ta thực sự tốt đến mức nào? Chúng ta nên có một số chỉ số hay thước đo để đánh giá.",L;return h=new on({props:{title:"Định nghĩa mô hình",local:"định-nghĩa-mô-hình",headingTag:"h3"}}),d=new f({props:{code:"aWQybGFiZWwlMjAlM0QlMjAlN0JpJTNBJTIwbGFiZWwlMjBmb3IlMjBpJTJDJTIwbGFiZWwlMjBpbiUyMGVudW1lcmF0ZShsYWJlbF9uYW1lcyklN0QlMEFsYWJlbDJpZCUyMCUzRCUyMCU3QnYlM0ElMjBrJTIwZm9yJTIwayUyQyUyMHYlMjBpbiUyMGlkMmxhYmVsLml0ZW1zKCklN0Q=",highlighted:`id2label = {i: label <span class="hljs-keyword">for</span> i, label <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(label_names)}
label2id = {v: k <span class="hljs-keyword">for</span> k, v <span class="hljs-keyword">in</span> id2label.items()}`,wrap:!1}}),$=new f({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFRGQXV0b01vZGVsRm9yVG9rZW5DbGFzc2lmaWNhdGlvbiUwQSUwQW1vZGVsJTIwJTNEJTIwVEZBdXRvTW9kZWxGb3JUb2tlbkNsYXNzaWZpY2F0aW9uLmZyb21fcHJldHJhaW5lZCglMEElMjAlMjAlMjAlMjBtb2RlbF9jaGVja3BvaW50JTJDJTBBJTIwJTIwJTIwJTIwaWQybGFiZWwlM0RpZDJsYWJlbCUyQyUwQSUyMCUyMCUyMCUyMGxhYmVsMmlkJTNEbGFiZWwyaWQlMkMlMEEp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> TFAutoModelForTokenClassification

model = TFAutoModelForTokenClassification.from_pretrained(
    model_checkpoint,
    id2label=id2label,
    label2id=label2id,
)`,wrap:!1}}),E=new f({props:{code:"bW9kZWwuY29uZmlnLm51bV9sYWJlbHM=",highlighted:"model.config.num_labels",wrap:!1}}),K=new f({props:{code:"OQ==",highlighted:'<span class="hljs-number">9</span>',wrap:!1}}),A=new Mt({props:{warning:!0,$$slots:{default:[sa]},$$scope:{ctx:v}}}),Y=new on({props:{title:"Tinh chỉnh một mô hình",local:"tinh-chỉnh-một-mô-hình",headingTag:"h3"}}),ln=new f({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMG5vdGVib29rX2xvZ2luJTBBJTBBbm90ZWJvb2tfbG9naW4oKQ==",highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> notebook_login

notebook_login()`,wrap:!1}}),N=new f({props:{code:"aHVnZ2luZ2ZhY2UtY2xpJTIwbG9naW4=",highlighted:"huggingface-cli login",wrap:!1}}),H=new f({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMGNyZWF0ZV9vcHRpbWl6ZXIlMEFpbXBvcnQlMjB0ZW5zb3JmbG93JTIwYXMlMjB0ZiUwQSUwQSUyMyUyMEh1JUUxJUJBJUE1biUyMGx1eSVFMSVCQiU4N24lMjB0cm9uZyUyMG1peGVkLXByZWNpc2lvbiUyMGZsb2F0MTYlMEElMjMlMjBCJUMzJUFDbmglMjBsdSVFMSVCQSVBRG4lMjBkJUMzJUIybmclMjBuJUMzJUEweSUyMG4lRTElQkElQkZ1JTIwYiVFMSVCQSVBMW4lMjAlQzQlOTFhbmclMjBzJUUxJUJCJUFEJTIwZCVFMSVCQiVBNW5nJTIwR1BVJTIwbiVDMyVBQW4lMjBraCVDMyVCNG5nJTIwJUM0JTkxJUM2JUIwJUUxJUJCJUEzYyUyMGglQzYlQjAlRTElQkIlOUZuZyUyMGwlRTElQkIlQTNpJTIwdCVFMSVCQiVBQiUyMCVDNCU5MWklRTElQkIlODF1JTIwbiVDMyVBMHklMEF0Zi5rZXJhcy5taXhlZF9wcmVjaXNpb24uc2V0X2dsb2JhbF9wb2xpY3koJTIybWl4ZWRfZmxvYXQxNiUyMiklMEElMEElMjMlMjBTJUUxJUJCJTkxJTIwYiVDNiVCMCVFMSVCQiU5QmMlMjBodSVFMSVCQSVBNW4lMjBsdXklRTElQkIlODduJTIwbCVDMyVBMCUyMHMlRTElQkIlOTElMjBsJUM2JUIwJUUxJUJCJUEzbmclMjBtJUUxJUJBJUFCdSUyMHRyb25nJTIwdCVFMSVCQSVBRHAlMjBkJUUxJUJCJUFGJTIwbGklRTElQkIlODd1JTJDJTIwY2hpYSUyMGNobyUyMGslQzMlQURjaCUyMHRoJUM2JUIwJUUxJUJCJTlCYyUyMGwlQzMlQjQlMjBzYXUlMjAlQzQlOTElQzMlQjMlMjBuaCVDMyVBMm4lMEElMjMlMjB2JUUxJUJCJTlCaSUyMHMlRTElQkIlOTElMjBlcG9jaC4lMjBMJUM2JUIwdSUyMCVDMyVCRCUyMHIlRTElQkElQjFuZyUyMHRmX3RyYWluX2RhdGFzZXQlMjAlRTElQkIlOUYlMjAlQzQlOTElQzMlQTJ5JTIwbCVDMyVBMCUyMGwlQzMlQjQlMjB0Zi5kYXRhLkRhdGFzZXQlMkMlMEElMjMlMjBraCVDMyVCNG5nJTIwcGglRTElQkElQTNpJTIwSHVnZ2luZyUyMEZhY2UlMjBEYXRhc2V0JTIwZyVFMSVCQiU5MWMlMkMlMjBuJUMzJUFBbiUyMGxlbigpJTIwYyVFMSVCQiVBN2ElMjBuJUMzJUIzJTIwdiVFMSVCQiU5MW4lMjBsJUMzJUEwJTIwbnVtX3NhbXBsZXMlMjAlMkYlMkYlMjBiYXRjaF9zaXplLiUwQW51bV9lcG9jaHMlMjAlM0QlMjAzJTBBbnVtX3RyYWluX3N0ZXBzJTIwJTNEJTIwbGVuKHRmX3RyYWluX2RhdGFzZXQpJTIwKiUyMG51bV9lcG9jaHMlMEElMEFvcHRpbWl6ZXIlMkMlMjBzY2hlZHVsZSUyMCUzRCUyMGNyZWF0ZV9vcHRpbWl6ZXIoJTBBJTIwJTIwJTIwJTIwaW5pdF9sciUzRDJlLTUlMkMlMEElMjAlMjAlMjAlMjBudW1fd2FybXVwX3N0ZXBzJTNEMCUyQyUwQSUyMCUyMCUyMCUyMG51bV90cmFpbl9zdGVwcyUzRG51bV90cmFpbl9zdGVwcyUyQyUwQSUyMCUyMCUyMCUyMHdlaWdodF9kZWNheV9yYXRlJTNEMC4wMSUyQyUwQSklMEFtb2RlbC5jb21waWxlKG9wdGltaXplciUzRG9wdGltaXplcik=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> create_optimizer
<span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf

<span class="hljs-comment"># Huấn luyện trong mixed-precision float16</span>
<span class="hljs-comment"># Bình luận dòng này nếu bạn đang sử dụng GPU nên không được hưởng lợi từ điều này</span>
tf.keras.mixed_precision.set_global_policy(<span class="hljs-string">&quot;mixed_float16&quot;</span>)

<span class="hljs-comment"># Số bước huấn luyện là số lượng mẫu trong tập dữ liệu, chia cho kích thước lô sau đó nhân</span>
<span class="hljs-comment"># với số epoch. Lưu ý rằng tf_train_dataset ở đây là lô tf.data.Dataset,</span>
<span class="hljs-comment"># không phải Hugging Face Dataset gốc, nên len() của nó vốn là num_samples // batch_size.</span>
num_epochs = <span class="hljs-number">3</span>
num_train_steps = <span class="hljs-built_in">len</span>(tf_train_dataset) * num_epochs

optimizer, schedule = create_optimizer(
    init_lr=<span class="hljs-number">2e-5</span>,
    num_warmup_steps=<span class="hljs-number">0</span>,
    num_train_steps=num_train_steps,
    weight_decay_rate=<span class="hljs-number">0.01</span>,
)
model.<span class="hljs-built_in">compile</span>(optimizer=optimizer)`,wrap:!1}}),en=new f({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycy5rZXJhc19jYWxsYmFja3MlMjBpbXBvcnQlMjBQdXNoVG9IdWJDYWxsYmFjayUwQSUwQWNhbGxiYWNrJTIwJTNEJTIwUHVzaFRvSHViQ2FsbGJhY2sob3V0cHV0X2RpciUzRCUyMmJlcnQtZmluZXR1bmVkLW5lciUyMiUyQyUyMHRva2VuaXplciUzRHRva2VuaXplciklMEElMEFtb2RlbC5maXQoJTBBJTIwJTIwJTIwJTIwdGZfdHJhaW5fZGF0YXNldCUyQyUwQSUyMCUyMCUyMCUyMHZhbGlkYXRpb25fZGF0YSUzRHRmX2V2YWxfZGF0YXNldCUyQyUwQSUyMCUyMCUyMCUyMGNhbGxiYWNrcyUzRCU1QmNhbGxiYWNrJTVEJTJDJTBBJTIwJTIwJTIwJTIwZXBvY2hzJTNEbnVtX2Vwb2NocyUyQyUwQSk=",highlighted:`<span class="hljs-keyword">from</span> transformers.keras_callbacks <span class="hljs-keyword">import</span> PushToHubCallback

callback = PushToHubCallback(output_dir=<span class="hljs-string">&quot;bert-finetuned-ner&quot;</span>, tokenizer=tokenizer)

model.fit(
    tf_train_dataset,
    validation_data=tf_eval_dataset,
    callbacks=[callback],
    epochs=num_epochs,
)`,wrap:!1}}),an=new Mt({props:{$$slots:{default:[ea]},$$scope:{ctx:v}}}),{c(){J(h.$$.fragment),g=a(),i=m("p"),i.innerHTML=U,x=a(),w=m("p"),w.innerHTML=k,V=a(),J(d.$$.fragment),_=a(),B=m("p"),B.innerHTML=C,Z=a(),J($.$$.fragment),G=a(),O=m("p"),O.innerHTML=Vl,cn=a(),J(E.$$.fragment),hn=a(),J(K.$$.fragment),In=a(),J(A.$$.fragment),Zn=a(),J(Y.$$.fragment),D=a(),nn=m("p"),nn.textContent=Zl,pn=a(),J(ln.$$.fragment),kn=a(),W=m("p"),W.textContent=Al,Mn=a(),tn=m("p"),tn.textContent=Gl,sn=a(),J(N.$$.fragment),rn=a(),X=m("p"),X.innerHTML=xn,An=a(),J(H.$$.fragment),yn=a(),F=m("p"),F.innerHTML=_n,Gn=a(),z=m("p"),z.innerHTML=Jn,mn=a(),J(en.$$.fragment),$n=a(),Q=m("p"),Q.innerHTML=Wl,un=a(),J(an.$$.fragment),Wn=a(),S=m("p"),S.textContent=Bn,vn=a(),R=m("p"),R.textContent=Qn},l(p){T(h.$$.fragment,p),g=c(p),i=u(p,"P",{"data-svelte-h":!0}),o(i)!=="svelte-1h695r0"&&(i.innerHTML=U),x=c(p),w=u(p,"P",{"data-svelte-h":!0}),o(w)!=="svelte-1fds6q0"&&(w.innerHTML=k),V=c(p),T(d.$$.fragment,p),_=c(p),B=u(p,"P",{"data-svelte-h":!0}),o(B)!=="svelte-xx4gkw"&&(B.innerHTML=C),Z=c(p),T($.$$.fragment,p),G=c(p),O=u(p,"P",{"data-svelte-h":!0}),o(O)!=="svelte-1jtivna"&&(O.innerHTML=Vl),cn=c(p),T(E.$$.fragment,p),hn=c(p),T(K.$$.fragment,p),In=c(p),T(A.$$.fragment,p),Zn=c(p),T(Y.$$.fragment,p),D=c(p),nn=u(p,"P",{"data-svelte-h":!0}),o(nn)!=="svelte-13yyv4p"&&(nn.textContent=Zl),pn=c(p),T(ln.$$.fragment,p),kn=c(p),W=u(p,"P",{"data-svelte-h":!0}),o(W)!=="svelte-186dusw"&&(W.textContent=Al),Mn=c(p),tn=u(p,"P",{"data-svelte-h":!0}),o(tn)!=="svelte-19r3lx0"&&(tn.textContent=Gl),sn=c(p),T(N.$$.fragment,p),rn=c(p),X=u(p,"P",{"data-svelte-h":!0}),o(X)!=="svelte-h8x1hs"&&(X.innerHTML=xn),An=c(p),T(H.$$.fragment,p),yn=c(p),F=u(p,"P",{"data-svelte-h":!0}),o(F)!=="svelte-1e521xi"&&(F.innerHTML=_n),Gn=c(p),z=u(p,"P",{"data-svelte-h":!0}),o(z)!=="svelte-ju8nry"&&(z.innerHTML=Jn),mn=c(p),T(en.$$.fragment,p),$n=c(p),Q=u(p,"P",{"data-svelte-h":!0}),o(Q)!=="svelte-19wbtjm"&&(Q.innerHTML=Wl),un=c(p),T(an.$$.fragment,p),Wn=c(p),S=u(p,"P",{"data-svelte-h":!0}),o(S)!=="svelte-ufb2i2"&&(S.textContent=Bn),vn=c(p),R=u(p,"P",{"data-svelte-h":!0}),o(R)!=="svelte-fv59gz"&&(R.textContent=Qn)},m(p,I){j(h,p,I),s(p,g,I),s(p,i,I),s(p,x,I),s(p,w,I),s(p,V,I),j(d,p,I),s(p,_,I),s(p,B,I),s(p,Z,I),j($,p,I),s(p,G,I),s(p,O,I),s(p,cn,I),j(E,p,I),s(p,hn,I),j(K,p,I),s(p,In,I),j(A,p,I),s(p,Zn,I),j(Y,p,I),s(p,D,I),s(p,nn,I),s(p,pn,I),j(ln,p,I),s(p,kn,I),s(p,W,I),s(p,Mn,I),s(p,tn,I),s(p,sn,I),j(N,p,I),s(p,rn,I),s(p,X,I),s(p,An,I),j(H,p,I),s(p,yn,I),s(p,F,I),s(p,Gn,I),s(p,z,I),s(p,mn,I),j(en,p,I),s(p,$n,I),s(p,Q,I),s(p,un,I),j(an,p,I),s(p,Wn,I),s(p,S,I),s(p,vn,I),s(p,R,I),L=!0},i(p){L||(r(h.$$.fragment,p),r(d.$$.fragment,p),r($.$$.fragment,p),r(E.$$.fragment,p),r(K.$$.fragment,p),r(A.$$.fragment,p),r(Y.$$.fragment,p),r(ln.$$.fragment,p),r(N.$$.fragment,p),r(H.$$.fragment,p),r(en.$$.fragment,p),r(an.$$.fragment,p),L=!0)},o(p){y(h.$$.fragment,p),y(d.$$.fragment,p),y($.$$.fragment,p),y(E.$$.fragment,p),y(K.$$.fragment,p),y(A.$$.fragment,p),y(Y.$$.fragment,p),y(ln.$$.fragment,p),y(N.$$.fragment,p),y(H.$$.fragment,p),y(en.$$.fragment,p),y(an.$$.fragment,p),L=!1},d(p){p&&(t(g),t(i),t(x),t(w),t(V),t(_),t(B),t(Z),t(G),t(O),t(cn),t(hn),t(In),t(Zn),t(D),t(nn),t(pn),t(kn),t(W),t(Mn),t(tn),t(sn),t(rn),t(X),t(An),t(yn),t(F),t(Gn),t(z),t(mn),t($n),t(Q),t(un),t(Wn),t(S),t(vn),t(R)),b(h,p),b(d,p),b($,p),b(E,p),b(K,p),b(A,p),b(Y,p),b(ln,p),b(N,p),b(H,p),b(en,p),b(an,p)}}}function sa(v){let h,g="⚠️ Nếu bạn có một mô hình có số nhãn sai, bạn sẽ gặp lỗi khó hiểu khi gọi <code>model.fit()</code> sau này. Điều này có thể gây khó chịu khi gỡ lỗi, vì vậy hãy đảm bảo bạn thực hiện kiểm tra này để xác nhận rằng bạn có số lượng nhãn dự kiến.";return{c(){h=m("p"),h.innerHTML=g},l(i){h=u(i,"P",{"data-svelte-h":!0}),o(h)!=="svelte-16ij52r"&&(h.innerHTML=g)},m(i,U){s(i,h,U)},p:Ol,d(i){i&&t(h)}}}function ea(v){let h,g="💡 Nếu thư mục đầu ra bạn đang sử dụng đã tồn tại, nó cần phải là bản sao cục bộ của kho lưu trữ mà bạn muốn đẩy đến. Nếu không, bạn sẽ gặp lỗi khi gọi <code>model.fit()</code> và sẽ cần đặt tên mới.";return{c(){h=m("p"),h.innerHTML=g},l(i){h=u(i,"P",{"data-svelte-h":!0}),o(h)!=="svelte-1vbugor"&&(h.innerHTML=g)},m(i,U){s(i,h,U)},p:Ol,d(i){i&&t(h)}}}function aa(v){let h,g='Khung truyền thống được sử dụng để đánh giá phân loại token là <a href="https://github.com/chakki-works/seqeval" rel="nofollow"><em>seqeval</em></a>. Để sử dụng thước đo này, ta sẽ cần cài đặt thư viện <em>seqeval</em>:',i,U,x,w,k='Chúng ta có thể tải nó qua hàm <code>evaluate.load()</code> như đã làm ở <a href="/course/chapter3">Chương 3 3</a>:',V;return U=new f({props:{code:"IXBpcCUyMGluc3RhbGwlMjBzZXFldmFs",highlighted:"!pip install seqeval",wrap:!1}}),{c(){h=m("p"),h.innerHTML=g,i=a(),J(U.$$.fragment),x=a(),w=m("p"),w.innerHTML=k},l(d){h=u(d,"P",{"data-svelte-h":!0}),o(h)!=="svelte-bg3phi"&&(h.innerHTML=g),i=c(d),T(U.$$.fragment,d),x=c(d),w=u(d,"P",{"data-svelte-h":!0}),o(w)!=="svelte-1hsdiaj"&&(w.innerHTML=k)},m(d,_){s(d,h,_),s(d,i,_),j(U,d,_),s(d,x,_),s(d,w,_),V=!0},i(d){V||(r(U.$$.fragment,d),V=!0)},o(d){y(U.$$.fragment,d),V=!1},d(d){d&&(t(h),t(i),t(x),t(w)),b(U,d)}}}function ca(v){let h,g="Để <code>Trainer</code> tính toán một thước đo cho mỗi epoch, ta sẽ cần định nghĩa hàm <code>compute_metrics()</code> nhận một array các dự đoán và nhãn, và trả về một từ điển với tên các thước đo và giá trị tương ứng.",i,U,x='Khung truyền thống được sử dụng để đánh giá phân loại token là <a href="https://github.com/chakki-works/seqeval" rel="nofollow"><em>seqeval</em></a>. Để sử dụng thước đo này, ta sẽ cần cài đặt thư viện <em>seqeval</em>:',w,k,V,d,_='Chúng ta có thể tải nó qua hàm <code>evaluate.load()</code> như đã làm ở <a href="/course/chapter3">Chương 3 3</a>:',B;return k=new f({props:{code:"IXBpcCUyMGluc3RhbGwlMjBzZXFldmFs",highlighted:"!pip install seqeval",wrap:!1}}),{c(){h=m("p"),h.innerHTML=g,i=a(),U=m("p"),U.innerHTML=x,w=a(),J(k.$$.fragment),V=a(),d=m("p"),d.innerHTML=_},l(C){h=u(C,"P",{"data-svelte-h":!0}),o(h)!=="svelte-1agpne1"&&(h.innerHTML=g),i=c(C),U=u(C,"P",{"data-svelte-h":!0}),o(U)!=="svelte-bg3phi"&&(U.innerHTML=x),w=c(C),T(k.$$.fragment,C),V=c(C),d=u(C,"P",{"data-svelte-h":!0}),o(d)!=="svelte-1hsdiaj"&&(d.innerHTML=_)},m(C,Z){s(C,h,Z),s(C,i,Z),s(C,U,Z),s(C,w,Z),j(k,C,Z),s(C,V,Z),s(C,d,Z),B=!0},i(C){B||(r(k.$$.fragment,C),B=!0)},o(C){y(k.$$.fragment,C),B=!1},d(C){C&&(t(h),t(i),t(U),t(w),t(V),t(d)),b(k,C)}}}function ha(v){let h,g="Điều này đang gửi lại rất nhiều thông tin! Chúng ta nhận được precision, recall, và điểm F1 cho từng thực thể riêng biệt, cũng như tổng thể. Hãy cũng xem chuyện gì xảy ra nêu sta thử sử dụng giá trị dự đoán thực của mô hình để tính ra điểm số thực.",i,U,x="TensorFlow không giống như việc nối các dự đoán của chúng ta lại với nhau, bởi vì chúng có độ dài chuỗi thay đổi. Điều này có nghĩa là chúng ta không thể chỉ sử dụng <code>model.predict()</code> —  hưng điều đó sẽ không ngăn cản chúng ta. Chúng ta sẽ nhận được một số dự đoán tại một thời điểm và nối chúng thành một danh sách dài lớn khi tiếp tục, bỏ các token <code>-100</code> tương ứng bị ẩn đi hoặc đệm, sau đó tính toán các số liệu trên danh sách ở cuối:",w,k,V,d,_,B,C="Mô hình của bạn đã làm như thế nào, so với mô hình của chúng tôi? Nếu bạn có những con số tương tự, khóa đào tạo của bạn đã thành công!",Z;return k=new f({props:{code:"aW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBJTBBYWxsX3ByZWRpY3Rpb25zJTIwJTNEJTIwJTVCJTVEJTBBYWxsX2xhYmVscyUyMCUzRCUyMCU1QiU1RCUwQWZvciUyMGJhdGNoJTIwaW4lMjB0Zl9ldmFsX2RhdGFzZXQlM0ElMEElMjAlMjAlMjAlMjBsb2dpdHMlMjAlM0QlMjBtb2RlbC5wcmVkaWN0KGJhdGNoKSU1QiUyMmxvZ2l0cyUyMiU1RCUwQSUyMCUyMCUyMCUyMGxhYmVscyUyMCUzRCUyMGJhdGNoJTVCJTIybGFiZWxzJTIyJTVEJTBBJTIwJTIwJTIwJTIwcHJlZGljdGlvbnMlMjAlM0QlMjBucC5hcmdtYXgobG9naXRzJTJDJTIwYXhpcyUzRC0xKSUwQSUyMCUyMCUyMCUyMGZvciUyMHByZWRpY3Rpb24lMkMlMjBsYWJlbCUyMGluJTIwemlwKHByZWRpY3Rpb25zJTJDJTIwbGFiZWxzKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMHByZWRpY3RlZF9pZHglMkMlMjBsYWJlbF9pZHglMjBpbiUyMHppcChwcmVkaWN0aW9uJTJDJTIwbGFiZWwpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjBsYWJlbF9pZHglMjAlM0QlM0QlMjAtMTAwJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY29udGludWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhbGxfcHJlZGljdGlvbnMuYXBwZW5kKGxhYmVsX25hbWVzJTVCcHJlZGljdGVkX2lkeCU1RCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhbGxfbGFiZWxzLmFwcGVuZChsYWJlbF9uYW1lcyU1QmxhYmVsX2lkeCU1RCklMEFtZXRyaWMuY29tcHV0ZShwcmVkaWN0aW9ucyUzRCU1QmFsbF9wcmVkaWN0aW9ucyU1RCUyQyUyMHJlZmVyZW5jZXMlM0QlNUJhbGxfbGFiZWxzJTVEKQ==",highlighted:`<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np

all_predictions = []
all_labels = []
<span class="hljs-keyword">for</span> batch <span class="hljs-keyword">in</span> tf_eval_dataset:
    logits = model.predict(batch)[<span class="hljs-string">&quot;logits&quot;</span>]
    labels = batch[<span class="hljs-string">&quot;labels&quot;</span>]
    predictions = np.argmax(logits, axis=-<span class="hljs-number">1</span>)
    <span class="hljs-keyword">for</span> prediction, label <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(predictions, labels):
        <span class="hljs-keyword">for</span> predicted_idx, label_idx <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(prediction, label):
            <span class="hljs-keyword">if</span> label_idx == -<span class="hljs-number">100</span>:
                <span class="hljs-keyword">continue</span>
            all_predictions.append(label_names[predicted_idx])
            all_labels.append(label_names[label_idx])
metric.compute(predictions=[all_predictions], references=[all_labels])`,wrap:!1}}),d=new f({props:{code:"JTdCJ0xPQyclM0ElMjAlN0IncHJlY2lzaW9uJyUzQSUyMDAuOTElMkMlMjAncmVjYWxsJyUzQSUyMDAuOTIlMkMlMjAnZjEnJTNBJTIwMC45MSUyQyUyMCdudW1iZXInJTNBJTIwMTY2OCU3RCUyQyUwQSUyMCdNSVNDJyUzQSUyMCU3QidwcmVjaXNpb24nJTNBJTIwMC43MCUyQyUyMCdyZWNhbGwnJTNBJTIwMC43OSUyQyUyMCdmMSclM0ElMjAwLjc0JTJDJTIwJ251bWJlciclM0ElMjA3MDIlN0QlMkMlMEElMjAnT1JHJyUzQSUyMCU3QidwcmVjaXNpb24nJTNBJTIwMC44NSUyQyUyMCdyZWNhbGwnJTNBJTIwMC45MCUyQyUyMCdmMSclM0ElMjAwLjg4JTJDJTIwJ251bWJlciclM0ElMjAxNjYxJTdEJTJDJTBBJTIwJ1BFUiclM0ElMjAlN0IncHJlY2lzaW9uJyUzQSUyMDAuOTUlMkMlMjAncmVjYWxsJyUzQSUyMDAuOTUlMkMlMjAnZjEnJTNBJTIwMC45NSUyQyUyMCdudW1iZXInJTNBJTIwMTYxNyU3RCUyQyUwQSUyMCdvdmVyYWxsX3ByZWNpc2lvbiclM0ElMjAwLjg3JTJDJTBBJTIwJ292ZXJhbGxfcmVjYWxsJyUzQSUyMDAuOTElMkMlMEElMjAnb3ZlcmFsbF9mMSclM0ElMjAwLjg5JTJDJTBBJTIwJ292ZXJhbGxfYWNjdXJhY3knJTNBJTIwMC45NyU3RA==",highlighted:`{<span class="hljs-string">&#x27;LOC&#x27;</span>: {<span class="hljs-string">&#x27;precision&#x27;</span>: <span class="hljs-number">0.91</span>, <span class="hljs-string">&#x27;recall&#x27;</span>: <span class="hljs-number">0.92</span>, <span class="hljs-string">&#x27;f1&#x27;</span>: <span class="hljs-number">0.91</span>, <span class="hljs-string">&#x27;number&#x27;</span>: <span class="hljs-number">1668</span>},
 <span class="hljs-string">&#x27;MISC&#x27;</span>: {<span class="hljs-string">&#x27;precision&#x27;</span>: <span class="hljs-number">0.70</span>, <span class="hljs-string">&#x27;recall&#x27;</span>: <span class="hljs-number">0.79</span>, <span class="hljs-string">&#x27;f1&#x27;</span>: <span class="hljs-number">0.74</span>, <span class="hljs-string">&#x27;number&#x27;</span>: <span class="hljs-number">702</span>},
 <span class="hljs-string">&#x27;ORG&#x27;</span>: {<span class="hljs-string">&#x27;precision&#x27;</span>: <span class="hljs-number">0.85</span>, <span class="hljs-string">&#x27;recall&#x27;</span>: <span class="hljs-number">0.90</span>, <span class="hljs-string">&#x27;f1&#x27;</span>: <span class="hljs-number">0.88</span>, <span class="hljs-string">&#x27;number&#x27;</span>: <span class="hljs-number">1661</span>},
 <span class="hljs-string">&#x27;PER&#x27;</span>: {<span class="hljs-string">&#x27;precision&#x27;</span>: <span class="hljs-number">0.95</span>, <span class="hljs-string">&#x27;recall&#x27;</span>: <span class="hljs-number">0.95</span>, <span class="hljs-string">&#x27;f1&#x27;</span>: <span class="hljs-number">0.95</span>, <span class="hljs-string">&#x27;number&#x27;</span>: <span class="hljs-number">1617</span>},
 <span class="hljs-string">&#x27;overall_precision&#x27;</span>: <span class="hljs-number">0.87</span>,
 <span class="hljs-string">&#x27;overall_recall&#x27;</span>: <span class="hljs-number">0.91</span>,
 <span class="hljs-string">&#x27;overall_f1&#x27;</span>: <span class="hljs-number">0.89</span>,
 <span class="hljs-string">&#x27;overall_accuracy&#x27;</span>: <span class="hljs-number">0.97</span>}`,wrap:!1}}),{c(){h=m("p"),h.textContent=g,i=a(),U=m("p"),U.innerHTML=x,w=a(),J(k.$$.fragment),V=a(),J(d.$$.fragment),_=a(),B=m("p"),B.textContent=C},l($){h=u($,"P",{"data-svelte-h":!0}),o(h)!=="svelte-1v3lf6"&&(h.textContent=g),i=c($),U=u($,"P",{"data-svelte-h":!0}),o(U)!=="svelte-1fqdwns"&&(U.innerHTML=x),w=c($),T(k.$$.fragment,$),V=c($),T(d.$$.fragment,$),_=c($),B=u($,"P",{"data-svelte-h":!0}),o(B)!=="svelte-r15qm"&&(B.textContent=C)},m($,G){s($,h,G),s($,i,G),s($,U,G),s($,w,G),j(k,$,G),s($,V,G),j(d,$,G),s($,_,G),s($,B,G),Z=!0},i($){Z||(r(k.$$.fragment,$),r(d.$$.fragment,$),Z=!0)},o($){y(k.$$.fragment,$),y(d.$$.fragment,$),Z=!1},d($){$&&(t(h),t(i),t(U),t(w),t(V),t(_),t(B)),b(k,$),b(d,$)}}}function ia(v){let h,g="Điều này đang gửi lại rất nhiều thông tin! Chúng ta nhận được precision, recall, và điểm F1 cho từng thực thể riêng biệt, cũng như tổng thể. Đối với tính toán số liệu của mình, chúng ta sẽ chỉ giữ lại điểm tổng thể, nhưng hãy tinh chỉnh chức năng <code>compute_metrics()</code> để trả về tất cả các số liệu bạn muốn báo cáo.",i,U,x="Hàm <code>compute_metrics()</code> này trước tiên lấy argmax của logits để chuyển chúng thành các dự đoán (như thường lệ, logits và xác suất theo cùng một thứ tự, vì vậy chúng ta không cần áp dụng softmax). Sau đó, chúng ta phải chuyển đổi cả nhãn và dự đoán từ số nguyên sang chuỗi. Chúng ta xóa tất cả các giá trị có nhãn là <code>-100</code>, sau đó chuyển kết quả đến phương thức <code>metric.compute()</code>:",w,k,V,d,_="Bây giờ điều này đã được thực hiện, chúng ta gần như đã sẵn sàng để xác định <code>Trainer</code> của mình. Chúng ta chỉ cần một <code>model</code>  để tinh chỉnh!",B;return k=new f({props:{code:"aW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBJTBBJTBBZGVmJTIwY29tcHV0ZV9tZXRyaWNzKGV2YWxfcHJlZHMpJTNBJTBBJTIwJTIwJTIwJTIwbG9naXRzJTJDJTIwbGFiZWxzJTIwJTNEJTIwZXZhbF9wcmVkcyUwQSUyMCUyMCUyMCUyMHByZWRpY3Rpb25zJTIwJTNEJTIwbnAuYXJnbWF4KGxvZ2l0cyUyQyUyMGF4aXMlM0QtMSklMEElMEElMjAlMjAlMjAlMjAlMjMlMjBYbyVDMyVBMSUyMG5oJUUxJUJCJUFGbmclMjBjaCVFMSVCQiU4OSUyMG0lRTElQkIlQTVjJTIwYiVFMSVCQiU4QiUyMG5nJUMzJUIzJTIwbCVDNiVBMSUyMCh0b2tlbiUyMCVDNCU5MSVFMSVCQSVCN2MlMjBiaSVFMSVCQiU4N3QpJTIwdiVDMyVBMCUyMGNodXklRTElQkIlODNuJTIwY2glQzMlQkFuZyUyMHRoJUMzJUEwbmglMjBuaCVDMyVBM24lMEElMjAlMjAlMjAlMjB0cnVlX2xhYmVscyUyMCUzRCUyMCU1QiU1QmxhYmVsX25hbWVzJTVCbCU1RCUyMGZvciUyMGwlMjBpbiUyMGxhYmVsJTIwaWYlMjBsJTIwISUzRCUyMC0xMDAlNUQlMjBmb3IlMjBsYWJlbCUyMGluJTIwbGFiZWxzJTVEJTBBJTIwJTIwJTIwJTIwdHJ1ZV9wcmVkaWN0aW9ucyUyMCUzRCUyMCU1QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QmxhYmVsX25hbWVzJTVCcCU1RCUyMGZvciUyMChwJTJDJTIwbCklMjBpbiUyMHppcChwcmVkaWN0aW9uJTJDJTIwbGFiZWwpJTIwaWYlMjBsJTIwISUzRCUyMC0xMDAlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmb3IlMjBwcmVkaWN0aW9uJTJDJTIwbGFiZWwlMjBpbiUyMHppcChwcmVkaWN0aW9ucyUyQyUyMGxhYmVscyklMEElMjAlMjAlMjAlMjAlNUQlMEElMjAlMjAlMjAlMjBhbGxfbWV0cmljcyUyMCUzRCUyMG1ldHJpYy5jb21wdXRlKHByZWRpY3Rpb25zJTNEdHJ1ZV9wcmVkaWN0aW9ucyUyQyUyMHJlZmVyZW5jZXMlM0R0cnVlX2xhYmVscyklMEElMjAlMjAlMjAlMjByZXR1cm4lMjAlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJwcmVjaXNpb24lMjIlM0ElMjBhbGxfbWV0cmljcyU1QiUyMm92ZXJhbGxfcHJlY2lzaW9uJTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIycmVjYWxsJTIyJTNBJTIwYWxsX21ldHJpY3MlNUIlMjJvdmVyYWxsX3JlY2FsbCUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmYxJTIyJTNBJTIwYWxsX21ldHJpY3MlNUIlMjJvdmVyYWxsX2YxJTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyYWNjdXJhY3klMjIlM0ElMjBhbGxfbWV0cmljcyU1QiUyMm92ZXJhbGxfYWNjdXJhY3klMjIlNUQlMkMlMEElMjAlMjAlMjAlMjAlN0Q=",highlighted:`<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np


<span class="hljs-keyword">def</span> <span class="hljs-title function_">compute_metrics</span>(<span class="hljs-params">eval_preds</span>):
    logits, labels = eval_preds
    predictions = np.argmax(logits, axis=-<span class="hljs-number">1</span>)

    <span class="hljs-comment"># Xoá những chỉ mục bị ngó lơ (token đặc biệt) và chuyển chúng thành nhãn</span>
    true_labels = [[label_names[l] <span class="hljs-keyword">for</span> l <span class="hljs-keyword">in</span> label <span class="hljs-keyword">if</span> l != -<span class="hljs-number">100</span>] <span class="hljs-keyword">for</span> label <span class="hljs-keyword">in</span> labels]
    true_predictions = [
        [label_names[p] <span class="hljs-keyword">for</span> (p, l) <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(prediction, label) <span class="hljs-keyword">if</span> l != -<span class="hljs-number">100</span>]
        <span class="hljs-keyword">for</span> prediction, label <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(predictions, labels)
    ]
    all_metrics = metric.compute(predictions=true_predictions, references=true_labels)
    <span class="hljs-keyword">return</span> {
        <span class="hljs-string">&quot;precision&quot;</span>: all_metrics[<span class="hljs-string">&quot;overall_precision&quot;</span>],
        <span class="hljs-string">&quot;recall&quot;</span>: all_metrics[<span class="hljs-string">&quot;overall_recall&quot;</span>],
        <span class="hljs-string">&quot;f1&quot;</span>: all_metrics[<span class="hljs-string">&quot;overall_f1&quot;</span>],
        <span class="hljs-string">&quot;accuracy&quot;</span>: all_metrics[<span class="hljs-string">&quot;overall_accuracy&quot;</span>],
    }`,wrap:!1}}),{c(){h=m("p"),h.innerHTML=g,i=a(),U=m("p"),U.innerHTML=x,w=a(),J(k.$$.fragment),V=a(),d=m("p"),d.innerHTML=_},l(C){h=u(C,"P",{"data-svelte-h":!0}),o(h)!=="svelte-5m5ywm"&&(h.innerHTML=g),i=c(C),U=u(C,"P",{"data-svelte-h":!0}),o(U)!=="svelte-1bgo0dj"&&(U.innerHTML=x),w=c(C),T(k.$$.fragment,C),V=c(C),d=u(C,"P",{"data-svelte-h":!0}),o(d)!=="svelte-6jkqqs"&&(d.innerHTML=_)},m(C,Z){s(C,h,Z),s(C,i,Z),s(C,U,Z),s(C,w,Z),j(k,C,Z),s(C,V,Z),s(C,d,Z),B=!0},i(C){B||(r(k.$$.fragment,C),B=!0)},o(C){y(k.$$.fragment,C),B=!1},d(C){C&&(t(h),t(i),t(U),t(w),t(V),t(d)),b(k,C)}}}function Ge(v){let h,g,i,U="Vì chúng ta đang giải quyết vấn đề phân loại token, chúng ta sẽ sử dụng lớp <code>AutoModelForTokenClassification</code>. Điều chính cần nhớ khi xác định mô hình này là truyền một số thông tin về số lượng nhãn mà chúng ta có. Cách dễ nhất để làm điều này là truyền vào tham số <code>num_labels</code>, nhưng nếu chúng ta muốn một tiện ích luận suy hoạt động giống như tiện ích chúng ta đã thấy ở đầu phần này, tốt hơn nên đặt các nhãn tương ứng chính xác thay thế.",x,w,k="Chúng phải được đặt bởi hai từ điển, <code>id2label</code> và <code>label2id</code>, chứa các ánh xạ từ ID đến nhãn và ngược lại:",V,d,_,B,C="Giờ ta có thể truyền chúng vào phương thức <code>AutoModelForTokenClassification.from_pretrained()</code>, và chúng sẽ được thiết lập trong cấu hình mô hình và sau đó được lưu vả tải lên Hub:",Z,$,G,O,Vl='Giống như khi chúng tôi định nghĩa <code>AutoModelForSequenceClassification</code> của mình trong <a href="/course/chapter3">Chương 3</a>, việc tạo mô hình đưa ra cảnh báo rằng một số trọng số không được sử dụng (những trọng số từ đầu huấn luyện trước) và một số trọng số khác được khởi tạo ngẫu nhiên (những trọng số từ đầu phân loại token mới) và mô hình này nên được huấn luyện. Chúng ta sẽ làm điều đó sau một phút, nhưng trước tiên hãy kiểm tra kỹ xem mô hình của chúng ta có đúng số lượng nhãn hay không:',cn,E,hn,K,In,A,Zn,Y,D,nn,Zl="Giờ ta đã sẵn sàng để huấn luyện mô hình của mình! Chúng ta chỉ cần làm hai điều trước khi định nghĩa <code>Trainer</code>:  đăng nhập vào Hugging Face và định nghĩa các tham số huấn luyện. Nếu bạn đang làm việc với notebook, có một hàm thuận tiện có thể giúp bạn:",pn,ln,kn,W,Al="Thao tác này sẽ hiển thị một tiện ích mà bạn có thể nhập thông tin đăng nhập Hugging Facecủa mình.",Mn,tn,Gl="Nếu bạn không làm việc trong sổ ghi chép, chỉ cần nhập dòng sau vào thiết bị đầu cuối của bạn:",sn,N,rn,X,xn="Once this is done, we can define our <code>TrainingArguments</code>:",An,H,yn,F,_n='Bạn đã từng thấy hầu hết những điều đó trước đây: chúng ta đặt một số siêu tham số (như tốc độ học, số epoch cần luyện tập và giảm trọng lượng) và chúng ta chỉ định <code>push_to_hub=True</code> để chỉ ra rằng chúng ta muốn lưu mô hình và đánh giá nó vào cuối mỗi epoch và rằng chúng ta muốn tải kết quả của mình lên Model Hub. Lưu ý rằng bạn có thể chỉ định tên của kho lưu trữ mà bạn muốn đẩy đến bằng tham số <code>hub_model_id</code> (cụ thể là bạn sẽ phải sử dụng tham số này để đẩy đến một tổ chức). Ví dụ: khi đẩy mô hình vào tổ chức <a href="https://huggingface.co/huggingface-course" rel="nofollow"><code>huggingface-course</code></a> chúng ta đã thêm <code>hub_model_id=&quot;huggingface-course/bert-finetuned-ner&quot;</code> vào <code>TrainingArguments</code>. Theo mặc định, kho lưu trữ được sử dụng sẽ nằm trong không gian tên của bạn và được đặt tên theo thư mục đầu ra mà bạn đã đặt, vì vậy trong trường hợp của chúng tôi, nó sẽ là <code>&quot;sgugger/bert-finetuned-ner&quot;</code>.',Gn,z,Jn,mn,en="Cuối cùng, chúng ta chỉ cần truyền mọi thứ cho  <code>Trainer</code> và bắt đầu huấn luyện:",$n,Q,Wl,un,an="Lưu ý rằng trong khi quá trình huấn luyện diễn ra, mỗi khi mô hình được lưu (ở đây, mỗi epoch), nó sẽ được tải lên Hub ở chế độ nền. Bằng cách này, bạn sẽ có thể tiếp tục huấn luyện của mình trên một máy khác nếu cần.",Wn,S,Bn="Sau khi quá trình huấn luyện hoàn tất, chúng ta sử dụng phương thức <code>push_to_hub()</code> để đảm bảo chúng ta tải lên phiên bản mới nhất của mô hình:",vn,R,Qn,L,p="Câu lệnh này trả về URL của cam khết nó vừa làm, nếu bạn muốn kiểm tra nó:",I,Tn,Kl,jn,rt="<code>Trainer</code> cũng soạn thảo một thẻ mô hình với tất cả các kết quả đánh giá và tải nó lên. Ở giai đoạn này, bạn có thể sử dụng tiện ích luận suy trên Model Hub để kiểm tra mô hình của mình và chia sẻ với bạn bè. Bạn đã tinh chỉnh thành công một mô hình trong tác vụ phân loại token - xin chúc mừng!",Rn,Ql,yt="Nếu bạn muốn tìm hiểu sâu hơn một chút về vòng huấn luyện, bây giờ chúng tôi sẽ hướng dẫn bạn cách thực hiện điều tương tự bằng cách sử dụng 🤗 Accelerate.",En,Yn,Nn,Xn,Rl='Bây giờ chúng ta hãy xem toàn bộ vòng lặp huấn luyện, vì vậy bạn có thể dễ dàng tùy chỉnh các phần bạn cần. Nó sẽ trông rất giống những gì chúng ta đã làm trong <a href="/course/chapter3/4">Chương 3</a>, với một vài thay đổi cho phần đánh giá.',mt,Hn,Fn,zn,El="Đầu tiên, chúng ta cần xây dựng các <code>DataLoader</code> từ các tập dữ liệu của mình. Chúng ta sẽ sử dụng lại <code>data_collator</code> của mình dưới dạng <code>collate_fn</code> và xáo trộn tập huấn luyện, nhưng không phải tập kiểm định:",nt,bn,ut,Sn,Yl="Tiếp theo, chúng ta khôi phục mô hình của mình, để đảm bảo rằng chúng ta không tiếp tục tinh chỉnh từ trước mà bắt đầu lại từ mô hình được huấn luyện trước BERT:",ot,Ln,Dn,Nl,Jt="Sau đó, chúng tôi sẽ cần một trình tối ưu hóa. Chúng ta sẽ sử dụng <code>AdamW</code> cổ điển, giống như <code>Adam</code>, nhưng với một bản sửa lỗi trong cách áp dụng weight decay (phân rã trọng số):",qn,Pn,On,Kn,Xl="Once we have all those objects, we can send them to the <code>accelerator.prepare()</code> method:",Tt,nl,ll,tl,sl,Hl,jt="Bây giờ, chúng ta đã gửi <code>train_dataloader</code> của mình tới <code>speedrator.prepare()</code>, chúng ta có thể sử dụng độ dài của nó để tính số bước huấn luyện. Hãy nhớ rằng chúng ta phải luôn làm điều này sau khi chuẩn bị dataloader, vì phương thức đó sẽ thay đổi độ dài của nó. Chúng ta sử dụng một lịch trình tuyến tính cổ điển từ tốc độ học đến 0:",Vn,el,al,cl,Fl="Cuối cùng, để đẩy mô hình của chúng ta lên Hub, chúng ta sẽ cần tạo một đối tượng <code>Repository</code> trong một thư mục đang làm việc. Đầu tiên hãy đăng nhập vào Hugging Face, nếu bạn chưa đăng nhập. Chúng ta sẽ xác định tên kho lưu trữ từ ID mô hình mà ta muốn cung cấp cho mô hình của mình (vui lòng thay thế <code>repo_name</code> bằng sự lựa chọn của riêng bạn; nó chỉ cần chứa tên người dùng của bạn, đó là những gì hàm <code>get_full_repo_name ()</code> thực hiện):",lt,dn,bt,hl,il,zl,dt="Sau đó, ta có thể sao chép kho lưu trữ đó trong một thư mục cục bộ. Nếu nó đã tồn tại, thư mục cục bộ này phải là bản sao hiện có của kho lưu trữ mà chúng ta đang làm việc:",pl,Ml,rl,Sl,gt="Giờ ta có thể tải mọi thứ ta lưu trong <code>output_dir</code> bằng cách gọi phương thức <code>repo.push_to_hub()</code>. Điều này sẽ giúp ta tải ngay lập tức mô hình ở cuối mỗi epoch.",yl,ml,ul,ol,Ll="Bây giờ chúng ta đã sẵn sàng để viết vòng lặp  huấn luyện đầy đủ. Để đơn giản hóa phần đánh giá của nó, chúng ta định nghĩa hàm <code>postprocess()</code> lấy các dự đoán và nhãn và chuyển đổi chúng thành danh sách các chuỗi, giống như đối tượng <code>metric</code> mong đợi:",Ut,Jl,Tl,jl,Dl="Sau đó, chúng ta có thể viết vòng lặp huấn luyện. Sau khi xác định một thanh tiến trình để theo dõi quá trình huấn luyện diễn ra như thế nào, vòng lặp có ba phần:",tt,gn,os="<li>Bản thân quá trình huấn luyện, là vòng lặp cổ điển trên <code>train_dataloader</code>, truyền thẳng qua mô hình, sau đó truyền ngược và tối ưu hóa.</li> <li>Đánh giá, trong đó có một điểm mới sau khi nhận được kết quả đầu ra của mô hình trên một lô: vì hai quy trình có thể đã độn các đầu vào và nhãn thành các hình dạng khác nhau, chúng ta cần sử dụng <code>accelerator.pad_across_processes()</code>để đưa ra dự đoán và dán nhãn cho cùng một hình dạng trước khi gọi phương thức <code>collect()</code>. Nếu không làm điều này, đánh giá sẽ bị lỗi hoặc bị treo vĩnh viễn. Sau đó, chúng ta gửi kết quả đến <code>metric.add_batch()</code> và gọi <code>metric.compute()</code> khi vòng lặp đánh giá kết thúc.</li> <li>Lưu và tải lên, nơi đầu tiên chúng ta lưu mô hình và trình tokenize, sau đó gọi <code>repo.push_to_hub()</code>. Lưu ý rằng chúng ta sử dụng đối số <code>blocks=False</code> để yêu cầu thư viện 🤗 Hub đẩy vào một quá trình không đồng bộ. Bằng cách này, quá trình huấn luyện tiếp tục diễn ra bình thường và lệnh (dài) này được thực thi ở chế độ nền.</li>",st,Un,Js="Đây là mã hoàn chỉnh cho vòng lặp huấn luyện:",et,wn,at,fn,wt="Trong trường hợp đây là lần đầu tiên bạn thấy một mô hình được lưu bằng 🤗 Accelerate, hãy dành một chút thời gian để kiểm tra ba dòng mã đi kèm với nó:",bl,ql,ct,Cn,ft="Dòng đầu tiên đã tự giải thích: nó cho tất cả các quá trình chờ cho đến khi mọi người ở giai đoạn đó trước khi tiếp tục. Điều này là để đảm bảo rằng ta có cùng một mô hình trong mọi quy trình trước khi lưu. Sau đó, chúng ta lấy <code>unwrapped_model</code>, là mô hình cơ sở mà ta đã xác định. Phương thức <code>accelerator.prepare()</code> thay đổi mô hình để hoạt động trong huấn luyện phân tán, vì vậy nó sẽ không có phương thức <code>save_pretrained()</code> nữa; phương thức <code>accelerator.unwrap_model()</code> hoàn tác bước đó. Cuối cùng, chúng ta gọi là <code>save_pretrained()</code> nhưng yêu cầu phương thức đó sử dụng <code>accelerator.save()</code> thay vì <code>torch.save()</code>.",dl,Pl,Ct='Khi điều này được thực hiện, bạn sẽ có một mô hình tạo ra kết quả khá giống với mô hình được huấn luyện với <code>Trainer</code>. Bạn có thể kiểm tra mô hình mà chúng ta đã huấn luyện bằng cách sử dụng đoạn mã này tại <a href="https://huggingface.co/huggingface-course/bert-finetuned-ner-accelerate" rel="nofollow"><em>huggingface-course/bert-finetuned-ner-accelerate</em></a>. Và nếu bạn muốn kiểm tra bất kỳ tinh chỉnh nào đối với vòng lặp huấn luyện, bạn có thể trực tiếp thực hiện chúng bằng cách chỉnh sửa đoạn mã được hiển thị ở trên!',gl;return h=new on({props:{title:"Định nghĩa mô hình",local:"định-nghĩa-mô-hình",headingTag:"h3"}}),d=new f({props:{code:"aWQybGFiZWwlMjAlM0QlMjAlN0JpJTNBJTIwbGFiZWwlMjBmb3IlMjBpJTJDJTIwbGFiZWwlMjBpbiUyMGVudW1lcmF0ZShsYWJlbF9uYW1lcyklN0QlMEFsYWJlbDJpZCUyMCUzRCUyMCU3QnYlM0ElMjBrJTIwZm9yJTIwayUyQyUyMHYlMjBpbiUyMGlkMmxhYmVsLml0ZW1zKCklN0Q=",highlighted:`id2label = {i: label <span class="hljs-keyword">for</span> i, label <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(label_names)}
label2id = {v: k <span class="hljs-keyword">for</span> k, v <span class="hljs-keyword">in</span> id2label.items()}`,wrap:!1}}),$=new f({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Nb2RlbEZvclRva2VuQ2xhc3NpZmljYXRpb24lMEElMEFtb2RlbCUyMCUzRCUyMEF1dG9Nb2RlbEZvclRva2VuQ2xhc3NpZmljYXRpb24uZnJvbV9wcmV0cmFpbmVkKCUwQSUyMCUyMCUyMCUyMG1vZGVsX2NoZWNrcG9pbnQlMkMlMEElMjAlMjAlMjAlMjBpZDJsYWJlbCUzRGlkMmxhYmVsJTJDJTBBJTIwJTIwJTIwJTIwbGFiZWwyaWQlM0RsYWJlbDJpZCUyQyUwQSk=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoModelForTokenClassification

model = AutoModelForTokenClassification.from_pretrained(
    model_checkpoint,
    id2label=id2label,
    label2id=label2id,
)`,wrap:!1}}),E=new f({props:{code:"bW9kZWwuY29uZmlnLm51bV9sYWJlbHM=",highlighted:"model.config.num_labels",wrap:!1}}),K=new f({props:{code:"OQ==",highlighted:'<span class="hljs-number">9</span>',wrap:!1}}),A=new Mt({props:{warning:!0,$$slots:{default:[pa]},$$scope:{ctx:v}}}),Y=new on({props:{title:"Tinh chỉnh mô hình",local:"tinh-chỉnh-mô-hình",headingTag:"h3"}}),ln=new f({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMG5vdGVib29rX2xvZ2luJTBBJTBBbm90ZWJvb2tfbG9naW4oKQ==",highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> notebook_login

notebook_login()`,wrap:!1}}),N=new f({props:{code:"aHVnZ2luZ2ZhY2UtY2xpJTIwbG9naW4=",highlighted:"huggingface-cli login",wrap:!1}}),H=new f({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFRyYWluaW5nQXJndW1lbnRzJTBBJTBBYXJncyUyMCUzRCUyMFRyYWluaW5nQXJndW1lbnRzKCUwQSUyMCUyMCUyMCUyMCUyMmJlcnQtZmluZXR1bmVkLW5lciUyMiUyQyUwQSUyMCUyMCUyMCUyMGV2YWx1YXRpb25fc3RyYXRlZ3klM0QlMjJlcG9jaCUyMiUyQyUwQSUyMCUyMCUyMCUyMHNhdmVfc3RyYXRlZ3klM0QlMjJlcG9jaCUyMiUyQyUwQSUyMCUyMCUyMCUyMGxlYXJuaW5nX3JhdGUlM0QyZS01JTJDJTBBJTIwJTIwJTIwJTIwbnVtX3RyYWluX2Vwb2NocyUzRDMlMkMlMEElMjAlMjAlMjAlMjB3ZWlnaHRfZGVjYXklM0QwLjAxJTJDJTBBJTIwJTIwJTIwJTIwcHVzaF90b19odWIlM0RUcnVlJTJDJTBBKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> TrainingArguments

args = TrainingArguments(
    <span class="hljs-string">&quot;bert-finetuned-ner&quot;</span>,
    evaluation_strategy=<span class="hljs-string">&quot;epoch&quot;</span>,
    save_strategy=<span class="hljs-string">&quot;epoch&quot;</span>,
    learning_rate=<span class="hljs-number">2e-5</span>,
    num_train_epochs=<span class="hljs-number">3</span>,
    weight_decay=<span class="hljs-number">0.01</span>,
    push_to_hub=<span class="hljs-literal">True</span>,
)`,wrap:!1}}),z=new Mt({props:{$$slots:{default:[Ma]},$$scope:{ctx:v}}}),Q=new f({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFRyYWluZXIlMEElMEF0cmFpbmVyJTIwJTNEJTIwVHJhaW5lciglMEElMjAlMjAlMjAlMjBtb2RlbCUzRG1vZGVsJTJDJTBBJTIwJTIwJTIwJTIwYXJncyUzRGFyZ3MlMkMlMEElMjAlMjAlMjAlMjB0cmFpbl9kYXRhc2V0JTNEdG9rZW5pemVkX2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBldmFsX2RhdGFzZXQlM0R0b2tlbml6ZWRfZGF0YXNldHMlNUIlMjJ2YWxpZGF0aW9uJTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwZGF0YV9jb2xsYXRvciUzRGRhdGFfY29sbGF0b3IlMkMlMEElMjAlMjAlMjAlMjBjb21wdXRlX21ldHJpY3MlM0Rjb21wdXRlX21ldHJpY3MlMkMlMEElMjAlMjAlMjAlMjB0b2tlbml6ZXIlM0R0b2tlbml6ZXIlMkMlMEEpJTBBdHJhaW5lci50cmFpbigp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> Trainer

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=tokenized_datasets[<span class="hljs-string">&quot;train&quot;</span>],
    eval_dataset=tokenized_datasets[<span class="hljs-string">&quot;validation&quot;</span>],
    data_collator=data_collator,
    compute_metrics=compute_metrics,
    tokenizer=tokenizer,
)
trainer.train()`,wrap:!1}}),R=new f({props:{code:"dHJhaW5lci5wdXNoX3RvX2h1Yihjb21taXRfbWVzc2FnZSUzRCUyMlRyYWluaW5nJTIwY29tcGxldGUlMjIp",highlighted:'trainer.push_to_hub(commit_message=<span class="hljs-string">&quot;Training complete&quot;</span>)',wrap:!1}}),Tn=new f({props:{code:"J2h0dHBzJTNBJTJGJTJGaHVnZ2luZ2ZhY2UuY28lMkZzZ3VnZ2VyJTJGYmVydC1maW5ldHVuZWQtbmVyJTJGY29tbWl0JTJGMjZhYjIxZTViMTU2OGY5YWZlY2NkYWVkMmQ4NzE1ZjU3MWQ3ODZlZCc=",highlighted:'<span class="hljs-string">&#x27;https://huggingface.co/sgugger/bert-finetuned-ner/commit/26ab21e5b1568f9afeccdaed2d8715f571d786ed&#x27;</span>',wrap:!1}}),Yn=new on({props:{title:"Một vòng huấn luyện tuỳ chỉnh",local:"một-vòng-huấn-luyện-tuỳ-chỉnh",headingTag:"h2"}}),Hn=new on({props:{title:"Chuẩn bị mọi thứ để huấn luyện",local:"chuẩn-bị-mọi-thứ-để-huấn-luyện",headingTag:"h3"}}),bn=new f({props:{code:"ZnJvbSUyMHRvcmNoLnV0aWxzLmRhdGElMjBpbXBvcnQlMjBEYXRhTG9hZGVyJTBBJTBBdHJhaW5fZGF0YWxvYWRlciUyMCUzRCUyMERhdGFMb2FkZXIoJTBBJTIwJTIwJTIwJTIwdG9rZW5pemVkX2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBzaHVmZmxlJTNEVHJ1ZSUyQyUwQSUyMCUyMCUyMCUyMGNvbGxhdGVfZm4lM0RkYXRhX2NvbGxhdG9yJTJDJTBBJTIwJTIwJTIwJTIwYmF0Y2hfc2l6ZSUzRDglMkMlMEEpJTBBZXZhbF9kYXRhbG9hZGVyJTIwJTNEJTIwRGF0YUxvYWRlciglMEElMjAlMjAlMjAlMjB0b2tlbml6ZWRfZGF0YXNldHMlNUIlMjJ2YWxpZGF0aW9uJTIyJTVEJTJDJTIwY29sbGF0ZV9mbiUzRGRhdGFfY29sbGF0b3IlMkMlMjBiYXRjaF9zaXplJTNEOCUwQSk=",highlighted:`<span class="hljs-keyword">from</span> torch.utils.data <span class="hljs-keyword">import</span> DataLoader

train_dataloader = DataLoader(
    tokenized_datasets[<span class="hljs-string">&quot;train&quot;</span>],
    shuffle=<span class="hljs-literal">True</span>,
    collate_fn=data_collator,
    batch_size=<span class="hljs-number">8</span>,
)
eval_dataloader = DataLoader(
    tokenized_datasets[<span class="hljs-string">&quot;validation&quot;</span>], collate_fn=data_collator, batch_size=<span class="hljs-number">8</span>
)`,wrap:!1}}),Ln=new f({props:{code:"bW9kZWwlMjAlM0QlMjBBdXRvTW9kZWxGb3JUb2tlbkNsYXNzaWZpY2F0aW9uLmZyb21fcHJldHJhaW5lZCglMEElMjAlMjAlMjAlMjBtb2RlbF9jaGVja3BvaW50JTJDJTBBJTIwJTIwJTIwJTIwaWQybGFiZWwlM0RpZDJsYWJlbCUyQyUwQSUyMCUyMCUyMCUyMGxhYmVsMmlkJTNEbGFiZWwyaWQlMkMlMEEp",highlighted:`model = AutoModelForTokenClassification.from_pretrained(
    model_checkpoint,
    id2label=id2label,
    label2id=label2id,
)`,wrap:!1}}),Pn=new f({props:{code:"ZnJvbSUyMHRvcmNoLm9wdGltJTIwaW1wb3J0JTIwQWRhbVclMEElMEFvcHRpbWl6ZXIlMjAlM0QlMjBBZGFtVyhtb2RlbC5wYXJhbWV0ZXJzKCklMkMlMjBsciUzRDJlLTUp",highlighted:`<span class="hljs-keyword">from</span> torch.optim <span class="hljs-keyword">import</span> AdamW

optimizer = AdamW(model.parameters(), lr=<span class="hljs-number">2e-5</span>)`,wrap:!1}}),nl=new f({props:{code:"ZnJvbSUyMGFjY2VsZXJhdGUlMjBpbXBvcnQlMjBBY2NlbGVyYXRvciUwQSUwQWFjY2VsZXJhdG9yJTIwJTNEJTIwQWNjZWxlcmF0b3IoKSUwQW1vZGVsJTJDJTIwb3B0aW1pemVyJTJDJTIwdHJhaW5fZGF0YWxvYWRlciUyQyUyMGV2YWxfZGF0YWxvYWRlciUyMCUzRCUyMGFjY2VsZXJhdG9yLnByZXBhcmUoJTBBJTIwJTIwJTIwJTIwbW9kZWwlMkMlMjBvcHRpbWl6ZXIlMkMlMjB0cmFpbl9kYXRhbG9hZGVyJTJDJTIwZXZhbF9kYXRhbG9hZGVyJTBBKQ==",highlighted:`<span class="hljs-keyword">from</span> accelerate <span class="hljs-keyword">import</span> Accelerator

accelerator = Accelerator()
model, optimizer, train_dataloader, eval_dataloader = accelerator.prepare(
    model, optimizer, train_dataloader, eval_dataloader
)`,wrap:!1}}),tl=new Mt({props:{$$slots:{default:[ra]},$$scope:{ctx:v}}}),el=new f({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMGdldF9zY2hlZHVsZXIlMEElMEFudW1fdHJhaW5fZXBvY2hzJTIwJTNEJTIwMyUwQW51bV91cGRhdGVfc3RlcHNfcGVyX2Vwb2NoJTIwJTNEJTIwbGVuKHRyYWluX2RhdGFsb2FkZXIpJTBBbnVtX3RyYWluaW5nX3N0ZXBzJTIwJTNEJTIwbnVtX3RyYWluX2Vwb2NocyUyMColMjBudW1fdXBkYXRlX3N0ZXBzX3Blcl9lcG9jaCUwQSUwQWxyX3NjaGVkdWxlciUyMCUzRCUyMGdldF9zY2hlZHVsZXIoJTBBJTIwJTIwJTIwJTIwJTIybGluZWFyJTIyJTJDJTBBJTIwJTIwJTIwJTIwb3B0aW1pemVyJTNEb3B0aW1pemVyJTJDJTBBJTIwJTIwJTIwJTIwbnVtX3dhcm11cF9zdGVwcyUzRDAlMkMlMEElMjAlMjAlMjAlMjBudW1fdHJhaW5pbmdfc3RlcHMlM0RudW1fdHJhaW5pbmdfc3RlcHMlMkMlMEEp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> get_scheduler

num_train_epochs = <span class="hljs-number">3</span>
num_update_steps_per_epoch = <span class="hljs-built_in">len</span>(train_dataloader)
num_training_steps = num_train_epochs * num_update_steps_per_epoch

lr_scheduler = get_scheduler(
    <span class="hljs-string">&quot;linear&quot;</span>,
    optimizer=optimizer,
    num_warmup_steps=<span class="hljs-number">0</span>,
    num_training_steps=num_training_steps,
)`,wrap:!1}}),dn=new f({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMFJlcG9zaXRvcnklMkMlMjBnZXRfZnVsbF9yZXBvX25hbWUlMEElMEFtb2RlbF9uYW1lJTIwJTNEJTIwJTIyYmVydC1maW5ldHVuZWQtbmVyLWFjY2VsZXJhdGUlMjIlMEFyZXBvX25hbWUlMjAlM0QlMjBnZXRfZnVsbF9yZXBvX25hbWUobW9kZWxfbmFtZSklMEFyZXBvX25hbWU=",highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> Repository, get_full_repo_name

model_name = <span class="hljs-string">&quot;bert-finetuned-ner-accelerate&quot;</span>
repo_name = get_full_repo_name(model_name)
repo_name`,wrap:!1}}),hl=new f({props:{code:"J3NndWdnZXIlMkZiZXJ0LWZpbmV0dW5lZC1uZXItYWNjZWxlcmF0ZSc=",highlighted:'<span class="hljs-string">&#x27;sgugger/bert-finetuned-ner-accelerate&#x27;</span>',wrap:!1}}),Ml=new f({props:{code:"b3V0cHV0X2RpciUyMCUzRCUyMCUyMmJlcnQtZmluZXR1bmVkLW5lci1hY2NlbGVyYXRlJTIyJTBBcmVwbyUyMCUzRCUyMFJlcG9zaXRvcnkob3V0cHV0X2RpciUyQyUyMGNsb25lX2Zyb20lM0RyZXBvX25hbWUp",highlighted:`output_dir = <span class="hljs-string">&quot;bert-finetuned-ner-accelerate&quot;</span>
repo = Repository(output_dir, clone_from=repo_name)`,wrap:!1}}),ml=new on({props:{title:"Vòng lặp huấn luyện",local:"vòng-lặp-huấn-luyện",headingTag:"h3"}}),Jl=new f({props:{code:"ZGVmJTIwcG9zdHByb2Nlc3MocHJlZGljdGlvbnMlMkMlMjBsYWJlbHMpJTNBJTBBJTIwJTIwJTIwJTIwcHJlZGljdGlvbnMlMjAlM0QlMjBwcmVkaWN0aW9ucy5kZXRhY2goKS5jcHUoKS5jbG9uZSgpLm51bXB5KCklMEElMjAlMjAlMjAlMjBsYWJlbHMlMjAlM0QlMjBsYWJlbHMuZGV0YWNoKCkuY3B1KCkuY2xvbmUoKS5udW1weSgpJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwTG8lRTElQkElQTFpJTIwYiVFMSVCQiU4RiUyMGMlQzMlQTFjJTIwY2glRTElQkIlODklMjBtJUUxJUJCJUE1YyUyMGIlRTElQkIlOEIlMjBuZyVDMyVCMyUyMGwlQzYlQTElMjAoYyVDMyVBMWMlMjB0b2tlbiUyMCVDNCU5MSVFMSVCQSVCN2MlMjBiaSVFMSVCQiU4N3QpJTIwdiVDMyVBMCUyMGNodXklRTElQkIlODNuJTIwY2glQzMlQkFuZyUyMHRoJUMzJUEwbmglMjBuaCVDMyVBM24lMEElMjAlMjAlMjAlMjB0cnVlX2xhYmVscyUyMCUzRCUyMCU1QiU1QmxhYmVsX25hbWVzJTVCbCU1RCUyMGZvciUyMGwlMjBpbiUyMGxhYmVsJTIwaWYlMjBsJTIwISUzRCUyMC0xMDAlNUQlMjBmb3IlMjBsYWJlbCUyMGluJTIwbGFiZWxzJTVEJTBBJTIwJTIwJTIwJTIwdHJ1ZV9wcmVkaWN0aW9ucyUyMCUzRCUyMCU1QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QmxhYmVsX25hbWVzJTVCcCU1RCUyMGZvciUyMChwJTJDJTIwbCklMjBpbiUyMHppcChwcmVkaWN0aW9uJTJDJTIwbGFiZWwpJTIwaWYlMjBsJTIwISUzRCUyMC0xMDAlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmb3IlMjBwcmVkaWN0aW9uJTJDJTIwbGFiZWwlMjBpbiUyMHppcChwcmVkaWN0aW9ucyUyQyUyMGxhYmVscyklMEElMjAlMjAlMjAlMjAlNUQlMEElMjAlMjAlMjAlMjByZXR1cm4lMjB0cnVlX2xhYmVscyUyQyUyMHRydWVfcHJlZGljdGlvbnM=",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">postprocess</span>(<span class="hljs-params">predictions, labels</span>):
    predictions = predictions.detach().cpu().clone().numpy()
    labels = labels.detach().cpu().clone().numpy()

    <span class="hljs-comment"># Loại bỏ các chỉ mục bị ngó lơ (các token đặc biệt) và chuyển chúng thành nhãn</span>
    true_labels = [[label_names[l] <span class="hljs-keyword">for</span> l <span class="hljs-keyword">in</span> label <span class="hljs-keyword">if</span> l != -<span class="hljs-number">100</span>] <span class="hljs-keyword">for</span> label <span class="hljs-keyword">in</span> labels]
    true_predictions = [
        [label_names[p] <span class="hljs-keyword">for</span> (p, l) <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(prediction, label) <span class="hljs-keyword">if</span> l != -<span class="hljs-number">100</span>]
        <span class="hljs-keyword">for</span> prediction, label <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(predictions, labels)
    ]
    <span class="hljs-keyword">return</span> true_labels, true_predictions`,wrap:!1}}),wn=new f({props:{code:"ZnJvbSUyMHRxZG0uYXV0byUyMGltcG9ydCUyMHRxZG0lMEFpbXBvcnQlMjB0b3JjaCUwQSUwQXByb2dyZXNzX2JhciUyMCUzRCUyMHRxZG0ocmFuZ2UobnVtX3RyYWluaW5nX3N0ZXBzKSklMEElMEFmb3IlMjBlcG9jaCUyMGluJTIwcmFuZ2UobnVtX3RyYWluX2Vwb2NocyklM0ElMEElMjAlMjAlMjAlMjAlMjMlMjBIdSVFMSVCQSVBNW4lMjBsdXklRTElQkIlODduJTBBJTIwJTIwJTIwJTIwbW9kZWwudHJhaW4oKSUwQSUyMCUyMCUyMCUyMGZvciUyMGJhdGNoJTIwaW4lMjB0cmFpbl9kYXRhbG9hZGVyJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb3V0cHV0cyUyMCUzRCUyMG1vZGVsKCoqYmF0Y2gpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbG9zcyUyMCUzRCUyMG91dHB1dHMubG9zcyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGFjY2VsZXJhdG9yLmJhY2t3YXJkKGxvc3MpJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb3B0aW1pemVyLnN0ZXAoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxyX3NjaGVkdWxlci5zdGVwKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvcHRpbWl6ZXIuemVyb19ncmFkKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcm9ncmVzc19iYXIudXBkYXRlKDEpJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUM0JTkwJUMzJUExbmglMjBnaSVDMyVBMSUwQSUyMCUyMCUyMCUyMG1vZGVsLmV2YWwoKSUwQSUyMCUyMCUyMCUyMGZvciUyMGJhdGNoJTIwaW4lMjBldmFsX2RhdGFsb2FkZXIlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aXRoJTIwdG9yY2gubm9fZ3JhZCgpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb3V0cHV0cyUyMCUzRCUyMG1vZGVsKCoqYmF0Y2gpJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJlZGljdGlvbnMlMjAlM0QlMjBvdXRwdXRzLmxvZ2l0cy5hcmdtYXgoZGltJTNELTEpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGFiZWxzJTIwJTNEJTIwYmF0Y2glNUIlMjJsYWJlbHMlMjIlNUQlMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBDJUUxJUJBJUE3biUyMCVDNCU5MSVFMSVCQiU4N20lMjBjJUMzJUExYyUyMGQlRTElQkIlQjElMjAlQzQlOTFvJUMzJUExbiUyMHYlQzMlQTAlMjBuaCVDMyVBM24lMjAlQzQlOTElRTElQkIlODMlMjB0JUUxJUJBJUFEcCUyMGglRTElQkIlQTNwJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJlZGljdGlvbnMlMjAlM0QlMjBhY2NlbGVyYXRvci5wYWRfYWNyb3NzX3Byb2Nlc3NlcyhwcmVkaWN0aW9ucyUyQyUyMGRpbSUzRDElMkMlMjBwYWRfaW5kZXglM0QtMTAwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxhYmVscyUyMCUzRCUyMGFjY2VsZXJhdG9yLnBhZF9hY3Jvc3NfcHJvY2Vzc2VzKGxhYmVscyUyQyUyMGRpbSUzRDElMkMlMjBwYWRfaW5kZXglM0QtMTAwKSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByZWRpY3Rpb25zX2dhdGhlcmVkJTIwJTNEJTIwYWNjZWxlcmF0b3IuZ2F0aGVyKHByZWRpY3Rpb25zKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxhYmVsc19nYXRoZXJlZCUyMCUzRCUyMGFjY2VsZXJhdG9yLmdhdGhlcihsYWJlbHMpJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdHJ1ZV9wcmVkaWN0aW9ucyUyQyUyMHRydWVfbGFiZWxzJTIwJTNEJTIwcG9zdHByb2Nlc3MocHJlZGljdGlvbnNfZ2F0aGVyZWQlMkMlMjBsYWJlbHNfZ2F0aGVyZWQpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWV0cmljLmFkZF9iYXRjaChwcmVkaWN0aW9ucyUzRHRydWVfcHJlZGljdGlvbnMlMkMlMjByZWZlcmVuY2VzJTNEdHJ1ZV9sYWJlbHMpJTBBJTBBJTIwJTIwJTIwJTIwcmVzdWx0cyUyMCUzRCUyMG1ldHJpYy5jb21wdXRlKCklMEElMjAlMjAlMjAlMjBwcmludCglMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmJTIyZXBvY2glMjAlN0JlcG9jaCU3RCUzQSUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGtleSUzQSUyMHJlc3VsdHMlNUJmJTIyb3ZlcmFsbF8lN0JrZXklN0QlMjIlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmb3IlMjBrZXklMjBpbiUyMCU1QiUyMnByZWNpc2lvbiUyMiUyQyUyMCUyMnJlY2FsbCUyMiUyQyUyMCUyMmYxJTIyJTJDJTIwJTIyYWNjdXJhY3klMjIlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEElMjAlMjAlMjAlMjApJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwTCVDNiVCMHUlMjB2JUMzJUEwJTIwdCVFMSVCQSVBM2klMEElMjAlMjAlMjAlMjBhY2NlbGVyYXRvci53YWl0X2Zvcl9ldmVyeW9uZSgpJTBBJTIwJTIwJTIwJTIwdW53cmFwcGVkX21vZGVsJTIwJTNEJTIwYWNjZWxlcmF0b3IudW53cmFwX21vZGVsKG1vZGVsKSUwQSUyMCUyMCUyMCUyMHVud3JhcHBlZF9tb2RlbC5zYXZlX3ByZXRyYWluZWQob3V0cHV0X2RpciUyQyUyMHNhdmVfZnVuY3Rpb24lM0RhY2NlbGVyYXRvci5zYXZlKSUwQSUyMCUyMCUyMCUyMGlmJTIwYWNjZWxlcmF0b3IuaXNfbWFpbl9wcm9jZXNzJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdG9rZW5pemVyLnNhdmVfcHJldHJhaW5lZChvdXRwdXRfZGlyKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJlcG8ucHVzaF90b19odWIoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY29tbWl0X21lc3NhZ2UlM0RmJTIyVHJhaW5pbmclMjBpbiUyMHByb2dyZXNzJTIwZXBvY2glMjAlN0JlcG9jaCU3RCUyMiUyQyUyMGJsb2NraW5nJTNERmFsc2UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAp",highlighted:`<span class="hljs-keyword">from</span> tqdm.auto <span class="hljs-keyword">import</span> tqdm
<span class="hljs-keyword">import</span> torch

progress_bar = tqdm(<span class="hljs-built_in">range</span>(num_training_steps))

<span class="hljs-keyword">for</span> epoch <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(num_train_epochs):
    <span class="hljs-comment"># Huấn luyện</span>
    model.train()
    <span class="hljs-keyword">for</span> batch <span class="hljs-keyword">in</span> train_dataloader:
        outputs = model(**batch)
        loss = outputs.loss
        accelerator.backward(loss)

        optimizer.step()
        lr_scheduler.step()
        optimizer.zero_grad()
        progress_bar.update(<span class="hljs-number">1</span>)

    <span class="hljs-comment"># Đánh giá</span>
    model.<span class="hljs-built_in">eval</span>()
    <span class="hljs-keyword">for</span> batch <span class="hljs-keyword">in</span> eval_dataloader:
        <span class="hljs-keyword">with</span> torch.no_grad():
            outputs = model(**batch)

        predictions = outputs.logits.argmax(dim=-<span class="hljs-number">1</span>)
        labels = batch[<span class="hljs-string">&quot;labels&quot;</span>]

        <span class="hljs-comment"># Cần đệm các dự đoán và nhãn để tập hợp</span>
        predictions = accelerator.pad_across_processes(predictions, dim=<span class="hljs-number">1</span>, pad_index=-<span class="hljs-number">100</span>)
        labels = accelerator.pad_across_processes(labels, dim=<span class="hljs-number">1</span>, pad_index=-<span class="hljs-number">100</span>)

        predictions_gathered = accelerator.gather(predictions)
        labels_gathered = accelerator.gather(labels)

        true_predictions, true_labels = postprocess(predictions_gathered, labels_gathered)
        metric.add_batch(predictions=true_predictions, references=true_labels)

    results = metric.compute()
    <span class="hljs-built_in">print</span>(
        <span class="hljs-string">f&quot;epoch <span class="hljs-subst">{epoch}</span>:&quot;</span>,
        {
            key: results[<span class="hljs-string">f&quot;overall_<span class="hljs-subst">{key}</span>&quot;</span>]
            <span class="hljs-keyword">for</span> key <span class="hljs-keyword">in</span> [<span class="hljs-string">&quot;precision&quot;</span>, <span class="hljs-string">&quot;recall&quot;</span>, <span class="hljs-string">&quot;f1&quot;</span>, <span class="hljs-string">&quot;accuracy&quot;</span>]
        },
    )

    <span class="hljs-comment"># Lưu và tải</span>
    accelerator.wait_for_everyone()
    unwrapped_model = accelerator.unwrap_model(model)
    unwrapped_model.save_pretrained(output_dir, save_function=accelerator.save)
    <span class="hljs-keyword">if</span> accelerator.is_main_process:
        tokenizer.save_pretrained(output_dir)
        repo.push_to_hub(
            commit_message=<span class="hljs-string">f&quot;Training in progress epoch <span class="hljs-subst">{epoch}</span>&quot;</span>, blocking=<span class="hljs-literal">False</span>
        )`,wrap:!1}}),ql=new f({props:{code:"YWNjZWxlcmF0b3Iud2FpdF9mb3JfZXZlcnlvbmUoKSUwQXVud3JhcHBlZF9tb2RlbCUyMCUzRCUyMGFjY2VsZXJhdG9yLnVud3JhcF9tb2RlbChtb2RlbCklMEF1bndyYXBwZWRfbW9kZWwuc2F2ZV9wcmV0cmFpbmVkKG91dHB1dF9kaXIlMkMlMjBzYXZlX2Z1bmN0aW9uJTNEYWNjZWxlcmF0b3Iuc2F2ZSk=",highlighted:`accelerator.wait_for_everyone()
unwrapped_model = accelerator.unwrap_model(model)
unwrapped_model.save_pretrained(output_dir, save_function=accelerator.save)`,wrap:!1}}),{c(){J(h.$$.fragment),g=a(),i=m("p"),i.innerHTML=U,x=a(),w=m("p"),w.innerHTML=k,V=a(),J(d.$$.fragment),_=a(),B=m("p"),B.innerHTML=C,Z=a(),J($.$$.fragment),G=a(),O=m("p"),O.innerHTML=Vl,cn=a(),J(E.$$.fragment),hn=a(),J(K.$$.fragment),In=a(),J(A.$$.fragment),Zn=a(),J(Y.$$.fragment),D=a(),nn=m("p"),nn.innerHTML=Zl,pn=a(),J(ln.$$.fragment),kn=a(),W=m("p"),W.textContent=Al,Mn=a(),tn=m("p"),tn.textContent=Gl,sn=a(),J(N.$$.fragment),rn=a(),X=m("p"),X.innerHTML=xn,An=a(),J(H.$$.fragment),yn=a(),F=m("p"),F.innerHTML=_n,Gn=a(),J(z.$$.fragment),Jn=a(),mn=m("p"),mn.innerHTML=en,$n=a(),J(Q.$$.fragment),Wl=a(),un=m("p"),un.textContent=an,Wn=a(),S=m("p"),S.innerHTML=Bn,vn=a(),J(R.$$.fragment),Qn=a(),L=m("p"),L.textContent=p,I=a(),J(Tn.$$.fragment),Kl=a(),jn=m("p"),jn.innerHTML=rt,Rn=a(),Ql=m("p"),Ql.textContent=yt,En=a(),J(Yn.$$.fragment),Nn=a(),Xn=m("p"),Xn.innerHTML=Rl,mt=a(),J(Hn.$$.fragment),Fn=a(),zn=m("p"),zn.innerHTML=El,nt=a(),J(bn.$$.fragment),ut=a(),Sn=m("p"),Sn.textContent=Yl,ot=a(),J(Ln.$$.fragment),Dn=a(),Nl=m("p"),Nl.innerHTML=Jt,qn=a(),J(Pn.$$.fragment),On=a(),Kn=m("p"),Kn.innerHTML=Xl,Tt=a(),J(nl.$$.fragment),ll=a(),J(tl.$$.fragment),sl=a(),Hl=m("p"),Hl.innerHTML=jt,Vn=a(),J(el.$$.fragment),al=a(),cl=m("p"),cl.innerHTML=Fl,lt=a(),J(dn.$$.fragment),bt=a(),J(hl.$$.fragment),il=a(),zl=m("p"),zl.textContent=dt,pl=a(),J(Ml.$$.fragment),rl=a(),Sl=m("p"),Sl.innerHTML=gt,yl=a(),J(ml.$$.fragment),ul=a(),ol=m("p"),ol.innerHTML=Ll,Ut=a(),J(Jl.$$.fragment),Tl=a(),jl=m("p"),jl.textContent=Dl,tt=a(),gn=m("ul"),gn.innerHTML=os,st=a(),Un=m("p"),Un.textContent=Js,et=a(),J(wn.$$.fragment),at=a(),fn=m("p"),fn.textContent=wt,bl=a(),J(ql.$$.fragment),ct=a(),Cn=m("p"),Cn.innerHTML=ft,dl=a(),Pl=m("p"),Pl.innerHTML=Ct},l(l){T(h.$$.fragment,l),g=c(l),i=u(l,"P",{"data-svelte-h":!0}),o(i)!=="svelte-d902n4"&&(i.innerHTML=U),x=c(l),w=u(l,"P",{"data-svelte-h":!0}),o(w)!=="svelte-15mxxvp"&&(w.innerHTML=k),V=c(l),T(d.$$.fragment,l),_=c(l),B=u(l,"P",{"data-svelte-h":!0}),o(B)!=="svelte-1yc0rdn"&&(B.innerHTML=C),Z=c(l),T($.$$.fragment,l),G=c(l),O=u(l,"P",{"data-svelte-h":!0}),o(O)!=="svelte-1n0pl10"&&(O.innerHTML=Vl),cn=c(l),T(E.$$.fragment,l),hn=c(l),T(K.$$.fragment,l),In=c(l),T(A.$$.fragment,l),Zn=c(l),T(Y.$$.fragment,l),D=c(l),nn=u(l,"P",{"data-svelte-h":!0}),o(nn)!=="svelte-108k9yy"&&(nn.innerHTML=Zl),pn=c(l),T(ln.$$.fragment,l),kn=c(l),W=u(l,"P",{"data-svelte-h":!0}),o(W)!=="svelte-1x93p4g"&&(W.textContent=Al),Mn=c(l),tn=u(l,"P",{"data-svelte-h":!0}),o(tn)!=="svelte-kzblct"&&(tn.textContent=Gl),sn=c(l),T(N.$$.fragment,l),rn=c(l),X=u(l,"P",{"data-svelte-h":!0}),o(X)!=="svelte-h1gi55"&&(X.innerHTML=xn),An=c(l),T(H.$$.fragment,l),yn=c(l),F=u(l,"P",{"data-svelte-h":!0}),o(F)!=="svelte-frep00"&&(F.innerHTML=_n),Gn=c(l),T(z.$$.fragment,l),Jn=c(l),mn=u(l,"P",{"data-svelte-h":!0}),o(mn)!=="svelte-ks90bo"&&(mn.innerHTML=en),$n=c(l),T(Q.$$.fragment,l),Wl=c(l),un=u(l,"P",{"data-svelte-h":!0}),o(un)!=="svelte-1fxnk8l"&&(un.textContent=an),Wn=c(l),S=u(l,"P",{"data-svelte-h":!0}),o(S)!=="svelte-ljclew"&&(S.innerHTML=Bn),vn=c(l),T(R.$$.fragment,l),Qn=c(l),L=u(l,"P",{"data-svelte-h":!0}),o(L)!=="svelte-hfc7x9"&&(L.textContent=p),I=c(l),T(Tn.$$.fragment,l),Kl=c(l),jn=u(l,"P",{"data-svelte-h":!0}),o(jn)!=="svelte-15a1ycq"&&(jn.innerHTML=rt),Rn=c(l),Ql=u(l,"P",{"data-svelte-h":!0}),o(Ql)!=="svelte-14v44xv"&&(Ql.textContent=yt),En=c(l),T(Yn.$$.fragment,l),Nn=c(l),Xn=u(l,"P",{"data-svelte-h":!0}),o(Xn)!=="svelte-n26vu8"&&(Xn.innerHTML=Rl),mt=c(l),T(Hn.$$.fragment,l),Fn=c(l),zn=u(l,"P",{"data-svelte-h":!0}),o(zn)!=="svelte-1m4gkj1"&&(zn.innerHTML=El),nt=c(l),T(bn.$$.fragment,l),ut=c(l),Sn=u(l,"P",{"data-svelte-h":!0}),o(Sn)!=="svelte-ephkr6"&&(Sn.textContent=Yl),ot=c(l),T(Ln.$$.fragment,l),Dn=c(l),Nl=u(l,"P",{"data-svelte-h":!0}),o(Nl)!=="svelte-5gl77r"&&(Nl.innerHTML=Jt),qn=c(l),T(Pn.$$.fragment,l),On=c(l),Kn=u(l,"P",{"data-svelte-h":!0}),o(Kn)!=="svelte-1oqv3so"&&(Kn.innerHTML=Xl),Tt=c(l),T(nl.$$.fragment,l),ll=c(l),T(tl.$$.fragment,l),sl=c(l),Hl=u(l,"P",{"data-svelte-h":!0}),o(Hl)!=="svelte-1uvr3sm"&&(Hl.innerHTML=jt),Vn=c(l),T(el.$$.fragment,l),al=c(l),cl=u(l,"P",{"data-svelte-h":!0}),o(cl)!=="svelte-loah9a"&&(cl.innerHTML=Fl),lt=c(l),T(dn.$$.fragment,l),bt=c(l),T(hl.$$.fragment,l),il=c(l),zl=u(l,"P",{"data-svelte-h":!0}),o(zl)!=="svelte-1p9p9jh"&&(zl.textContent=dt),pl=c(l),T(Ml.$$.fragment,l),rl=c(l),Sl=u(l,"P",{"data-svelte-h":!0}),o(Sl)!=="svelte-wep7ks"&&(Sl.innerHTML=gt),yl=c(l),T(ml.$$.fragment,l),ul=c(l),ol=u(l,"P",{"data-svelte-h":!0}),o(ol)!=="svelte-1otlyfz"&&(ol.innerHTML=Ll),Ut=c(l),T(Jl.$$.fragment,l),Tl=c(l),jl=u(l,"P",{"data-svelte-h":!0}),o(jl)!=="svelte-l84x9r"&&(jl.textContent=Dl),tt=c(l),gn=u(l,"UL",{"data-svelte-h":!0}),o(gn)!=="svelte-5g1gkm"&&(gn.innerHTML=os),st=c(l),Un=u(l,"P",{"data-svelte-h":!0}),o(Un)!=="svelte-1rmzoer"&&(Un.textContent=Js),et=c(l),T(wn.$$.fragment,l),at=c(l),fn=u(l,"P",{"data-svelte-h":!0}),o(fn)!=="svelte-1mkh5ro"&&(fn.textContent=wt),bl=c(l),T(ql.$$.fragment,l),ct=c(l),Cn=u(l,"P",{"data-svelte-h":!0}),o(Cn)!=="svelte-uqd9cr"&&(Cn.innerHTML=ft),dl=c(l),Pl=u(l,"P",{"data-svelte-h":!0}),o(Pl)!=="svelte-h4na4u"&&(Pl.innerHTML=Ct)},m(l,M){j(h,l,M),s(l,g,M),s(l,i,M),s(l,x,M),s(l,w,M),s(l,V,M),j(d,l,M),s(l,_,M),s(l,B,M),s(l,Z,M),j($,l,M),s(l,G,M),s(l,O,M),s(l,cn,M),j(E,l,M),s(l,hn,M),j(K,l,M),s(l,In,M),j(A,l,M),s(l,Zn,M),j(Y,l,M),s(l,D,M),s(l,nn,M),s(l,pn,M),j(ln,l,M),s(l,kn,M),s(l,W,M),s(l,Mn,M),s(l,tn,M),s(l,sn,M),j(N,l,M),s(l,rn,M),s(l,X,M),s(l,An,M),j(H,l,M),s(l,yn,M),s(l,F,M),s(l,Gn,M),j(z,l,M),s(l,Jn,M),s(l,mn,M),s(l,$n,M),j(Q,l,M),s(l,Wl,M),s(l,un,M),s(l,Wn,M),s(l,S,M),s(l,vn,M),j(R,l,M),s(l,Qn,M),s(l,L,M),s(l,I,M),j(Tn,l,M),s(l,Kl,M),s(l,jn,M),s(l,Rn,M),s(l,Ql,M),s(l,En,M),j(Yn,l,M),s(l,Nn,M),s(l,Xn,M),s(l,mt,M),j(Hn,l,M),s(l,Fn,M),s(l,zn,M),s(l,nt,M),j(bn,l,M),s(l,ut,M),s(l,Sn,M),s(l,ot,M),j(Ln,l,M),s(l,Dn,M),s(l,Nl,M),s(l,qn,M),j(Pn,l,M),s(l,On,M),s(l,Kn,M),s(l,Tt,M),j(nl,l,M),s(l,ll,M),j(tl,l,M),s(l,sl,M),s(l,Hl,M),s(l,Vn,M),j(el,l,M),s(l,al,M),s(l,cl,M),s(l,lt,M),j(dn,l,M),s(l,bt,M),j(hl,l,M),s(l,il,M),s(l,zl,M),s(l,pl,M),j(Ml,l,M),s(l,rl,M),s(l,Sl,M),s(l,yl,M),j(ml,l,M),s(l,ul,M),s(l,ol,M),s(l,Ut,M),j(Jl,l,M),s(l,Tl,M),s(l,jl,M),s(l,tt,M),s(l,gn,M),s(l,st,M),s(l,Un,M),s(l,et,M),j(wn,l,M),s(l,at,M),s(l,fn,M),s(l,bl,M),j(ql,l,M),s(l,ct,M),s(l,Cn,M),s(l,dl,M),s(l,Pl,M),gl=!0},i(l){gl||(r(h.$$.fragment,l),r(d.$$.fragment,l),r($.$$.fragment,l),r(E.$$.fragment,l),r(K.$$.fragment,l),r(A.$$.fragment,l),r(Y.$$.fragment,l),r(ln.$$.fragment,l),r(N.$$.fragment,l),r(H.$$.fragment,l),r(z.$$.fragment,l),r(Q.$$.fragment,l),r(R.$$.fragment,l),r(Tn.$$.fragment,l),r(Yn.$$.fragment,l),r(Hn.$$.fragment,l),r(bn.$$.fragment,l),r(Ln.$$.fragment,l),r(Pn.$$.fragment,l),r(nl.$$.fragment,l),r(tl.$$.fragment,l),r(el.$$.fragment,l),r(dn.$$.fragment,l),r(hl.$$.fragment,l),r(Ml.$$.fragment,l),r(ml.$$.fragment,l),r(Jl.$$.fragment,l),r(wn.$$.fragment,l),r(ql.$$.fragment,l),gl=!0)},o(l){y(h.$$.fragment,l),y(d.$$.fragment,l),y($.$$.fragment,l),y(E.$$.fragment,l),y(K.$$.fragment,l),y(A.$$.fragment,l),y(Y.$$.fragment,l),y(ln.$$.fragment,l),y(N.$$.fragment,l),y(H.$$.fragment,l),y(z.$$.fragment,l),y(Q.$$.fragment,l),y(R.$$.fragment,l),y(Tn.$$.fragment,l),y(Yn.$$.fragment,l),y(Hn.$$.fragment,l),y(bn.$$.fragment,l),y(Ln.$$.fragment,l),y(Pn.$$.fragment,l),y(nl.$$.fragment,l),y(tl.$$.fragment,l),y(el.$$.fragment,l),y(dn.$$.fragment,l),y(hl.$$.fragment,l),y(Ml.$$.fragment,l),y(ml.$$.fragment,l),y(Jl.$$.fragment,l),y(wn.$$.fragment,l),y(ql.$$.fragment,l),gl=!1},d(l){l&&(t(g),t(i),t(x),t(w),t(V),t(_),t(B),t(Z),t(G),t(O),t(cn),t(hn),t(In),t(Zn),t(D),t(nn),t(pn),t(kn),t(W),t(Mn),t(tn),t(sn),t(rn),t(X),t(An),t(yn),t(F),t(Gn),t(Jn),t(mn),t($n),t(Wl),t(un),t(Wn),t(S),t(vn),t(Qn),t(L),t(I),t(Kl),t(jn),t(Rn),t(Ql),t(En),t(Nn),t(Xn),t(mt),t(Fn),t(zn),t(nt),t(ut),t(Sn),t(ot),t(Dn),t(Nl),t(qn),t(On),t(Kn),t(Tt),t(ll),t(sl),t(Hl),t(Vn),t(al),t(cl),t(lt),t(bt),t(il),t(zl),t(pl),t(rl),t(Sl),t(yl),t(ul),t(ol),t(Ut),t(Tl),t(jl),t(tt),t(gn),t(st),t(Un),t(et),t(at),t(fn),t(bl),t(ct),t(Cn),t(dl),t(Pl)),b(h,l),b(d,l),b($,l),b(E,l),b(K,l),b(A,l),b(Y,l),b(ln,l),b(N,l),b(H,l),b(z,l),b(Q,l),b(R,l),b(Tn,l),b(Yn,l),b(Hn,l),b(bn,l),b(Ln,l),b(Pn,l),b(nl,l),b(tl,l),b(el,l),b(dn,l),b(hl,l),b(Ml,l),b(ml,l),b(Jl,l),b(wn,l),b(ql,l)}}}function pa(v){let h,g="⚠️ Nếu bạn có mô hình với số lượng nhãn sai, bạn sẽ nhận một lỗi khó hiểu khi gọi hàm <code>Trainer.train()</code> sau đó (giống như “CUDA error: device-side assert triggered”). Đây là nguyên nhân số một gây ra lỗi do người dùng báo cáo về những lỗi như vậy, vì vậy hãy đảm bảo bạn thực hiện kiểm tra này để xác nhận rằng bạn có số lượng nhãn dự kiến.";return{c(){h=m("p"),h.innerHTML=g},l(i){h=u(i,"P",{"data-svelte-h":!0}),o(h)!=="svelte-fi380e"&&(h.innerHTML=g)},m(i,U){s(i,h,U)},p:Ol,d(i){i&&t(h)}}}function Ma(v){let h,g="💡 Nếu thư mục đầu ra bạn đang sử dụng đã tồn tại, nó cần phải là bản sao cục bộ của kho lưu trữ mà bạn muốn đẩy đến. Nếu không, bạn sẽ gặp lỗi khi xác định <code>Trainer</code> của mình và sẽ cần đặt một tên mới.";return{c(){h=m("p"),h.innerHTML=g},l(i){h=u(i,"P",{"data-svelte-h":!0}),o(h)!=="svelte-3nvkea"&&(h.innerHTML=g)},m(i,U){s(i,h,U)},p:Ol,d(i){i&&t(h)}}}function ra(v){let h,g='🚨 Nếu bạn huấn luyện trên TPU, bạn sẽ cần chuyển tất cả các đoạn mã ở trên thành một hàm huấn luyện. Xem <a href="/course/chapter3">Chương 3</a> để biết thêm chi tiết.';return{c(){h=m("p"),h.innerHTML=g},l(i){h=u(i,"P",{"data-svelte-h":!0}),o(h)!=="svelte-1ej7tt4"&&(h.innerHTML=g)},m(i,U){s(i,h,U)},p:Ol,d(i){i&&t(h)}}}function ya(v){let h,g,i,U,x,w,k,V,d,_,B,C,Z="Ứng dụng đầu tiên chúng ta sẽ cùng khám phá là phân loại token. Tác vụ chung này bao gồm bất kỳ vấn đề nào có thể được xây dựng dưới dạng “gán nhãn cho mỗi token trong một câu”, chẳng hạn như:",$,G,O="<li><strong>Nhận dạng thực thể được đặt tên (NER)</strong>: Tìm các thực thể (chẳng hạn như người, địa điểm hoặc tổ chức) trong một câu. Điều này có thể được xây dựng như là gán nhãn cho mỗi token bằng cách có một nhãn cho mỗi thực thể và một nhãn cho “không có thực thể”.</li> <li><strong>Gán nhãn từ loại (POS)</strong>: Đánh dấu mỗi từ trong câu tương ứng với một từ loại cụ thể của văn bản (chẳng hạn như danh từ, động từ, tính từ, v.v.).</li> <li><strong>Phân khúc</strong>: Tìm các token thuộc cùng một thực thể. Tác vụ này (có thể được kết hợp với POS hoặc NER) có thể được xây dựng dưới dạng gán một nhãn (thường là <code>B-</code>) cho bất kỳ token nào ở đầu một đoạn, một nhãn khác (thường là <code>I-</code>) cho các token đó nằm bên trong một đoạn và một nhãn thứ ba (thường là <code>O</code>) token không thuộc bất kỳ đoạn nào.</li>",Vl,cn,E,hn,K="Tất nhiên, có nhiều loại vấn đề phân loại token khác; đó chỉ là một vài ví dụ tiêu biểu. Trong phần này, chúng ta sẽ tinh chỉnh một mô hình (BERT) trên một tác vụ NER, sau đó sẽ có thể tính toán các dự đoán như sau:",In,A,Zn,Y,D,nn='<img class="block dark:hidden lg:w-3/5" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/model-eval-bert-finetuned-ner.png" alt="One-hot encoded labels for question answering."/> <img class="hidden dark:block lg:w-3/5" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/model-eval-bert-finetuned-ner-dark.png" alt="One-hot encoded labels for question answering."/>',Zl,pn,ln='Bạn có thể tìm mô hình ta sẽ huấn luyện và tải lên Hub và kiểm tra lại các dự đoán <a href="https://huggingface.co/huggingface-course/bert-finetuned-ner?text=My+name+is+Sylvain+and+I+work+at+Hugging+Face+in+Brooklyn" rel="nofollow">tại đây</a>.',kn,W,Al,Mn,tn='Đầu tiên, ta cần bộ dữ liệu chuẩn bị cho phân loại token. Trong chương này, chúng ta sẽ sử dụng bộ dữ liệu <a href="https://huggingface.co/datasets/conll2003" rel="nofollow">CoNLL-2003</a>, bao gồm các câu chuyện tin tức từ Reuters.',Gl,sn,N,rn,X,xn,An="Để tải bộ dữ liệu CoNLL-2003, ta cần sử dụng phương thức <code>load_dataset()</code> từ thư viện 🤗 Datasets:",H,yn,F,_n,Gn='Ta sẽ tải và lưu bộ dữ liệu vào cache, như ta đã thấy trong <a href="/course/chapter3">Chương 3</a> cho bộ dữ liệu GLUE MRPC. Việc kiểm tra đối tượng này cho chúng ta thấy các cột hiện có và sự phân chia giữa các tập huấn luyện, kiểm định và kiểm thử:',z,Jn,mn,en,$n,Q,Wl="Đặc biệt, chúng ta có thể thấy tập dữ liệu chứa các nhãn cho ba tác vụ mà chúng ta đã đề cập trước đó: NER, POS và chunking. Một sự khác biệt lớn so với các bộ dữ liệu khác là các văn bản đầu vào không được trình bày dưới dạng câu hoặc tài liệu, mà là danh sách các từ (cột cuối cùng được gọi là <code>tokens</code>, nhưng nó chứa các từ theo nghĩa đây là các đầu vào được tokenize trước vẫn cần để đi qua trình tokenize để tokenize từ phụ).",un,an,Wn="Hãy xem phần tử đầu tiên của tập huấn luyện:",S,Bn,vn,R,Qn,L,p="Vì ta muốn thực hiện nhận dạng thực thể được đặt tên, chúng ta sẽ nhìn vào các thẻ NER:",I,Tn,Kl,jn,rt,Rn,Ql="Đó là những nhãn dưới dạng số nguyên sẵn sàng để huấn luyện, nhưng chúng không nhất thiết hữu ích khi chúng ta muốn kiểm tra dữ liệu. Giống như phân loại văn bản, chúng ta có thể truy cập sự tương ứng giữa các số nguyên đó và tên nhãn bằng cách xem thuộc tính <code>features</code> của tập dữ liệu:",yt,En,Yn,Nn,Xn,Rl,mt="Vì vậy, cột này chứa các phần tử là chuỗi của <code>ClassLabel</code>. Loại phần tử của chuỗi nằm trong thuộc tính <code>feature</code> của <code>ner_feature</code> này, và chúng ta có thể truy cập danh sách tên bằng cách xem thuộc tính <code>names</code> của <code>feature</code> đó:",Hn,Fn,zn,El,nt,bn,ut='Chúng ta đã thấy các nhãn khi đào sâu vào pipeline <code>token-classification</code> trong <a href="/course/chapter6/3">Chương 6</a>, nhưng để cập nhật nhanh:',Sn,Yl,ot="<li><code>O</code> nghĩa là từ không thuộc bất kì thực thể nào.</li> <li><code>B-PER</code>/<code>I-PER</code> nghĩa là từ tương ứng phần bắt đầu/ nằm bên trong của thực thể <em>person</em> hay <em>con người</em>.</li> <li><code>B-ORG</code>/<code>I-ORG</code> nghĩa là từ tương ứng phần bắt đầu/ nằm bên trong của thực thể <em>organization</em> hay <em>tổ chức</em>.</li> <li><code>B-LOC</code>/<code>I-LOC</code> nghĩa là từ tương ứng phần bắt đầu/ nằm bên trong của thực thể <em>location</em> hay <em>địa điểm</em>.</li> <li><code>B-MISC</code>/<code>I-MISC</code> nghĩa là từ tương ứng phần bắt đầu/ nằm bên trong của thực thể <em>miscellaneous</em> hay <em>lộn xộn</em>.</li>",Ln,Dn,Nl="Giờ khi giải mã các nhãn, ta thấy chúng cho ta:",Jt,qn,Pn,On,Kn,Xl,Tt="Và đối với một ví dụ trộn nhãn <code>B-</code> và <code>I-</code>, đây là những gì mà cùng một đoạn mã cung cấp cho chúng ta về phần tử của tập huấn luyện ở chỉ mục 4:",nl,ll,tl,sl,Hl="Như chúng ta có thể thấy, các thực thể bao gồm hai từ, như “European Union” và “Werner Zwingmann”, được gán nhãn <code>B-</code> cho từ đầu tiên và nhãn <code>I-</code> cho từ thứ hai.",jt,Vn,el,al,cl,Fl,lt,dn,bt='Như thường lệ, các văn bản của chúng ta cần được chuyển đổi sang token ID trước khi mô hình có thể hiểu được chúng. Như chúng ta đã thấy trong <a href="/course/chapter6/">Chương 6</a>, một sự khác biệt lớn trong trường hợp tác vụ phân loại token là chúng ta có các đầu vào được tokenize trước. May mắn thay, API tokenizer có thể giải quyết vấn đề đó khá dễ dàng; chúng ta chỉ cần báo <code>tokenizer</code> bằng một lá cờ đặc biệt.',hl,il,zl="Để bắt đầu, hãy tạo đối tượng <code>tokenizer</code> của chúng ta. Như chúng tôi đã nói trước đây, chúng ta sẽ sử dụng mô hình huấn luyện trước BERT, vì vậy chúng ta sẽ bắt đầu bằng cách tải xuống và lưu vào bộ nhớ đệm của tokenizer liên quan:",dt,pl,Ml,rl,Sl='Bạn có thể thay thế <code>model_checkpoint</code> bằng bất kỳ mô hình nào khác mà bạn thích từ <a href="https://huggingface.co/models" rel="nofollow">Hub</a> hoặc bằng một thư mục cục bộ trong đó bạn đã lưu một mô hình được huấn luyện trước và một trình tokenize. Hạn chế duy nhất là tokenizer cần được hỗ trợ bởi thư viện 🤗 Tokenizers, vì vậy sẽ có phiên bản “nhanh”. Bạn có thể xem tất cả các kiến trúc đi kèm với phiên bản nhanh trong <a href="https://huggingface.co/transformers/#supported-frameworks" rel="nofollow">bảng lớn này</a> và để kiểm tra xem đối tượng <code>tokenizer</code> mà bạn đang sử dụng có thực sự là được hỗ trợ bởi 🤗 Tokenizers, bạn có thể xem thuộc tính <code>is_fast</code> của nó:',gt,yl,ml,ul,ol,Ll,Ut="Để tokenize dữ liệu đầu vào đã tiền tokenize, ta có thể sử dụng <code>tokenizer</code> như thường lệ và chỉ thêm <code>is_split_into_words=True</code>:",Jl,Tl,jl,Dl,tt,gn,os="Như chúng ta có thể thấy, trình tokenizer đã thêm các token đặc biệt được sử dụng bởi mô hình (<code>[CLS]</code> ở đầu và <code>[SEP]</code> ở cuối) và để nguyên hầu hết các từ. Tuy nhiên, từ <code>lamb</code> đã được tokenize thành hai từ phụ, <code>la</code> và <code>##mb</code>. Điều này dẫn đến sự không khớp giữa đầu vào và các nhãn: danh sách nhãn chỉ có 9 phần tử, trong khi đầu vào của chúng ta hiện có 12 token. Việc tính toán các token đặc biệt rất dễ dàng (chúng ta biết chúng nằm ở đầu và cuối), nhưng chúng ta cũng cần đảm bảo rằng chúng ta sắp xếp tất cả các nhãn với các từ thích hợp.",st,Un,Js='May mắn thay, bởi vì chúng ta đang sử dụng một tokenizer nhanh, chúng ta có quyền truy cập vào sức mạnh siêu cường 🤗 Tokenizers, có nghĩa là chúng ta có thể dễ dàng ánh xạ từng token với từ tương ứng của nó (như đã thấy trong <a href="/course/chapter6/3">Chương 6</a>):',et,wn,at,fn,wt,bl,ql="Với một chút công việc, sau đó chúng ta có thể mở rộng danh sách nhãn của mình để phù hợp với các token. Quy tắc đầu tiên chúng ta sẽ áp dụng là các token đặc biệt có nhãn là <code>-100</code>. Điều này là do theo mặc định <code>-100</code> là chỉ số bị bỏ qua trong hàm mất mát mà chúng ta sẽ sử dụng (entropy chéo). Sau đó, mỗi token có cùng nhãn với token bắt đầu từ bên trong nó, vì chúng là một phần của cùng một thực thể. Đối với các token bên trong một từ nhưng không ở đầu, chúng ta thay thế <code>B-</code> bằng <code>I-</code> (vì token không bắt đầu thực thể):",ct,Cn,ft,dl,Pl="Hãy cùng thử với câu đầu tiên:",Ct,gl,l,M,js,It,ee="Như chúng ta có thể thấy, hàm đã thêm <code>-100</code> cho hai token đặc biệt ở đầu và cuối, và dấu <code>0</code> mới cho từ của chúng ta đã được chia thành hai token.",bs,ht,ds,kt,ae="Để xử lý trước toàn bộ tập dữ liệu của mình, chúng ta cần tokenize tất cả các đầu vào và áp dụng <code>align_labels_with_tokens()</code> trên tất cả các nhãn. Để tận dụng tốc độ của trình tokenize nhanh của mình, tốt nhất bạn nên tokenize nhiều văn bản cùng một lúc, vì vậy chúng ta sẽ viết một hàm xử lý danh sách các ví dụ và sử dụng phương thức <code>Dataset.map()</code> với tùy chọn <code>batched=True</code>. Điều duy nhất khác với ví dụ trước là hàm <code>word_ids()</code> cần lấy chỉ mục của mẫu mà chúng ta muốn các ID từ khi các đầu vào cho tokenizer là danh sách văn bản (hoặc trong trường hợp của chúng ta là danh sách danh sách các từ), vì vậy chúng ta cũng thêm vào đó:",gs,$t,Us,vt,ce="Lưu ý rằng chúng ta chưa đệm vào của mình; chúng ta sẽ làm điều đó sau, khi tạo các lô bằng trình đối chiếu dữ liệu.",ws,xt,he="Bây giờ chúng ta có thể áp dụng tất cả tiền xử lý đó trong một lần vào các phần khác của tập dữ liệu của mình:",fs,_t,Cs,Bt,ie='Chúng ta đã hoàn thành phần khó nhất! Bây giờ, dữ liệu đã được tiền xử lý, quá trình huấn luyện thực tế sẽ giống như những gì chúng ta đã làm trong <a href="/course/chapter3">Chương 3</a>.',Is,Ul,wl,is,Vt,ks,Zt,pe='Chúng ta không thể chỉ sử dụng một <code>DataCollatorWithPadding</code> như trong <a href="/course/chapter3">Chương 3</a> vì nó chỉ đệm các đầu vào (ID đầu vào, attention mask và loại token ID). Ở đây, các nhãn của chúng ta nên được đệm theo cùng một cách giống như các đầu vào để chúng giữ nguyên kích thước, sử dụng <code>-100</code> làm giá trị để các dự đoán tương ứng bị bỏ qua trong tính toán tổn thất.',$s,At,Me='Tất cả điều này được thực hiện bởi <a href="https://huggingface.co/transformers/main_classes/data_collator.html#datacollatorfortokenclassification" rel="nofollow"><code>DataCollatorForTokenClassification</code></a>. Giống như <code>DataCollatorWithPadding</code>, nó sử dụng <code>tokenizer</code> để xử lý trước các đầu vào:',vs,fl,Cl,ps,Gt,re="Để kiểm tra nó trên vài mẫu, ta có thể gọi nó trên danh sách các mẫu từ tập huấn luyện đã được tokenize:",xs,Wt,_s,Qt,Bs,Rt,ye="Hãy so sánh điều này với các nhãn cho phần tử đầu tiên và thứ hai trong tập dữ liệu của mình:",Vs,Et,Zs,Yt,As,Il,kl,Ms,rs,Nt,Gs,$l,vl,ys,Xt,Ws,Ht,me="Thước đo này không giống như các thước đo độ chính xác thông thương: nó sẽ nhận một danh sách các nhãn như là chuỗi văn bản, không phải số nguyên, nên ta sẽ cần giải mã toàn bộ những dự đoán và nhãn trước khi truyền chúng vào thước đo. Hãy cùng xem nó hoạt động ra sao. Đầu tiên, ta sẽ lấy những nhãn từ mẫu huấn luyện đầu tiên:",Qs,Ft,Rs,zt,Es,St,ue="Ta có thể tạo ra những dự đoán giả cho chúng bằng cách thay đổi giá trị ở chỉ mục 2:",Ys,Lt,Ns,Dt,oe="Lưu ý rằng thước đo nhận danh sách các dự đoán (không chỉ một) và danh sách các nhãn. Đây là đầu ra:",Xs,qt,Hs,xl,_l,ms,us,Pt,Fs,Ot,Je="Chúng tôi đã chỉ cho bạn cách bạn có thể sử dụng mô hình mà chúng ta đã tinh chỉnh trên Model Hub bằng tiện ích luận suy. Để sử dụng nó cục bộ trong một <code>pipeline</code>, bạn chỉ cần chỉ định mã định danh mô hình thích hợp:",zs,Kt,Ss,ns,Ls,ls,Te="Tuyệt quá! Mô hình của chúng ta đang hoạt động tốt như mô hình mặc định cho pipeline này!",Ds,Ts,qs;x=new Fe({props:{fw:v[0]}}),k=new on({props:{title:"Phân loại token",local:"phân-loại-token",headingTag:"h1"}});const je=[Se,ze],ts=[];function be(n,e){return n[0]==="pt"?0:1}d=be(v),_=ts[d]=je[d](v),cn=new Ze({props:{id:"wVHdVlPScxA"}}),W=new on({props:{title:"Chuẩn bị dữ liệu",local:"chuẩn-bị-dữ-liệu",headingTag:"h2"}}),sn=new Mt({props:{$$slots:{default:[Le]},$$scope:{ctx:v}}}),rn=new on({props:{title:"Tập dữ liệu CoNLL-2003",local:"tập-dữ-liệu-conll-2003",headingTag:"h3"}}),yn=new f({props:{code:"ZnJvbSUyMGRhdGFzZXRzJTIwaW1wb3J0JTIwbG9hZF9kYXRhc2V0JTBBJTBBcmF3X2RhdGFzZXRzJTIwJTNEJTIwbG9hZF9kYXRhc2V0KCUyMmNvbmxsMjAwMyUyMik=",highlighted:`<span class="hljs-keyword">from</span> datasets <span class="hljs-keyword">import</span> load_dataset

raw_datasets = load_dataset(<span class="hljs-string">&quot;conll2003&quot;</span>)`,wrap:!1}}),Jn=new f({props:{code:"cmF3X2RhdGFzZXRz",highlighted:"raw_datasets",wrap:!1}}),en=new f({props:{code:"RGF0YXNldERpY3QoJTdCJTBBJTIwJTIwJTIwJTIwdHJhaW4lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ2NodW5rX3RhZ3MnJTJDJTIwJ2lkJyUyQyUyMCduZXJfdGFncyclMkMlMjAncG9zX3RhZ3MnJTJDJTIwJ3Rva2VucyclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDE0MDQxJTBBJTIwJTIwJTIwJTIwJTdEKSUwQSUyMCUyMCUyMCUyMHZhbGlkYXRpb24lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ2NodW5rX3RhZ3MnJTJDJTIwJ2lkJyUyQyUyMCduZXJfdGFncyclMkMlMjAncG9zX3RhZ3MnJTJDJTIwJ3Rva2VucyclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDMyNTAlMEElMjAlMjAlMjAlMjAlN0QpJTBBJTIwJTIwJTIwJTIwdGVzdCUzQSUyMERhdGFzZXQoJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZmVhdHVyZXMlM0ElMjAlNUInY2h1bmtfdGFncyclMkMlMjAnaWQnJTJDJTIwJ25lcl90YWdzJyUyQyUyMCdwb3NfdGFncyclMkMlMjAndG9rZW5zJyU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwMzQ1MyUwQSUyMCUyMCUyMCUyMCU3RCklMEElN0Qp",highlighted:`DatasetDict({
    train: Dataset({
        features: [<span class="hljs-string">&#x27;chunk_tags&#x27;</span>, <span class="hljs-string">&#x27;id&#x27;</span>, <span class="hljs-string">&#x27;ner_tags&#x27;</span>, <span class="hljs-string">&#x27;pos_tags&#x27;</span>, <span class="hljs-string">&#x27;tokens&#x27;</span>],
        num_rows: <span class="hljs-number">14041</span>
    })
    validation: Dataset({
        features: [<span class="hljs-string">&#x27;chunk_tags&#x27;</span>, <span class="hljs-string">&#x27;id&#x27;</span>, <span class="hljs-string">&#x27;ner_tags&#x27;</span>, <span class="hljs-string">&#x27;pos_tags&#x27;</span>, <span class="hljs-string">&#x27;tokens&#x27;</span>],
        num_rows: <span class="hljs-number">3250</span>
    })
    test: Dataset({
        features: [<span class="hljs-string">&#x27;chunk_tags&#x27;</span>, <span class="hljs-string">&#x27;id&#x27;</span>, <span class="hljs-string">&#x27;ner_tags&#x27;</span>, <span class="hljs-string">&#x27;pos_tags&#x27;</span>, <span class="hljs-string">&#x27;tokens&#x27;</span>],
        num_rows: <span class="hljs-number">3453</span>
    })
})`,wrap:!1}}),Bn=new f({props:{code:"cmF3X2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUIwJTVEJTVCJTIydG9rZW5zJTIyJTVE",highlighted:'raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">0</span>][<span class="hljs-string">&quot;tokens&quot;</span>]',wrap:!1}}),R=new f({props:{code:"JTVCJ0VVJyUyQyUyMCdyZWplY3RzJyUyQyUyMCdHZXJtYW4nJTJDJTIwJ2NhbGwnJTJDJTIwJ3RvJyUyQyUyMCdib3ljb3R0JyUyQyUyMCdCcml0aXNoJyUyQyUyMCdsYW1iJyUyQyUyMCcuJyU1RA==",highlighted:'[<span class="hljs-string">&#x27;EU&#x27;</span>, <span class="hljs-string">&#x27;rejects&#x27;</span>, <span class="hljs-string">&#x27;German&#x27;</span>, <span class="hljs-string">&#x27;call&#x27;</span>, <span class="hljs-string">&#x27;to&#x27;</span>, <span class="hljs-string">&#x27;boycott&#x27;</span>, <span class="hljs-string">&#x27;British&#x27;</span>, <span class="hljs-string">&#x27;lamb&#x27;</span>, <span class="hljs-string">&#x27;.&#x27;</span>]',wrap:!1}}),Tn=new f({props:{code:"cmF3X2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUIwJTVEJTVCJTIybmVyX3RhZ3MlMjIlNUQ=",highlighted:'raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">0</span>][<span class="hljs-string">&quot;ner_tags&quot;</span>]',wrap:!1}}),jn=new f({props:{code:"JTVCMyUyQyUyMDAlMkMlMjA3JTJDJTIwMCUyQyUyMDAlMkMlMjAwJTJDJTIwNyUyQyUyMDAlMkMlMjAwJTVE",highlighted:'[<span class="hljs-number">3</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>]',wrap:!1}}),En=new f({props:{code:"bmVyX2ZlYXR1cmUlMjAlM0QlMjByYXdfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RC5mZWF0dXJlcyU1QiUyMm5lcl90YWdzJTIyJTVEJTBBbmVyX2ZlYXR1cmU=",highlighted:`ner_feature = raw_datasets[<span class="hljs-string">&quot;train&quot;</span>].features[<span class="hljs-string">&quot;ner_tags&quot;</span>]
ner_feature`,wrap:!1}}),Nn=new f({props:{code:"U2VxdWVuY2UoZmVhdHVyZSUzRENsYXNzTGFiZWwobnVtX2NsYXNzZXMlM0Q5JTJDJTIwbmFtZXMlM0QlNUInTyclMkMlMjAnQi1QRVInJTJDJTIwJ0ktUEVSJyUyQyUyMCdCLU9SRyclMkMlMjAnSS1PUkcnJTJDJTIwJ0ItTE9DJyUyQyUyMCdJLUxPQyclMkMlMjAnQi1NSVNDJyUyQyUyMCdJLU1JU0MnJTVEJTJDJTIwbmFtZXNfZmlsZSUzRE5vbmUlMkMlMjBpZCUzRE5vbmUpJTJDJTIwbGVuZ3RoJTNELTElMkMlMjBpZCUzRE5vbmUp",highlighted:'<span class="hljs-type">Sequence</span>(feature=ClassLabel(num_classes=<span class="hljs-number">9</span>, names=[<span class="hljs-string">&#x27;O&#x27;</span>, <span class="hljs-string">&#x27;B-PER&#x27;</span>, <span class="hljs-string">&#x27;I-PER&#x27;</span>, <span class="hljs-string">&#x27;B-ORG&#x27;</span>, <span class="hljs-string">&#x27;I-ORG&#x27;</span>, <span class="hljs-string">&#x27;B-LOC&#x27;</span>, <span class="hljs-string">&#x27;I-LOC&#x27;</span>, <span class="hljs-string">&#x27;B-MISC&#x27;</span>, <span class="hljs-string">&#x27;I-MISC&#x27;</span>], names_file=<span class="hljs-literal">None</span>, <span class="hljs-built_in">id</span>=<span class="hljs-literal">None</span>), length=-<span class="hljs-number">1</span>, <span class="hljs-built_in">id</span>=<span class="hljs-literal">None</span>)',wrap:!1}}),Fn=new f({props:{code:"bGFiZWxfbmFtZXMlMjAlM0QlMjBuZXJfZmVhdHVyZS5mZWF0dXJlLm5hbWVzJTBBbGFiZWxfbmFtZXM=",highlighted:`label_names = ner_feature.feature.names
label_names`,wrap:!1}}),El=new f({props:{code:"JTVCJ08nJTJDJTIwJ0ItUEVSJyUyQyUyMCdJLVBFUiclMkMlMjAnQi1PUkcnJTJDJTIwJ0ktT1JHJyUyQyUyMCdCLUxPQyclMkMlMjAnSS1MT0MnJTJDJTIwJ0ItTUlTQyclMkMlMjAnSS1NSVNDJyU1RA==",highlighted:'[<span class="hljs-string">&#x27;O&#x27;</span>, <span class="hljs-string">&#x27;B-PER&#x27;</span>, <span class="hljs-string">&#x27;I-PER&#x27;</span>, <span class="hljs-string">&#x27;B-ORG&#x27;</span>, <span class="hljs-string">&#x27;I-ORG&#x27;</span>, <span class="hljs-string">&#x27;B-LOC&#x27;</span>, <span class="hljs-string">&#x27;I-LOC&#x27;</span>, <span class="hljs-string">&#x27;B-MISC&#x27;</span>, <span class="hljs-string">&#x27;I-MISC&#x27;</span>]',wrap:!1}}),qn=new f({props:{code:"d29yZHMlMjAlM0QlMjByYXdfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCU1QjAlNUQlNUIlMjJ0b2tlbnMlMjIlNUQlMEFsYWJlbHMlMjAlM0QlMjByYXdfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCU1QjAlNUQlNUIlMjJuZXJfdGFncyUyMiU1RCUwQWxpbmUxJTIwJTNEJTIwJTIyJTIyJTBBbGluZTIlMjAlM0QlMjAlMjIlMjIlMEFmb3IlMjB3b3JkJTJDJTIwbGFiZWwlMjBpbiUyMHppcCh3b3JkcyUyQyUyMGxhYmVscyklM0ElMEElMjAlMjAlMjAlMjBmdWxsX2xhYmVsJTIwJTNEJTIwbGFiZWxfbmFtZXMlNUJsYWJlbCU1RCUwQSUyMCUyMCUyMCUyMG1heF9sZW5ndGglMjAlM0QlMjBtYXgobGVuKHdvcmQpJTJDJTIwbGVuKGZ1bGxfbGFiZWwpKSUwQSUyMCUyMCUyMCUyMGxpbmUxJTIwJTJCJTNEJTIwd29yZCUyMCUyQiUyMCUyMiUyMCUyMiUyMColMjAobWF4X2xlbmd0aCUyMC0lMjBsZW4od29yZCklMjAlMkIlMjAxKSUwQSUyMCUyMCUyMCUyMGxpbmUyJTIwJTJCJTNEJTIwZnVsbF9sYWJlbCUyMCUyQiUyMCUyMiUyMCUyMiUyMColMjAobWF4X2xlbmd0aCUyMC0lMjBsZW4oZnVsbF9sYWJlbCklMjAlMkIlMjAxKSUwQSUwQXByaW50KGxpbmUxKSUwQXByaW50KGxpbmUyKQ==",highlighted:`words = raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">0</span>][<span class="hljs-string">&quot;tokens&quot;</span>]
labels = raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">0</span>][<span class="hljs-string">&quot;ner_tags&quot;</span>]
line1 = <span class="hljs-string">&quot;&quot;</span>
line2 = <span class="hljs-string">&quot;&quot;</span>
<span class="hljs-keyword">for</span> word, label <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(words, labels):
    full_label = label_names[label]
    max_length = <span class="hljs-built_in">max</span>(<span class="hljs-built_in">len</span>(word), <span class="hljs-built_in">len</span>(full_label))
    line1 += word + <span class="hljs-string">&quot; &quot;</span> * (max_length - <span class="hljs-built_in">len</span>(word) + <span class="hljs-number">1</span>)
    line2 += full_label + <span class="hljs-string">&quot; &quot;</span> * (max_length - <span class="hljs-built_in">len</span>(full_label) + <span class="hljs-number">1</span>)

<span class="hljs-built_in">print</span>(line1)
<span class="hljs-built_in">print</span>(line2)`,wrap:!1}}),On=new f({props:{code:"J0VVJTIwJTIwJTIwJTIwcmVqZWN0cyUyMEdlcm1hbiUyMGNhbGwlMjB0byUyMGJveWNvdHQlMjBCcml0aXNoJTIwbGFtYiUyMC4nJTBBJ0ItT1JHJTIwTyUyMCUyMCUyMCUyMCUyMCUyMCUyMEItTUlTQyUyME8lMjAlMjAlMjAlMjBPJTIwJTIwTyUyMCUyMCUyMCUyMCUyMCUyMCUyMEItTUlTQyUyMCUyME8lMjAlMjAlMjAlMjBPJw==",highlighted:`<span class="hljs-string">&#x27;EU    rejects German call to boycott British lamb .&#x27;</span>
<span class="hljs-string">&#x27;B-ORG O       B-MISC O    O  O       B-MISC  O    O&#x27;</span>`,wrap:!1}}),ll=new f({props:{code:"J0dlcm1hbnklMjAlNUMncyUyMHJlcHJlc2VudGF0aXZlJTIwdG8lMjB0aGUlMjBFdXJvcGVhbiUyMFVuaW9uJTIwJTVDJ3MlMjB2ZXRlcmluYXJ5JTIwY29tbWl0dGVlJTIwV2VybmVyJTIwWndpbmdtYW5uJTIwc2FpZCUyMG9uJTIwV2VkbmVzZGF5JTIwY29uc3VtZXJzJTIwc2hvdWxkJTIwYnV5JTIwc2hlZXBtZWF0JTIwZnJvbSUyMGNvdW50cmllcyUyMG90aGVyJTIwdGhhbiUyMEJyaXRhaW4lMjB1bnRpbCUyMHRoZSUyMHNjaWVudGlmaWMlMjBhZHZpY2UlMjB3YXMlMjBjbGVhcmVyJTIwLiclMEEnQi1MT0MlMjAlMjAlMjBPJTIwJTIwTyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyME8lMjAlMjBPJTIwJTIwJTIwQi1PUkclMjAlMjAlMjAlMjBJLU9SRyUyME8lMjAlMjBPJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEItUEVSJTIwJTIwSS1QRVIlMjAlMjAlMjAlMjAlMjBPJTIwJTIwJTIwJTIwTyUyMCUyME8lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBPJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTyUyMCUyMCUyMCUyMCUyMCUyME8lMjAlMjAlMjBPJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTyUyMCUyMCUyMCUyME8lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBPJTIwJTIwJTIwJTIwJTIwTyUyMCUyMCUyMCUyMEItTE9DJTIwJTIwJTIwTyUyMCUyMCUyMCUyMCUyME8lMjAlMjAlMjBPJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTyUyMCUyMCUyMCUyMCUyMCUyME8lMjAlMjAlMjBPJTIwJTIwJTIwJTIwJTIwJTIwJTIwTyc=",highlighted:`<span class="hljs-string">&#x27;Germany \\&#x27;s representative to the European Union \\&#x27;s veterinary committee Werner Zwingmann said on Wednesday consumers should buy sheepmeat from countries other than Britain until the scientific advice was clearer .&#x27;</span>
<span class="hljs-string">&#x27;B-LOC   O  O              O  O   B-ORG    I-ORG O  O          O         B-PER  I-PER     O    O  O         O         O      O   O         O    O         O     O    B-LOC   O     O   O          O      O   O       O&#x27;</span>`,wrap:!1}}),Vn=new Mt({props:{$$slots:{default:[De]},$$scope:{ctx:v}}}),al=new on({props:{title:"Xử lý dữ liệu",local:"xử-lý-dữ-liệu",headingTag:"h3"}}),Fl=new Ze({props:{id:"iY2AZYdZAr0"}}),pl=new f({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMEElMEFtb2RlbF9jaGVja3BvaW50JTIwJTNEJTIwJTIyYmVydC1iYXNlLWNhc2VkJTIyJTBBdG9rZW5pemVyJTIwJTNEJTIwQXV0b1Rva2VuaXplci5mcm9tX3ByZXRyYWluZWQobW9kZWxfY2hlY2twb2ludCk=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer

model_checkpoint = <span class="hljs-string">&quot;bert-base-cased&quot;</span>
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)`,wrap:!1}}),yl=new f({props:{code:"dG9rZW5pemVyLmlzX2Zhc3Q=",highlighted:"tokenizer.is_fast",wrap:!1}}),ul=new f({props:{code:"VHJ1ZQ==",highlighted:'<span class="hljs-literal">True</span>',wrap:!1}}),Tl=new f({props:{code:"aW5wdXRzJTIwJTNEJTIwdG9rZW5pemVyKHJhd19kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVEJTVCMCU1RCU1QiUyMnRva2VucyUyMiU1RCUyQyUyMGlzX3NwbGl0X2ludG9fd29yZHMlM0RUcnVlKSUwQWlucHV0cy50b2tlbnMoKQ==",highlighted:`inputs = tokenizer(raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">0</span>][<span class="hljs-string">&quot;tokens&quot;</span>], is_split_into_words=<span class="hljs-literal">True</span>)
inputs.tokens()`,wrap:!1}}),Dl=new f({props:{code:"JTVCJyU1QkNMUyU1RCclMkMlMjAnRVUnJTJDJTIwJ3JlamVjdHMnJTJDJTIwJ0dlcm1hbiclMkMlMjAnY2FsbCclMkMlMjAndG8nJTJDJTIwJ2JveWNvdHQnJTJDJTIwJ0JyaXRpc2gnJTJDJTIwJ2xhJyUyQyUyMCclMjMlMjNtYiclMkMlMjAnLiclMkMlMjAnJTVCU0VQJTVEJyU1RA==",highlighted:'[<span class="hljs-string">&#x27;[CLS]&#x27;</span>, <span class="hljs-string">&#x27;EU&#x27;</span>, <span class="hljs-string">&#x27;rejects&#x27;</span>, <span class="hljs-string">&#x27;German&#x27;</span>, <span class="hljs-string">&#x27;call&#x27;</span>, <span class="hljs-string">&#x27;to&#x27;</span>, <span class="hljs-string">&#x27;boycott&#x27;</span>, <span class="hljs-string">&#x27;British&#x27;</span>, <span class="hljs-string">&#x27;la&#x27;</span>, <span class="hljs-string">&#x27;##mb&#x27;</span>, <span class="hljs-string">&#x27;.&#x27;</span>, <span class="hljs-string">&#x27;[SEP]&#x27;</span>]',wrap:!1}}),wn=new f({props:{code:"aW5wdXRzLndvcmRfaWRzKCk=",highlighted:"inputs.word_ids()",wrap:!1}}),fn=new f({props:{code:"JTVCTm9uZSUyQyUyMDAlMkMlMjAxJTJDJTIwMiUyQyUyMDMlMkMlMjA0JTJDJTIwNSUyQyUyMDYlMkMlMjA3JTJDJTIwNyUyQyUyMDglMkMlMjBOb25lJTVE",highlighted:'[<span class="hljs-literal">None</span>, <span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">6</span>, <span class="hljs-number">7</span>, <span class="hljs-number">7</span>, <span class="hljs-number">8</span>, <span class="hljs-literal">None</span>]',wrap:!1}}),Cn=new f({props:{code:"ZGVmJTIwYWxpZ25fbGFiZWxzX3dpdGhfdG9rZW5zKGxhYmVscyUyQyUyMHdvcmRfaWRzKSUzQSUwQSUyMCUyMCUyMCUyMG5ld19sYWJlbHMlMjAlM0QlMjAlNUIlNUQlMEElMjAlMjAlMjAlMjBjdXJyZW50X3dvcmQlMjAlM0QlMjBOb25lJTBBJTIwJTIwJTIwJTIwZm9yJTIwd29yZF9pZCUyMGluJTIwd29yZF9pZHMlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMHdvcmRfaWQlMjAhJTNEJTIwY3VycmVudF93b3JkJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwQiVFMSVCQSVBRnQlMjAlQzQlOTElRTElQkElQTd1JTIwbSVFMSVCQiU5OXQlMjB0JUUxJUJCJUFCJTIwbSVFMSVCQiU5QmkhJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY3VycmVudF93b3JkJTIwJTNEJTIwd29yZF9pZCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxhYmVsJTIwJTNEJTIwLTEwMCUyMGlmJTIwd29yZF9pZCUyMGlzJTIwTm9uZSUyMGVsc2UlMjBsYWJlbHMlNUJ3b3JkX2lkJTVEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbmV3X2xhYmVscy5hcHBlbmQobGFiZWwpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZWxpZiUyMHdvcmRfaWQlMjBpcyUyME5vbmUlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBUb2tlbiUyMCVDNCU5MSVFMSVCQSVCN2MlMjBiaSVFMSVCQiU4N3QlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBuZXdfbGFiZWxzLmFwcGVuZCgtMTAwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGVsc2UlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBUJUUxJUJCJUFCJTIwZ2klRTElQkIlOTFuZyUyMHYlRTElQkIlOUJpJTIwdG9rZW4lMjB0ciVDNiVCMCVFMSVCQiU5QmMlMjAlQzQlOTElQzMlQjMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsYWJlbCUyMCUzRCUyMGxhYmVscyU1QndvcmRfaWQlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBOJUUxJUJBJUJGdSUyMG5oJUMzJUEzbiUyMGwlQzMlQTAlMjBCLVhYWCUyQyUyMHRhJTIwJUM0JTkxJUUxJUJCJTk1aSUyMHNhbmclMjBJLVhYWCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwbGFiZWwlMjAlMjUlMjAyJTIwJTNEJTNEJTIwMSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxhYmVsJTIwJTJCJTNEJTIwMSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG5ld19sYWJlbHMuYXBwZW5kKGxhYmVsKSUwQSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMG5ld19sYWJlbHM=",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">align_labels_with_tokens</span>(<span class="hljs-params">labels, word_ids</span>):
    new_labels = []
    current_word = <span class="hljs-literal">None</span>
    <span class="hljs-keyword">for</span> word_id <span class="hljs-keyword">in</span> word_ids:
        <span class="hljs-keyword">if</span> word_id != current_word:
            <span class="hljs-comment"># Bắt đầu một từ mới!</span>
            current_word = word_id
            label = -<span class="hljs-number">100</span> <span class="hljs-keyword">if</span> word_id <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span> <span class="hljs-keyword">else</span> labels[word_id]
            new_labels.append(label)
        <span class="hljs-keyword">elif</span> word_id <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>:
            <span class="hljs-comment"># Token đặc biệt</span>
            new_labels.append(-<span class="hljs-number">100</span>)
        <span class="hljs-keyword">else</span>:
            <span class="hljs-comment"># Từ giống với token trước đó</span>
            label = labels[word_id]
            <span class="hljs-comment"># Nếu nhãn là B-XXX, ta đổi sang I-XXX</span>
            <span class="hljs-keyword">if</span> label % <span class="hljs-number">2</span> == <span class="hljs-number">1</span>:
                label += <span class="hljs-number">1</span>
            new_labels.append(label)

    <span class="hljs-keyword">return</span> new_labels`,wrap:!1}}),gl=new f({props:{code:"bGFiZWxzJTIwJTNEJTIwcmF3X2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUIwJTVEJTVCJTIybmVyX3RhZ3MlMjIlNUQlMEF3b3JkX2lkcyUyMCUzRCUyMGlucHV0cy53b3JkX2lkcygpJTBBcHJpbnQobGFiZWxzKSUwQXByaW50KGFsaWduX2xhYmVsc193aXRoX3Rva2VucyhsYWJlbHMlMkMlMjB3b3JkX2lkcykp",highlighted:`labels = raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">0</span>][<span class="hljs-string">&quot;ner_tags&quot;</span>]
word_ids = inputs.word_ids()
<span class="hljs-built_in">print</span>(labels)
<span class="hljs-built_in">print</span>(align_labels_with_tokens(labels, word_ids))`,wrap:!1}}),M=new f({props:{code:"JTVCMyUyQyUyMDAlMkMlMjA3JTJDJTIwMCUyQyUyMDAlMkMlMjAwJTJDJTIwNyUyQyUyMDAlMkMlMjAwJTVEJTBBJTVCLTEwMCUyQyUyMDMlMkMlMjAwJTJDJTIwNyUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDclMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAtMTAwJTVE",highlighted:`[<span class="hljs-number">3</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>]
[-<span class="hljs-number">100</span>, <span class="hljs-number">3</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, -<span class="hljs-number">100</span>]`,wrap:!1}}),ht=new Mt({props:{$$slots:{default:[qe]},$$scope:{ctx:v}}}),$t=new f({props:{code:"ZGVmJTIwdG9rZW5pemVfYW5kX2FsaWduX2xhYmVscyhleGFtcGxlcyklM0ElMEElMjAlMjAlMjAlMjB0b2tlbml6ZWRfaW5wdXRzJTIwJTNEJTIwdG9rZW5pemVyKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGV4YW1wbGVzJTVCJTIydG9rZW5zJTIyJTVEJTJDJTIwdHJ1bmNhdGlvbiUzRFRydWUlMkMlMjBpc19zcGxpdF9pbnRvX3dvcmRzJTNEVHJ1ZSUwQSUyMCUyMCUyMCUyMCklMEElMjAlMjAlMjAlMjBhbGxfbGFiZWxzJTIwJTNEJTIwZXhhbXBsZXMlNUIlMjJuZXJfdGFncyUyMiU1RCUwQSUyMCUyMCUyMCUyMG5ld19sYWJlbHMlMjAlM0QlMjAlNUIlNUQlMEElMjAlMjAlMjAlMjBmb3IlMjBpJTJDJTIwbGFiZWxzJTIwaW4lMjBlbnVtZXJhdGUoYWxsX2xhYmVscyklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3b3JkX2lkcyUyMCUzRCUyMHRva2VuaXplZF9pbnB1dHMud29yZF9pZHMoaSklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBuZXdfbGFiZWxzLmFwcGVuZChhbGlnbl9sYWJlbHNfd2l0aF90b2tlbnMobGFiZWxzJTJDJTIwd29yZF9pZHMpKSUwQSUwQSUyMCUyMCUyMCUyMHRva2VuaXplZF9pbnB1dHMlNUIlMjJsYWJlbHMlMjIlNUQlMjAlM0QlMjBuZXdfbGFiZWxzJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwdG9rZW5pemVkX2lucHV0cw==",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">tokenize_and_align_labels</span>(<span class="hljs-params">examples</span>):
    tokenized_inputs = tokenizer(
        examples[<span class="hljs-string">&quot;tokens&quot;</span>], truncation=<span class="hljs-literal">True</span>, is_split_into_words=<span class="hljs-literal">True</span>
    )
    all_labels = examples[<span class="hljs-string">&quot;ner_tags&quot;</span>]
    new_labels = []
    <span class="hljs-keyword">for</span> i, labels <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(all_labels):
        word_ids = tokenized_inputs.word_ids(i)
        new_labels.append(align_labels_with_tokens(labels, word_ids))

    tokenized_inputs[<span class="hljs-string">&quot;labels&quot;</span>] = new_labels
    <span class="hljs-keyword">return</span> tokenized_inputs`,wrap:!1}}),_t=new f({props:{code:"dG9rZW5pemVkX2RhdGFzZXRzJTIwJTNEJTIwcmF3X2RhdGFzZXRzLm1hcCglMEElMjAlMjAlMjAlMjB0b2tlbml6ZV9hbmRfYWxpZ25fbGFiZWxzJTJDJTBBJTIwJTIwJTIwJTIwYmF0Y2hlZCUzRFRydWUlMkMlMEElMjAlMjAlMjAlMjByZW1vdmVfY29sdW1ucyUzRHJhd19kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVELmNvbHVtbl9uYW1lcyUyQyUwQSk=",highlighted:`tokenized_datasets = raw_datasets.<span class="hljs-built_in">map</span>(
    tokenize_and_align_labels,
    batched=<span class="hljs-literal">True</span>,
    remove_columns=raw_datasets[<span class="hljs-string">&quot;train&quot;</span>].column_names,
)`,wrap:!1}});const de=[Oe,Pe],ss=[];function ge(n,e){return n[0]==="pt"?0:1}Ul=ge(v),wl=ss[Ul]=de[Ul](v),Vt=new on({props:{title:"Đối chiếu dữ liệu",local:"đối-chiếu-dữ-liệu",headingTag:"h3"}});const Ue=[na,Ke],es=[];function we(n,e){return n[0]==="pt"?0:1}fl=we(v),Cl=es[fl]=Ue[fl](v),Wt=new f({props:{code:"YmF0Y2glMjAlM0QlMjBkYXRhX2NvbGxhdG9yKCU1QnRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVEJTVCaSU1RCUyMGZvciUyMGklMjBpbiUyMHJhbmdlKDIpJTVEKSUwQWJhdGNoJTVCJTIybGFiZWxzJTIyJTVE",highlighted:`batch = data_collator([tokenized_datasets[<span class="hljs-string">&quot;train&quot;</span>][i] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">2</span>)])
batch[<span class="hljs-string">&quot;labels&quot;</span>]`,wrap:!1}}),Qt=new f({props:{code:"dGVuc29yKCU1QiU1Qi0xMDAlMkMlMjAlMjAlMjAlMjAzJTJDJTIwJTIwJTIwJTIwMCUyQyUyMCUyMCUyMCUyMDclMkMlMjAlMjAlMjAlMjAwJTJDJTIwJTIwJTIwJTIwMCUyQyUyMCUyMCUyMCUyMDAlMkMlMjAlMjAlMjAlMjA3JTJDJTIwJTIwJTIwJTIwMCUyQyUyMCUyMCUyMCUyMDAlMkMlMjAlMjAlMjAlMjAwJTJDJTIwLTEwMCU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1Qi0xMDAlMkMlMjAlMjAlMjAlMjAxJTJDJTIwJTIwJTIwJTIwMiUyQyUyMC0xMDAlMkMlMjAtMTAwJTJDJTIwLTEwMCUyQyUyMC0xMDAlMkMlMjAtMTAwJTJDJTIwLTEwMCUyQyUyMC0xMDAlMkMlMjAtMTAwJTJDJTIwLTEwMCU1RCU1RCk=",highlighted:`tensor([[-<span class="hljs-number">100</span>,    <span class="hljs-number">3</span>,    <span class="hljs-number">0</span>,    <span class="hljs-number">7</span>,    <span class="hljs-number">0</span>,    <span class="hljs-number">0</span>,    <span class="hljs-number">0</span>,    <span class="hljs-number">7</span>,    <span class="hljs-number">0</span>,    <span class="hljs-number">0</span>,    <span class="hljs-number">0</span>, -<span class="hljs-number">100</span>],
        [-<span class="hljs-number">100</span>,    <span class="hljs-number">1</span>,    <span class="hljs-number">2</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>]])`,wrap:!1}}),Et=new f({props:{code:"Zm9yJTIwaSUyMGluJTIwcmFuZ2UoMiklM0ElMEElMjAlMjAlMjAlMjBwcmludCh0b2tlbml6ZWRfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCU1QmklNUQlNUIlMjJsYWJlbHMlMjIlNUQp",highlighted:`<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">2</span>):
    <span class="hljs-built_in">print</span>(tokenized_datasets[<span class="hljs-string">&quot;train&quot;</span>][i][<span class="hljs-string">&quot;labels&quot;</span>])`,wrap:!1}}),Yt=new f({props:{code:"JTVCLTEwMCUyQyUyMDMlMkMlMjAwJTJDJTIwNyUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDclMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAtMTAwJTVEJTBBJTVCLTEwMCUyQyUyMDElMkMlMjAyJTJDJTIwLTEwMCU1RA==",highlighted:`[-<span class="hljs-number">100</span>, <span class="hljs-number">3</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, -<span class="hljs-number">100</span>]
[-<span class="hljs-number">100</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, -<span class="hljs-number">100</span>]`,wrap:!1}});const fe=[ta,la],as=[];function Ce(n,e){return n[0]==="pt"?0:1}Il=Ce(v),kl=as[Il]=fe[Il](v);let q=v[0]==="tf"&&Ae(v);Nt=new on({props:{title:"Thước đo",local:"thước-đo",headingTag:"h3"}});const Ie=[ca,aa],cs=[];function ke(n,e){return n[0]==="pt"?0:1}$l=ke(v),vl=cs[$l]=Ie[$l](v),Xt=new f({props:{code:"aW1wb3J0JTIwZXZhbHVhdGUlMEElMEFtZXRyaWMlMjAlM0QlMjBldmFsdWF0ZS5sb2FkKCUyMnNlcWV2YWwlMjIp",highlighted:`<span class="hljs-keyword">import</span> evaluate

metric = evaluate.load(<span class="hljs-string">&quot;seqeval&quot;</span>)`,wrap:!1}}),Ft=new f({props:{code:"bGFiZWxzJTIwJTNEJTIwcmF3X2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUIwJTVEJTVCJTIybmVyX3RhZ3MlMjIlNUQlMEFsYWJlbHMlMjAlM0QlMjAlNUJsYWJlbF9uYW1lcyU1QmklNUQlMjBmb3IlMjBpJTIwaW4lMjBsYWJlbHMlNUQlMEFsYWJlbHM=",highlighted:`labels = raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">0</span>][<span class="hljs-string">&quot;ner_tags&quot;</span>]
labels = [label_names[i] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> labels]
labels`,wrap:!1}}),zt=new f({props:{code:"JTVCJ0ItT1JHJyUyQyUyMCdPJyUyQyUyMCdCLU1JU0MnJTJDJTIwJ08nJTJDJTIwJ08nJTJDJTIwJ08nJTJDJTIwJ0ItTUlTQyclMkMlMjAnTyclMkMlMjAnTyclNUQ=",highlighted:'[<span class="hljs-string">&#x27;B-ORG&#x27;</span>, <span class="hljs-string">&#x27;O&#x27;</span>, <span class="hljs-string">&#x27;B-MISC&#x27;</span>, <span class="hljs-string">&#x27;O&#x27;</span>, <span class="hljs-string">&#x27;O&#x27;</span>, <span class="hljs-string">&#x27;O&#x27;</span>, <span class="hljs-string">&#x27;B-MISC&#x27;</span>, <span class="hljs-string">&#x27;O&#x27;</span>, <span class="hljs-string">&#x27;O&#x27;</span>]',wrap:!1}}),Lt=new f({props:{code:"cHJlZGljdGlvbnMlMjAlM0QlMjBsYWJlbHMuY29weSgpJTBBcHJlZGljdGlvbnMlNUIyJTVEJTIwJTNEJTIwJTIyTyUyMiUwQW1ldHJpYy5jb21wdXRlKHByZWRpY3Rpb25zJTNEJTVCcHJlZGljdGlvbnMlNUQlMkMlMjByZWZlcmVuY2VzJTNEJTVCbGFiZWxzJTVEKQ==",highlighted:`predictions = labels.copy()
predictions[<span class="hljs-number">2</span>] = <span class="hljs-string">&quot;O&quot;</span>
metric.compute(predictions=[predictions], references=[labels])`,wrap:!1}}),qt=new f({props:{code:"JTdCJ01JU0MnJTNBJTIwJTdCJ3ByZWNpc2lvbiclM0ElMjAxLjAlMkMlMjAncmVjYWxsJyUzQSUyMDAuNSUyQyUyMCdmMSclM0ElMjAwLjY3JTJDJTIwJ251bWJlciclM0ElMjAyJTdEJTJDJTBBJTIwJ09SRyclM0ElMjAlN0IncHJlY2lzaW9uJyUzQSUyMDEuMCUyQyUyMCdyZWNhbGwnJTNBJTIwMS4wJTJDJTIwJ2YxJyUzQSUyMDEuMCUyQyUyMCdudW1iZXInJTNBJTIwMSU3RCUyQyUwQSUyMCdvdmVyYWxsX3ByZWNpc2lvbiclM0ElMjAxLjAlMkMlMEElMjAnb3ZlcmFsbF9yZWNhbGwnJTNBJTIwMC42NyUyQyUwQSUyMCdvdmVyYWxsX2YxJyUzQSUyMDAuOCUyQyUwQSUyMCdvdmVyYWxsX2FjY3VyYWN5JyUzQSUyMDAuODklN0Q=",highlighted:`{<span class="hljs-string">&#x27;MISC&#x27;</span>: {<span class="hljs-string">&#x27;precision&#x27;</span>: <span class="hljs-number">1.0</span>, <span class="hljs-string">&#x27;recall&#x27;</span>: <span class="hljs-number">0.5</span>, <span class="hljs-string">&#x27;f1&#x27;</span>: <span class="hljs-number">0.67</span>, <span class="hljs-string">&#x27;number&#x27;</span>: <span class="hljs-number">2</span>},
 <span class="hljs-string">&#x27;ORG&#x27;</span>: {<span class="hljs-string">&#x27;precision&#x27;</span>: <span class="hljs-number">1.0</span>, <span class="hljs-string">&#x27;recall&#x27;</span>: <span class="hljs-number">1.0</span>, <span class="hljs-string">&#x27;f1&#x27;</span>: <span class="hljs-number">1.0</span>, <span class="hljs-string">&#x27;number&#x27;</span>: <span class="hljs-number">1</span>},
 <span class="hljs-string">&#x27;overall_precision&#x27;</span>: <span class="hljs-number">1.0</span>,
 <span class="hljs-string">&#x27;overall_recall&#x27;</span>: <span class="hljs-number">0.67</span>,
 <span class="hljs-string">&#x27;overall_f1&#x27;</span>: <span class="hljs-number">0.8</span>,
 <span class="hljs-string">&#x27;overall_accuracy&#x27;</span>: <span class="hljs-number">0.89</span>}`,wrap:!1}});const $e=[ia,ha],hs=[];function ve(n,e){return n[0]==="pt"?0:1}xl=ve(v),_l=hs[xl]=$e[xl](v);let P=v[0]==="pt"&&Ge(v);return Pt=new on({props:{title:"Sử dụng mô hình đã được tinh chỉnh",local:"sử-dụng-mô-hình-đã-được-tinh-chỉnh",headingTag:"h2"}}),Kt=new f({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMHBpcGVsaW5lJTBBJTBBJTIzJTIwVGhheSUyMHRoJUUxJUJBJUJGJTIwbiVDMyVCMyUyMHYlRTElQkIlOUJpJTIwY2hlY2twb2ludCUyMGMlRTElQkIlQTdhJTIwdGElMEFtb2RlbF9jaGVja3BvaW50JTIwJTNEJTIwJTIyaHVnZ2luZ2ZhY2UtY291cnNlJTJGYmVydC1maW5ldHVuZWQtbmVyJTIyJTBBdG9rZW5fY2xhc3NpZmllciUyMCUzRCUyMHBpcGVsaW5lKCUwQSUyMCUyMCUyMCUyMCUyMnRva2VuLWNsYXNzaWZpY2F0aW9uJTIyJTJDJTIwbW9kZWwlM0Rtb2RlbF9jaGVja3BvaW50JTJDJTIwYWdncmVnYXRpb25fc3RyYXRlZ3klM0QlMjJzaW1wbGUlMjIlMEEpJTBBdG9rZW5fY2xhc3NpZmllciglMjJNeSUyMG5hbWUlMjBpcyUyMFN5bHZhaW4lMjBhbmQlMjBJJTIwd29yayUyMGF0JTIwSHVnZ2luZyUyMEZhY2UlMjBpbiUyMEJyb29rbHluLiUyMik=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> pipeline

<span class="hljs-comment"># Thay thế nó với checkpoint của ta</span>
model_checkpoint = <span class="hljs-string">&quot;huggingface-course/bert-finetuned-ner&quot;</span>
token_classifier = pipeline(
    <span class="hljs-string">&quot;token-classification&quot;</span>, model=model_checkpoint, aggregation_strategy=<span class="hljs-string">&quot;simple&quot;</span>
)
token_classifier(<span class="hljs-string">&quot;My name is Sylvain and I work at Hugging Face in Brooklyn.&quot;</span>)`,wrap:!1}}),ns=new f({props:{code:"JTVCJTdCJ2VudGl0eV9ncm91cCclM0ElMjAnUEVSJyUyQyUyMCdzY29yZSclM0ElMjAwLjk5ODg1MDYlMkMlMjAnd29yZCclM0ElMjAnU3lsdmFpbiclMkMlMjAnc3RhcnQnJTNBJTIwMTElMkMlMjAnZW5kJyUzQSUyMDE4JTdEJTJDJTBBJTIwJTdCJ2VudGl0eV9ncm91cCclM0ElMjAnT1JHJyUyQyUyMCdzY29yZSclM0ElMjAwLjk2NDc2MjUlMkMlMjAnd29yZCclM0ElMjAnSHVnZ2luZyUyMEZhY2UnJTJDJTIwJ3N0YXJ0JyUzQSUyMDMzJTJDJTIwJ2VuZCclM0ElMjA0NSU3RCUyQyUwQSUyMCU3QidlbnRpdHlfZ3JvdXAnJTNBJTIwJ0xPQyclMkMlMjAnc2NvcmUnJTNBJTIwMC45OTg2MTE4JTJDJTIwJ3dvcmQnJTNBJTIwJ0Jyb29rbHluJyUyQyUyMCdzdGFydCclM0ElMjA0OSUyQyUyMCdlbmQnJTNBJTIwNTclN0QlNUQ=",highlighted:`[{<span class="hljs-string">&#x27;entity_group&#x27;</span>: <span class="hljs-string">&#x27;PER&#x27;</span>, <span class="hljs-string">&#x27;score&#x27;</span>: <span class="hljs-number">0.9988506</span>, <span class="hljs-string">&#x27;word&#x27;</span>: <span class="hljs-string">&#x27;Sylvain&#x27;</span>, <span class="hljs-string">&#x27;start&#x27;</span>: <span class="hljs-number">11</span>, <span class="hljs-string">&#x27;end&#x27;</span>: <span class="hljs-number">18</span>},
 {<span class="hljs-string">&#x27;entity_group&#x27;</span>: <span class="hljs-string">&#x27;ORG&#x27;</span>, <span class="hljs-string">&#x27;score&#x27;</span>: <span class="hljs-number">0.9647625</span>, <span class="hljs-string">&#x27;word&#x27;</span>: <span class="hljs-string">&#x27;Hugging Face&#x27;</span>, <span class="hljs-string">&#x27;start&#x27;</span>: <span class="hljs-number">33</span>, <span class="hljs-string">&#x27;end&#x27;</span>: <span class="hljs-number">45</span>},
 {<span class="hljs-string">&#x27;entity_group&#x27;</span>: <span class="hljs-string">&#x27;LOC&#x27;</span>, <span class="hljs-string">&#x27;score&#x27;</span>: <span class="hljs-number">0.9986118</span>, <span class="hljs-string">&#x27;word&#x27;</span>: <span class="hljs-string">&#x27;Brooklyn&#x27;</span>, <span class="hljs-string">&#x27;start&#x27;</span>: <span class="hljs-number">49</span>, <span class="hljs-string">&#x27;end&#x27;</span>: <span class="hljs-number">57</span>}]`,wrap:!1}}),{c(){h=m("meta"),g=a(),i=m("p"),U=a(),J(x.$$.fragment),w=a(),J(k.$$.fragment),V=a(),_.c(),B=a(),C=m("p"),C.textContent=Z,$=a(),G=m("ul"),G.innerHTML=O,Vl=a(),J(cn.$$.fragment),E=a(),hn=m("p"),hn.textContent=K,In=a(),A=m("iframe"),Y=a(),D=m("a"),D.innerHTML=nn,Zl=a(),pn=m("p"),pn.innerHTML=ln,kn=a(),J(W.$$.fragment),Al=a(),Mn=m("p"),Mn.innerHTML=tn,Gl=a(),J(sn.$$.fragment),N=a(),J(rn.$$.fragment),X=a(),xn=m("p"),xn.innerHTML=An,H=a(),J(yn.$$.fragment),F=a(),_n=m("p"),_n.innerHTML=Gn,z=a(),J(Jn.$$.fragment),mn=a(),J(en.$$.fragment),$n=a(),Q=m("p"),Q.innerHTML=Wl,un=a(),an=m("p"),an.textContent=Wn,S=a(),J(Bn.$$.fragment),vn=a(),J(R.$$.fragment),Qn=a(),L=m("p"),L.textContent=p,I=a(),J(Tn.$$.fragment),Kl=a(),J(jn.$$.fragment),rt=a(),Rn=m("p"),Rn.innerHTML=Ql,yt=a(),J(En.$$.fragment),Yn=a(),J(Nn.$$.fragment),Xn=a(),Rl=m("p"),Rl.innerHTML=mt,Hn=a(),J(Fn.$$.fragment),zn=a(),J(El.$$.fragment),nt=a(),bn=m("p"),bn.innerHTML=ut,Sn=a(),Yl=m("ul"),Yl.innerHTML=ot,Ln=a(),Dn=m("p"),Dn.textContent=Nl,Jt=a(),J(qn.$$.fragment),Pn=a(),J(On.$$.fragment),Kn=a(),Xl=m("p"),Xl.innerHTML=Tt,nl=a(),J(ll.$$.fragment),tl=a(),sl=m("p"),sl.innerHTML=Hl,jt=a(),J(Vn.$$.fragment),el=a(),J(al.$$.fragment),cl=a(),J(Fl.$$.fragment),lt=a(),dn=m("p"),dn.innerHTML=bt,hl=a(),il=m("p"),il.innerHTML=zl,dt=a(),J(pl.$$.fragment),Ml=a(),rl=m("p"),rl.innerHTML=Sl,gt=a(),J(yl.$$.fragment),ml=a(),J(ul.$$.fragment),ol=a(),Ll=m("p"),Ll.innerHTML=Ut,Jl=a(),J(Tl.$$.fragment),jl=a(),J(Dl.$$.fragment),tt=a(),gn=m("p"),gn.innerHTML=os,st=a(),Un=m("p"),Un.innerHTML=Js,et=a(),J(wn.$$.fragment),at=a(),J(fn.$$.fragment),wt=a(),bl=m("p"),bl.innerHTML=ql,ct=a(),J(Cn.$$.fragment),ft=a(),dl=m("p"),dl.textContent=Pl,Ct=a(),J(gl.$$.fragment),l=a(),J(M.$$.fragment),js=a(),It=m("p"),It.innerHTML=ee,bs=a(),J(ht.$$.fragment),ds=a(),kt=m("p"),kt.innerHTML=ae,gs=a(),J($t.$$.fragment),Us=a(),vt=m("p"),vt.textContent=ce,ws=a(),xt=m("p"),xt.textContent=he,fs=a(),J(_t.$$.fragment),Cs=a(),Bt=m("p"),Bt.innerHTML=ie,Is=a(),wl.c(),is=a(),J(Vt.$$.fragment),ks=a(),Zt=m("p"),Zt.innerHTML=pe,$s=a(),At=m("p"),At.innerHTML=Me,vs=a(),Cl.c(),ps=a(),Gt=m("p"),Gt.textContent=re,xs=a(),J(Wt.$$.fragment),_s=a(),J(Qt.$$.fragment),Bs=a(),Rt=m("p"),Rt.textContent=ye,Vs=a(),J(Et.$$.fragment),Zs=a(),J(Yt.$$.fragment),As=a(),kl.c(),Ms=a(),q&&q.c(),rs=a(),J(Nt.$$.fragment),Gs=a(),vl.c(),ys=a(),J(Xt.$$.fragment),Ws=a(),Ht=m("p"),Ht.textContent=me,Qs=a(),J(Ft.$$.fragment),Rs=a(),J(zt.$$.fragment),Es=a(),St=m("p"),St.textContent=ue,Ys=a(),J(Lt.$$.fragment),Ns=a(),Dt=m("p"),Dt.textContent=oe,Xs=a(),J(qt.$$.fragment),Hs=a(),_l.c(),ms=a(),P&&P.c(),us=a(),J(Pt.$$.fragment),Fs=a(),Ot=m("p"),Ot.innerHTML=Je,zs=a(),J(Kt.$$.fragment),Ss=a(),J(ns.$$.fragment),Ls=a(),ls=m("p"),ls.textContent=Te,Ds=a(),Ts=m("p"),this.h()},l(n){const e=Xe("svelte-u9bgzb",document.head);h=u(e,"META",{name:!0,content:!0}),e.forEach(t),g=c(n),i=u(n,"P",{}),se(i).forEach(t),U=c(n),T(x.$$.fragment,n),w=c(n),T(k.$$.fragment,n),V=c(n),_.l(n),B=c(n),C=u(n,"P",{"data-svelte-h":!0}),o(C)!=="svelte-kcrb9d"&&(C.textContent=Z),$=c(n),G=u(n,"UL",{"data-svelte-h":!0}),o(G)!=="svelte-4hl2j6"&&(G.innerHTML=O),Vl=c(n),T(cn.$$.fragment,n),E=c(n),hn=u(n,"P",{"data-svelte-h":!0}),o(hn)!=="svelte-dqjq9p"&&(hn.textContent=K),In=c(n),A=u(n,"IFRAME",{src:!0,frameborder:!0,height:!0,title:!0,class:!0,allow:!0,sandbox:!0}),se(A).forEach(t),Y=c(n),D=u(n,"A",{class:!0,href:!0,"data-svelte-h":!0}),o(D)!=="svelte-1269mpl"&&(D.innerHTML=nn),Zl=c(n),pn=u(n,"P",{"data-svelte-h":!0}),o(pn)!=="svelte-1t3cji1"&&(pn.innerHTML=ln),kn=c(n),T(W.$$.fragment,n),Al=c(n),Mn=u(n,"P",{"data-svelte-h":!0}),o(Mn)!=="svelte-1uj2l9r"&&(Mn.innerHTML=tn),Gl=c(n),T(sn.$$.fragment,n),N=c(n),T(rn.$$.fragment,n),X=c(n),xn=u(n,"P",{"data-svelte-h":!0}),o(xn)!=="svelte-14f74cf"&&(xn.innerHTML=An),H=c(n),T(yn.$$.fragment,n),F=c(n),_n=u(n,"P",{"data-svelte-h":!0}),o(_n)!=="svelte-1do8e0y"&&(_n.innerHTML=Gn),z=c(n),T(Jn.$$.fragment,n),mn=c(n),T(en.$$.fragment,n),$n=c(n),Q=u(n,"P",{"data-svelte-h":!0}),o(Q)!=="svelte-1gwdilo"&&(Q.innerHTML=Wl),un=c(n),an=u(n,"P",{"data-svelte-h":!0}),o(an)!=="svelte-1p36v05"&&(an.textContent=Wn),S=c(n),T(Bn.$$.fragment,n),vn=c(n),T(R.$$.fragment,n),Qn=c(n),L=u(n,"P",{"data-svelte-h":!0}),o(L)!=="svelte-173j4oc"&&(L.textContent=p),I=c(n),T(Tn.$$.fragment,n),Kl=c(n),T(jn.$$.fragment,n),rt=c(n),Rn=u(n,"P",{"data-svelte-h":!0}),o(Rn)!=="svelte-p3gjn2"&&(Rn.innerHTML=Ql),yt=c(n),T(En.$$.fragment,n),Yn=c(n),T(Nn.$$.fragment,n),Xn=c(n),Rl=u(n,"P",{"data-svelte-h":!0}),o(Rl)!=="svelte-gj76dr"&&(Rl.innerHTML=mt),Hn=c(n),T(Fn.$$.fragment,n),zn=c(n),T(El.$$.fragment,n),nt=c(n),bn=u(n,"P",{"data-svelte-h":!0}),o(bn)!=="svelte-1rvacz8"&&(bn.innerHTML=ut),Sn=c(n),Yl=u(n,"UL",{"data-svelte-h":!0}),o(Yl)!=="svelte-tf3n4v"&&(Yl.innerHTML=ot),Ln=c(n),Dn=u(n,"P",{"data-svelte-h":!0}),o(Dn)!=="svelte-gzp23x"&&(Dn.textContent=Nl),Jt=c(n),T(qn.$$.fragment,n),Pn=c(n),T(On.$$.fragment,n),Kn=c(n),Xl=u(n,"P",{"data-svelte-h":!0}),o(Xl)!=="svelte-10hefl4"&&(Xl.innerHTML=Tt),nl=c(n),T(ll.$$.fragment,n),tl=c(n),sl=u(n,"P",{"data-svelte-h":!0}),o(sl)!=="svelte-lr1n85"&&(sl.innerHTML=Hl),jt=c(n),T(Vn.$$.fragment,n),el=c(n),T(al.$$.fragment,n),cl=c(n),T(Fl.$$.fragment,n),lt=c(n),dn=u(n,"P",{"data-svelte-h":!0}),o(dn)!=="svelte-14v7uwd"&&(dn.innerHTML=bt),hl=c(n),il=u(n,"P",{"data-svelte-h":!0}),o(il)!=="svelte-5rxk81"&&(il.innerHTML=zl),dt=c(n),T(pl.$$.fragment,n),Ml=c(n),rl=u(n,"P",{"data-svelte-h":!0}),o(rl)!=="svelte-m0jajb"&&(rl.innerHTML=Sl),gt=c(n),T(yl.$$.fragment,n),ml=c(n),T(ul.$$.fragment,n),ol=c(n),Ll=u(n,"P",{"data-svelte-h":!0}),o(Ll)!=="svelte-x8rm6b"&&(Ll.innerHTML=Ut),Jl=c(n),T(Tl.$$.fragment,n),jl=c(n),T(Dl.$$.fragment,n),tt=c(n),gn=u(n,"P",{"data-svelte-h":!0}),o(gn)!=="svelte-15nt9mx"&&(gn.innerHTML=os),st=c(n),Un=u(n,"P",{"data-svelte-h":!0}),o(Un)!=="svelte-p7a3ad"&&(Un.innerHTML=Js),et=c(n),T(wn.$$.fragment,n),at=c(n),T(fn.$$.fragment,n),wt=c(n),bl=u(n,"P",{"data-svelte-h":!0}),o(bl)!=="svelte-1twimfs"&&(bl.innerHTML=ql),ct=c(n),T(Cn.$$.fragment,n),ft=c(n),dl=u(n,"P",{"data-svelte-h":!0}),o(dl)!=="svelte-1eyv0ai"&&(dl.textContent=Pl),Ct=c(n),T(gl.$$.fragment,n),l=c(n),T(M.$$.fragment,n),js=c(n),It=u(n,"P",{"data-svelte-h":!0}),o(It)!=="svelte-k6o8on"&&(It.innerHTML=ee),bs=c(n),T(ht.$$.fragment,n),ds=c(n),kt=u(n,"P",{"data-svelte-h":!0}),o(kt)!=="svelte-1ic8gh6"&&(kt.innerHTML=ae),gs=c(n),T($t.$$.fragment,n),Us=c(n),vt=u(n,"P",{"data-svelte-h":!0}),o(vt)!=="svelte-18dzia1"&&(vt.textContent=ce),ws=c(n),xt=u(n,"P",{"data-svelte-h":!0}),o(xt)!=="svelte-1iw2eb5"&&(xt.textContent=he),fs=c(n),T(_t.$$.fragment,n),Cs=c(n),Bt=u(n,"P",{"data-svelte-h":!0}),o(Bt)!=="svelte-1cxuke"&&(Bt.innerHTML=ie),Is=c(n),wl.l(n),is=c(n),T(Vt.$$.fragment,n),ks=c(n),Zt=u(n,"P",{"data-svelte-h":!0}),o(Zt)!=="svelte-1w45ng5"&&(Zt.innerHTML=pe),$s=c(n),At=u(n,"P",{"data-svelte-h":!0}),o(At)!=="svelte-ff9wd4"&&(At.innerHTML=Me),vs=c(n),Cl.l(n),ps=c(n),Gt=u(n,"P",{"data-svelte-h":!0}),o(Gt)!=="svelte-tar3mw"&&(Gt.textContent=re),xs=c(n),T(Wt.$$.fragment,n),_s=c(n),T(Qt.$$.fragment,n),Bs=c(n),Rt=u(n,"P",{"data-svelte-h":!0}),o(Rt)!=="svelte-ilc1k7"&&(Rt.textContent=ye),Vs=c(n),T(Et.$$.fragment,n),Zs=c(n),T(Yt.$$.fragment,n),As=c(n),kl.l(n),Ms=c(n),q&&q.l(n),rs=c(n),T(Nt.$$.fragment,n),Gs=c(n),vl.l(n),ys=c(n),T(Xt.$$.fragment,n),Ws=c(n),Ht=u(n,"P",{"data-svelte-h":!0}),o(Ht)!=="svelte-gumr3v"&&(Ht.textContent=me),Qs=c(n),T(Ft.$$.fragment,n),Rs=c(n),T(zt.$$.fragment,n),Es=c(n),St=u(n,"P",{"data-svelte-h":!0}),o(St)!=="svelte-1bkmxg0"&&(St.textContent=ue),Ys=c(n),T(Lt.$$.fragment,n),Ns=c(n),Dt=u(n,"P",{"data-svelte-h":!0}),o(Dt)!=="svelte-n98vq6"&&(Dt.textContent=oe),Xs=c(n),T(qt.$$.fragment,n),Hs=c(n),_l.l(n),ms=c(n),P&&P.l(n),us=c(n),T(Pt.$$.fragment,n),Fs=c(n),Ot=u(n,"P",{"data-svelte-h":!0}),o(Ot)!=="svelte-18hz3t7"&&(Ot.innerHTML=Je),zs=c(n),T(Kt.$$.fragment,n),Ss=c(n),T(ns.$$.fragment,n),Ls=c(n),ls=u(n,"P",{"data-svelte-h":!0}),o(ls)!=="svelte-1mo9myv"&&(ls.textContent=Te),Ds=c(n),Ts=u(n,"P",{}),se(Ts).forEach(t),this.h()},h(){Bl(h,"name","hf:doc:metadata"),Bl(h,"content",ma),Re(A.src,Zn="https://course-demos-bert-finetuned-ner.hf.space")||Bl(A,"src",Zn),Bl(A,"frameborder","0"),Bl(A,"height","350"),Bl(A,"title","Gradio app"),Bl(A,"class","block dark:hidden container p-0 flex-grow space-iframe"),Bl(A,"allow","accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking"),Bl(A,"sandbox","allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"),Bl(D,"class","flex justify-center"),Bl(D,"href","/huggingface-course/bert-finetuned-ner")},m(n,e){He(document.head,h),s(n,g,e),s(n,i,e),s(n,U,e),j(x,n,e),s(n,w,e),j(k,n,e),s(n,V,e),ts[d].m(n,e),s(n,B,e),s(n,C,e),s(n,$,e),s(n,G,e),s(n,Vl,e),j(cn,n,e),s(n,E,e),s(n,hn,e),s(n,In,e),s(n,A,e),s(n,Y,e),s(n,D,e),s(n,Zl,e),s(n,pn,e),s(n,kn,e),j(W,n,e),s(n,Al,e),s(n,Mn,e),s(n,Gl,e),j(sn,n,e),s(n,N,e),j(rn,n,e),s(n,X,e),s(n,xn,e),s(n,H,e),j(yn,n,e),s(n,F,e),s(n,_n,e),s(n,z,e),j(Jn,n,e),s(n,mn,e),j(en,n,e),s(n,$n,e),s(n,Q,e),s(n,un,e),s(n,an,e),s(n,S,e),j(Bn,n,e),s(n,vn,e),j(R,n,e),s(n,Qn,e),s(n,L,e),s(n,I,e),j(Tn,n,e),s(n,Kl,e),j(jn,n,e),s(n,rt,e),s(n,Rn,e),s(n,yt,e),j(En,n,e),s(n,Yn,e),j(Nn,n,e),s(n,Xn,e),s(n,Rl,e),s(n,Hn,e),j(Fn,n,e),s(n,zn,e),j(El,n,e),s(n,nt,e),s(n,bn,e),s(n,Sn,e),s(n,Yl,e),s(n,Ln,e),s(n,Dn,e),s(n,Jt,e),j(qn,n,e),s(n,Pn,e),j(On,n,e),s(n,Kn,e),s(n,Xl,e),s(n,nl,e),j(ll,n,e),s(n,tl,e),s(n,sl,e),s(n,jt,e),j(Vn,n,e),s(n,el,e),j(al,n,e),s(n,cl,e),j(Fl,n,e),s(n,lt,e),s(n,dn,e),s(n,hl,e),s(n,il,e),s(n,dt,e),j(pl,n,e),s(n,Ml,e),s(n,rl,e),s(n,gt,e),j(yl,n,e),s(n,ml,e),j(ul,n,e),s(n,ol,e),s(n,Ll,e),s(n,Jl,e),j(Tl,n,e),s(n,jl,e),j(Dl,n,e),s(n,tt,e),s(n,gn,e),s(n,st,e),s(n,Un,e),s(n,et,e),j(wn,n,e),s(n,at,e),j(fn,n,e),s(n,wt,e),s(n,bl,e),s(n,ct,e),j(Cn,n,e),s(n,ft,e),s(n,dl,e),s(n,Ct,e),j(gl,n,e),s(n,l,e),j(M,n,e),s(n,js,e),s(n,It,e),s(n,bs,e),j(ht,n,e),s(n,ds,e),s(n,kt,e),s(n,gs,e),j($t,n,e),s(n,Us,e),s(n,vt,e),s(n,ws,e),s(n,xt,e),s(n,fs,e),j(_t,n,e),s(n,Cs,e),s(n,Bt,e),s(n,Is,e),ss[Ul].m(n,e),s(n,is,e),j(Vt,n,e),s(n,ks,e),s(n,Zt,e),s(n,$s,e),s(n,At,e),s(n,vs,e),es[fl].m(n,e),s(n,ps,e),s(n,Gt,e),s(n,xs,e),j(Wt,n,e),s(n,_s,e),j(Qt,n,e),s(n,Bs,e),s(n,Rt,e),s(n,Vs,e),j(Et,n,e),s(n,Zs,e),j(Yt,n,e),s(n,As,e),as[Il].m(n,e),s(n,Ms,e),q&&q.m(n,e),s(n,rs,e),j(Nt,n,e),s(n,Gs,e),cs[$l].m(n,e),s(n,ys,e),j(Xt,n,e),s(n,Ws,e),s(n,Ht,e),s(n,Qs,e),j(Ft,n,e),s(n,Rs,e),j(zt,n,e),s(n,Es,e),s(n,St,e),s(n,Ys,e),j(Lt,n,e),s(n,Ns,e),s(n,Dt,e),s(n,Xs,e),j(qt,n,e),s(n,Hs,e),hs[xl].m(n,e),s(n,ms,e),P&&P.m(n,e),s(n,us,e),j(Pt,n,e),s(n,Fs,e),s(n,Ot,e),s(n,zs,e),j(Kt,n,e),s(n,Ss,e),j(ns,n,e),s(n,Ls,e),s(n,ls,e),s(n,Ds,e),s(n,Ts,e),qs=!0},p(n,[e]){const xe={};e&1&&(xe.fw=n[0]),x.$set(xe);let Ps=d;d=be(n),d!==Ps&&(pt(),y(ts[Ps],1,1,()=>{ts[Ps]=null}),it(),_=ts[d],_||(_=ts[d]=je[d](n),_.c()),r(_,1),_.m(B.parentNode,B));const _e={};e&2&&(_e.$$scope={dirty:e,ctx:n}),sn.$set(_e);const Be={};e&2&&(Be.$$scope={dirty:e,ctx:n}),Vn.$set(Be);const Ve={};e&2&&(Ve.$$scope={dirty:e,ctx:n}),ht.$set(Ve);let Os=Ul;Ul=ge(n),Ul!==Os&&(pt(),y(ss[Os],1,1,()=>{ss[Os]=null}),it(),wl=ss[Ul],wl||(wl=ss[Ul]=de[Ul](n),wl.c()),r(wl,1),wl.m(is.parentNode,is));let Ks=fl;fl=we(n),fl!==Ks&&(pt(),y(es[Ks],1,1,()=>{es[Ks]=null}),it(),Cl=es[fl],Cl||(Cl=es[fl]=Ue[fl](n),Cl.c()),r(Cl,1),Cl.m(ps.parentNode,ps));let ne=Il;Il=Ce(n),Il!==ne&&(pt(),y(as[ne],1,1,()=>{as[ne]=null}),it(),kl=as[Il],kl||(kl=as[Il]=fe[Il](n),kl.c()),r(kl,1),kl.m(Ms.parentNode,Ms)),n[0]==="tf"?q?e&1&&r(q,1):(q=Ae(n),q.c(),r(q,1),q.m(rs.parentNode,rs)):q&&(pt(),y(q,1,1,()=>{q=null}),it());let le=$l;$l=ke(n),$l!==le&&(pt(),y(cs[le],1,1,()=>{cs[le]=null}),it(),vl=cs[$l],vl||(vl=cs[$l]=Ie[$l](n),vl.c()),r(vl,1),vl.m(ys.parentNode,ys));let te=xl;xl=ve(n),xl!==te&&(pt(),y(hs[te],1,1,()=>{hs[te]=null}),it(),_l=hs[xl],_l||(_l=hs[xl]=$e[xl](n),_l.c()),r(_l,1),_l.m(ms.parentNode,ms)),n[0]==="pt"?P?e&1&&r(P,1):(P=Ge(n),P.c(),r(P,1),P.m(us.parentNode,us)):P&&(pt(),y(P,1,1,()=>{P=null}),it())},i(n){qs||(r(x.$$.fragment,n),r(k.$$.fragment,n),r(_),r(cn.$$.fragment,n),r(W.$$.fragment,n),r(sn.$$.fragment,n),r(rn.$$.fragment,n),r(yn.$$.fragment,n),r(Jn.$$.fragment,n),r(en.$$.fragment,n),r(Bn.$$.fragment,n),r(R.$$.fragment,n),r(Tn.$$.fragment,n),r(jn.$$.fragment,n),r(En.$$.fragment,n),r(Nn.$$.fragment,n),r(Fn.$$.fragment,n),r(El.$$.fragment,n),r(qn.$$.fragment,n),r(On.$$.fragment,n),r(ll.$$.fragment,n),r(Vn.$$.fragment,n),r(al.$$.fragment,n),r(Fl.$$.fragment,n),r(pl.$$.fragment,n),r(yl.$$.fragment,n),r(ul.$$.fragment,n),r(Tl.$$.fragment,n),r(Dl.$$.fragment,n),r(wn.$$.fragment,n),r(fn.$$.fragment,n),r(Cn.$$.fragment,n),r(gl.$$.fragment,n),r(M.$$.fragment,n),r(ht.$$.fragment,n),r($t.$$.fragment,n),r(_t.$$.fragment,n),r(wl),r(Vt.$$.fragment,n),r(Cl),r(Wt.$$.fragment,n),r(Qt.$$.fragment,n),r(Et.$$.fragment,n),r(Yt.$$.fragment,n),r(kl),r(q),r(Nt.$$.fragment,n),r(vl),r(Xt.$$.fragment,n),r(Ft.$$.fragment,n),r(zt.$$.fragment,n),r(Lt.$$.fragment,n),r(qt.$$.fragment,n),r(_l),r(P),r(Pt.$$.fragment,n),r(Kt.$$.fragment,n),r(ns.$$.fragment,n),qs=!0)},o(n){y(x.$$.fragment,n),y(k.$$.fragment,n),y(_),y(cn.$$.fragment,n),y(W.$$.fragment,n),y(sn.$$.fragment,n),y(rn.$$.fragment,n),y(yn.$$.fragment,n),y(Jn.$$.fragment,n),y(en.$$.fragment,n),y(Bn.$$.fragment,n),y(R.$$.fragment,n),y(Tn.$$.fragment,n),y(jn.$$.fragment,n),y(En.$$.fragment,n),y(Nn.$$.fragment,n),y(Fn.$$.fragment,n),y(El.$$.fragment,n),y(qn.$$.fragment,n),y(On.$$.fragment,n),y(ll.$$.fragment,n),y(Vn.$$.fragment,n),y(al.$$.fragment,n),y(Fl.$$.fragment,n),y(pl.$$.fragment,n),y(yl.$$.fragment,n),y(ul.$$.fragment,n),y(Tl.$$.fragment,n),y(Dl.$$.fragment,n),y(wn.$$.fragment,n),y(fn.$$.fragment,n),y(Cn.$$.fragment,n),y(gl.$$.fragment,n),y(M.$$.fragment,n),y(ht.$$.fragment,n),y($t.$$.fragment,n),y(_t.$$.fragment,n),y(wl),y(Vt.$$.fragment,n),y(Cl),y(Wt.$$.fragment,n),y(Qt.$$.fragment,n),y(Et.$$.fragment,n),y(Yt.$$.fragment,n),y(kl),y(q),y(Nt.$$.fragment,n),y(vl),y(Xt.$$.fragment,n),y(Ft.$$.fragment,n),y(zt.$$.fragment,n),y(Lt.$$.fragment,n),y(qt.$$.fragment,n),y(_l),y(P),y(Pt.$$.fragment,n),y(Kt.$$.fragment,n),y(ns.$$.fragment,n),qs=!1},d(n){n&&(t(g),t(i),t(U),t(w),t(V),t(B),t(C),t($),t(G),t(Vl),t(E),t(hn),t(In),t(A),t(Y),t(D),t(Zl),t(pn),t(kn),t(Al),t(Mn),t(Gl),t(N),t(X),t(xn),t(H),t(F),t(_n),t(z),t(mn),t($n),t(Q),t(un),t(an),t(S),t(vn),t(Qn),t(L),t(I),t(Kl),t(rt),t(Rn),t(yt),t(Yn),t(Xn),t(Rl),t(Hn),t(zn),t(nt),t(bn),t(Sn),t(Yl),t(Ln),t(Dn),t(Jt),t(Pn),t(Kn),t(Xl),t(nl),t(tl),t(sl),t(jt),t(el),t(cl),t(lt),t(dn),t(hl),t(il),t(dt),t(Ml),t(rl),t(gt),t(ml),t(ol),t(Ll),t(Jl),t(jl),t(tt),t(gn),t(st),t(Un),t(et),t(at),t(wt),t(bl),t(ct),t(ft),t(dl),t(Ct),t(l),t(js),t(It),t(bs),t(ds),t(kt),t(gs),t(Us),t(vt),t(ws),t(xt),t(fs),t(Cs),t(Bt),t(Is),t(is),t(ks),t(Zt),t($s),t(At),t(vs),t(ps),t(Gt),t(xs),t(_s),t(Bs),t(Rt),t(Vs),t(Zs),t(As),t(Ms),t(rs),t(Gs),t(ys),t(Ws),t(Ht),t(Qs),t(Rs),t(Es),t(St),t(Ys),t(Ns),t(Dt),t(Xs),t(Hs),t(ms),t(us),t(Fs),t(Ot),t(zs),t(Ss),t(Ls),t(ls),t(Ds),t(Ts)),t(h),b(x,n),b(k,n),ts[d].d(n),b(cn,n),b(W,n),b(sn,n),b(rn,n),b(yn,n),b(Jn,n),b(en,n),b(Bn,n),b(R,n),b(Tn,n),b(jn,n),b(En,n),b(Nn,n),b(Fn,n),b(El,n),b(qn,n),b(On,n),b(ll,n),b(Vn,n),b(al,n),b(Fl,n),b(pl,n),b(yl,n),b(ul,n),b(Tl,n),b(Dl,n),b(wn,n),b(fn,n),b(Cn,n),b(gl,n),b(M,n),b(ht,n),b($t,n),b(_t,n),ss[Ul].d(n),b(Vt,n),es[fl].d(n),b(Wt,n),b(Qt,n),b(Et,n),b(Yt,n),as[Il].d(n),q&&q.d(n),b(Nt,n),cs[$l].d(n),b(Xt,n),b(Ft,n),b(zt,n),b(Lt,n),b(qt,n),hs[xl].d(n),P&&P.d(n),b(Pt,n),b(Kt,n),b(ns,n)}}}const ma='{"title":"Phân loại token","local":"phân-loại-token","sections":[{"title":"Chuẩn bị dữ liệu","local":"chuẩn-bị-dữ-liệu","sections":[{"title":"Tập dữ liệu CoNLL-2003","local":"tập-dữ-liệu-conll-2003","sections":[],"depth":3},{"title":"Xử lý dữ liệu","local":"xử-lý-dữ-liệu","sections":[],"depth":3}],"depth":2},{"title":"Tinh chỉnh mô hình trong API Trainer","local":"tinh-chỉnh-mô-hình-trong-api-trainer","sections":[],"depth":2},{"title":"Tinh chỉnh mô hình với Keras","local":"tinh-chỉnh-mô-hình-với-keras","sections":[{"title":"Đối chiếu dữ liệu","local":"đối-chiếu-dữ-liệu","sections":[],"depth":3},{"title":"Định nghĩa mô hình","local":"định-nghĩa-mô-hình","sections":[],"depth":3},{"title":"Tinh chỉnh một mô hình","local":"tinh-chỉnh-một-mô-hình","sections":[],"depth":3},{"title":"Thước đo","local":"thước-đo","sections":[],"depth":3},{"title":"Định nghĩa mô hình","local":"định-nghĩa-mô-hình","sections":[],"depth":3},{"title":"Tinh chỉnh mô hình","local":"tinh-chỉnh-mô-hình","sections":[],"depth":3}],"depth":2},{"title":"Một vòng huấn luyện tuỳ chỉnh","local":"một-vòng-huấn-luyện-tuỳ-chỉnh","sections":[{"title":"Chuẩn bị mọi thứ để huấn luyện","local":"chuẩn-bị-mọi-thứ-để-huấn-luyện","sections":[],"depth":3},{"title":"Vòng lặp huấn luyện","local":"vòng-lặp-huấn-luyện","sections":[],"depth":3}],"depth":2},{"title":"Sử dụng mô hình đã được tinh chỉnh","local":"sử-dụng-mô-hình-đã-được-tinh-chỉnh","sections":[],"depth":2}],"depth":1}';function ua(v,h,g){let i="pt";return Ee(()=>{const U=new URLSearchParams(window.location.search);g(0,i=U.get("fw")||"pt")}),[i]}class wa extends Ye{constructor(h){super(),Ne(this,h,ua,ya,Qe,{})}}export{wa as component};
