6
12 Task Downstream dan Jenis Klasifikasi
append_dataset_args adalah satu-satunya tempat di repository ini yang menerjemahkan nilai --dataset menjadi jenis task. Setiap nama dataset yang dikenal masuk ke satu cabang if/elif, lalu cabang tersebut mengisi args['task'], args['num_labels'], args['dataset_class'], args['dataloader_class'], args['forward_fn'], dan args['metrics_fn'] (utils/args_helper.py:83-841). Fungsi itu dipanggil oleh main.py sebelum directory eksperimen dibuat dan sebelum model dimuat, dan dipanggil juga oleh predict.py (main.py:1422, predict.py:693). Akibatnya dua belas task downstream berbagi satu jalur kode yang sama; yang berbeda hanyalah kelas dataset, jumlah label, dan fungsi forward yang dipilih cabang tersebut.
Ada tepat tiga nilai args['task'] yang dipakai cabang-cabang itu: sequence_classification, token_classification, dan multi_label_classification. Nilai itu nanti dipakai get_model_class untuk memilih kelas kepala klasifikasi (utils/functions.py:172-1774); rincian kelasnya ada di Modul Kepala Klasifikasi.
graph TD
CLI["--dataset dari argparse"] --> DISP{"append_dataset_args"}
DISP -->|"sequence_classification"| SEQ["3 dataset · satu label per dokumen"]
DISP -->|"token_classification"| TOK["7 dataset · satu label per token"]
DISP -->|"multi_label_classification"| ML["2 dataset · satu label per aspek"]
SEQ --> EMO["emotion-twitter<br/>NUM_LABELS = 5"]
SEQ --> ENT["entailment-ui<br/>NUM_LABELS = 2"]
SEQ --> DOC["doc-sentiment-prosa<br/>NUM_LABELS = 3"]
TOK --> TERM["term-extraction-airy<br/>NUM_LABELS = 5"]
TOK --> NERG["ner-grit<br/>NUM_LABELS = 7"]
TOK --> POSIDN["pos-idn<br/>NUM_LABELS = 41"]
TOK --> KW["keyword-extraction-prosa<br/>NUM_LABELS = 3"]
TOK --> QA["qa-factoid-itb<br/>NUM_LABELS = 3"]
TOK --> NERP["ner-prosa<br/>NUM_LABELS = 11"]
TOK --> POSP["pos-prosa<br/>NUM_LABELS = 26"]
ML --> ABSAA["absa-airy<br/>NUM_LABELS = [4, 4, 4, 4, 4, 4, 4, 4, 4, 4]"]
ML --> ABSAP["absa-prosa<br/>NUM_LABELS = [3, 3, 3, 3, 3, 3]"]
style DISP fill:#f59e0b,color:#000
style SEQ fill:#2d7d46,color:#fff
style TOK fill:#8b5cf6,color:#fff
style ML fill:#f59e0b,color:#000
%% fig: Pemetaan --dataset ke tiga jenis task
%% desc: append_dataset_args memecah dua belas nama dataset ke tiga nilai task, dan setiap cabang menetapkan kuantitas labelnya sendiri.Tiga jenis task dan bentuk labelnya
Ketiga jenis task berbeda pada bentuk label yang dikirim ke fungsi forward, bukan pada model dasarnya. EmotionDetectionDataLoader menyusun label_batch berbentuk (batch_size, 1), satu skalar per dokumen (utils/data_utils.py:4275). Loader token-level menyusun seq_label_batch berbentuk (batch_size, max_tgt_len) dan mengisi sisa posisi dengan -100 agar diabaikan saat menghitung loss (utils/data_utils.py:826). Loader ABSA menyusun label_batch berbentuk (batch_size, self.num_aspects), satu vektor label per aspek (utils/data_utils.py:8157).
graph LR
SEQ2["sequence_classification"] --> S1["label_batch (batch_size, 1)"]
TOK2["token_classification"] --> T1["seq_label_batch (batch_size, max_tgt_len)"]
T1 --> T2["posisi kosong diisi -100"]
ML2["multi_label_classification"] --> M1["label_batch (batch_size, num_aspects)"]
M1 --> M2["num_aspects diambil dari dataset.NUM_ASPECTS"]
style SEQ2 fill:#2d7d46,color:#fff
style TOK2 fill:#8b5cf6,color:#fff
style ML2 fill:#f59e0b,color:#000
style T2 fill:#dc2626,color:#fff
%% fig: Bentuk label per jenis task
%% desc: Jenis task menentukan bentuk tensor label yang masuk ke forward function, dari skalar per dokumen sampai vektor per aspek.Task sequence_classification memakai forward_sequence_classification dan satu label per dokumen. Task token_classification memakai forward_word_classification dan label per kata, dengan subword_to_word_indices memetakan subword kembali ke kata. Task multi_label_classification memakai forward_sequence_multi_classification, yang menerima logits berupa list tensor dan mengembalikan satu prediksi untuk setiap kelas; komentar pada berkas itu menyebut list<tensor(bs, num_label)> (utils/forward_fn.py:108-1178). Penjelasan alur forward selengkapnya ada di Forward Pass dan Metrik Evaluasi.
Setiap cabang juga menetapkan args['valid_criterion'] = 'F1', sehingga pemilihan model terbaik selalu memakai F1 tanpa memandang jenis task (utils/args_helper.py:919). Yang berbeda per dataset adalah metrics_fn: ner_metrics_fn dipakai dua dataset NER, pos_tag_metrics_fn dipakai dua dataset POS, dan absa_metrics_fn dipakai dua dataset ABSA.
Dua belas dataset dan kelas pendukungnya
--dataset | task | dataset_class | NUM_LABELS | forward_fn | metrics_fn | word_tokenizer_class | Rujukan |
|---|---|---|---|---|---|---|---|
emotion-twitter | sequence_classification | EmotionDetectionDataset | 5 | forward_sequence_classification | emotion_detection_metrics_fn | TweetTokenizer | utils/args_helper.py:84-10110 |
absa-airy | multi_label_classification | AspectBasedSentimentAnalysisAiryDataset | [4, 4, 4, 4, 4, 4, 4, 4, 4, 4] | forward_sequence_multi_classification | absa_metrics_fn | TweetTokenizer | utils/args_helper.py:102-11911 |
term-extraction-airy | token_classification | AspectExtractionDataset | 5 | forward_word_classification | aspect_extraction_metrics_fn | TweetTokenizer | utils/args_helper.py:120-13712 |
ner-grit | token_classification | NerGritDataset | 7 | forward_word_classification | ner_metrics_fn | TweetTokenizer | utils/args_helper.py:138-15513 |
pos-idn | token_classification | PosTagIdnDataset | 41 | forward_word_classification | pos_tag_metrics_fn | TweetTokenizer | utils/args_helper.py:156-17314 |
entailment-ui | sequence_classification | EntailmentDataset | 2 | forward_sequence_classification | entailment_metrics_fn | TweetTokenizer | utils/args_helper.py:174-19115 |
doc-sentiment-prosa | sequence_classification | DocumentSentimentDataset | 3 | forward_sequence_classification | document_sentiment_metrics_fn | TweetTokenizer | utils/args_helper.py:192-20916 |
keyword-extraction-prosa | token_classification | KeywordExtractionDataset | 3 | forward_word_classification | keyword_extraction_metrics_fn | WordSplitTokenizer | utils/args_helper.py:210-22717 |
qa-factoid-itb | token_classification | QAFactoidDataset | 3 | forward_word_classification | qa_factoid_metrics_fn | TweetTokenizer | utils/args_helper.py:228-24518 |
ner-prosa | token_classification | NerProsaDataset | 11 | forward_word_classification | ner_metrics_fn | TweetTokenizer | utils/args_helper.py:246-26319 |
pos-prosa | token_classification | PosTagProsaDataset | 26 | forward_word_classification | pos_tag_metrics_fn | TweetTokenizer | utils/args_helper.py:264-28120 |
absa-prosa | multi_label_classification | AspectBasedSentimentAnalysisProsaDataset | [3, 3, 3, 3, 3, 3] | forward_sequence_multi_classification | absa_metrics_fn | TweetTokenizer | utils/args_helper.py:282-29921 |
Tujuh dari dua belas task adalah token_classification, tiga sequence_classification, dan dua multi_label_classification. Sebagian kelas dipakai bersama antar dataset: ner-grit dan ner-prosa sama-sama memakai NerDataLoader, pos-idn dan pos-prosa sama-sama memakai PosTagDataLoader, sedangkan absa-airy dan absa-prosa sama-sama memakai AspectBasedSentimentAnalysisDataLoader (utils/args_helper.py:138-15513, utils/args_helper.py:246-26319, utils/args_helper.py:282-299). Satu-satunya task yang memakai WordSplitTokenizer adalah keyword-extraction-prosa; sisanya memakai TweetTokenizer (utils/args_helper.py:227, utils/args_helper.py:101). Struktur path train_set_path dan kawan-kawan yang diisi cabang yang sama dibahas di Struktur Berkas Dataset dan Submission, sedangkan pembentukan batch-nya di Data Utils dan Dataloader.
Label set per jenis task
Label set didefinisikan sebagai konstanta kelas pada masing-masing dataset_class, dan main.py memakai args['dataset_class'].LABEL2INDEX serta INDEX2LABEL sebagai w2i dan i2w saat mendekode prediksi (main.py:15624).
sequence_classification
| Dataset | Kunci LABEL2INDEX | Jumlah | Rujukan |
|---|---|---|---|
emotion-twitter | sadness, anger, love, fear, happy | 5 | utils/data_utils.py:389-39325 |
entailment-ui | NotEntail, Entail_or_Paraphrase | 2 | utils/data_utils.py:443-44726 |
doc-sentiment-prosa | positive, neutral, negative | 3 | utils/data_utils.py:504-50827 |
token_classification
| Dataset | Kunci LABEL2INDEX | Jumlah | Rujukan |
|---|---|---|---|
term-extraction-airy | I-SENTIMENT, O, I-ASPECT, B-SENTIMENT, B-ASPECT | 5 | utils/data_utils.py:12-1628 |
ner-grit | I-PERSON, B-ORGANISATION, I-ORGANISATION, B-PLACE, I-PLACE, O, B-PERSON | 7 | utils/data_utils.py:101-10529 |
ner-prosa | I-PPL, B-EVT, B-PLC, I-IND, B-IND, B-FNB, I-EVT, B-PPL, I-PLC, O, I-FNB | 11 | utils/data_utils.py:156-16030 |
pos-idn | tag B-/I- dari B-PR, B-CD, I-PR, sampai B-X | 41 | utils/data_utils.py:245-24931 |
pos-prosa | tag B- dari B-PPO, B-KUA, B-ADV, sampai B-VBE | 26 | utils/data_utils.py:300-30432 |
keyword-extraction-prosa | O, B, I | 3 | utils/data_utils.py:559-56333 |
qa-factoid-itb | O, B, I | 3 | utils/data_utils.py:649-65334 |
multi_label_classification
| Dataset | Kunci LABEL2INDEX | Aspek | Rujukan |
|---|---|---|---|
absa-airy | neg, neut, pos, neg_pos | 10 aspek: ac, air_panas, bau, general, kebersihan, linen, service, sunrise_meal, tv, wifi | utils/data_utils.py:744-75035 |
absa-prosa | negative, neutral, positive | 6 aspek: fuel, machine, others, part, price, service | utils/data_utils.py:772-77836 |
⚠️
NUM_LABELStidak selalu berupa bilangan bulat. Pada dua dataset ABSA nilainya berupa list, satu entri per aspek.get_model_classmenanganinya denganconfig.num_labels = max(args['num_labels'])dan menyimpan daftar aslinya diconfig.num_labels_list(utils/functions.py:262-26637). Memperlakukanargs['num_labels']sebagaiintakan salah untukabsa-airydanabsa-prosa.
Di luar dua belas: news-category-prosa
--dataset memiliki nilai default emotion-twitter, dan teks bantuannya menyebut daftar nama dataset yang tidak sepenuhnya cocok dengan cabang yang benar-benar ada: teks itu memuat news-category-prosa tetapi tidak memuat absa-prosa (utils/args_helper.py:3738). NewsCategorizationDataset memang diimpor dan didefinisikan dengan NUM_LABELS = 16 (utils/args_helper.py:839, utils/data_utils.py:832-83640), namun tidak ada cabang elif untuk nama dataset itu.
⚠️ Menjalankan
--dataset news-category-prosaakan berhenti diraise ValueError(f'Unknown dataset name ...')karena rantaiif/elifselesai tanpa cabang yang cocok (utils/args_helper.py:300-30141).run_all_tasks.shjuga hanya menjalankan dua belas nama yang punya cabang (run_all_tasks.sh:1-1242).