Giới thiệu dự án

Sự bùng nổ của các nền tảng mạng xã hội như Facebook, YouTube, TikTok và X (Twitter) đã biến không gian số thành môi trường tương tác chính của hàng chục triệu người dùng Việt Nam. Tuy nhiên, mặt trái của sự phát triển này là sự gia tăng đột biến của các hành vi bạo lực mạng, quấy rối trực tuyến và phát ngôn thù ghét (Hate Speech). Theo khảo sát Chỉ số Văn minh Trực tuyến (Digital Civility Index - DCI) do Microsoft công bố, Việt Nam nằm trong nhóm 5 quốc gia có chỉ số văn minh trực tuyến thấp nhất trong số 25 quốc gia được khảo sát, với hơn 70% người dùng từng gặp phải các hành vi ứng xử thiếu văn minh trên không gian mạng.

                                  KIỂM DUYỆT TRUYỀN THỐNG
 [Bình luận thù ghét] ───► [Bộ phân loại nhị phân / đa lớp] ───► Gán nhãn: HATE
                                                                     │ (Kiểm duyệt viên phải
                                                                     ▼  đọc lại toàn bộ)
                                    GIẢI PHÁP ViHOS
 [Bình luận thù ghét] ───► [Transformer / BiLSTM-CRF] ────────► Trích xuất: Span độc hại
                                                                     │ (Highlight chính xác
                                                                     ▼  vị trí vi phạm)

Thực trạng này đặt ra thách thức khổng lồ cho các cơ quan quản lý và đội ngũ kiểm duyệt nội dung (Content Moderators). Các hệ thống phân loại truyền thống chỉ dừng lại ở mức gán nhãn toàn bộ câu (Document/Sentence-level Classification) thành các nhóm như Sạch (CLEAN), Thù ghét (HATE), hoặc Xúc phạm (OFFENSIVE). Khi một bình luận dài bị gắn cờ, kiểm duyệt viên vẫn phải đọc lại toàn bộ văn bản để tìm ra từ ngữ vi phạm, gây lãng phí thời gian và tăng áp lực tâm lý. Bài toán Nhận diện chuỗi xúc phạm trong bình luận tiếng Việt (Vietnamese Hate and Offensive Spans Detection - ViHOS) ra đời nhằm giải quyết triệt để điểm nghẽn này bằng cách bóc tách chính xác vị trí các ký tự và cụm từ mang tính công kích, độc hại trong câu.

Đề tài đặt ra 3 mục tiêu nghiên cứu cụ thể:

  1. Xây dựng bộ dữ liệu chuẩn ViHOS: Thu thập và gán nhãn 11.056 bình luận mạng xã hội tiếng Việt với độ tin cậy và tính nhất quán cao, phục vụ bài toán Sequence Tagging ở cấp độ từ và ký tự.
  2. Thực nghiệm và tối ưu hóa mô hình học sâu/học chuyển tiếp: Triển khai các kiến trúc tiên tiến gồm BiLSTM-CRF, PhoBERT và XLM-RoBERTa để thiết lập đường cơ sở (baseline) vững chắc cho bài toán trích xuất chuỗi xúc phạm tiếng Việt.
  3. Xây dựng hệ thống streaming dữ liệu thời gian thực: Thiết kế và triển khai ứng dụng tích hợp Apache Spark để thu thập, phân loại và bóc tách chuỗi xúc phạm trực tiếp từ luồng dữ liệu mạng xã hội với độ trễ thấp.

Giải pháp sử dụng hướng tiếp cận mô hình hóa bài toán dưới dạng Gán nhãn chuỗi (Sequence Tagging / Token Classification), kết hợp biểu diễn không gian ngữ nghĩa tiếng Việt đa tầng. Kết quả kỳ vọng đạt điểm F1-Score trên 0.77 cho tác vụ trích xuất chuỗi độc hại, đồng thời xây dựng quy trình pipeline xử lý dữ liệu streaming đạt thông lượng hàng nghìn bình luận mỗi giây. Phạm vi nghiên cứu tập trung vào văn bản mạng xã hội tiếng Việt phi cấu trúc, có xét đến các hiện tượng ngôn ngữ đặc thù như teencode, từ lóng, viết tắt, từ thiếu dấu và các biện pháp tu từ ẩn ý.


Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Tại Việt Nam, các nghiên cứu trước đây chủ yếu tập trung vào phân loại sắc thái hoặc phát hiện bình luận độc hại ở cấp độ văn bản thô như ViHSD (Vietnamese Hate Speech Detection) hay UIT-ViCTSD (Constructive and Toxic Speech Detection). Trên thế giới, các tác vụ trích xuất chuỗi độc hại chỉ mới được khởi xướng gần đây thông qua SemEval-2021 Task 5 (Toxic Spans Detection) trên tập dữ liệu tiếng Anh Civil Comments và HateXplain trên Gab/Twitter.

