{"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}],"dockerImageVersionId":31286,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"###############################################################\n# 1. IMPORT LIBRARIES\n###############################################################\n\n# Data manipulation\nimport pandas as pd\nimport numpy as np\n\n# Visualization libraries\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Text processing\nimport re\nfrom collections import Counter\n\n# Machine Learning\nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.neighbors import NearestNeighbors\n\n# Display settings\npd.set_option(\"display.max_columns\", None)\nsns.set(style=\"whitegrid\")\n\n###############################################################\n# 2. LOAD DATASETS\n###############################################################\n\nbase_path = \"/kaggle/input/competitions/deep-past-initiative-machine-translation/\"\n\ntrain = pd.read_csv(base_path + \"train.csv\")\ntest = pd.read_csv(base_path + \"test.csv\")\nsample_submission = pd.read_csv(base_path + \"sample_submission.csv\")\n\nlexicon = pd.read_csv(base_path + \"OA_Lexicon_eBL.csv\")\ndictionary = pd.read_csv(base_path + \"eBL_Dictionary.csv\")\n\npublications = pd.read_csv(base_path + \"publications.csv\")\npublished_texts = pd.read_csv(base_path + \"published_texts.csv\")\n\nsentences = pd.read_csv(base_path + \"Sentences_Oare_FirstWord_LinNum.csv\")\nbibliography = pd.read_csv(base_path + \"bibliography.csv\")\nresources = pd.read_csv(base_path + \"resources.csv\")\n\nprint(\"All datasets loaded successfully\")\n\n###############################################################\n# 3. BASIC DATA OVERVIEW\n###############################################################\n\nprint(\"Train shape:\", train.shape)\nprint(\"Test shape:\", test.shape)\n\nprint(\"\\nTrain sample\")\nprint(train.head())\n\nprint(\"\\nTest sample\")\nprint(test.head())\n\n###############################################################\n# 4. MISSING VALUE ANALYSIS\n###############################################################\n\nprint(\"\\nMissing values in Train Dataset\")\nprint(train.isnull().sum())\n\nplt.figure(figsize=(6,4))\nsns.heatmap(train.isnull(), cbar=False)\nplt.title(\"Missing Values Heatmap\")\nplt.show()\n\n###############################################################\n# 5. TEXT LENGTH ANALYSIS\n###############################################################\n\ntrain[\"translit_len\"] = train[\"transliteration\"].astype(str).apply(len)\ntrain[\"translation_len\"] = train[\"translation\"].astype(str).apply(len)\n\nplt.figure(figsize=(12,5))\n\nplt.subplot(1,2,1)\nsns.histplot(train[\"translit_len\"], bins=40)\nplt.title(\"Transliteration Length\")\n\nplt.subplot(1,2,2)\nsns.histplot(train[\"translation_len\"], bins=40)\nplt.title(\"Translation Length\")\n\nplt.show()\n\n###############################################################\n# 6. WORD FREQUENCY ANALYSIS\n###############################################################\n\nall_words = \" \".join(train[\"transliteration\"].astype(str)).split()\n\nword_counts = Counter(all_words)\n\ncommon_words = word_counts.most_common(20)\n\nwords = [w[0] for w in common_words]\ncounts = [w[1] for w in common_words]\n\nplt.figure(figsize=(10,6))\nsns.barplot(x=counts, y=words)\nplt.title(\"Top 20 Akkadian Tokens\")\nplt.show()\n\n###############################################################\n# 7. TEXT CLEANING FUNCTION\n###############################################################\n\ndef clean_text(text):\n\n    text = str(text).lower()\n\n    # remove punctuation\n    text = re.sub(r\"[!?/:]\", \"\", text)\n\n    # remove brackets\n    text = re.sub(r\"\\[.*?\\]\", \"\", text)\n\n    # normalize characters\n    replacements = {\n        \"ḫ\": \"h\",\n        \"Ḫ\": \"h\",\n        \"ṣ\": \"s\",\n        \"ṭ\": \"t\",\n        \"š\": \"sh\"\n    }\n\n    for k,v in replacements.items():\n        text = text.replace(k,v)\n\n    text = re.sub(r\"\\s+\", \" \", text)\n\n    return text.strip()\n\n###############################################################\n# 8. APPLY CLEANING\n###############################################################\n\ntrain[\"clean_translit\"] = train[\"transliteration\"].apply(clean_text)\ntest[\"clean_translit\"] = test[\"transliteration\"].apply(clean_text)\n\nprint(train[[\"transliteration\",\"clean_translit\"]].head())\n\n###############################################################\n# 9. WORD COUNT ANALYSIS\n###############################################################\n\ntrain[\"word_count\"] = train[\"translation\"].astype(str).apply(lambda x: len(x.split()))\n\nplt.figure(figsize=(8,4))\nsns.histplot(train[\"word_count\"], bins=30)\nplt.title(\"Translation Word Count Distribution\")\nplt.show()\n\n###############################################################\n# 10. LEXICON COVERAGE ANALYSIS\n###############################################################\n\nlex_words = set(lexicon[\"form\"].astype(str))\n\ntrain[\"lexicon_matches\"] = train[\"clean_translit\"].apply(\n    lambda x: len(set(x.split()) & lex_words)\n)\n\nplt.figure(figsize=(8,4))\nsns.histplot(train[\"lexicon_matches\"], bins=20)\nplt.title(\"Lexicon Match Distribution\")\nplt.show()\n\n###############################################################\n# 11. TF-IDF FEATURE EXTRACTION\n###############################################################\n\nvectorizer = TfidfVectorizer(\n    ngram_range=(1,2),\n    max_features=7000,\n    min_df=2\n)\n\nX_train = vectorizer.fit_transform(train[\"clean_translit\"])\nX_test = vectorizer.transform(test[\"clean_translit\"])\n\nprint(\"TF-IDF shape:\", X_train.shape)\n\n###############################################################\n# 12. BASELINE MODEL (Nearest Neighbor Retrieval)\n###############################################################\n\nmodel = NearestNeighbors(\n    n_neighbors=1,\n    metric=\"cosine\"\n)\n\nmodel.fit(X_train)\n\n###############################################################\n# 13. PREDICTION\n###############################################################\n\ndistances, indices = model.kneighbors(X_test)\n\npredictions = []\n\nfor idx in indices:\n\n    translation = train.iloc[idx[0]][\"translation\"]\n\n    predictions.append(translation)\n\n###############################################################\n# 14. CREATE SUBMISSION FILE\n###############################################################\n\nsubmission = pd.DataFrame({\n    \"id\": test[\"id\"],\n    \"translation\": predictions\n})\n\nsubmission.to_csv(\"submission.csv\", index=False)\n\nprint(\"Submission file saved\")\n\nprint(submission.head())\n\n###############################################################\n# 15. PUBLICATION DATASET ANALYSIS\n###############################################################\n\nprint(\"Publications dataset:\", publications.shape)\nprint(publications.head())\n\n###############################################################\n# 16. PUBLISHED TEXTS OVERVIEW\n###############################################################\n\nprint(\"Published texts:\", published_texts.shape)\nprint(published_texts.head())\n\n###############################################################\n# PIPELINE COMPLETE\n###############################################################","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-03-05T05:19:26.498218Z","iopub.execute_input":"2026-03-05T05:19:26.498520Z","iopub.status.idle":"2026-03-05T05:19:33.306575Z","shell.execute_reply.started":"2026-03-05T05:19:26.498488Z","shell.execute_reply":"2026-03-05T05:19:33.305767Z"}},"outputs":[],"execution_count":null}]}