| """ |
| prepare_data.py |
| --------------- |
| Δα»c ViClickbait-2025 CSV, tαΊ‘o cα»t text kαΊΏt hợp title + lead_paragraph, |
| encode label thΓ nh sα», chia stratified 80/10/10 vΓ lΖ°u ra 3 file CSV. |
| |
| DΓΉng: |
| python scripts/prepare_data.py \ |
| --csv /tmp/dataset_nlp/clickbait_dataset_vietnamese.csv \ |
| --out_dir data/splits |
| """ |
|
|
| import argparse |
| import os |
|
|
| import pandas as pd |
| from sklearn.model_selection import train_test_split |
|
|
|
|
| def main() -> None: |
| parser = argparse.ArgumentParser() |
| parser.add_argument( |
| "--csv", |
| default="/tmp/dataset_nlp/clickbait_dataset_vietnamese.csv", |
| help="ΔΖ°α»ng dαΊ«n tα»i file CSV gα»c", |
| ) |
| parser.add_argument( |
| "--out_dir", |
| default="data/splits", |
| help="ThΖ° mα»₯c lΖ°u train/val/test CSV", |
| ) |
| parser.add_argument( |
| "--text_mode", |
| choices=["title", "title_lead", "lead"], |
| default="title_lead", |
| help="TrΖ°α»ng vΔn bαΊ£n: chα» title, title+lead_paragraph, hoαΊ·c chα» lead", |
| ) |
| parser.add_argument("--seed", type=int, default=42) |
| args = parser.parse_args() |
|
|
| |
| df = pd.read_csv(args.csv) |
| print(f"Tα»ng sα» mαΊ«u: {len(df)}") |
| print("PhΓ’n phα»i nhΓ£n gα»c:") |
| print(df["label"].value_counts(), "\n") |
|
|
| |
| df["title"] = df["title"].fillna("") |
| df["lead_paragraph"] = df["lead_paragraph"].fillna("") |
|
|
| |
| if args.text_mode == "title": |
| df["text"] = df["title"] |
| elif args.text_mode == "lead": |
| df["text"] = df["lead_paragraph"] |
| else: |
| df["text"] = df["title"] + " [SEP] " + df["lead_paragraph"] |
|
|
| |
| label_map = {"non-clickbait": 0, "clickbait": 1} |
| df["label_id"] = df["label"].map(label_map) |
| assert df["label_id"].notna().all(), "CΓ³ nhΓ£n khΓ΄ng xΓ‘c Δα»nh!" |
| df["label_id"] = df["label_id"].astype(int) |
|
|
| print("Label map:", label_map) |
| print("PhΓ’n phα»i sau encode:") |
| print(df["label_id"].value_counts(), "\n") |
|
|
| |
| df = df[["id", "text", "label_id"]].copy() |
|
|
| |
| train_df, temp_df = train_test_split( |
| df, |
| test_size=0.20, |
| random_state=args.seed, |
| stratify=df["label_id"], |
| ) |
| val_df, test_df = train_test_split( |
| temp_df, |
| test_size=0.50, |
| random_state=args.seed, |
| stratify=temp_df["label_id"], |
| ) |
|
|
| print(f"Train : {len(train_df):>5} mαΊ«u | label dist: {dict(train_df['label_id'].value_counts().sort_index())}") |
| print(f"Val : {len(val_df):>5} mαΊ«u | label dist: {dict(val_df['label_id'].value_counts().sort_index())}") |
| print(f"Test : {len(test_df):>5} mαΊ«u | label dist: {dict(test_df['label_id'].value_counts().sort_index())}") |
|
|
| |
| os.makedirs(args.out_dir, exist_ok=True) |
| train_df.to_csv(os.path.join(args.out_dir, "train.csv"), index=False) |
| val_df.to_csv(os.path.join(args.out_dir, "val.csv"), index=False) |
| test_df.to_csv(os.path.join(args.out_dir, "test.csv"), index=False) |
| print(f"\nΔΓ£ lΖ°u vΓ o: {args.out_dir}/ (train.csv, val.csv, test.csv)") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|