Mô hình ensemble đơn giản cho phân loại sắc thái bình luận (7th place solution)

nlp
classification
demo_nlp_contest

#1

Giới thiệu

Bài viết sẽ giới thiệu giải pháp của hệ thống đạt hạng 7 của tôi (nlpers team, gồm 1 thành viên là minhpqn) trong cuộc thi về phân loại sắc thái bình luận do Aivivn tổ chức.

Một số điểm chính trong phương pháp mà tôi sử dụng:

  • Tôi sử dụng phương pháp ensemble learning khá đơn giản bằng cách kết hợp 3 mô hình phân loại dùng majority voting. Tôi lựa chọn các mô hình phân loại cơ sở dựa trên kết quả cross-validation trên tập dữ liệu huấn luyện.
  • Bước tiền xử lý có tham khảo cách thay thế các từ viết tắt trong bài viết: Chia sẻ ideas cho cuộc thi Phân loại sắc thái bình luận
  • Tôi sử dụng bộ công cụ scikit-learn trong các thực nghiệm.

Mã nguồn của hệ thống của tôi có tại: https://github.com/minhpqn/aivivn_1_ensemble_7th_place

Chi tiết cách làm

Tiền xử lý

Bước tiền xử lý sẽ thực hiện 2 việc:

  • Chuẩn hóa từ viết tắt. Theo quan sát của tôi, trong các bình luận có sắc thái tiêu cực, các từ như “không” có vai trò quan trọng nhưng thường được viết tắt thành “k”, “ko”, “kg” hay viết không dấu “khong”. Việc chuẩn hóa các từ này vì thế có ý nghĩa quan trọng. Tương tự trong các bình luận tích cực hay có các từ như “ok”, “thanks”, “thank”,…
  • Tách từ: tôi sử dụng công cụ tách từ trong bộ công cụ Underthesea.

Để chuẩn bị dữ liệu cho thực nghiệm, thực thi file prepare_data.py.

python prepare_data.py

Sau khi chạy script trên, 4 files được sinh ra trong thư mục ./data

  • train.csv: Dữ liệu huấn luyện dưới dạng csv, trong đó trường text_ws là review đã được tiền xử lý.
  • test.csv: Dữ liệu test
  • train_dev.csvtest_dev.csv là dữ liệu train/test được dùng cho việc phát triển hệ thống và được chia từ dữ liệu train.csv.

Đặc trưng

Đặc trưng tôi sử dụng là tf-idf và tôi sử dụng 1-gram, bigram và tri-gram. Việc trích xuất đặc trưng được thực hiện đơn giản bằng các lớp CountVectorizerTfidfTransformer trong bộ công cụ sklearn.

Chọn lựa mô hình bằng cross-validation

Để lựa chọn 3 mô hình để đưa vào mô hình ensemble learning, tôi thực hiện 5-fold cross-validation trên dữ liệu training.

Tôi sử dụng script cross_val.py cho công việc này. Script này dựa trên ví dụ Classification of text documents using sparse features.

Thực thi lệnh

python cross_val.py --binary_feature ./data/train.csv

Dựa trên kết quả cross-validation tôi quyết định sử dụng 3 mô hình cơ sở sau đây:

Mô hình ensemble

Tôi dùng phương pháp majority voting để kết hợp 3 mô hình đã lựa chọn nói trên. Class VotingClassifier trong sklearn giúp chúng ta dễ dàng thực hiện việc này.

from sklearn.ensemble import VotingClassifier
ensemble_clf = VotingClassifier(
                  estimators=[('linearSVM', clf1), ('sgd', clf2), ('rdf', clf3), ],
                  voting='hard')

Ngoài ra trước khi huấn luyện mô hình ensemble, tôi có thực hiện lựa chọn tham số cho mô hình LinearSVCSGDClassifier với GridSearchCV. Việc lựa chọn tham số cho SGDClassifier là tùy chọn.

Thực thi script sau để sinh ra file submission

python ensemble_sklearn.py ./data/train.csv ./data/test.csv submission.csv

Các cải tiến có thể làm thêm


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

Code chạy trên máy em bị báo lỗi là do dâu vậy Anh Minh_Pham


#3

Lỗi gì vậy em? Em đưa lên đây anh xem thử với


#4

a ơi e có thử chạy từng bước nhưng lỗi ạ!


#5