Chuyển đến nội dung chính

Ứng dụng CNN 1D trong trích xuất n-gram đặc trưng cảm xúc văn bản

Trong bài toán xử lý ngôn ngữ tự nhiên (NLP) hiện đại, việc phân tích thái độ của người dùng từ các đoạn bình luận hay đánh giá sản phẩm đòi hỏi mô hình vừa phải hiểu rõ ngữ cảnh, vừa phải đảm bảo tốc độ xử lý vượt trội. Khi đối mặt với các kiến trúc truyền thống như mạng tuần tự (RNN, LSTM), các kỹ sư thường gặp điểm nghẽn về khả năng song song hóa do tính chất phụ thuộc thời gian. Giải pháp thay thế hiệu quả và mang tính cách mạng chính là CNN 1D phân tích cảm xúc, tận dụng cơ chế cửa sổ trượt để quét qua các cụm từ liền kề.

Bài viết này sẽ đi sâu phân tích cơ chế kỹ thuật, quy trình thực hiện, ví dụ minh họa kèm mã nguồn Python và đánh giá ưu nhược điểm của việc ứng dụng mạng tích chập một chiều trong bài toán trích xuất n-gram đặc trưng cảm xúc văn bản.


Bản chất của CNN 1D và cách hoạt động trên chuỗi văn bản

Khác với mạng CNN 2D thường được sử dụng trong thị giác máy tính để xử lý ma trận điểm ảnh của hình ảnh, mạng tích chập 1D hoạt động trên không gian một chiều. Trong văn bản, sau khi các từ đã được chuyển đổi thành các vector nhúng (word embedding), một câu văn được biểu diễn thành một ma trận kích thước [Chiều dài câu x Số chiều embedding].

Cửa sổ trượt của bộ lọc tích chập (kernel size) sẽ quét qua chuỗi theo chiều dọc của văn bản (từ trên xuống dưới theo thứ tự từ). Mỗi kích thước kernel tương ứng với một độ dài n-gram cụ thể: * Kernel size = 2: Bắt cặp các cụm 2 từ (bigram). * Kernel size = 3: Bắt cặp các cụm 3 từ (trigram). * Kernel size = 4 hoặc lớn hơn: Bắt cặp các cụm từ dài hơn để nắm bắt ngữ cảnh rộng.

Nhờ cơ chế này, mạng có thể song song hóa toàn bộ quá trình tính toán cho mọi vị trí trong câu cùng một lúc, khắc phục hoàn toàn nhược điểm tính tuần tự của LSTM hay RNN (như đã phân tích tại So sánh các mạng neuron trong phân tích cảm xúc văn bản).


Quy trình chuẩn xây dựng pipeline CNN 1D cho văn bản

CNN 1D phân tích cảm xúc — ảnh minh họa 1

Phân tích cảm xúc với CNN 1D

Để xây dựng một hệ thống hoàn chỉnh nhận diện cảm xúc văn bản bằng CNN 1D, chúng ta cần tuân thủ một quy trình gồm các bước mạch lạc sau:

  1. Tiền xử lý và Tách từ: Chuẩn hóa văn bản, chuyển về chữ thường và thực hiện tách từ (đặc biệt quan trọng với tiếng Việt để giữ nguyên cụm từ có nghĩa).
  2. Chuyển đổi Embedding: Ánh xạ từng từ thành vector số thông qua các không gian nhúng như Word2Vec hoặc FastText (tham khảo thêm tại FastText Word Embedding: Cách biểu diễn từ bằng subword).
  3. Tích chập 1D (1D Convolution): Áp dụng các bộ lọc với kích thước khác nhau để trích xuất các n-gram cục bộ.
  4. Gộp tối đa theo chiều dọc (Global Max Pooling): Lọc ra đặc trưng nổi bật nhất từ mỗi bộ lọc, giúp mô hình tập trung vào từ khóa quyết định cảm xúc bất kể vị trí của chúng trong câu.
  5. Phân loại Fully Connected: Đưa vector đặc trưng qua các lớp ẩn để dự đoán nhãn cảm xúc cuối cùng (Positive, Negative, Neutral).

Ví dụ minh họa bằng mã nguồn Python và PyTorch

Dưới đây là đoạn mã mô phỏng kiến trúc CNN 1D đơn giản bằng thư viện PyTorch để trích xuất n-gram và phân loại cảm xúc văn bản.

