Chia sẻ model Sentiment Analysis - AIVIVN.COM TOP 5

nlp
demo_nlp_contest

#1

Chào mọi người! Mình chia sẻ ngắn gọn trong bài này giải pháp của mình trong cuộc thi phân loại sắc thái bình luận.

Sơ lược giải pháp:

Giải pháp của mình tập trung vào data hơn mô hình. Với bài toán này, mình tập trung tiền xử lý dữ liệu, loại bỏ nhiễu, gán nhãn lại các mislabel data. Lý do tập trung vào data hơn vì mình quan sát dữ liệu thấy có khá nhiều nhiễu, gán nhãn sai và lấy từ các trang thương mại điện tử nên từ ngữ lộn xộn, thường không theo văn phong chuẩn mực, cần phải có bước chuẩn hóa. Mô hình mình sử dụng là SVM và feature quen thuộc TF-IDF (5-gram). Lý do sử dụng SVM vì mình thấy SVM khá phù hợp với các bài toán có ít dữ liệu nhưng nhiều features. Mô hình này vẫn cho kết quả khá tốt, thời gian train/predict khá nhanh (train dưới 1 phút với macbook 2015 của mình). Cuối cùng là giải thích về việc dùng Error Analysis để gán lại các Mislabel data.

Chi tiết cách thực hiện:

1. Tiền xử lý dữ liệu:

  • Dữ liệu bình luận (văn nói) nên người dùng thường không quan tâm đến chữ hoa thường khi gõ, đưa hết về lower case.
  • Loại bỏ những ký tự kéo dài: Ví dụ: Áo đẹp quáaaaaaaa--> Áo đẹp quá.
  • Tiếng Việt có 2 cách bỏ dấu nên đưa về 1 chuẩn. Ví dụ, chữ "Hòa" và "Hoà" đều được chấp nhận trong tiếng Việt. Ngoài ra còn một số trường hợp lỗi font chữ cũng cần chuẩn hóa lại. (các trường hợp dính chữ như: "Giao hàngnhanh" xử ý đc sẽ tốt hơn).
  • Chuẩn hóa một số sentiment word: "okie"-->"ok", "okey"-->"ok", authentic--> "chuẩn chính hãng",vv...
  • Emoj quy về 2 loại: emojs mang ý nghĩa tích cực (positive): '💯','💗' và emojs mang nghĩa tiêu cực (nagative): '👎','😣'.
  • Người dùng đánh giá 1,2 sao (*) quy hết về 1star, trên 3 sao quy hết về 5tar.
  • Loại bỏ dấu câu (puntuations) và các ký tự nhiễu.
  • Xử lý vấn đề phủ định, TF-IDF không xử lý được vấn đề phủ định trong bài toán sentiment. Ví dụ: Cái áo này rất đẹpCái áo này chẳng đẹp sẽ không khác nhau nhiều khi chọn feature tf-idf, giải pháp của mình là biến chẳng đẹp thành not-positive, hay không tệ thành not-nagative bằng cách dùng từ điển tâm lý và từ điển phủ định. Từ điển tâm lý mình lấy từ VietSentwordnet 1.0 chỉ lấy những từ có score >0.5 bổ sung 1 số sentiment words đặc thù từ tập train.
  • Augmentation data bằng cách thêm vào các sample của chính tập train nhưng không dấu. (Bình luận không dấu khá phổ biến).
  • Ngoài ra, mình bổ sung vào tập train các sample mới lấy từ chính 2 từ điển positive và nagative. Các từ vựng trong từ điển tích cực gán nhãn 0, các từ vựng từ từ điển tiêu cực gán nhãn 1.

2. Lựa chọn mô hình/tunning:

Mình chọn SVM, tunning một chút parameter. feature TF-IDF, 5 gram, sử dụng thư viện SKlearn. Stopword xem ra không hữu dụng lắm.

3. Sử dụng Error Analysis để gán lại nhãn:

Bằng cách train 2 lần: Lần 1 chia tập train/test theo tỉ lệ 7/3 và lần 2 train overfitting, mình phát hiện ra các trường hợp gán nhãn sai và gán lại nhãn, lặp đi lặp lại quá trình này vài chục lần mình đã gán nhãn lại được khá nhiều data. Cách làm của mình dựa trên ý tưởng của Overfitting, nếu đã dạy mô hình tập dữ liệu A rồi test trên chính tập A đó mà mô hình chỉ đạt độ chính xác thấp chứng tỏ dữ liệu chưa phổ quát, quá ít dữ liệu hoặc gán nhãn sai. VD: Train 7/3 đạt 89%, train overfit đạt chỉ 94% thì chứng tỏ có nhiều data gán nhãn sai. Mình gán lại nhãn đến khi độ chính xác khi train overfit đạt khoảng 98% thì dừng lại, lúc này độ chính xác của train 7/3 đạt khoảng 94%. Việc gán lại nhãn, loại bỏ nhiễu với train data là một phần của data science và hoàn toàn hợp lệ. (Tất nhiên là không động chút nào đến test data).

Kết quả

Mình chạy Crossvalidation 5 folds để đánh giá model công bằng hơn. Kết quả cuối cùng CV5fold với tập dữ liệu đã gán lại nhãn94.4%. Kết quả submit tại AIVIVN.COM của mình đạt 89.57%.

CODE

Mô hình của mình đặt tại Github

Tổng kết cuộc thi 'Phân loại sắc thái bình luận'