Tiêu chí ViHSD (2021) UIT-ViCTSD (2021) SemEval-2021 Task 5 Giải pháp đề tài (ViHOS)
Ngôn ngữ Tiếng Việt Tiếng Việt Tiếng Anh Tiếng Việt
Cấp độ nhãn Câu (Sentence-level) Câu (Sentence-level) Chuỗi (Character spans) Chuỗi & Ký tự (Spans/Token)
Kích thước 33.400 bình luận 10.000 bình luận 10.629 bình luận 11.056 bình luận
Tính đa dạng nhãn CLEAN, HATE, OFFENSIVE Constructive, Toxic Toxic spans Span gán nhãn theo ngữ cảnh sâu
Xử lý Real-time Không Không Không Có (Tích hợp Spark Streaming)

Yêu cầu người dùng đối với hệ thống được mô hình hóa theo ma trận MoSCoW:

  • Must Have: Bóc tách chính xác vị trí offset (start_char, end_char) của chuỗi xúc phạm; phân loại bình luận (CLEAN/HATE/OFFENSIVE); độ chính xác Macro-F1 > 0.75.
  • Should Have: Khả năng xử lý từ viết tắt, từ không dấu, teencode và các biến thể đồng âm; giao diện trực quan hóa span cho kiểm duyệt viên.
  • Could Have: Xử lý dữ liệu streaming từ API mạng xã hội thời gian thực; tích hợp lọc từ vựng động theo blacklist tùy chỉnh.
  • Won't Have: Tự động chỉnh sửa nội dung bài viết gốc của người dùng; xử lý dữ liệu âm thanh/hình ảnh đa phương thức (multimodal).
Thách thức kỹ thuật chính:
1. Thiếu ngữ cảnh bài viết: "Linh cẩu" (tên loài vật vs miệt thị đối tượng tên Linh).
2. Viết tắt / Thiếu dấu: "Lon roi an noi mat day" (nhập nhằng ngữ nghĩa nghiêm trọng).
3. Hoán dụ / Chơi chữ: "Gia nhập Juventus" (ám chỉ đi tù sọc trắng đen), "Bồn Kỳ Lắc" (xúc phạm vùng miền).

Thiết kế hệ thống

Kiến trúc hệ thống được xây dựng theo mô hình phân tầng hướng dịch vụ, bao gồm 4 khối chức năng chính: Khối thu thập dữ liệu (Ingestion Layer), Khối tiền xử lý (Preprocessing Engine), Khối suy diễn mô hình (Inference Engine) và Khối ứng dụng phân tích (Application & Presentation Layer).

flowchart TD
    A["Nguồn dữ liệu mạng xã hội (Twitter/Facebook API)"] --> B["Khối Streaming Ingestion (Apache Spark / Kafka)"]
    B --> C["Khối tiền xử lý (Syllable Tokenizer, FastBPE, Regex Normalizer)"]
    C --> D{"Mô hình suy diễn kép"}
    D -->|Nhánh 1: Phân loại câu| E["PhoBERT-CNN Classifier (CLEAN/HATE/OFFENSIVE)"]
    D -->|Nhánh 2: Bóc tách chuỗi| F["XLM-R / PhoBERT Sequence Tagger"]
    E --> G["Khối hợp nhất kết quả & Định vị Offset"]
    F --> G
    G --> H["Spark SQL / Storage (PostgreSQL & JSONL)"]
    G --> I["Giao diện Giám sát & REST API Endpoints"]

Bảng công nghệ sử dụng (Technology Stack):

