Hi anh em, hôm nay chúng ta sẽ trở lại với series về BERT với bài toán Thử nhận diện cảm xúc văn bản Tiếng Việt với PhoBert.
Trong 2 bài trước, mình đã cùng các bạn tìm hiểu về BERT. Bạn nào chưa xem thì có thể xem lại tại đây [BERT Series] Chương 1. BERT là cái chi chi? và [BERT Series] Chương 2. Nghịch một chút với Hugging Face
Trong các bài tiếp theo chúng ta sẽ cùng sử dụng thư viện Hugging Face để làm các Task khác nhau trong môn võ công BERT này. Và bắt đầu sẽ là tak thân quên Nhận diện cảm xúc
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.
Bài toán nhận diện cảm xúc này thì nhiều bạn làm, nhiều trang viết rồi, các bạn có thể search thoải mái trên mạng.
Nguồn: Tại đâyTóm lại , 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):
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.
Đó, đại khái cách làm là như vậy, bạn nào chưa rõ có thể post lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup để cùng thảo luận cho vui nhé!
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.
Cài đặt thư viện
Đầu tiên chúng ta cùng cài bằng lệnh pip thần thánh:
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:
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é:
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)
Và đưa vào tokenizer của PhoBert:
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é:
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:
Và cuối cùng là tống nó vào model và lấy ra output
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:
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.
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ó:
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.
Hẹn gặp lại các bạn! Mình xin tặng bạn nào đọc đến đây link github thay lời cảm ơn nha: Tại đây.
Chúc các bạn thành công!
#MìAI
Fanpage:http://facebook.com/miaiblog
Group trao đổi, chia sẻ:https://www.facebook.com/groups/miaigroup
Website:https://miai.vn
Youtube:http://bit.ly/miaiyoutube
Tài liệu tham khảo: https://viblo.asia/p/su-dung-ai-danh-gia-san-pham-tren-lazadatiki-dua-tren-comment-aWj53b9ol6m