Giới thiệu
Trong những năm gần đây, các đề tài về phân tích cảm xúc người dùng (Sentiment Analysis) đang trở thành một trong những hướng đi phổ biến trong các đồ án, đặc biệt là đồ án tốt nghiệp hoặc thực tập ngành CNTT hoặc các đồ án AI – machine learning.
Tại sao?
-
Bài toán có nội dung gần gũi, dễ hiểu
-
Có dữ liệu công khai trên Kaggle, GitHub
-
Dễ triển khai bằng các thư viện phổ biến như
scikit-learn,pandas,nltk,sklearn -
Có thể mở rộng lên mô hình hiện đại như BERT sau khi làm xong mô hình cơ bản
Bài viết này sẽ hướng dẫn bạn từng bước xây dựng một hệ thống phân tích cảm xúc đơn giản bằng Python. Bạn chỉ cần biết một chút về Python, còn lại mình sẽ lo!
Tải dữ liệu cảm xúc có sẵn để huấn luyện mô hình
Để làm bài toán này, ta sẽ sử dụng tập dữ liệu từ Kaggle:
Sentiment140 – Twitter Dataset
Bạn hãy tải file CSV từ link trên, đặt vào thư mục data/ và đổi tên thành sentiment.csv (nếu cần).
Cấu trúc dữ liệu gồm:
-
target: 0 = tiêu cực, 4 = tích cực
-
text: nội dung tweet
-
Một số cột không cần thiết khác có thể bỏ đi
Tiền xử lý dữ liệu văn bản để mô hình hiểu được
Trước khi huấn luyện, bạn cần xử lý văn bản: loại bỏ ký tự đặc biệt, chuyển chữ thường, loại stopwords, tách từ…
File: preprocess.py
import pandas as pd
import re
import nltk
from nltk.corpus import stopwords
nltk.download('stopwords')
stop_words = set(stopwords.words('english'))
def clean_text(text):
text = text.lower()
text = re.sub(r'http\S+', '', text) # bỏ link
text = re.sub(r'[^a-zA-Z\s]', '', text) # bỏ ký tự đặc biệt
text = ' '.join(word for word in text.split() if word not in stop_words)
return text
# Đọc dữ liệu
df = pd.read_csv("data/sentiment.csv", encoding='latin-1', usecols=[0, 5], names=["target", "text"], header=None)
# Gộp label về 0 (tiêu cực) và 1 (tích cực)
df['target'] = df['target'].apply(lambda x: 0 if x == 0 else 1)
df['text'] = df['text'].apply(clean_text)
df.to_csv("data/sentiment_clean.csv", index=False)
Sau bước này, bạn có thể tiếp tục bước vector hóa văn bản.
Chuyển văn bản thành vector số bằng TF-IDF
Mô hình học máy không thể làm việc với text thuần túy, nên ta cần chuyển text thành dạng vector.
File: vectorize.py
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
import joblib
df = pd.read_csv("data/sentiment_clean.csv")
vectorizer = TfidfVectorizer(max_features=5000)
X = vectorizer.fit_transform(df['text'])
y = df['target']
# Lưu vectorizer để dùng lại khi dự đoán
joblib.dump(vectorizer, "vectorizer.pkl")
# Lưu đặc trưng và nhãn
joblib.dump((X, y), "data/data_vectorized.pkl")
Huấn luyện mô hình phân tích cảm xúc đơn giản
Ở bước này, bạn sẽ huấn luyện mô hình Logistic Regression – thuật toán đơn giản nhưng cực kỳ hiệu quả với dữ liệu text.
File: train.py
import joblib
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# Tải dữ liệu vector hóa
X, y = joblib.load("data/data_vectorized.pkl")
# Chia dữ liệu train/test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Huấn luyện
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)
# Dự đoán
y_pred = model.predict(X_test)
# Đánh giá độ chính xác
acc = accuracy_score(y_test, y_pred)
print(f"Độ chính xác: {acc*100:.2f}%")
# Lưu mô hình
joblib.dump(model, "model_sentiment.pkl")
Nếu chạy đúng, bạn sẽ đạt độ chính xác trên 80% mà không cần đến deep learning.
Dự đoán cảm xúc của một câu mới bất kỳ
Sau khi huấn luyện, bạn có thể dùng mô hình để phân tích cảm xúc của bất kỳ câu nào.
File: predict.py
import joblib
import re
model = joblib.load("model_sentiment.pkl")
vectorizer = joblib.load("vectorizer.pkl")
def clean(text):
text = text.lower()
text = re.sub(r'http\S+', '', text)
text = re.sub(r'[^a-zA-Z\s]', '', text)
return text
# Văn bản cần phân tích
sample = "I really love this product. It's amazing!"
sample_clean = clean(sample)
X_input = vectorizer.transform([sample_clean])
prediction = model.predict(X_input)
label = "Tích cực" if prediction[0] == 1 else "Tiêu cực"
print(f"Cảm xúc của người dùng là: {label}")
Mở rộng đồ án phân tích cảm xúc
Sau khi hoàn thành bản đơn giản, bạn có thể mở rộng bằng:
-
Dùng Naive Bayes, Random Forest, hoặc SVM để so sánh kết quả
-
Tạo giao diện nhập cảm xúc người dùng bằng Streamlit hoặc Flask
-
Dự đoán cảm xúc trên bình luận sản phẩm, đánh giá app, hoặc bài đăng Facebook
-
Tạo dashboard thống kê theo thời gian, biểu đồ phân phối tích cực/tiêu cực
-
Dùng mô hình nâng cao như BERT hoặc LSTM để nâng độ chính xác
Kết luận
Phân tích cảm xúc người dùng là một đề tài AI dễ ăn điểm, dễ triển khai, nhưng vẫn có giá trị thực tiễn cao. Với dữ liệu có sẵn, mô hình đơn giản bằng scikit-learn, bạn hoàn toàn có thể tạo ra một đồ án thuyết phục, dễ trình bày và dễ mở rộng sau này.
Chỉ với vài file .py, bạn có thể xây dựng:
-
Mô hình phân tích cảm xúc
-
Giao diện dự đoán tương tác
-
Báo cáo đánh giá độ chính xác

