Transformer Cho Phân Tích Cảm Xúc trong Python và cách Fine-Tuning

Transformer được giới thiệu lần đầu tiên trong bài báo “Attention is All You Need” bởi nhóm nghiên cứu của Google, đánh dấu một bước ngoặt quan trọng trong lĩnh vực xử lý ngôn ngữ tự nhiên. Kể từ đó, Transformer đã trở thành nền tảng cho nhiều mô hình hiện đại như BERT, GPT, và RoBERTa, nhờ vào khả năng xử lý dữ liệu hiệu quả và linh hoạt hơn so với các kiến trúc trước đây như RNN hay LSTM.

Các mô hình này tận dụng kiến trúc Transformer để hiểu sâu hơn về ngữ cảnh và các mối quan hệ giữa các từ trong câu. Transformer cho phép các nhà nghiên cứu xây dựng các hệ thống nhận diện cảm xúc chính xác hơn, từ đó có thể phân tích các phản hồi của người dùng trên mạng xã hội hay phản hồi khách hàng một cách nhanh chóng và hiệu quả.


1. Cấu trúc cơ bản của Transformer:

Cơ chế Attention (Self-Attention):

Điểm đặc biệt nhất của Transformer là cơ chế Attention. Nó giúp mô hình tập trung vào những từ quan trọng trong câu, từ đó hiểu rõ hơn ngữ cảnh.

Encoder-Decoder:

Transformer được chia thành hai phần chính:

  • Encoder: Mã hóa đầu vào (ví dụ: đoạn văn bản).
  • Decoder: Sinh đầu ra (ví dụ: câu trả lời hoặc phân loại).

2. Phân tích cảm xúc bằng Transformer:

Khi áp dụng Transformer cho phân tích cảm xúc:

  • Mô hình (như BERT hoặc RoBERTa) được huấn luyện trên tập dữ liệu chứa nhãn cảm xúc (ví dụ: tích cực, tiêu cực, trung lập).
  • Dữ liệu văn bản đầu vào được token hóa thành các phần tử nhỏ (token).
  • Các token này được đưa qua Transformer để trích xuất các đặc trưng ngữ nghĩa.
  • Đầu ra của Transformer sẽ được chuyển qua một lớp phân loại để dự đoán cảm xúc.

3. Ưu điểm của Transformer trong phân tích cảm xúc:

  • Hiểu ngữ cảnh tốt hơn: Transformer không chỉ phân tích từng từ một cách độc lập mà còn hiểu được ý nghĩa trong ngữ cảnh.
  • Khả năng tổng quát hóa mạnh: Có thể áp dụng trên nhiều ngôn ngữ và ngữ cảnh khác nhau.
  • Hiệu quả vượt trội: Transformer được huấn luyện trước (pre-trained) giúp tiết kiệm thời gian và tài nguyên khi áp dụng vào các nhiệm vụ cụ thể.

4. Ứng dụng thực tế:

  • Phân tích nhận xét của khách hàng.
  • Đánh giá cảm xúc từ mạng xã hội.
  • Nghiên cứu thị trường và đo lường mức độ hài lòng.

Ví dụ sử dụng Python với Hugging Face:

from transformers import pipeline

# Khởi tạo pipeline cho phân tích cảm xúc
sentiment_analyzer = pipeline("sentiment-analysis")

# Dữ liệu văn bản mẫu
sample_texts = [
    "Tôi cực kỳ yêu thích sản phẩm này! Nó thật tuyệt vời!", 
    "Cũng tạm ổn, nhưng tôi đã mong đợi điều gì đó tốt hơn.", 
    "Đây là trải nghiệm tồi tệ nhất mà tôi từng có."
]

# Phân tích cảm xúc của các văn bản mẫu
for text in sample_texts:
    result = sentiment_analyzer(text)
    print(f"Văn bản: {text}")
    print(f"Kết quả phân tích cảm xúc: {result}")
    print("-" * 40)

Chạy trên Colab

Kết quả đầu ra ví dụ:

Văn bản: Tôi cực kỳ yêu thích sản phẩm này! Nó thật tuyệt vời!
Kết quả phân tích cảm xúc: [{'label': 'POSITIVE', 'score': 0.99}]
----------------------------------------
Văn bản: Cũng tạm ổn, nhưng tôi đã mong đợi điều gì đó tốt hơn.
Kết quả phân tích cảm xúc: [{'label': 'NEUTRAL', 'score': 0.75}]
----------------------------------------
Văn bản: Đây là trải nghiệm tồi tệ nhất mà tôi từng có.
Kết quả phân tích cảm xúc: [{'label': 'NEGATIVE', 'score': 0.98}]
----------------------------------------

Fine-tuning Transformer:

Fine-tuning là quá trình điều chỉnh lại các tham số của mô hình Transformer đã được huấn luyện trước, để nó hoạt động tốt hơn trên dữ liệu cụ thể. Mục tiêu là giúp mô hình hiểu sâu hơn các biểu hiện cảm xúc trong ngữ cảnh thực tế.

Code mẫu:

from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments
import torch
from torch.utils.data import Dataset

# Định nghĩa lớp dữ liệu tuỳ chỉnh
class SentimentDataset(Dataset):
    def __init__(self, texts, labels, tokenizer, max_len=128):
        self.texts = texts
        self.labels = labels
        self.tokenizer = tokenizer
        self.max_len = max_len

    def __len__(self):
        return len(self.texts)

    def __getitem__(self, index):
        text = self.texts[index]
        label = self.labels[index]
        inputs = self.tokenizer(
            text,
            padding="max_length",
            truncation=True,
            max_length=self.max_len,
            return_tensors="pt"
        )
        return {
            "input_ids": inputs["input_ids"].squeeze(),
            "attention_mask": inputs["attention_mask"].squeeze(),
            "labels": torch.tensor(label, dtype=torch.long)
        }

# Tải tokenizer và mô hình BERT đã huấn luyện sẵn
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=3)

# Dữ liệu huấn luyện và kiểm tra
train_texts = ["I love this!", "It's terrible.", "Not bad, not great."]
train_labels = [0, 2, 1]  # 0 = tích cực, 1 = trung lập, 2 = tiêu cực
eval_texts = ["Amazing experience!", "This was awful."]
eval_labels = [0, 2]

train_dataset = SentimentDataset(train_texts, train_labels, tokenizer)
eval_dataset = SentimentDataset(eval_texts, eval_labels, tokenizer)

# Thiết lập tham số huấn luyện
training_args = TrainingArguments(
    output_dir='./results',
    num_train_epochs=3,
    per_device_train_batch_size=8,
    per_device_eval_batch_size=8,
    evaluation_strategy="epoch",
    logging_dir='./logs',
    save_strategy="epoch",
    load_best_model_at_end=True
)

# Khởi tạo Trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset
)

# Huấn luyện mô hình
trainer.train()

# Đánh giá mô hình
metrics = trainer.evaluate()
print("Kết quả đánh giá:", metrics)

Chạy trên Colab


Discover more from Science Comics

Subscribe to get the latest posts sent to your email.

Leave a Reply

error: Content is protected !!