Thành phần Công nghệ / Thư viện Phiên bản Mục đích
Ngôn ngữ lõi Python 3.9.16 Xây dựng pipeline, huấn luyện mô hình
Deep Learning PyTorch / Transformers 1.13.1 / 4.25.1 Triển khai kiến trúc Transformer và BiLSTM
Pre-trained Models vinai/phobert-large, xlm-roberta-large HuggingFace Hub Backbone trích xuất vector ngữ cảnh tiếng Việt
Word Embeddings PhoW2V (Word2Vec tiếng Việt) 300-dim Vector nhúng đầu vào cho BiLSTM-CRF
Xử lý phân tán Apache Spark / PySpark 3.3.0 Xử lý luồng dữ liệu streaming thời gian thực
Công cụ gán nhãn LightTag Engine Cloud Enterprise Phục vụ quy trình gán nhãn và đo lường IAA

Cấu trúc dữ liệu đầu ra chuẩn (JSON Schema):

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "ViHOS_Prediction_Output",
  "type": "object",
  "properties": {
    "comment_id": { "type": "string" },
    "raw_text": { "type": "string" },
    "predicted_label": { "type": "string", "enum": ["CLEAN", "OFFENSIVE", "HATE"] },
    "spans": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "text": { "type": "string" },
          "start_offset": { "type": "integer" },
          "end_offset": { "type": "integer" },
          "confidence_score": { "type": "number", "minimum": 0.0, "maximum": 1.0 }
        },
        "required": ["text", "start_offset", "end_offset", "confidence_score"]
      }
    }
  },
  "required": ["comment_id", "raw_text", "predicted_label", "spans"]
}

Phương pháp luận (Methodology)

Dự án áp dụng quy trình phát triển lặp kết hợp khung tiêu chuẩn nghiên cứu khoa học dữ liệu CRISP-DM. Lộ trình thực hiện được chia thành 5 mốc chính trong 5 tháng:

Giai đoạn Thời gian Nhiệm vụ chính Sản phẩm bàn giao
M1: Khảo sát & Thiết kế Tháng 09/2022 Nghiên cứu bài toán, xây dựng quy tắc gán nhãn (Guidelines) Bộ tài liệu Annotation Guidelines v1.0
M2: Xây dựng ViHOS Tháng 10/2022 Gán nhãn 4 pha, kiểm định IAA (Kappa & Macro-F1) Dataset 11.056 mẫu (ViHOS)
M3: Thực nghiệm mô hình Tháng 11/2022 Cài đặt và fine-tune BiLSTM-CRF, PhoBERT, XLM-RoBERTa Checkpoints mô hình, bảng benchmark
M4: Xây dựng Streaming Tháng 12/2022 Tích hợp PySpark Streaming, thiết kế API & Dashboard Ứng dụng demo xử lý Twitter stream
M5: Đánh giá & Báo cáo Tháng 01/2023 Phân tích lỗi (Error analysis), hoàn thiện khóa luận Báo cáo khóa luận toàn văn

Để đảm bảo chất lượng dữ liệu cao nhất, quy trình gán nhãn trải qua 4 pha kiểm soát nghiêm ngặt với 6 sinh viên chuyên ngành Khoa học Dữ liệu có điểm thi Ngữ văn THPTQG $\ge 6.5$:

  • Pha 1 (Thí điểm): Gán thử 100 mẫu ngẫu nhiên qua 4 vòng lặp để cập nhật guideline; F1 đồng thuận tăng từ 0.7085 lên 0.8219.
  • Pha 2 (Tạo tập chuẩn): Hai chuyên gia gán độc lập 600 mẫu làm bộ kiểm tra chuẩn (Gold Standard), đạt Macro-F1 đồng thuận 0.8585 và Cohen's Kappa 0.7215.
  • Pha 3 (Gán chính): Trộn 100 mẫu chuẩn vào các tập con. Người gán nhãn đạt $F1 < 0.81$ trên tập kiểm tra phải thực hiện gán lại toàn bộ.
  • Pha 4 (Cân bằng dữ liệu): Bổ sung 5.528 mẫu CLEAN đã qua sàng lọc để đạt tổng số 11.056 mẫu, hạn chế thiên lệch (bias) cho mô hình.

Implementation và kết quả

Quá trình phát triển và thuật toán lõi

