| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | IOAI 2025 — Phân tách từ ghép | 100 (p) | 1.0s | 256M |
| 2 | IOAI 2025 — Phát hiện giọng nói tổng hợp | 100 (p) | 1.0s | 256M |
Trong tiếng Đức, từ ghép (Komposita) được tạo ra bằng cách nối nhiều từ ngắn lại với nhau thành một từ dài. Ví dụ, Fußball là ghép của Fuß ("chân") và Ball ("quả bóng"); Autobahnanschlussstelle là ghép của Autobahn ("đường cao tốc"), Anschluss ("kết nối") và Stelle ("vị trí").
Nhiệm vụ của bạn là, cho trước một từ ghép tiếng Đức, hãy tách nó trở lại thành các từ thành phần ban đầu.
Cách biểu diễn lời giải: với một từ có độ dài n, bạn cần xuất một mảng nhị phân độ dài đúng bằng n, trong đó mỗi phần tử ứng với một ký tự của từ. Giá trị 1 đánh dấu vị trí kết thúc của một từ con, còn 0 đánh dấu các vị trí ở đầu hoặc giữa từ con (vị trí được đánh số từ 0).
Ví dụ. Từ Fußballspieler (độ dài 14) được tách thành Fuß + ball + spieler. Các vị trí kết thúc của ba từ con lần lượt là 2, 6 và 13, nên nhãn tương ứng là:
[0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1]
Lưu ý ký tự cuối cùng của từ luôn là vị trí kết thúc của một từ con, do đó phần tử cuối của mảng luôn bằng 1.
Bộ dữ liệu được cung cấp ở định dạng JSON, mỗi tệp là một đối tượng dạng {từ: mảng_nhãn}. Cụ thể:
train.json — 94.306 từ ghép kèm nhãn phân tách chuẩn để huấn luyện.val.json — 11.788 từ ghép, mảng nhãn để rỗng; dùng để bạn chạy mô hình trên tập đánh giá.val_answer.json — đáp án chuẩn của tập validation, để bạn tự chấm điểm và tinh chỉnh mô hình ở local.test.json — 11.789 từ ghép, mảng nhãn để rỗng; đây là tập bạn cần dự đoán để nộp.Ngoài ra, đề bài có đính kèm notebook mẫu ioai25wordseg_baseline.ipynb minh hoạ cách đọc dữ liệu, huấn luyện một mô hình cơ bản và sinh tệp nộp bài.
Bạn cần nộp một tệp .zip chứa duy nhất một tệp test_answer.json. Tệp này là một đối tượng JSON dạng:
{"từ_1": [nhãn_1], "từ_2": [nhãn_2], ...}
trong đó:
test.json.test.json đều phải xuất hiện. Nếu một từ bị thiếu, hoặc mảng nhãn có độ dài khác với độ dài của từ, từ đó sẽ bị tính 0 điểm.Điểm cuối cùng là trung bình F1 trên từng từ trong tập test.
Với mỗi từ, từ mảng nhãn ta khôi phục được tập các "từ con" — mỗi từ con là một đoạn [start, end) được xác định bởi hai vị trí kết thúc liên tiếp. Gọi G là tập từ con theo đáp án chuẩn và P là tập từ con theo dự đoán. Khi đó:
Một từ con chỉ được coi là đúng khi trùng khớp hoàn toàn cả vị trí bắt đầu lẫn vị trí kết thúc với đáp án. Nếu mảng dự đoán giống hệt đáp án, F1 = 1; mọi đường biên thừa hoặc thiếu đều làm giảm điểm. Nếu độ dài mảng dự đoán không khớp độ dài từ, điểm F1 của từ đó là 0.
Điểm tổng = trung bình cộng F1 trên toàn bộ 11.789 từ của test.json.
Bài này được lấy từ kỳ thi IOAI 2025 — GAITE Task 4: Combinatorial Word Segmentation. Mô tả gốc và tài nguyên kèm theo có tại kho IOAI-2025 chính thức.
Giọng nói tổng hợp do AI tạo ra ngày càng trở nên giống thật, kéo theo nguy cơ bị lạm dụng (giả mạo giọng người nổi tiếng, lan truyền tin nhắn thoại sai sự thật...). Vì vậy, việc tự động phát hiện đâu là giọng người thật, đâu là giọng do máy tổng hợp là một bài toán quan trọng cho kiểm chứng nội dung và an ninh thông tin.
Trong bài này, bạn cần xây dựng một mô hình phân loại nhị phân:
0 (bonafide): bản ghi âm giọng người thật.1 (spoof): giọng nói do AI tổng hợp.Mỗi mẫu âm thanh đã được chuyển sẵn thành Mel spectrogram — một biểu diễn 2D với trục hoành là thời gian, trục tung là tần số Mel — và lưu dưới dạng tensor PyTorch trong tệp .pt. Bạn không làm việc với âm thanh thô; chỉ cần đọc các tensor .pt và xử lý chúng như ảnh 2D. Nhờ đó, có thể coi đây là một bài toán Thị giác máy tính và áp dụng các kiến trúc CNN quen thuộc (ví dụ ResNet18) trực tiếp lên spectrogram.
Do toàn bộ tập huấn luyện rất lớn (~559 MB, khoảng 11 000 spectrogram) nên không thể đính kèm trực tiếp trên LQDOJ. Bạn tự tải tập huấn luyện từ trang chính thức:
bonafide là giọng người thật (nhãn 0), thư mục spoof chứa giọng tổng hợp (nhãn 1).Các tệp dữ liệu đính kèm trên LQDOJ:
validation_set.zip — 1374 spectrogram .pt (subset A), dùng để bạn tự kiểm tra và tinh chỉnh mô hình tại máy.val_answer.csv — nhãn đúng của tập validation, mỗi dòng một nhãn, theo thứ tự tên tệp đã sắp xếp theo bảng chữ cái trong validation_set/.testing_set.zip — 1375 spectrogram .pt (subset B). Đây là tập bạn cần dự đoán để nộp. Không có nhãn công khai.ioai25speech_baseline.ipynb — notebook baseline của ban tổ chức. Bạn nên đọc và chạy thử trước, đặc biệt là lớp SpectrogramDataset (đừng sửa lớp này để tránh lỗi tải dữ liệu) cùng phần định nghĩa class MyModel(nn.Module) với resnet18. Bản gốc của baseline: https://github.com/IOAI-official/IOAI-2025/blob/main/GAITE-Contest/Synthetic_Speech_Detector/IOAI2025%20GAITE%20Task%205%20Synthetic%20Speech%20Detector%20Baseline.ipynbNộp một tệp .zip chứa đúng một tệp test_answer.csv với:
0 (bonafide) hoặc 1 (spoof)..pt trong thư mục testing_set/ sau khi giải nén.Nói cách khác, dòng thứ i của test_answer.csv là nhãn dự đoán cho tệp đứng thứ i khi liệt kê testing_set/ theo thứ tự alphabet.
Điểm số là macro F1-score (trung bình F1 trên cả hai lớp bonafide và spoof), so sánh nhãn dự đoán của bạn với nhãn đúng của 1375 mẫu trong tập test (subset B).
Điểm tham chiếu của ban tổ chức trên Leaderboard B:
Nguồn đề bài: https://github.com/IOAI-official/IOAI-2025/tree/main/GAITE-Contest/Synthetic_Speech_Detector.