import torch
import torch.nn as nn
class SentimentCNN1D(nn.Module):
def __init__(self, vocab_size, embed_dim, num_filters, kernel_sizes, num_classes):
super(SentimentCNN1D, self).__init__()
# Lớp nhúng từ
self.embedding = nn.Embedding(vocab_size, embed_dim, padding_idx=0)
# Các bộ lọc tích chập 1D cho các n-gram khác nhau
self.convs = nn.ModuleList([
            nn.Conv1d(in_channels=embed_dim, 
                      out_channels=num_filters, 
                      kernel_size=k)
for k in kernel_sizes
        ])
# Lớp Linear phân loại cuối cùng
self.fc = nn.Linear(len(kernel_sizes) * num_filters, num_classes)
self.relu = nn.ReLU()
self.dropout = nn.Dropout(0.5)
def forward(self, text):
# text shape: [batch_size, seq_len]
        embedded = self.embedding(text)
# embedded shape: [batch_size, seq_len, embed_dim]
# Chuyển đổi chiều cho Conv1d: [batch_size, embed_dim, seq_len]
        embedded = embedded.permute(0, 2, 1)

        conv_outputs = []
for conv in self.convs:
# Áp dụng tích chập và hàm kích hoạt ReLU
            c = self.relu(conv(embedded))
# Global Max Pooling theo chiều dài chuỗi
# [batch_size, num_filters, seq_len - k + 1] -> [batch_size, num_filters]
            pooled = torch.max(c, dim=2)[0]
            conv_outputs.append(pooled)
# Ghép nối các đặc trưng n-gram lại với nhau
        cat = torch.cat(conv_outputs, dim=1)
# [batch_size, len(kernel_sizes) * num_filters]

        out = self.fc(self.dropout(cat))
return out

# Khởi tạo mô hình thử nghiệm
vocab_size = 10000
embed_dim = 100
num_filters = 64
kernel_sizes = [2, 3, 4] # Bigram, Trigram, 4-gram
num_classes = 2 # Positive / Negative

model = SentimentCNN1D(vocab_size, embed_dim, num_filters, kernel_sizes, num_classes)
print(model)

Output khi khởi tạo chương trình:

SentimentCNN1D(
  (embedding): Embedding(10000, 100, padding_idx=0)
  (convs): ModuleList(
    (0): Conv1d(100, 64, kernel_size=(2,), stride=(1,))
    (1): Conv1d(100, 64, kernel_size=(3,), stride=(1,))
    (2): Conv1d(100, 64, kernel_size=(4,), stride=(1,))
  )
  (fc): Linear(in_features=192, out_features=2, bias=True)
  (relu): ReLU()
  (dropout): Dropout(p=0.5)
)

Sơ đồ khối cấu trúc thuật toán CNN 1D trong NLP

Để trực quan hóa cách dữ liệu di chuyển qua mạng, sơ đồ dưới đây mô tả cấu trúc dòng xử lý từ văn bản thô đến kết quả dự đoán cảm xúc:

[Văn bản đầu vào (Token IDs)]
             │
             ▼
    [Embedding Layer]  ──> Biểu diễn dạng vector [Batch, Seq_Len, Embed_Dim]
             │
             ▼
   [Permute / Chuyển vị] ──> Định dạng phù hợp cho Conv1d [Batch, Embed_Dim, Seq_Len]
             │
       ┌─────┼─────┐
       ▼     ▼     ▼
    [Conv2] [Conv3] [Conv4]  ──> Trích xuất n-gram tương ứng (Bigram, Trigram, 4-gram)
       │     │     │
       ▼     ▼     ▼
    [ReLU]  [ReLU] [ReLU]    ──> Kích hoạt phi tuyến tính
       │     │     │
       ▼     ▼     ▼
    [MaxP]  [MaxP] [MaxP]    ──> Global Max Pooling (Lấy đặc trưng mạnh nhất)
       └─────┼─────┘
             │
             ▼
      [Concatenate]  ──> Ghép nối toàn bộ đặc trưng n-gram [Batch, Total_Filters]
             │
             ▼
        [Dropout]
             │
             ▼
       [Linear Layer] ──> Đầu ra Logits phân loại cảm xúc

Đánh giá ưu điểm và hạn chế kỹ thuật

