{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":121150,"databundleVersionId":15061024,"sourceType":"competition"}],"dockerImageVersionId":31260,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# =========================\n# DEEP PAST FINAL SUBMIT\n# =========================\n\nimport os, re, torch, pandas as pd\nfrom torch.utils.data import Dataset\nfrom transformers import AutoTokenizer, AutoModelForSeq2SeqLM\nfrom transformers import Trainer, TrainingArguments\n\n# -------- LOAD DATA --------\nBASE_PATH = \"/kaggle/input/deep-past-initiative-machine-translation\"\ntrain = pd.read_csv(os.path.join(BASE_PATH, \"train.csv\"))\ntest  = pd.read_csv(os.path.join(BASE_PATH, \"test.csv\"))\n\nprint(\"Train columns:\", train.columns.tolist())\nprint(\"Test columns:\", test.columns.tolist())\n\n# -------- AUTO DETECT SCHEMA --------\nSRC_COL = train.columns[1]\nTGT_COL = train.columns[2]\n\nprint(\"Detected source column:\", SRC_COL)\nprint(\"Detected target column:\", TGT_COL)\n\n# -------- PREPROCESS --------\ndef normalize_akk(text):\n    text = str(text).lower()\n    text = re.sub(r\"[!?/:]\", \"\", text)\n    text = re.sub(r\"[˹˺\\[\\]]\", \"\", text)\n    text = text.replace(\"…\", \"<big_gap>\")\n    text = re.sub(r\"\\[x\\]\", \"<gap>\", text)\n    text = text.replace(\"ḫ\", \"h\").replace(\"Ḫ\", \"h\")\n    text = re.sub(r\"\\s+\", \" \", text).strip()\n    return text\n\ndef normalize_eng(text):\n    text = str(text).lower()\n    text = text.replace(\"’\", \"'\")\n    text = re.sub(r\"\\s+\", \" \", text).strip()\n    return text\n\ntrain[\"src\"] = train[SRC_COL].apply(normalize_akk)\ntrain[\"tgt\"] = train[TGT_COL].apply(normalize_eng)\ntest[\"src\"]  = test[SRC_COL].apply(normalize_akk)\n\n# -------- DATASET --------\nclass AkkDataset(Dataset):\n    def __init__(self, src, tgt, tokenizer):\n        self.src = src\n        self.tgt = tgt\n        self.tok = tokenizer\n        \n    def __len__(self):\n        return len(self.src)\n    \n    def __getitem__(self, i):\n        x = self.tok(self.src[i], truncation=True,\n                     padding=\"max_length\", max_length=256,\n                     return_tensors=\"pt\")\n        y = self.tok(self.tgt[i], truncation=True,\n                     padding=\"max_length\", max_length=256,\n                     return_tensors=\"pt\")\n        return {\n            \"input_ids\": x[\"input_ids\"].squeeze(),\n            \"attention_mask\": x[\"attention_mask\"].squeeze(),\n            \"labels\": y[\"input_ids\"].squeeze()\n        }\n\n# -------- MODEL --------\ntok = AutoTokenizer.from_pretrained(\"google/byt5-small\")\nmodel = AutoModelForSeq2SeqLM.from_pretrained(\"google/byt5-small\")\n\ntrain_ds = AkkDataset(train[\"src\"].tolist(),\n                      train[\"tgt\"].tolist(),\n                      tok)\n\nargs = TrainingArguments(\n    output_dir=\"/kaggle/working/byt5\",\n    per_device_train_batch_size=8,\n    gradient_accumulation_steps=4,\n    learning_rate=2e-4,\n    num_train_epochs=3,   # để chắc không timeout\n    fp16=True,\n    save_total_limit=1,\n    report_to=\"none\"\n)\n\nTrainer(model=model,\n        args=args,\n        train_dataset=train_ds).train()\n\n# -------- INFERENCE --------\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\nmodel.to(device)\n\ndef translate(text):\n    x = tok(text, return_tensors=\"pt\",\n            truncation=True, max_length=256).to(device)\n    out = model.generate(\n        **x,\n        max_length=256,\n        num_beams=4\n    )\n    return tok.decode(out[0], skip_special_tokens=True)\n\ntest[\"translation\"] = test[\"src\"].apply(translate)\n\n# -------- SUBMISSION --------\nsubmission = pd.DataFrame({\n    \"id\": test[\"id\"],\n    \"translation\": test[\"translation\"]\n})\n\nsubmission.to_csv(\"/kaggle/working/submission.csv\", index=False)\n\nprint(\"Saved to /kaggle/working/submission.csv\")\nprint(\"Files in working dir:\", os.listdir(\"/kaggle/working\"))\nsubmission.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-31T21:15:06.677378Z","iopub.execute_input":"2026-01-31T21:15:06.677821Z","iopub.status.idle":"2026-01-31T21:22:21.626736Z","shell.execute_reply.started":"2026-01-31T21:15:06.677797Z","shell.execute_reply":"2026-01-31T21:22:21.626051Z"}},"outputs":[],"execution_count":null}]}