Phần 1 – Đặt vấn đề bài toán nhận diện cảm xúc văn bản với PhoBert
1 4

Bài toán này là ta sẽ cần xây dựng một model nhận vào một câu văn bản và trả ra được cảm xúc của câu văn bản đó. Cảm xúc ở đây có thể là tích cực, tiêu cực, trung tính hoặc đơn giản là Tốt/Xấu…. tuỳ bài toán. Ví dụ

  • “Nhà hàng này rất ngon” thì là Tích cực
  • “Nhà hàng này ăn cũng tạm” thì là Trung tính
  • “Nhà hàng này lừa đảo” thì là Tiêu cực

Lớp bài toán này thì các làm là chúng ta sẽ vector hoá câu văn bản, sau đó đưa vào một mạng LSTM để lấy ra vector output, sau đó ta đưa qua một mạng neural đơn giản hoặc SVM để phân lớp.

Và hôm nay chúng ta sẽ làm cách tương tự đó là sử dụng BERT, đưa câu văn bản vào pretrain PhoBERT, lấy output đầu ra và sử dụng SVM để phân lớp nhé.

Phần 2 – Cách thức thực hiện

Rồi, chúng ta sẽ cùng vạch ra cách thức thực hiện bài toán này với pretrain PhoBert của VinAI (https://github.com/VinAIResearch/PhoBERT).

Như chúng ta đã biết, BERT là một nửa của Transformer (cụ thể là nửa Encoder) với một loạt các Block Encoder chồng lên nhau (nhiều hay ít tuỳ model Base hay Large):

2 3

Nếu chúng ta feed 1 câu văn bản qua PhoBERT thì sẽ lấy ra được embedding output của cả câu sau block encoder cuối cùng. Và đấy, chúng ta sẽ sử dụng output đó để làm đặc trưng classify nhá!

Cụ thể sẽ bao gồm các bước như sau:

  • Bước 1: Tiền xử lý câu văn bản
  • Bước 2: Word segment câu văn bản trước khi đưa vào PhoBert (do PhoBert yêu cầu)
  • Bước 3: Tokenize bằng bộ Tokenizer của PhoBert. Chú ý rằng khi tokenize ta sẽ thêm 2 token đặc biệt là [CLS] và [SEP] vào đầu và cuối câu.
  • Bước 4: Đưa câu văn bản đã được tokenize vào model kèm theo attention mask.
  • Bước 5: Lấy output đầu ra và lấy vector output đầu tiên (chính là ở vị trí token đặc biệt [CLS]) làm đặc trưng cho câu để train hoặc để predict (tuỳ phase).

Chú ý: Chỗ này mình nhấn mạnh đây là cách lazy, còn nếu làm sâu hơn thì nên fine tune lại model BERT nha (mình sẽ nói vào bài sau). Vì chắc sẽ có bạn comment chỗ này nên mình nói luôn để các bạn đỡ tìm.

Phần 3 – Viết code cho chương trình nhận diện cảm xúc văn bản với PhoBert

Đầu tiên chúng ta cùng cài bằng lệnh pip:

3 3

Chú ý ở đây là transformer hugging face sử dụng framework pytorch nên chúng ta phải cài đặt torch nhé.

Load model PhoBERT

Chúng ta sẽ load bằng đoạn code sau:

4 2

Chú ý model sẽ được load từ cloud về nên lần chạy đầu tiên sẽ khá chậm nhé.

Chuẩn hoá dữ liệu

Dữ liệu thu thập từ trên mạng thường rất sạn. Sạn ở đây cụ thể là: từ viết tắt, dấu câu, sai chính tả, từ không dấu….và chúng ta phải xử lý để chuẩn hoá dữ liệu thì model mới cho ra kết quả tốt được.

Việc chuẩn hoá này tốn nhiều công sức và thời gian xử lý lắm luôn! Ở đây chỉ để demo nên mình chỉ làm thao tác remove dấu câu thôi nhé:

5 3
Word segmentation và Tokenize

Rồi, sau khi đã chuẩn hoá xong, ta sẽ word segment (phân tách từ) bằng Underthesea (các bạn có thể dùng VnCoreNLP cũng okie nhé, mình cài sẵn Underthesea nên xài luôn)

6 2

Và đưa vào tokenizer của PhoBert:

7 2
Padding và đưa vào model PhoBERT trích đặc trưng

Ở đây các bạn chú ý là chúng ta phải padding để đảm bảo các input có cùng độ dài như nhau nhé:

8 1

Tuy nhiên, khi padding thế thì ta phải thêm một attention_mask đẻ model chỉ focus vào các từ trong câu và bỏ qua các từ được padding thêm:

9 2

Và cuối cùng là tống nó vào model và lấy ra output

10 2

Các bạn để ý dòng cuối, cái chỗ [:,0,:] chính là lấy vector embedding của token đầu tiên. Để mình vẽ cho các bạn dễ hình dung chỗ này:

11 2
Train model SVM

Vâng, và sau khi có đầy đủ các vector đặc trưng của từng câu thì ta chỉ cần nhét vào một model SVM đơn giản mà thôi. Thông số của SVM thì các bạn có thể sử dụng GridSearch để tìm nhé. Ở đây mình hardcode vài thông số cho nhanh.

12 2
Predict câu văn bản mới

Với câu mới, ta cũng thực hiện tương tự các bước: chuẩn hoá, word segment rồi thì cũng tokenize, lấy embeđing rồi đưa vào model SVM là ra class của nó:

13 2

Vậy thôi, đó là các bước khá đơn giản để làm một bài sentiment analysis theo cách số 1 – không finetune model. Trong bài tiếp theo mình sẽ cùng các bạn làm theo cách có finetune nhé.

Tips: Có một số bạn nói rằng trích xuất vector embedding của token [CLS] trong vài layer cuối sau đó concat lại làm đặc trưng sẽ mang lại kết quả tốt hơn.

Nguồn: https://www.miai.vn/2020/12/29/bert-series-chuong-3-thu-nhan-dien-cam-xuc-van-ban-tieng-viet-voi-phobert-cach-1/