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()
|