Ưu điểm vượt trội

  • Tốc độ xử lý cao: Do không có liên kết hồi tiếp theo thời gian như LSTM, các phép toán tích chập hoàn toàn độc lập và có thể chạy song song trên GPU.
  • Bắt giữ từ khóa cục bộ xuất sắc: Rất phù hợp với các bài toán đánh giá sản phẩm, nơi mà ý kiến thường được định đoạt bởi một vài cụm từ cụ thể (ví dụ: "dùng rất tốt", "quá tệ", "không đáng tiền").

Hạn chế cần lưu ý

  • Giới hạn ngữ cảnh toàn cục: Cửa sổ trượt của CNN chỉ quét trên một phạm vi cục bộ xác định bởi kích thước kernel, khó nắm bắt các mối liên kết phụ thuộc xa trong các câu văn phức tạp hoặc dài dòng.
  • Nhạy cảm với tiền xử lý: Nếu bước tách từ hoặc xử lý phủ định không tốt, mô hình dễ nhầm lẫn (xem thêm các lưu ý tại Các lỗi phổ biến khi xây Sentiment Analysis).

Kết luận

Ứng dụng CNN 1D trong trích xuất n-gram đặc trưng cảm xúc văn bản là một kỹ thuật mạnh mẽ, cân bằng hoàn hảo giữa tốc độ huấn luyện và độ chính xác trong các bài toán NLP thực tế. Bằng cách tận dụng các bộ lọc cửa sổ trượt, mô hình có thể phát hiện nhanh chóng các cụm từ mang sắc thái tích cực hoặc tiêu cực mà không đòi hỏi tài nguyên tính toán quá lớn như các mô hình Transformer quy mô lớn.

© The CS Note · THE CS NOTE

Nội dung gốc thuộc tác giả. Vui lòng không đăng lại toàn văn khi chưa được phép, trừ trường hợp pháp luật hoặc giấy phép áp dụng cho phép. Nội dung của bên thứ ba tuân theo quyền và giấy phép tương ứng.

Nguồn gốc: Ứng dụng CNN 1D trong trích xuất n-gram đặc trưng cảm xúc văn bản

Về trang chủ Về đầu bài

Bài Đăng Phổ Biến

Bài toán tháp Hà nội

Trải nghiệm Tháp Hà Nội Kéo thả đĩa hoặc chạm vào các nút bên dưới để di chuyển. Bạn phải chuyển toàn bộ đĩa sang cột ngoài cùng bên phải (Cột 3) mà không đặt đĩa to lên đĩa nhỏ. Cột 1 Cột 2 Cột 3 Điều khiển & Chế độ Số lượng đĩa 4 Tốc độ máy giải ↪ Undo ↻ Chơi lại 🤖 Máy tự giải Thống kê ván chơi Nước đã đi 0 Thời gian 00:00 Tối thiểu cần 15 Kỷ lục của bạn - Lịch sử và Nguồn gốc Truyền thuyết Bài toán Tháp Hà Nội (hay Tháp Brahma) là một trò chơi xếp hình toán học kinh điển được giới thiệu lần đầu vào năm 1883 bởi nhà toán học người Pháp Édouard L...

Bài toán phân tích cảm xúc trong văn bản

Bài toán phân tích cảm xúc (sentiment analysis) là một bài toán NLP nhằm xác định thái độ hoặc cảm xúc được thể hiện trong văn bản. Ví dụ, từ một đánh giá như “Điện thoại đẹp, chạy nhanh nhưng pin hơi yếu”, hệ thống có thể nhận biết rằng người dùng có cả nhận xét tích cực và tiêu cực. Điểm thú vị của bài toán nằm ở khoảng cách giữa cách con người hiểu ngôn ngữ và cách máy tính xử lý dữ liệu. Một hệ thống phân tích cảm xúc cần biến văn bản tự nhiên thành dữ liệu có cấu trúc, học được các mẫu ngôn ngữ từ dữ liệu huấn luyện và đưa ra dự đoán hợp lý trên những câu chưa từng gặp. 1. Bài toán phân tích cảm xúc bắt đầu từ đâu? Hãy tưởng tượng một cửa hàng trực tuyến có hàng nghìn đánh giá mỗi ngày. Con người có thể đọc từng đánh giá để biết khách hàng hài lòng hay không, nhưng việc này nhanh chóng trở nên tốn thời gian khi dữ liệu tăng lên. NLP có thể biến bài toán đó thành một bài toán phân loại. Với mỗi văn bản, hệ thống nhận vào một chuỗi ký...

