File size: 4,436 Bytes
af55aed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
"""
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()

    # ── 1. Đọc dα»― liệu ────────────────────────────────────────────────────────
    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")

    # ── 2. Điền giΓ‘ trα»‹ thiαΊΏu ─────────────────────────────────────────────────
    df["title"] = df["title"].fillna("")
    df["lead_paragraph"] = df["lead_paragraph"].fillna("")

    # ── 3. TαΊ‘o cα»™t text ───────────────────────────────────────────────────────
    if args.text_mode == "title":
        df["text"] = df["title"]
    elif args.text_mode == "lead":
        df["text"] = df["lead_paragraph"]
    else:  # title_lead (mαΊ·c Δ‘α»‹nh β€” cung cαΊ₯p nhiều ngα»― cαΊ£nh nhαΊ₯t)
        df["text"] = df["title"] + " [SEP] " + df["lead_paragraph"]

    # ── 4. Encode nhΓ£n ────────────────────────────────────────────────────────
    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")

    # ── 5. Chỉ giα»― cα»™t cαΊ§n thiαΊΏt ─────────────────────────────────────────────
    df = df[["id", "text", "label_id"]].copy()

    # ── 6. Stratified split 80 / 10 / 10 ─────────────────────────────────────
    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())}")

    # ── 7. LΖ°u ra file ────────────────────────────────────────────────────────
    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()