{"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":"none","dataSources":[{"sourceType":"competition","sourceId":121150,"databundleVersionId":15833391,"isSourceIdPinned":false},{"sourceType":"datasetVersion","sourceId":15041556,"datasetId":9629106,"databundleVersionId":15920777},{"sourceType":"modelInstanceVersion","sourceId":773301,"databundleVersionId":15921952,"modelInstanceId":590584,"modelId":602855,"isSourceIdPinned":false},{"sourceType":"modelInstanceVersion","sourceId":773469,"databundleVersionId":15924062,"modelInstanceId":590584,"modelId":602855,"isSourceIdPinned":false},{"sourceType":"modelInstanceVersion","sourceId":775704,"databundleVersionId":15950941,"modelInstanceId":590584,"modelId":602855,"isSourceIdPinned":false},{"sourceType":"modelInstanceVersion","sourceId":783706,"databundleVersionId":16044271,"modelInstanceId":590584,"modelId":602855,"isSourceIdPinned":false}],"dockerImageVersionId":31286,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install sentencepiece protobuf","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-04T13:24:36.885519Z","iopub.execute_input":"2026-03-04T13:24:36.886107Z","iopub.status.idle":"2026-03-04T13:24:41.010529Z","shell.execute_reply.started":"2026-03-04T13:24:36.886072Z","shell.execute_reply":"2026-03-04T13:24:41.009091Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(\"Scanning Kaggle directories for your model weights...\")\nsearch_path = '/kaggle/input/models/hermanadriaensen/nllb-model/transformers/base_version/6'\n\nfound = False\nfor dirname, _, filenames in os.walk(search_path):\n    for filename in filenames:\n        if filename.endswith('.safetensors') or filename.endswith('.bin'):\n            print(f\"\\n🎉 FOUND IT! Your actual MODEL_PATH should be:\")\n            print(f\"MODEL_PATH = '{dirname}'\")\n            print(f\"(File found: {filename})\")\n            found = True\n\nif not found:\n    print(\"\\n🚨 CRITICAL ERROR: The weight files are completely missing from the upload.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-04T13:24:41.013265Z","iopub.execute_input":"2026-03-04T13:24:41.014806Z","iopub.status.idle":"2026-03-04T13:24:41.028682Z","shell.execute_reply.started":"2026-03-04T13:24:41.014671Z","shell.execute_reply":"2026-03-04T13:24:41.027209Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ================= IMPORTS =================\nimport os\nimport gc\nimport torch\nimport numpy as np\nimport pandas as pd\nfrom tqdm import tqdm\nfrom transformers import AutoTokenizer, AutoModelForSeq2SeqLM\n\n# Enable progress bars for pandas\ntqdm.pandas()\n\n# ================= PATHS =================\nTRAIN_INPUT = \"/kaggle/input/competitions/deep-past-initiative-machine-translation/train.csv\"\nSENTENCES_INPUT = \"/kaggle/input/competitions/deep-past-initiative-machine-translation/Sentences_Oare_FirstWord_LinNum.csv\"\nTEST_INPUT = \"/kaggle/input/competitions/deep-past-initiative-machine-translation/test.csv\"\nCLEAN_FILE = \"final_train_cleaned.csv\"\n\n# ================= THE HOLY GRAIL PATH (AUTO-FINDER) =================\nprint(\"Scanning Kaggle directories for your model...\")\nMODEL_PATH = None\nfor root, dirs, files in os.walk(\"/kaggle/input\"):\n    # We look for the folder you showed in your screenshot\n    if \"nllb-our-finetuning\" in dirs:\n        potential_path = os.path.join(root, \"nllb-our-finetuning\")\n        # Verify it's the actual model folder by checking for config.json\n        if \"config.json\" in os.listdir(potential_path):\n            MODEL_PATH = potential_path\n            break\n\nif MODEL_PATH is None:\n    raise FileNotFoundError(\"Could not find the 'nllb-our-finetuning' folder. Make sure your model is attached!\")\n\nprint(f\"✅ Model successfully found at: {MODEL_PATH}\")\nMAX_LENGTH = 192\n\n# ================= DATA CLEANING =================\ndef clean_akkadian(text):\n    if not isinstance(text, str): return \"\"\n    text = text.replace(\"!\", \"\").replace(\"?\", \"\").replace(\"/\", \"\")\n    text = text.replace(\"[\", \"\").replace(\"]\", \"\").replace(\"<\", \"\").replace(\">\", \"\") \n    text = text.replace(\":\", \" \").replace(\".\", \" \") \n    subs = {\"₀\":\"0\", \"₁\":\"1\", \"₂\":\"2\", \"₃\":\"3\", \"₄\":\"4\", \"₅\":\"5\", \"₆\":\"6\", \"₇\":\"7\", \"₈\":\"8\", \"₉\":\"9\"}\n    for k, v in subs.items(): text = text.replace(k, v)\n    return \" \".join(text.split())\n\ndef clean_english(text):\n    if not isinstance(text, str): return \"\"\n    return \" \".join(text.split())\n\ndef make_dataset():\n    if os.path.exists(CLEAN_FILE):\n        return pd.read_csv(CLEAN_FILE)\n    \n    print(\"Generating clean dataset...\")\n    df_train = pd.read_csv(TRAIN_INPUT)\n    df_sent = pd.read_csv(SENTENCES_INPUT)\n    aligned_data = []\n    valid_uuids = set(df_sent['text_uuid'].unique())\n\n    # Process Aligned Sentences\n    for _, row in df_train[df_train['oare_id'].isin(valid_uuids)].iterrows():\n        doc_id = row['oare_id']\n        words = row['transliteration'].split() if isinstance(row['transliteration'], str) else []\n        doc_sents = df_sent[df_sent['text_uuid'] == doc_id].dropna(subset=['first_word_number']).sort_values('first_word_number')\n        starts = doc_sents['first_word_number'].astype(int).tolist()\n        trans = doc_sents['translation'].tolist()\n        for i in range(len(starts)):\n            start_idx = starts[i] - 1\n            end_idx = starts[i+1] - 1 if i < len(starts) - 1 else len(words)\n            if start_idx < len(words) and end_idx > start_idx:\n                chunk = \" \".join(words[start_idx:end_idx])\n                aligned_data.append({'transliteration': clean_akkadian(chunk), 'translation': clean_english(trans[i])})\n\n    # Process Documents\n    for _, row in df_train[~df_train['oare_id'].isin(valid_uuids)].iterrows():\n        aligned_data.append({'transliteration': clean_akkadian(row['transliteration']), 'translation': clean_english(row['translation'])})\n\n    final_df = pd.DataFrame(aligned_data)\n    final_df = final_df[final_df['transliteration'].str.len() > 2]\n    final_df.to_csv(CLEAN_FILE, index=False)\n    return final_df\n\ndf = make_dataset()\n\n# ================= MODEL LOADING =================\nprint(\"Loading model and tokenizer...\")\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\n# Force cleanup of GPU memory\ngc.collect()\ntorch.cuda.empty_cache()\n\n# Load Tokenizer specifying our \"Akkadian\" token (keeping use_fast=False just to be safe!)\ntokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, src_lang=\"ace_Latn\", use_fast=False)\n\n# Load Model\nmodel = AutoModelForSeq2SeqLM.from_pretrained(MODEL_PATH).to(device)\nprint(f\"Model loaded successfully on {device}!\")\n\n# Grab the target language ID for generation (English)\nENG_LANG_ID = tokenizer.convert_tokens_to_ids(\"eng_Latn\")\n\n# ================= INFERENCE FUNCTION =================\ndef translate(text):\n    if not isinstance(text, str) or text.strip() == \"\":\n        return \"\"\n        \n    inputs = tokenizer(\n        clean_akkadian(text),\n        return_tensors=\"pt\",\n        truncation=True,\n        max_length=MAX_LENGTH\n    ).to(device)\n\n    # Generate translation forcing English output\n    outputs = model.generate(\n        **inputs,\n        max_length=MAX_LENGTH,\n        forced_bos_token_id=ENG_LANG_ID\n    )\n\n    return tokenizer.decode(outputs[0], skip_special_tokens=True)\n\n# ================= PREDICT AND SUBMIT =================\nprint(\"Loading test data...\")\ntest_df = pd.read_csv(TEST_INPUT)\n\nprint(\"Translating test dataset... (This might take a while!)\")\ntest_df[\"translation\"] = test_df[\"transliteration\"].progress_apply(translate)\n\n# Save submission\nsubmission = test_df[[\"id\", \"translation\"]]\nsubmission.to_csv(\"submission.csv\", index=False)\n\nprint(\"\\n--- Submission.csv created successfully! ---\") \nprint(\"\\nPreview of translations:\")\nprint(test_df[[\"transliteration\", \"translation\"]].head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-04T13:24:41.030531Z","iopub.execute_input":"2026-03-04T13:24:41.031082Z","iopub.status.idle":"2026-03-04T13:25:34.902551Z","shell.execute_reply.started":"2026-03-04T13:24:41.031045Z","shell.execute_reply":"2026-03-04T13:25:34.901480Z"}},"outputs":[],"execution_count":null}]}