Bài toán trích xuất chuỗi xúc phạm được định nghĩa dưới dạng bài toán gán nhãn chuỗi (Sequence Tagging) theo định dạng BIO (Beginning - Inside - Outside) hoặc phân loại token nhị phân (Binary Token Classification: $0$ - Không xúc phạm, $1$ - Ký tự/Từ xúc phạm).

Văn bản đầu vào:   "thằng  ad   thở   ra   cái   tư_duy  như  trẻ_con"
BIO Tagging:       B-TOX  I-TOX B-TOX  O    B-TOX  I-TOX   O    I-TOX

Đối với mô hình BiLSTM-CRF, lớp nhúng từ PhoW2V trích xuất ma trận biểu diễn $X = (x_1, x_2, ..., x_n)$. Lớp BiLSTM tính toán trạng thái ẩn hai chiều $h_t = [\overrightarrow{h_t} ; \overleftarrow{h_t}]$. Lớp CRF tối ưu hóa hàm mất mát log-likelihood có điều kiện trên toàn bộ chuỗi nhãn $y$:

$$L(W, b) = \sum_i \log p(y^{(i)} | x^{(i)}) = \sum_i \left( s(x^{(i)}, y^{(i)}) - \log \sum_{\tilde{y}} e^{s(x^{(i)}, \tilde{y})} \right)$$

Trong đó $s(x, y) = \sum_{i=0}^n A_{y_i, y_{i+1}} + \sum_{i=1}^n P_{i, y_i}$ với $A$ là ma trận chuyển trạng thái (transition matrix) và $P$ là ma trận điểm phát xạ (emission matrix).

import torch
import torch.nn as nn
from transformers import AutoModelForTokenClassification, AutoTokenizer

class ToxicSpanClassifier(nn.Module):
    """
    Module phân loại chuỗi xúc phạm dựa trên kiến trúc Transformer Pre-trained
    Hỗ trợ fine-tuning PhoBERT hoặc XLM-RoBERTa cho bài toán Token Classification
    """
    def __init__(self, pretrained_model_name: str, num_labels: int = 2, dropout_rate: float = 0.2):
        super(ToxicSpanClassifier, self).__init__()
        self.num_labels = num_labels
        self.encoder = AutoModelForTokenClassification.from_pretrained(
            pretrained_model_name,
            num_labels=self.num_labels,
            output_hidden_states=False
        )
        self.dropout = nn.Dropout(dropout_rate)

    def forward(self, input_ids, attention_mask, labels=None):
        outputs = self.encoder(
            input_ids=input_ids,
            attention_mask=attention_mask,
            labels=labels,
            return_dict=True
        )
        logits = outputs.logits
        loss = outputs.loss if labels is not None else None
        return {"loss": loss, "logits": logits}

    def predict_spans(self, tokenizer, text: str, threshold: float = 0.5):
        self.eval()
        inputs = tokenizer(
            text,
            return_offsets_mapping=True,
            return_tensors="pt",
            truncation=True,
            max_length=256
        )
        offset_mapping = inputs.pop("offset_mapping")[0].cpu().numpy()
        
        with torch.no_grad():
            outputs = self.forward(
                input_ids=inputs["input_ids"],
                attention_mask=inputs["attention_mask"]
            )
            probs = torch.softmax(outputs["logits"], dim=-1)[0, :, 1].cpu().numpy()

        detected_spans = []
        for prob, (start, end) in zip(probs, offset_mapping):
            if start == end: # Loại bỏ special tokens (CLS, SEP)
                continue
            if prob >= threshold:
                detected_spans.append((int(start), int(end)))
        
        # Hợp nhất các span ký tự liền kề
        merged_spans = self._merge_adjacent_spans(detected_spans, text)
        return merged_spans

    @staticmethod
    def _merge_adjacent_spans(spans, text):
        if not spans:
            return []
        merged = [spans[0]]
        for current in spans[1:]:
            prev_start, prev_end = merged[-1]
            curr_start, curr_end = current
            # Nếu khoảng cách giữa 2 span chỉ là 1 khoảng trắng, tiến hành nối
            if curr_start <= prev_end + 1:
                merged[-1] = (prev_start, max(prev_end, curr_end))
            else:
                merged.append(current)
        return [{"text": text[s:e], "start": s, "end": e} for s, e in merged]

Xử lý luồng dữ liệu lớn với PySpark Streaming:

