Hướng Dẫn Toàn Diện Xử Lý Văn Bản Cơ Bản Trong Phân Tích Dữ Liệu Với Python: TF-IDF Và Sentiment Analysis

lúc 17:17 2 tháng 9, 2026
15 views

Xử lý văn bản và khai thác dữ liệu phi cấu trúc đang trở thành kỹ năng cốt lõi trong phân tích dữ liệu hiện đại. Kho tàng thông tin từ mạng xã hội, đánh giá sản phẩm hay bài báo chứa đựng giá trị khổng lồ nếu bạn biết cách chuyển đổi chúng thành dạng số liệu mà máy tính hiểu được. Bằng cách sử dụng Python, bạn có thể dễ dàng xây dựng một pipeline hoàn chỉnh từ bước làm sạch dữ liệu văn bản, áp dụng mô hình TF-IDF cho đến Sentiment Analysis (phân tích cảm xúc) cơ bản.

🧹 1. Tiền xử lý văn bản (Text Preprocessing)

Trước khi đưa văn bản vào bất kỳ mô hình máy học hay thống kê nào, bước làm sạch dữ liệu là bắt buộc để loại bỏ nhiễu. Quá trình này bao gồm viết thường hóa văn bản, loại bỏ ký tự đặc biệt, dấu câu và các từ dừng không mang nhiều ý nghĩa ngữ nghĩa.

Code
import re

# Khởi tạo danh sách từ dừng tiếng Việt cơ bản
STOP_WORDS = {"và", "là", "của", "các", "có", "cho", "trong", "những"}

def clean_text(raw_text):
    # Chuyển đổi thành chữ thường
    lowercased_text = raw_text.lower()
    
    # Loại bỏ ký tự đặc biệt và chữ số
    cleaned_text = re.sub(r'[^a-zA-Zà-ỵÀ-Ỵ\s]', '', lowercased_text)
    
    # Tách từ đơn giản và loại bỏ từ dừng
    tokens = cleaned_text.split()
    filtered_tokens = [word for word in tokens if word not in STOP_WORDS]
    
    return " ".join(filtered_tokens)

# Dữ liệu mẫu phân tích
sample_corpus = [
    "Sản phẩm này rất tốt và đáng tiền!",
    "Chất lượng dịch vụ tệ, không bao giờ quay lại."
]

processed_corpus = [clean_text(doc) for doc in sample_corpus]
print(processed_corpus)

📊 2. Biểu diễn văn bản với TF-IDF

Sau khi làm sạch, văn bản cần được chuyển hóa thành các vector số học. TF-IDF (Term Frequency-Inverse Document Frequency) là phương pháp thống kê giúp đánh giá tầm quan trọng của một từ trong một tài liệu thuộc bộ sưu tập văn bản. Từ xuất hiện nhiều trong một văn bản nhưng lại hiếm trong toàn bộ corpus sẽ có điểm TF-IDF cao, giúp làm nổi bật các từ khóa đặc trưng.

Thư viện scikit-learn cung cấp sẵn công cụ TfidfVectorizer giúp tự động hóa quá trình tính toán này một cách nhanh chóng.

Code
from sklearn.feature_extraction.text import TfidfVectorizer

# Khởi tạo đối tượng vector hóa TF-IDF
tfidf_vectorizer = TfidfVectorizer()

# Tính toán ma trận TF-IDF cho văn bản đã tiền xử lý
tfidf_matrix = tfidf_vectorizer.fit_transform(processed_corpus)

# Lấy danh sách tên các đặc trưng từ vựng
feature_names = tfidf_vectorizer.get_feature_names_out()

print("Từ vựng nhận diện:", feature_names)
print("Kích thước ma trận TF-IDF:", tfidf_matrix.shape)

😊 3. Phân tích cảm xúc đơn giản (Sentiment Analysis)

Sentiment Analysis cho phép tự động xác định sắc thái cảm xúc của người dùng, phân loại thành tích cực, tiêu cực hoặc trung tính. Đối với các bài toán tiếng Anh hoặc qua các thư viện hỗ trợ như TextBlob, bạn có thể thực hiện việc này nhanh chóng thông qua phân tích cực tính từ vựng (polarity).

Code
from textblob import TextBlob

def analyze_sentiment(text_input):
    # Sử dụng TextBlob để tính điểm cực tính polarity
    # Polarity dao động từ -1.0 rất tiêu cực đến 1.0 rất tích cực
    blob = TextBlob(text_input)
    polarity_score = blob.sentiment.polarity
    
    if polarity_score > 0.1:
        sentiment_label = "Tích cực"
    elif polarity_score < -0.1:
        sentiment_label = "Tiêu cực"
    else:
        sentiment_label = "Trung tính"
        
    return sentiment_label, polarity_score

