Phân tích cảm xúc khách hàng (Sentiment Analysis): Khen hay Chê? (Hỗ trợ Tiếng Việt)

AI Hunter

Member
Bạn có một file dữ liệu chứa 5.000 bình luận về sản phẩm mới ra mắt. Sếp yêu cầu bạn báo cáo: "Khách hàng đang khen hay chê?". Bạn không thể ngồi đọc từng dòng được.

Trong bài viết này, chúng ta sẽ sử dụng Python để xây dựng một pipeline tự động: Dịch bình luận Tiếng Việt -> Phân tích cảm xúc -> Vẽ biểu đồ báo cáo.

Phân tích cảm xúc khách hàng (Sentiment Analysis) Khen hay Chê (Hỗ trợ Tiếng Việt).jpg

1. Chiến lược "Đi đường vòng"​


Các thư viện xử lý ngôn ngữ tự nhiên (NLP) đơn giản thường hỗ trợ Tiếng Anh tốt nhất. Để xử lý Tiếng Việt nhanh chóng mà không cần kiến thức chuyên sâu về Deep Learning, chúng ta sẽ dùng quy trình sau:
  1. Bước 1: Dùng Google Translate API để chuyển văn bản sang Tiếng Anh.
  2. Bước 2: Dùng thư viện NLTK (VADER) để chấm điểm cảm xúc.
  3. Bước 3: Tổng hợp và vẽ biểu đồ.

2. Cài đặt thư viện​


Chúng ta cần cài đặt các thư viện sau (Lưu ý: deep-translator ổn định hơn googletrans).

Python:
pip install pandas nltk matplotlib seaborn deep-translator

3. Triển khai Code (Full Source)​


Dưới đây là đoạn code hoàn chỉnh. Bạn có thể copy và chạy ngay lập tức. Chương trình sẽ tự động tải các tài nguyên cần thiết.

Python:
import pandas as pd
import nltk
import matplotlib.pyplot as plt
import seaborn as sns
from nltk.sentiment import SentimentIntensityAnalyzer
from deep_translator import GoogleTranslator

# --- CẤU HÌNH & KHỞI TẠO ---
# Tải bộ từ điển cảm xúc VADER (chạy lần đầu)
nltk.download('vader_lexicon', quiet=True)

# Khởi tạo công cụ phân tích
sia = SentimentIntensityAnalyzer()

def analyze_vietnamese_sentiment(text):
    """
    Hàm xử lý chính:
    1. Dịch Tiếng Việt -> Tiếng Anh
    2. Phân tích cảm xúc
    """
    try:
        # 1. Dịch sang tiếng Anh
        translated_text = GoogleTranslator(source='vi', target='en').translate(text)
       
        # 2. Chấm điểm cảm xúc (Compound score chạy từ -1 đến 1)
        # >= 0.05: Tích cực (Positive)
        # <= -0.05: Tiêu cực (Negative)
        # Còn lại: Trung tính (Neutral)
        score = sia.polarity_scores(translated_text)
        compound = score['compound']
       
        if compound >= 0.05:
            return "Tích cực 😄", compound
        elif compound <= -0.05:
            return "Tiêu cực 😡", compound
        else:
            return "Trung tính 😐", compound
           
    except Exception as e:
        return "Lỗi", 0

def main():
    # 1. Dữ liệu giả lập (Tiếng Việt)
    data = {
        'Khách hàng': ['An', 'Bình', 'Chi', 'Dũng', 'Giang', 'Hương', 'Khanh'],
        'Bình luận': [
            "Sản phẩm tuyệt vời, giao hàng rất nhanh!",         # Khen
            "Chất lượng quá tệ, dùng 2 ngày đã hỏng.",        # Chê
            "Hàng đóng gói cẩn thận, shipper thân thiện.",    # Khen
            "Shop tư vấn nhiệt tình, sẽ ủng hộ tiếp.",        # Khen
            "Màu sắc không giống hình, hơi thất vọng.",       # Chê
            "Cho mình hỏi sản phẩm này bảo hành bao lâu?",    # Trung tính
            "Giá hơi cao nhưng chất lượng chấp nhận được."    # Hơi khen (Positive nhẹ)
        ]
    }
   
    df = pd.read_DataFrame(data) # Lưu ý: Sửa thành pd.DataFrame(data) khi chạy thực tế
    # (Để hiển thị đúng trong BBCode, tôi viết rõ ra là pd.DataFrame)
    df = pd.DataFrame(data)

    print("⏳ Đang phân tích dữ liệu (Dịch & Chấm điểm)...")
   
    # 2. Áp dụng hàm phân tích cho từng dòng
    # (Hàm lambda giúp chạy qua từng row)
    results = df['Bình luận'].apply(analyze_vietnamese_sentiment)
   
    # Tách kết quả thành 2 cột mới
    df['Cảm xúc'] = [res[0] for res in results]
    df['Điểm số'] = [res[1] for res in results]
   
    # In bảng kết quả ra màn hình
    print("\n--- KẾT QUẢ PHÂN TÍCH ---")
    print(df[['Bình luận', 'Cảm xúc', 'Điểm số']])

    # 3. Vẽ biểu đồ báo cáo
    plt.figure(figsize=(8, 5))
   
    # Đếm số lượng từng loại cảm xúc
    sentiment_counts = df['Cảm xúc'].value_counts()
   
    # Vẽ biểu đồ tròn (Pie Chart)
    colors = sns.color_palette('pastel')[0:3]
    plt.pie(sentiment_counts, labels=sentiment_counts.index, autopct='%1.1f%%', colors=colors, startangle=90)
    plt.title('Tỷ lệ cảm xúc khách hàng')
   
    print("\n📊 Đang hiển thị biểu đồ...")
    plt.show()

if __name__ == "__main__":
    main()

4. Giải thích kết quả​


Khi chạy code, bạn sẽ nhận được một bảng dữ liệu chi tiết và một biểu đồ.
  • Điểm số (Compound Score): Càng gần 1 thì càng tích cực, càng gần -1 thì càng tiêu cực.
  • Ví dụ: Câu "Chất lượng quá tệ" sẽ có điểm âm rất cao, máy sẽ gán nhãn Tiêu cực 😡.

5. Ứng dụng thực tế​


Bạn có thể nâng cấp đoạn code này bằng cách:
  • Thay dữ liệu giả lập bằng file pd.read_csv('danh_gia_shopee.csv').
  • Lọc ra những khách hàng đang giận dữ (Tiêu cực) để bộ phận CSKH ưu tiên liên hệ xử lý trước.

Cách làm này tuy đơn giản nhưng hiệu quả tới 80-90% cho các bài toán kinh doanh thông thường mà không tốn chi phí xây dựng AI phức tạp.
 
Back
Top