KAN cho phân đoạn khối u não với bộ BraTS 2020

Kolmogorov-Arnold Network (KAN) mở ra một hướng khác với MLP truyền thống: thay vì chỉ học các trọng số vô hướng trên mỗi kết nối, KAN có thể học những hàm phi tuyến một biến trên các cạnh . Khi đưa ý tưởng này vào kiến trúc encoder-decoder như U-Net, ta có thể sử dụng convolution để giữ cấu trúc không gian của ảnh MRI và dùng KAN để thực hiện các phép biến đổi phi tuyến mạnh hơn trên representation trung gian. Một bài toán phù hợp để nghiên cứu hướng này là phân đoạn u thần kinh đệm trên BraTS 2020 . Dataset cung cấp MRI đa mô thức và yêu cầu xác định các vùng Whole Tumor (WT), Tumor Core (TC) và Enhancing Tumor (ET). Đây là bài toán 3D có sự mất cân bằng voxel lớn, hình dạng khối u rất đa dạng và ranh giới giữa các mô bệnh lý không đơn giản. Lưu ý học thuật quan trọng: U-KAN gốc được công bố cho nhiều benchmark phân đoạn ảnh y tế nhưng không báo cáo kết quả BraTS 2020. Một công trình sau đó đã mở rộng U-KAN sang 3D MRI brain tumor segmentation , nhưng đánh giá trên BraTS 2...

Tách từ trong tiếng Việt Word Segmentation

Tách từ tiếng Việt là bài toán xác định ranh giới giữa các từ trong một chuỗi văn bản. Khó khăn nằm ở chỗ khoảng trắng trong tiếng Việt thường phân cách các âm tiết , nhưng một từ hoàn chỉnh có thể gồm nhiều âm tiết như “sinh viên” , “đại học” , “công nghệ” hay “tự nhiên” . Tách từ đúng giúp các hệ thống NLP dựa trên từ biểu diễn văn bản hợp lý hơn, đặc biệt trong tìm kiếm, TF-IDF, phân loại văn bản, gán nhãn từ loại và một số mô hình ngôn ngữ tiếng Việt. Tuy nhiên, với các Transformer sử dụng tokenizer dưới mức từ như subword hoặc SentencePiece, tách từ thủ công không phải lúc nào cũng là bước bắt buộc . Việc có cần tách từ trước hay không phụ thuộc vào mô hình và pipeline cụ thể. Tóm tắt nội dung Khoảng trắng trong tiếng Việt không phải lúc nào cũng là ranh giới từ ; nhiều từ gồm hai hoặc nhiều âm tiết. Word segmentation và tokenization có liên quan nhưng không hoàn toàn đồng nghĩa. Ba hướng chính gồm dựa trên từ điển, mô hình thống kê và mô hình học sâu . Tron...

KAN là gì? Mạng Kolmogorov-Arnold khác MLP thế nào?

Kolmogorov-Arnold Network (KAN) là một kiến trúc mạng nơ-ron trong đó mỗi cạnh không chỉ chứa một trọng số vô hướng mà mang một hàm một biến có thể học được . Đây là khác biệt cốt lõi so với Multi-Layer Perceptron (MLP), nơi các cạnh chủ yếu thực hiện phép nhân với trọng số còn hàm kích hoạt thường được áp dụng tại các node. KAN được lấy cảm hứng từ định lý biểu diễn Kolmogorov-Arnold và đặc biệt đáng chú ý trong các bài toán xấp xỉ hàm, mô hình hóa khoa học và symbolic regression. Tuy nhiên, KAN không nên được hiểu là kiến trúc đã thay thế MLP trong mọi bài toán Deep Learning; khả năng biểu diễn, chi phí tính toán và mức độ phù hợp của hai kiến trúc khác nhau theo từng nhiệm vụ. Tóm tắt nội dung MLP học chủ yếu trọng số trên các cạnh , còn KAN đặt hàm một biến học được trên từng cạnh . Một KAN layer cộng kết quả của nhiều hàm cạnh để tạo activation của node tiếp theo. KAN gốc sử dụng B-spline để tham số hóa các hàm phi tuyến trên cạnh. KAN có lợi thế đáng chú ý về trực...