from pyspark.sql import SparkSession
from pyspark.sql.functions import from_json, col, udf
from pyspark.sql.types import StructType, StructField, StringType, ArrayType, IntegerType

# Khởi tạo Spark Session tích hợp Spark SQL và Streaming
spark = SparkSession.builder \
    .appName("ViHOS_Twitter_Streaming_Analytics") \
    .config("spark.streaming.stopGracefullyOnShutdown", "true") \
    .config("spark.sql.shuffle.partitions", "4") \
    .getOrCreate()

schema = StructType([
    StructField("id", StringType(), False),
    StructField("created_at", StringType(), True),
    StructField("user_screen_name", StringType(), True),
    StructField("text", StringType(), False)
])

# Đọc luồng dữ liệu stream từ socket TCP / Kafka
raw_stream = spark.readStream \
    .format("socket") \
    .option("host", "localhost") \
    .option("port", 9999) \
    .load()

parsed_stream = raw_stream.select(from_json(col("value"), schema).alias("data")).select("data.*")

Thử nghiệm và đánh giá kết quả

Hệ thống được đánh giá qua độ đo đồng thuận gán nhãn liên kết (IAA) và độ chính xác của các mô hình học máy.

Tiến trình cải thiện độ đồng thuận IAA qua các pha:
Pha 1 (Lần 1):  [=====>                  ] Macro-F1: 0.7085 | Kappa: 0.4161
Pha 1 (Lần 4):  [================>       ] Macro-F1: 0.8219 | Kappa: 0.6402
Pha 2 (Chuẩn):  [==================>     ] Macro-F1: 0.8585 | Kappa: 0.7215
Pha 3 (Chính):  [===================>    ] Macro-F1: 0.8600 | Kappa: 0.7239

Bảng kết quả thử nghiệm mô hình trên tập kiểm tra ViHOS (Character-level Metrics):

Mô hình Backbone Embeddings Precision Recall F1-Score (All Spans) F1-Score (Single Span) F1-Score (Multi Spans)
BiLSTM-CRF PhoW2V (300d) 0.6842 0.6210 0.6511 0.6720 0.6015
PhoBERT-base Transformer (12 layers) 0.7450 0.7210 0.7328 0.7510 0.6980
PhoBERT-large Transformer (24 layers) 0.7712 0.7560 0.7635 0.7812 0.7310
XLM-RoBERTa-large Multilingual (24 layers) 0.7845 0.7698 0.7770 0.7950 0.7460

Mô hình XLM-RoBERTa-large đạt hiệu suất cao nhất với F1-Score tổng thể đạt 0.7770, vượt trội hơn PhoBERT-large (0.7635) và BiLSTM-CRF (0.6511). Nguyên nhân là nhờ lượng dữ liệu tiền huấn luyện đa ngữ khổng lồ (2.5TB dữ liệu, trong đó có 137GB văn bản tiếng Việt), giúp XLM-R học sâu được các cấu trúc từ ngữ biến thể, tiếng lóng mạng xã hội và các từ mượn tốt hơn.


Đổi mới và đóng góp

  1. Bộ dữ liệu tiên phong cho tiếng Việt (ViHOS): Đóng góp 11.056 bình luận được gắn nhãn span xúc phạm đầu tiên cho tiếng Việt. Bộ dữ liệu mở ra hướng đi mới cho cộng đồng NLP trong nước, chuyển dịch từ bài toán phân loại nhị phân tĩnh sang phân tích sâu cấp độ chuỗi ngữ nghĩa.
  2. Bộ hướng dẫn gán nhãn toàn diện: Xây dựng 6 nhóm quy tắc ngôn ngữ học giải quyết triệt để các trường hợp khó trong tiếng Việt mạng xã hội:
    • Bình luận không dấu và gõ sai dấu.
    • Ẩn dụ và hoán dụ chính trị/xã hội phức tạp.
    • Chơi chữ, biến âm, lách luật kiểm duyệt (Leetspeak / Euphemism).
    • Ngôn ngữ nói địa phương và tiếng lóng vùng miền.
  3. Hiệu quả tối ưu hóa vượt trội: So với hệ thống phân loại câu truyền thống, việc bóc tách chính xác chuỗi vi phạm giúp giảm 65% thời gian đọc và kiểm tra của nhân viên kiểm duyệt nội dung, loại bỏ hoàn toàn việc phải đọc đi đọc lại những bình luận mang tính quấy rối dài hàng trăm từ.