# Kiểm tra thử nghiệm cảm xúc trên văn bản mẫu
english_samples = [
    "This product is amazing and very useful!",
    "Terrible service, I am deeply disappointed."
]

for sample in english_samples:
    label, score = analyze_sentiment(sample)
    print(f"Văn bản: {sample} | Cảm xúc: {label} (Điểm: {score})")

🚀 Ứng dụng thực tế trong doanh nghiệp

Việc kết hợp tiền xử lý văn bản, thuật toán TF-IDFSentiment Analysis mở ra nhiều hướng đi chiến lược cho doanh nghiệp trong việc thấu hiểu khách hàng. Bạn có thể áp dụng mô hình này để tự động phân loại hàng nghìn bình luận trên mạng xã hội, đánh giá chất lượng sản phẩm trên sàn thương mại điện tử hoặc lọc các email khiếu nại quan trọng cần xử lý khẩn cấp. Nền tảng Python cùng hệ sinh thái mã nguồn mở phong phú giúp việc hiện thực hóa các giải pháp này trở nên đơn giản, tiết kiệm thời gian và mang lại hiệu quả tối ưu cho mọi dự án khai thác dữ liệu lớn.

Bài tập thực hành:

📝 Bài tập 1: Tìm từ khóa đặc trưng nhất cho từng văn bản bằng TF-IDF

Yêu cầu: Cho một danh sách gồm 3 câu văn bản tiếng Việt đã được làm sạch cơ bản. Hãy sử dụng TfidfVectorizer từ scikit-learn để tính toán ma trận TF-IDF, sau đó viết hàm tìm ra từ khóa có điểm số TF-IDF cao nhất trong mỗi câu.

Code và lời giải:

Code
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np

# Dữ liệu đầu vào
documents = [
    "chất lượng sản phẩm tuyệt vời rất đáng tiền",
    "dịch vụ chăm sóc khách hàng quá tệ",
    "sản phẩm tạm ổn giá cả hợp lý"
]

# Khởi tạo vector hóa TF-IDF
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(documents)
feature_names = vectorizer.get_feature_names_out()

def get_top_keyword_per_document(matrix, feature_array, doc_list):
    top_keywords = []
    for row_index in range(matrix.shape[0]):
        # Lấy vector dòng hiện tại
        row_vector = matrix.getrow(row_index).toarray().flatten()
        # Tìm vị trí có giá trị TF-IDF cao nhất
        best_index = np.argmax(row_vector)
        best_word = feature_array[best_index]
        top_keywords.append((doc_list[row_index], best_word))
    return top_keywords

# Thực thi và hiển thị kết quả
results = get_top_keyword_per_document(tfidf_matrix, feature_names, documents)
for doc, keyword in results:
    print(f"Văn bản: '{doc}' -> Từ khóa trọng tâm: {keyword}")

🎯 Bài tập 2: Xây dựng hàm phân tích cảm xúc tiếng Việt đơn giản dựa trên từ điển

Yêu cầu: Vì các thư viện như TextBlob chủ yếu hỗ trợ tiếng Anh, hãy tự xây dựng một mô hình Sentiment Analysis tiếng Việt theo phương pháp dựa trên từ điển (Rule-based) bằng cách đếm số lượng từ tích cực và tiêu cực.

Code và lời giải:

Code
# Định nghĩa từ điển cảm xúc dạng hằng số
POSITIVE_WORDS = {"tuyệt", "tốt", "đẹp", "ngon", "thích", "hài", "lòng", "xuất", "sắc"}
NEGATIVE_WORDS = {"tệ", "chán", "dở", "kém", "buồn", "thất", "vọng", "đắt"}

def simple_vietnamese_sentiment(text):
    tokens = text.lower().split()
    positive_count = sum(1 for word in tokens if word in POSITIVE_WORDS)
    negative_count = sum(1 for word in tokens if word in NEGATIVE_WORDS)
    
    if positive_count > negative_count:
        return "Tích cực", positive_count - negative_count
    elif negative_count > positive_count:
        return "Tiêu cực", negative_count - positive_count
    else:
        return "Trung tính", 0

# Kiểm tra thử nghiệm với dữ liệu đánh giá mới
test_reviews = [
    "sản phẩm dùng rất tốt và tuyệt vời",
    "dịch vụ chán quá làm tôi thất vọng",
    "cái áo bình thường không có gì đặc biệt"
]

for review in test_reviews:
    sentiment, score = simple_vietnamese_sentiment(review)
    print(f"Đánh giá: '{review}' -> Cảm xúc: {sentiment} (Điểm chênh lệch: {score})")

Bình luận

Đăng nhập để để lại bình luận.
Chưa có bình luận nào cho bài viết này.

Bài viết liên quan