{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"},"kaggle":{"accelerator":"none","dataSources":[{"sourceType":"competition","sourceId":121150,"databundleVersionId":15833391},{"sourceType":"datasetVersion","sourceId":14971472,"datasetId":9526735,"databundleVersionId":15843677}],"dockerImageVersionId":31286,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nimport pandas as pd\nfrom transformers import ByT5Tokenizer, AutoModelForSeq2SeqLM\nfrom sentence_transformers import SentenceTransformer\nfrom sklearn.metrics.pairwise import cosine_similarity\nimport numpy as np\n\n\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\",\n            \"₅\":\"5\",\"₆\":\"6\",\"₇\":\"7\",\"₈\":\"8\",\"₉\":\"9\"}\n    for k, v in subs.items(): text = text.replace(k, v)\n    return \" \".join(text.split())\n\n\nMODEL_PATH = \"/kaggle/input/datasets/up202108827/training-model/byt5-our-finetuning\"\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\ntokenizer = ByT5Tokenizer.from_pretrained(MODEL_PATH)\nmodel = AutoModelForSeq2SeqLM.from_pretrained(MODEL_PATH).to(device)\nembedder = SentenceTransformer(\"/kaggle/input/datasets/up202108827/training-model/paraphrase-multilingual-mpnet-base-v2\", device=device)\n\nmodel.eval()\nprint(\"Model loaded.\")\n\n\nMAX_LENGTH = 512\n\n\"\"\"\ndef translate(text):\n    inputs = tokenizer(\n        clean_akkadian(text),\n        return_tensors=\"pt\",\n        truncation=True,\n        max_length=MAX_LENGTH\n    ).to(device)\n\n    outputs = model.generate(\n        **inputs,\n        max_length=MAX_LENGTH,\n        num_beams=4,\n        length_penalty=0.8,\n        early_stopping=True,\n    )\n\n    return tokenizer.decode(outputs[0], skip_special_tokens=True)\"\"\"\n\ndef select_best_translation(translations):\n\n    embeddings = embedder.encode(translations, convert_to_numpy=True)\n\n    # Normalize\n    embeddings = embeddings / np.linalg.norm(\n        embeddings, axis=1, keepdims=True\n    )\n\n    sim_matrix = cosine_similarity(embeddings)\n    scores = sim_matrix.mean(axis=1)\n\n    best_idx = np.argmax(scores)\n\n    return translations[best_idx], scores\n\ndef generate_best_translation(text, num_return_sequences=8):\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    outputs = model.generate(\n        **inputs,\n        max_length=MAX_LENGTH,\n        num_beams=4,\n        length_penalty=0.8,\n        early_stopping=True,\n    )\n\n    translations = tokenizer.batch_decode(\n        outputs[0],\n        skip_special_tokens=True\n    )\n\n    best_translation, scores = select_best_translation(translations)\n\n    return best_translation, translations, scores\n\ntest_df = pd.read_csv(\n    \"/kaggle/input/competitions/deep-past-initiative-machine-translation/test.csv\"\n)\n\ntest_df[\"translation\"] = test_df[\"transliteration\"].apply(generate_best_translation)\n\nsubmission = test_df[[\"id\", \"translation\"]]\nsubmission.to_csv(\"/kaggle/working/submission.csv\", index=False)\n\nprint(\"submission.csv created\")\nsubmission.head()\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null}]}