{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"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"},"colab":{"machine_shape":"hm","gpuType":"T4"},"accelerator":"GPU","kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":121150,"databundleVersionId":15061024,"isSourceIdPinned":false,"sourceType":"competition"},{"sourceId":754215,"sourceType":"modelInstanceVersion","isSourceIdPinned":false,"modelInstanceId":575902,"modelId":588199}],"dockerImageVersionId":31259,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Akkadian - praeclarum/cuneiform\n\nThe website https://aicuneiform.com/search?q=P361098 uses https://huggingface.co/praeclarum/cuneiform as a backend model.\n\nFirst attempt solution is to wire this huggingface model upto Kaggle, the translations do seem a little repetative however.","metadata":{}},{"cell_type":"code","source":"# !pip install -U transformers --quiet","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-17T14:53:26.141334Z","iopub.execute_input":"2026-02-17T14:53:26.142116Z","iopub.status.idle":"2026-02-17T14:53:26.145116Z","shell.execute_reply.started":"2026-02-17T14:53:26.142083Z","shell.execute_reply":"2026-02-17T14:53:26.144530Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!find /kaggle/input/competitions","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-17T14:53:26.146498Z","iopub.execute_input":"2026-02-17T14:53:26.146770Z","iopub.status.idle":"2026-02-17T14:53:26.316621Z","shell.execute_reply.started":"2026-02-17T14:53:26.146748Z","shell.execute_reply":"2026-02-17T14:53:26.315768Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!find /kaggle/input/","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-17T14:53:26.317734Z","iopub.execute_input":"2026-02-17T14:53:26.317982Z","iopub.status.idle":"2026-02-17T14:53:26.470049Z","shell.execute_reply.started":"2026-02-17T14:53:26.317955Z","shell.execute_reply":"2026-02-17T14:53:26.469334Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Model: https://huggingface.co/praeclarum/cuneiform\nimport pandas as pd\nimport torch\nimport json\nfrom transformers import AutoTokenizer, AutoModelForSeq2SeqLM\nfrom transformers import T5Tokenizer\n\nMODEL_PATH = \"/kaggle/input/models/jamesmcguigan/praeclarumcuneiform/pytorch/default/1\"\n\n# BUGFIX: https://claude.ai/chat/5ab01b0f-fad9-41fb-8b39-09947bb70b0e\n# Fix the broken tokenizer_config.json in-place (copy to /tmp first)\nimport shutil, os\nLOCAL_PATH = \"/tmp/cuneiform\"\nshutil.copytree(MODEL_PATH, LOCAL_PATH, dirs_exist_ok=True)\n\nconfig_path = os.path.join(LOCAL_PATH, \"tokenizer_config.json\")\nwith open(config_path) as f:\n    config = json.load(f)\n\n# Convert extra_special_tokens from list to dict if needed\nif isinstance(config.get(\"extra_special_tokens\"), list):\n    config[\"extra_special_tokens\"] = {}\n\nwith open(config_path, \"w\") as f:\n    json.dump(config, f)\n    \ndevice    = \"cuda\" if torch.cuda.is_available() else \"cpu\"\ntokenizer = AutoTokenizer.from_pretrained(LOCAL_PATH, legacy=False)\nmodel     = AutoModelForSeq2SeqLM.from_pretrained(LOCAL_PATH).to(device)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-17T14:53:26.471910Z","iopub.execute_input":"2026-02-17T14:53:26.472166Z","iopub.status.idle":"2026-02-17T14:53:28.360632Z","shell.execute_reply.started":"2026-02-17T14:53:26.472139Z","shell.execute_reply":"2026-02-17T14:53:28.359995Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/competitions/deep-past-initiative-machine-translation/train.csv')\ntest_df  = pd.read_csv('/kaggle/input/competitions/deep-past-initiative-machine-translation/test.csv')\ntest_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-17T14:53:28.361431Z","iopub.execute_input":"2026-02-17T14:53:28.361747Z","iopub.status.idle":"2026-02-17T14:53:28.402896Z","shell.execute_reply.started":"2026-02-17T14:53:28.361723Z","shell.execute_reply":"2026-02-17T14:53:28.402268Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def translate_batch(texts, batch_size=8):\n    results = []\n    texts = [ \"translate Akkadian to English: \"+text for text in texts ] # The network requires a prompt telling it the direction of translation. For example:\n    for i in range(0, len(texts), batch_size):\n        batch = texts[i:i + batch_size]\n        inputs = tokenizer(batch, return_tensors=\"pt\", padding=True, truncation=True).to(device)\n        with torch.no_grad():\n            outputs = model.generate(\n                input_ids=inputs[\"input_ids\"],\n                attention_mask=inputs.get(\"attention_mask\"),\n                max_length=128\n            )\n        decoded = [tokenizer.decode(o, skip_special_tokens=True) for o in outputs]\n        results.extend(decoded)\n    return results","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-17T14:53:28.403822Z","iopub.execute_input":"2026-02-17T14:53:28.404086Z","iopub.status.idle":"2026-02-17T14:53:31.881097Z","shell.execute_reply.started":"2026-02-17T14:53:28.404063Z","shell.execute_reply":"2026-02-17T14:53:31.880248Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"list(zip(\n    range(5),\n    train_df['transliteration'].tolist()[:5],\n    train_df['translation'].tolist()[:5],\n    translate_batch(train_df['transliteration'].tolist()[:5])\n))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-17T14:53:31.882130Z","iopub.execute_input":"2026-02-17T14:53:31.882536Z","iopub.status.idle":"2026-02-17T14:53:34.202573Z","shell.execute_reply.started":"2026-02-17T14:53:31.882504Z","shell.execute_reply":"2026-02-17T14:53:34.201857Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"list(zip(\n    range(5),\n    test_df['transliteration'].tolist()[:5],\n    translate_batch(test_df['transliteration'].tolist()[:5])\n))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-17T14:53:34.203575Z","iopub.execute_input":"2026-02-17T14:53:34.203961Z","iopub.status.idle":"2026-02-17T14:53:36.197441Z","shell.execute_reply.started":"2026-02-17T14:53:34.203925Z","shell.execute_reply":"2026-02-17T14:53:36.196824Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission_df = pd.read_csv('/kaggle/input/competitions/deep-past-initiative-machine-translation/sample_submission.csv')\nsubmission_df['translation'] = translate_batch(test_df['transliteration'].tolist())\nsubmission_df.to_csv('submission.csv')\nsubmission_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-17T14:53:36.198946Z","iopub.execute_input":"2026-02-17T14:53:36.199208Z","iopub.status.idle":"2026-02-17T14:53:38.265205Z","shell.execute_reply.started":"2026-02-17T14:53:36.199187Z","shell.execute_reply":"2026-02-17T14:53:38.264591Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}