Phân tích cảm xúc (Sentiment Analysis) là một nhánh quan trọng của xử lý ngôn ngữ tự nhiên (NLP), giúp máy hiểu được thái độ hoặc tình cảm của người viết đối với một chủ đề cụ thể. Trong bối cảnh mạng xã hội phát triển mạnh mẽ, việc phân tích cảm xúc bài đăng Facebook trở thành công cụ quan trọng cho:
- Doanh nghiệp theo dõi phản ứng khách hàng
- Chính phủ giám sát dư luận xã hội
- Nhà nghiên cứu đo lường xu hướng
Nếu bạn đã từng đọc qua các hướng dẫn như Giải thích confusion matrix dễ hiểu nhất hay Xử lý ngôn ngữ tiếng Việt với underthesea, thì đây là bước tiếp theo để ứng dụng NLP vào thực tế: phân tích cảm xúc mạng xã hội bằng Python.
Thu thập dữ liệu bài đăng Facebook
Trước tiên, chúng ta cần có dữ liệu để phân tích. Do Facebook hạn chế quyền truy cập dữ liệu qua API đối với tài khoản cá nhân, nên giải pháp phổ biến là sử dụng trình thu thập dữ liệu từ các trang công khai.
Thư viện facebook-scraper là một lựa chọn đơn giản, cho phép thu thập bài viết công khai mà không cần token hay xác thực phức tạp.
pip install facebook-scraper
Đoạn code cơ bản để lấy thông tin bài post:
from facebook_scraper import get_posts
posts = []
for post in get_posts("tinhte", pages=5):
posts.append(post['text'])
print(posts[:3])
Lưu ý: Chỉ thu thập bài viết từ trang công khai và sử dụng vào mục đích học tập hoặc nghiên cứu. Việc sử dụng sai có thể vi phạm điều khoản Facebook.
Tiền xử lý văn bản tiếng Việt
Sau khi thu thập được dữ liệu thô, bạn không thể sử dụng trực tiếp để phân tích vì bài đăng Facebook thường chứa emoji, link, từ viết tắt, hoặc các ký hiệu đặc biệt. Do đó, bước tiền xử lý là cực kỳ quan trọng để chuẩn hóa dữ liệu.
Trong tiếng Việt, việc tách từ cũng là một bước then chốt vì không có dấu cách rõ ràng giữa các từ. Chúng ta sẽ sử dụng thư viện underthesea để tách từ và xử lý văn bản.
import re
from underthesea import word_tokenize
def clean_text(text):
text = re.sub(r"[^\w\s]", "", text) # bỏ ký tự đặc biệt
text = text.lower()
return word_tokenize(text, format="text")
cleaned_posts = [clean_text(p) for p in posts]
Gán nhãn cảm xúc (Labeling)
Một mô hình học máy không thể hoạt động nếu không có dữ liệu đã được gán nhãn. Trong trường hợp này, chúng ta sẽ tạo ra một tập nhỏ gồm các câu ví dụ và nhãn cảm xúc tương ứng để huấn luyện mô hình phân loại cơ bản.
Việc gán nhãn này có thể mở rộng hoặc dùng kỹ thuật semi-supervised để tăng quy mô dữ liệu sau này.
texts = ["Tôi rất vui vì sản phẩm này", "Thật tệ, tôi thất vọng", "Bình thường thôi"] labels = ["positive", "negative", "neutral"]
Vector hóa dữ liệu bằng TF-IDF
Mô hình học máy không hiểu được văn bản dạng chuỗi. Vì vậy chúng ta phải chuyển văn bản thành các vector số học, phản ánh mức độ quan trọng của từ trong câu. Phổ biến nhất là dùng kỹ thuật TF-IDF (Term Frequency – Inverse Document Frequency).
Chúng ta sẽ sử dụng TfidfVectorizer từ sklearn.feature_extraction.text.
from sklearn.feature_extraction.text import TfidfVectorizer vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(texts)
Huấn luyện mô hình phân loại cảm xúc
Sau khi đã có dữ liệu vector hóa, ta sẽ huấn luyện mô hình phân loại đơn giản. Ở đây, ta sử dụng thuật toán Naive Bayes vì nó rất phù hợp với dữ liệu văn bản và chạy nhanh.
Chúng ta sẽ kết hợp TF-IDF và mô hình vào một pipeline để tiện sử dụng và dự đoán.
from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import make_pipeline model = make_pipeline(TfidfVectorizer(), MultinomialNB()) model.fit(texts, labels)
Dự đoán cảm xúc bài đăng Facebook
Khi mô hình đã được huấn luyện, ta sẽ áp dụng nó để phân tích cảm xúc các bài viết Facebook đã thu thập.
Chúng ta sẽ xem xét 5 kết quả đầu tiên để kiểm tra trực quan hiệu suất mô hình.
predictions = model.predict(cleaned_posts)
for i, pred in enumerate(predictions[:5]):
print(f"{pred}: {posts[i]}")
Trực quan hóa cảm xúc
Trực quan hóa giúp bạn dễ dàng nắm bắt xu hướng cảm xúc chung của các bài đăng. Ở đây, ta sử dụng thư viện seaborn để vẽ biểu đồ cột biểu thị số lượng bài đăng theo từng loại cảm xúc.
Bước này cực kỳ hữu ích nếu bạn cần báo cáo hoặc trình bày kết quả cho người không chuyên.
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
df = pd.DataFrame({"text": posts, "sentiment": predictions})
sns.countplot(data=df, x="sentiment")
plt.title("Phân phối cảm xúc các bài đăng")
plt.show()
Kết luận
Bằng cách sử dụng Python và các thư viện mã nguồn mở, bạn có thể dễ dàng xây dựng hệ thống phân tích cảm xúc cho bài đăng Facebook. Đây là bước quan trọng trong việc nắm bắt tâm lý khách hàng, xu hướng cộng đồng, hay đánh giá chiến dịch marketing.
Tuy mô hình đơn giản, nhưng bạn đã nắm được toàn bộ quy trình: từ thu thập, xử lý dữ liệu, huấn luyện mô hình, đến phân tích và trực quan hóa. Bạn có thể nâng cấp mô hình này bằng các kỹ thuật hiện đại hơn như fine-tune PhoBERT, áp dụng deep learning hoặc triển khai thành API realtime với Flask hay FastAPI để tích hợp vào hệ thống sản phẩm.

