{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":121150,"databundleVersionId":15061024,"sourceType":"competition"}],"dockerImageVersionId":31259,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport re\nimport networkx as nx\nimport torch\nfrom tqdm import tqdm\nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.cluster import KMeans\nfrom transformers import pipeline\n\n# 1. Очистка (улучшенная для клинописи)\ndef clean_text(text):\n    if not isinstance(text, str): return \"\"\n    text = re.sub(r'[!?\\\\/:]', ' ', text)\n    text = re.sub(r'˹|˺|<<.*?>>|\\[|\\]', '', text)\n    text = text.replace('…', ' <gap> ').replace('ḫ', 'h').replace('Ḫ', 'H')\n    return re.sub(r'\\s+', ' ', text).strip()\n\n# 2. Загрузка\ntrain = pd.read_csv('/kaggle/input/deep-past-initiative-machine-translation/train.csv')\ntest = pd.read_csv('/kaggle/input/deep-past-initiative-machine-translation/test.csv')\n\ntrain['src'] = train['transliteration'].apply(clean_text)\ntest['src'] = test['transliteration'].apply(clean_text)\nall_src = pd.concat([train['src'], test['src']])\n\n# 3. Графовая фича (PageRank) — замена Node2Vec\nprint(\"Processing Graph (PageRank)...\")\nG = nx.Graph()\nfor txt in all_src:\n    tokens = txt.split()\n    for i in range(len(tokens)-1):\n        G.add_edge(tokens[i], tokens[i+1])\n# pr — словарь {слово: важность}\npr = nx.pagerank(G, alpha=0.85)\n\n# 4. Семантическая кластеризация\nprint(\"Clustering domains...\")\nvect = TfidfVectorizer(max_features=300)\ntfidf = vect.fit_transform(all_src)\nkmeans = KMeans(n_clusters=5, n_init=10, random_state=42).fit(tfidf)\nclusters = kmeans.labels_\n\n# 5. Инициализация модели (Internet ON)\ndevice = 0 if torch.cuda.is_available() else -1\ntranslator = pipeline(\"translation\", model=\"facebook/nllb-200-distilled-600M\", device=device)\n\n# 6. Генерация сабмита\nresults = []\noffset = len(train)\n\nfor i, row in enumerate(tqdm(test.itertuples(), total=len(test))):\n    cluster = clusters[offset + i]\n    # Считаем средний PageRank текста (структурная сложность)\n    avg_pr = np.mean([pr.get(w, 0) for w in row.src.split()]) if row.src else 0\n    # Формируем обогащенный промпт\n    prompt = f\"Domain_{cluster} (rank_{avg_pr:.4f}): {row.src}\"\n    \n    try:\n        out = translator(prompt, max_length=128, src_lang=\"sux_Latn\", tgt_lang=\"eng_Latn\")\n        results.append(out[0]['translation_text'] if isinstance(out, list) else out['translation_text'])\n    except:\n        results.append(row.src)\n\n# 7. Сохранение\ntest['translation'] = results\ntest[['id', 'translation']].to_csv('submission.csv', index=False)\nprint(\"Submission saved!\")\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-01-29T16:55:51.176925Z","iopub.execute_input":"2026-01-29T16:55:51.177619Z","iopub.status.idle":"2026-01-29T16:56:05.555441Z","shell.execute_reply.started":"2026-01-29T16:55:51.177584Z","shell.execute_reply":"2026-01-29T16:56:05.554750Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!uv pip install --force-reinstall \"numpy<2.0.0\" \"pandas<2.2.0\" -q\n# ПОСЛЕ ЭТОГО НАЖМИТЕ: Run -> Restart Session (в меню сверху)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}