So sánh hiệu suất vận hành:
Kiểm duyệt thủ công toàn văn:  [==============================] 100% thời gian (Chuẩn)
Phân loại nhãn câu (ViHSD):   [====================          ]  68% thời gian (Vẫn phải dò từ)
Bóc tách Span tự động (ViHOS): [=======                      ]  35% thời gian (Tiết kiệm 65%)

Ứng dụng thực tế và triển khai

Tình huống ứng dụng thực tế (Use Cases)

[Bình luận mạng xã hội] ──► [Spark Streaming Ingestion] ──► [XLM-R Span Extractor]
                                                                    │
           ┌────────────────────────────────────────────────────────┴─────────────────────────────────┐
           ▼                                                         ▼                                 ▼
   [Tự động che mờ (Masking)]                               [Trợ lý kiểm duyệt viên]          [Phân tích an ninh mạng]
  "Thằng *** nói ngu như ***"                                Highlight trực quan vị trí        Thống kê từ lóng thù ghét
 (Bảo vệ người dùng trực tiếp)                               giúp duyệt bài cực nhanh           theo dõi biến động dư luận
  1. Hệ thống lọc tự động trên sàn thương mại điện tử & diễn đàn: Tự động phát hiện và che mờ (masking bằng dấu ***) chính xác các cụm từ xúc phạm trong đánh giá sản phẩm hoặc phần bình luận mà không làm mất đi toàn bộ nội dung hữu ích khác của bình luận.
  2. Bảng điều khiển hỗ trợ kiểm duyệt (Moderator Copilot): Tích hợp vào các CMS báo chí (VnExpress, Tuổi Trẻ, Dân Trí) để tô màu (highlight) các cụm từ độc hại theo thời gian thực, hỗ trợ kiểm duyệt viên phê duyệt nhanh với độ trễ dưới 200ms.
  3. Giám sát an ninh mạng & lắng nghe xã hội (Social Listening): Giúp các cơ quan quản lý và doanh nghiệp theo dõi các chiến dịch công kích bẩn, bóc tách các từ khóa xúc phạm mới nổi để cập nhật chính sách an toàn thông tin.

Yêu cầu hệ thống và triển khai hạ tầng

Bảng cấu hình phần cứng và môi trường:

Thành phần Môi trường phát triển (Dev) Môi trường sản xuất (Production Cluster)
CPU Intel Core i7-11700K (8 cores, 16 threads) 2x Intel Xeon Gold 6330 (56 cores)
GPU NVIDIA RTX 3090 (24GB VRAM) 2x NVIDIA A10G (24GB VRAM Tensor Core)
RAM 32 GB DDR4 128 GB ECC DDR4
Lưu trữ 512 GB NVMe SSD 2 TB NVMe RAID 10
Hệ điều hành Ubuntu 20.04 LTS / CUDA 11.7 Ubuntu 22.04 LTS / CUDA 12.0 / Docker 24.0

Quy trình triển khai dịch vụ (Production Deployment):

# 1. Clone repository và thiết lập môi trường
git clone https://github.com/nlp-uit/ViHOS-Detection-System.git
cd ViHOS-Detection-System
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt

# 2. Tải trọng số mô hình đã fine-tuned
python scripts/download_checkpoints.py --model xlm-roberta-large-vihos

# 3. Khởi chạy cụm xử lý Spark Streaming và API Backend
docker-compose up -d spark-master spark-worker
uvicorn app.api.main:app --host 0.0.0.0 --port 8000 --workers 4

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Sự phụ thuộc vào ngữ cảnh ngoài (External Context Dependency): Một số bình luận mang tính mỉa mai, châm biếm sâu cay cần ngữ cảnh toàn bộ bài đăng gốc để xác định. Hiện tại mô hình chỉ xử lý bình luận độc lập nên có thể xảy ra tình trạng dương tính giả (False Positive) hoặc âm tính giả (False Negative).
  • Hiện tượng trôi ranh giới ký tự (Boundary Drift): Do đặc thù bộ tách từ tiếng Việt (Word Segmentation), ranh giới giữa âm tiết và từ ghép có thể làm lệch offset ký tự bắt đầu/kết thúc từ 1-2 vị trí khi gặp teencode phức tạp.

Hướng phát triển tương lai

  • Tích hợp mô hình ngôn ngữ lớn (LLMs): Nghiên cứu áp dụng kỹ thuật Instruction Tuning trên các mô hình nguồn mở thế hệ mới (Llama-3-Vietnamese, Gemma-2-9B) kết hợp cơ chế Chain-of-Thought (CoT) để giải thích lý do vì sao một span bị coi là xúc phạm.
  • Mở rộng nhận diện đa phương thức (Multimodal Span Detection): Kết hợp bóc tách văn bản độc hại lồng ghép bên trong hình ảnh chế (memes) và video ngắn trên TikTok.
  • Cơ chế học chủ động (Active Learning): Xây dựng pipeline tự động thu thập các mẫu nhận diện sai từ thực tế để gán nhãn bổ sung và tái huấn luyện mô hình định kỳ (Continuous Retraining).

Đối tượng hưởng lợi

                                  LỢI ÍCH TỔNG THỂ
 ┌───────────────────────────┬───────────────────────────┬───────────────────────────┐
 │   Sinh viên / Nghiên cứu  │      Lập trình viên       │     Doanh nghiệp / Xã hội │
 │  - Dataset chuẩn 11k mẫu  │  - Mã nguồn PyTorch/Spark │  - Giảm 65% chi phí duyệt │
 │  - Phương pháp luận gán   │  - Pipeline Sequence Tag  │  - Không gian mạng sạch   │
 └───────────────────────────┴───────────────────────────┴───────────────────────────┘
  • Sinh viên & Học viên cao học: Tiếp cận nguồn tư liệu thực nghiệm chuẩn mực về Sequence Tagging tiếng Việt, nắm vững kỹ thuật đo lường độ đồng thuận người gán nhãn (IAA) và phương pháp giải quyết dữ liệu bất cân bằng.
  • Kỹ sư AI & Lập trình viên: Sở hữu mã nguồn hoàn chỉnh về việc tích hợp mô hình Transformer vào hệ thống xử lý luồng dữ liệu lớn với Apache Spark; tái sử dụng kiến trúc Token Classification cho các bài toán tương tự như Named Entity Recognition (NER) hay Keyphrase Extraction.
  • Doanh nghiệp & Đơn vị truyền thông: Giảm trực tiếp 60 - 75% chi phí vận hành đội ngũ kiểm duyệt nội dung, bảo vệ thương hiệu khỏi các cuộc khủng hoảng truyền thông do bình luận tiêu cực và tuân thủ các quy định pháp luật về an ninh mạng.
  • Nhà nghiên cứu NLP: Bộ dữ liệu ViHOS cung cấp một chuẩn benchmark học thuật tin cậy để so sánh các kiến trúc xử lý ngôn ngữ tự nhiên mới cho tiếng Việt.

Câu hỏi thường gặp

1. Cần cấu hình tối thiểu như thế nào để triển khai mô hình vào môi trường thực tế?

Để phục vụ môi trường thực tế với tải trung bình (100 - 300 requests/giây), hệ thống yêu cầu máy chủ có ít nhất 1 GPU NVIDIA T4 hoặc RTX 3090 (tối thiểu 16GB VRAM), CPU 8 cores và 32GB RAM. Đối với môi trường thử nghiệm phi GPU, có thể sử dụng phiên bản rút gọn PhoBERT-base lượng tử hóa (Quantization INT8/ONNX Runtime) trên CPU với độ trễ tăng thêm khoảng 45ms mỗi bình luận.

2. Mô hình xử lý các bình luận cố tình viết sai chính tả hoặc lách luật kiểm duyệt như thế nào?

Mô hình XLM-RoBERTa sử dụng thuật toán phân rã từ con Byte-Pair Encoding (BPE) với tập từ vựng đa ngữ lớn, giúp chia nhỏ các từ viết tắt hoặc từ lách luật (ví dụ: đ.é.o, đk_m, chó_đẻ) thành các subwords liên quan. Kết hợp với việc bộ dữ liệu ViHOS đã bao phủ nhiều biến thể teencode và từ lách luật trong hướng dẫn gán nhãn, mô hình duy trì được khả năng nhận diện với độ chính xác F1 đạt trên 0.74 trên nhóm dữ liệu biến thể.

3. Hệ thống có thể tích hợp vào các nền tảng CMS hoặc ứng dụng web hiện có qua giao thức nào?

Hệ thống cung cấp sẵn chuẩn giao tiếp RESTful API và WebSocket xây dựng trên nền FastAPI. Doanh nghiệp chỉ cần gửi payload dạng JSON chứa nội dung văn bản tới endpoint /api/v1/spans/detect để nhận về danh sách các offset ký tự vi phạm cùng nhãn phân loại trong thời gian thực.

POST /api/v1/spans/detect
Payload: {"text": "thằng ad làm ăn như trẻ lớp mầm"}
Response: {
  "label": "OFFENSIVE",
  "spans": [{"text": "thằng", "start": 0, "end": 5}, {"text": "như trẻ lớp mầm", "start": 18, "end": 34}]
}

4. Chi phí bảo trì và xử lý hiện tượng trôi dạt dữ liệu (Data Drift) định kỳ ra sao?

Ngôn ngữ mạng xã hội thay đổi liên tục với các từ lóng mới xuất hiện theo xu hướng. Để duy trì độ chính xác cao, hệ thống nên được thiết lập chu kỳ đánh giá hàng tháng. Các bình luận có điểm tự tin (confidence score) thấp dưới 0.6 sẽ được lưu trữ vào bộ đệm để chuyên viên gán nhãn bổ sung, sau đó tiến hành fine-tuning lại mô hình định kỳ mỗi quý với chi phí tính toán ước tính dưới $50/lần huấn luyện trên hạ tầng điện toán đám mây.

5. Tại sao mô hình XLM-RoBERTa lại cho kết quả cao hơn PhoBERT trên tập dữ liệu tiếng Việt?

Mặc dù PhoBERT là mô hình chuyên biệt cho tiếng Việt, nhưng PhoBERT được huấn luyện chủ yếu trên văn bản tin tức chính thống (19GB Báo chí và 1GB Wikipedia). Ngược lại, tập dữ liệu tiền huấn luyện 137GB tiếng Việt của XLM-RoBERTa bao gồm lượng lớn dữ liệu thu thập từ Common Crawl, chứa đựng đa dạng văn phong đời thường, tiếng lóng và cấu trúc ngữ pháp tự do tương đồng với văn bản mạng xã hội trong tập ViHOS.


Kết luận

Khóa luận tốt nghiệp "Nhận diện chuỗi xúc phạm trong bình luận tiếng Việt" của nhóm tác giả Hoàng Gia Phú và Lưu Đức Cảnh (Khoa Khoa học và Kỹ thuật Thông tin, Trường Đại học Công nghệ Thông tin - ĐHQG-HCM) dưới sự hướng dẫn của ThS. Nguyễn Văn Kiệt đã hoàn thành toàn diện và xuất sắc các mục tiêu nghiên cứu đề ra.

Đề tài tạo nên bước đột phá khi giải quyết bài toán Sequence Tagging cho phát ngôn thù ghét tiếng Việt ở cấp độ chuỗi ký tự, đóng góp cho cộng đồng bộ dữ liệu ViHOS với 11.056 mẫu đạt chuẩn chất lượng cao và quy trình gán nhãn chặt chẽ với điểm đồng thuận Macro-F1 đạt 0.8585. Các thử nghiệm chuyên sâu đã chứng minh tính ưu việt của mô hình XLM-RoBERTa-large với điểm F1-Score đạt 0.7770, đồng thời ứng dụng thành công kiến trúc xử lý thời gian thực trên nền tảng Apache Spark.

Công trình không chỉ mang giá trị học thuật to lớn đối với ngành Xử lý Ngôn ngữ Tự nhiên tiếng Việt mà còn mang tính thực tiễn sâu sắc, cung cấp giải pháp công nghệ hiệu quả để làm trong sạch không gian mạng và bảo vệ người dùng trước các vấn nạn bạo lực trực tuyến.

Khám phá và kế thừa bộ dữ liệu cũng như mã nguồn của đề tài để cùng chung tay xây dựng môi trường số an toàn, văn minh cho người Việt!