diff --git a/lab_8/lab8.ipynb b/lab_8/lab8.ipynb new file mode 100644 index 0000000..80b81c7 --- /dev/null +++ b/lab_8/lab8.ipynb @@ -0,0 +1,436 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Лабораторная работа 8 ##" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Загрузка данных из .doc файлов:" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Загружено 41 документов.\n" + ] + } + ], + "source": [ + "import os\n", + "import win32com.client\n", + "\n", + "# Укажите правильный путь к папке с файлами\n", + "data_path = os.path.abspath(\"..//static//csv//tz_itdocs\")\n", + "\n", + "# Проверка существования папки\n", + "if not os.path.exists(data_path):\n", + " raise FileNotFoundError(f\"Папка {data_path} не найдена.\")\n", + "\n", + "# Инициализация Word\n", + "word = win32com.client.Dispatch(\"Word.Application\")\n", + "word.Visible = False # Используйте свойство Visible с заглавной буквы\n", + "\n", + "# Чтение всех .doc файлов\n", + "texts = []\n", + "for filename in os.listdir(data_path):\n", + " if filename.endswith(\".doc\"):\n", + " file_path = os.path.join(data_path, filename)\n", + " try:\n", + " # Открытие документа\n", + " doc = word.Documents.Open(file_path)\n", + " text = doc.Content.Text\n", + " texts.append(text)\n", + " doc.Close(SaveChanges=False) # Закрыть без сохранения изменений\n", + " except Exception as e:\n", + " print(f\"Ошибка при чтении файла {filename}: {e}\")\n", + "\n", + "# Закрытие Word\n", + "word.Quit()\n", + "\n", + "# Вывод результата\n", + "print(f\"Загружено {len(texts)} документов.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Предобработка текста:" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [], + "source": [ + "stop_words = set(stopwords.words('russian'))\n", + "lemmatizer = WordNetLemmatizer()\n", + "\n", + "def preprocess_text(text):\n", + " # Удаление спецсимволов\n", + " text = re.sub(r'\\W', ' ', text)\n", + " # Приведение к нижнему регистру\n", + " text = text.lower()\n", + " # Удаление стоп-слов и лемматизация\n", + " tokens = [lemmatizer.lemmatize(word) for word in text.split() if word not in stop_words]\n", + " return ' '.join(tokens)\n", + "\n", + "# Применение предобработки к каждому документу\n", + "texts = [preprocess_text(text) for text in texts]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Векторизация текста" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [], + "source": [ + "vectorizer = TfidfVectorizer(max_features=1000)\n", + "X = vectorizer.fit_transform(texts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Кластеризация с использованием K-means" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1kAAAK9CAYAAADWo6YTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACXwklEQVR4nOzde1xUdf7H8fcBFAQFJLmooeKlVbykYpiWmSsqXbSLq13XS3YzrUxrw3bL7CK5aWlmZtaqrXZV1zU1xEv+rM0kRSpTWzXUUm5mgkCKzpzfH8Ss4wAyeBAGX8/Hg0fNme+c85kZGHnz/Z7PMUzTNAUAAAAAsIRXdRcAAAAAALUJIQsAAAAALETIAgAAAAALEbIAAAAAwEKELAAAAACwECELAAAAACxEyAIAAAAACxGyAAAAAMBChCwAAAAAsBAhCwAAAAAsRMjCRW3BggUyDMPpKywsTH369NGnn35a3eUBAIBK2r9/v9O/797e3mrWrJluueUWpaWluYw/ceKEXn31VXXv3l1BQUHy8/PTZZddprFjx+q///1vqcf4y1/+IsMwdNttt1Xxs4GnMUzTNKu7CKC6LFiwQCNHjtRzzz2nqKgomaaprKwsLViwQN9//70++eQT3XjjjdVdJgAAcNP+/fsVFRWlO+64Q9dff71sNpt27dqlOXPm6OTJk/rqq6/UuXNnSdKRI0cUHx+vbdu26cYbb1RcXJzq16+vH374QR988IEyMzNVVFTktH/TNNWsWTP5+PgoKytLWVlZatCgQTU8U9REPtVdAFATXHfdderWrZvj9qhRoxQeHq7333+fkAUAgAfr2rWr7r77bsftq666SoMGDdKcOXM0d+5cSdKIESO0fft2LVmyRIMHD3Z6/PPPP6+//vWvLvvduHGjfv75Z23YsEEDBgzQsmXLNHz48Kp9MvAYLBcEShEcHKx69erJx+d/f4coWXawYMECp7FjxoyRYRgaMWKEY9uyZcsUGxurkJAQ1atXT23bttXUqVNVMnH82WefyTAM/etf/3I59nvvvSfDMLR582ZJ0rfffqsRI0aoZcuW8vPzU0REhO655x798ssvpdbeokULlyWQhmFo48aNTmPOrFeSPv74YxmGoRYtWji2/fDDD/rjH/+oiIgI+fr6KjIyUg8++KCOHj3qGFNUVKRnnnlGMTExCgoKUkBAgHr16qXPPvvMaf8lr9+0adNcau7QoYOuvfZap23XXnuty7avv/7a8XzOlJ+frwkTJqhly5aqU6eO0/M+cuRIqa9Tecd58cUX5eXlpffee6/U51Da15mmTZumnj176pJLLlG9evUUExOjJUuWlHr8RYsWKTY2Vv7+/mrYsKGuueYaJScnSyr7vSz5OvO9stvtmjFjhtq3by8/Pz+Fh4frgQce0K+//up0vBYtWujGG29UcnKyOnfuLD8/P0VHR2vZsmVO40qW0u7fv9/pGJ06dXL5OXj22WcVHR2t+vXrKzAwUFdeeaWWL1/utL/PP/9cQ4YMUbNmzRzfS4899ph+++03p3EjRoxQ/fr1XV6nJUuWuHwfb9y40WWbJN1www0yDEPPPvusU42lfd9ERESUuo8zlTy2vK8zH79lyxbFx8crKChI/v7+6t27t/7zn/+Uus8zffbZZ/L19dWDDz7otP3QoUMaNWqUmjRpIl9fX0VFRWn06NEqKioqdcnz2V9nvlcbNmxQr169FBAQoODgYN10003atWtXuc+3QYMGio2NdXlPy1JevWVx5/NVko4dO6bHHntMLVq0kK+vry699FINGzbM8fNe8r1R1tfZ+/vxxx81ZMgQhYSEyN/fX1deeaVWrVpVaq0jRowodZ9nfr+V9X18tptuukktWrSQn5+fwsLCNGjQIH333XdOY06fPq3nn39erVq1kq+vr1q0aKGnnnpKJ0+edBp35ueFl5eXIiIidNttt+ngwYNO4yr6+WQYhsaOHeuy/cYbb3T67KnMezdu3DhFRkbK19dXrVu31tSpU2W32132aRiGy/fdiRMn1LBhwzL/PamIP/7xj5Kk9PR0ScU/s6tWrdKoUaNcApYk+fr6lnqsxYsXKzo6Wn369FFcXJwWL15cqXpQOzGTBUjKzc3VkSNHZJqmsrOzNWvWLOXn5zv95as0e/fu1bx581y25+XlqXv37ho+fLjq1KmjpKQkJSQkyMfHRxMmTNC1116ryMhILV68WLfccovTYxcvXqxWrVqpR48ekqS1a9fqxx9/1MiRIxUREaHvv/9eb731lr7//nt99dVXLr+oSVKvXr10//33S5J27dqlKVOmlPs8Tp8+Xepf6QoKCnTppZdq4MCBCgwM1I4dOzR79mwdOnRIn3zyieO5vv3227rjjjt033336fjx43rnnXc0YMAApaSkOJZiWOHJJ58sdfsTTzyhN998U6NGjdJVV12lOnXqaNmyZaWG2HOZP3++/va3v2n69Om68847Sx1z//33q1evXpJU6nFmzpypQYMG6a677lJRUZE++OADDRkyRCtXrtQNN9zgGDd58mQ9++yz6tmzp5577jnVrVtXW7Zs0YYNG9S/f3/NmDFD+fn5kv73Pj711FNq166dJDn9EvfAAw84lr8+8sgjSk9P1+uvv67t27frP//5j+rUqeMYu2fPHt1222168MEHNXz4cM2fP19DhgxRUlKS+vXrV+Zr889//tPlF0Cp+PvklltuUYsWLfTbb79pwYIFGjx4sDZv3qzY2FhJxSG+sLBQo0eP1iWXXKKUlBTNmjVLP//8sz7++ONy3xN3bNq0SatXr67Q2OnTpysrK+uc42699Va1bt3acfuxxx5Tu3btHD9jkhzvyYYNG3TdddcpJiZGkyZNkpeXl+bPn68//vGP+vzzzx2vx9m++eYb3Xzzzbr++us1e/Zsx/bDhw8rNjZWx44d0/3336+2bdvq0KFDWrJkiQoLC3XNNdfon//8p2P8iy++KElOP889e/aUJK1bt07XXXedWrZsqWeffVa//fabZs2apauuukqpqalOvzhLcuz3yJEjeuONNzRkyBDt2LFDf/jDH8p8rc5Vb926dct9rc9U1udrfn6+evXqpV27dumee+5R165ddeTIEa1YsUI///yzGjVq5Bj7yCOP6IorrnB6/L333ut0OysrSz179lRhYaEeeeQRXXLJJVq4cKEGDRqkJUuWuHxGS1KjRo306quvOm7/+c9/rvDzOtv999+viIgIHT58WK+//rri4uKUnp4uf39/R70LFy7Un/70J02YMEFbtmxRYmKidu3a5fLZU/LZb7fbtWPHDs2YMUOHDx/W559/7hhT0c+n81HWe1dYWKjevXvr0KFDeuCBB9SsWTN9+eWXmjhxojIyMjRjxgyn8X5+fpo/f75uvvlmx7Zly5bpxIkT51Xfvn37JEmXXHKJJGnFihWS3HsfT548qaVLl2rChAmSpDvuuEMjR45UZmamIiIizqs+1BImcBGbP3++Kcnly9fX11ywYIHT2PT0dFOSOX/+fMe2oUOHmh06dDAjIyPN4cOHl3us6Oho88Ybb3Tcnjhxounr62seO3bMsS07O9v08fExJ02a5NhWWFjosq/333/flGRu2rTJ5b6mTZuaI0eOdNz+7LPPTEnmZ5995tjWvHlzp3rfeOMN09fX1+zTp4/ZvHnzcp/HQw89ZNavX99x+/Tp0+bJkyedxvz6669meHi4ec899zi2lbx+L7/8sss+27dvb/bu3dtpW+/evZ22rV692pRkxsfHm2d/dDVu3NgcMGCA07ZJkyaZksycnJxyn8+Zx1m1apXp4+NjTpgwodSxe/bsMSWZCxcudDnOmc5+z4qKiswOHTqYf/zjH5325eXlZd5yyy2mzWZzGm+3212OXdr7WOLzzz83JZmLFy922p6UlOSyvXnz5qYkc+nSpY5tubm5ZuPGjc0uXbo4tpX8bKSnp5umaZonTpwwmzVrZl533XUuPwdny87ONiWZ06ZNK/M1MU3TTExMNA3DMA8cOODYNnz4cDMgIMBl7Mcff+zy/Et7Tbp37+6o8cyfo7Pfp+zsbLNBgwaOsaW9rmU5++enhN1uN9u0aWMOGDDA6T0sLCw0o6KizH79+pVaz/79+83GjRubV199tfnbb7857XPYsGGml5eX+fXXX5d6vLOd/XNzps6dO5thYWHmL7/84tj2zTffmF5eXuawYcNKra1EcnKyKcn86KOPSt13Zest4c7n6zPPPGNKMpctW1bmMUq+Nz7++GOXMQEBAU77GzdunCnJ/Pzzzx3bjh8/bkZFRZktWrRw+fm86667zKioKKdtZ3+/lfV9fC4fffSRKcncunWraZqmmZaWZkoy7733Xqdxjz/+uCnJ3LBhg2Nbad+Xd955p+nv7++0rSKfTyXPacyYMS413nDDDU7/Trjz3j3//PNmQECA+d///tdpnwkJCaa3t7d58OBBp33ecccdpo+Pj5mZmekY27dvX/POO+8s89+TM5XsZ/LkyWZOTo6ZmZlpbty40ezSpYvT5+Att9xiSjJ//fXXcvd3piVLlpiSzD179pimaZp5eXmmn5+f+eqrr1Z4H6jdWC4ISJo9e7bWrl2rtWvXatGiRerTp4/uvfdelyVUZ9q2bZs+/vhjJSYmysur9B+lI0eO6Oeff9aCBQu0d+9eXXPNNY77hg0bppMnTzot0/jwww91+vRppxm0evXqOf7/xIkTOnLkiK688kpJUmpqqssxi4qK5OvrW+HnXlhYqOeee05jx45Vs2bNSh2Tm5urrKwsrV+/XqtWrXJ6Ht7e3o6/Ttvtdh09elSnT59Wt27dSq2vMkzT1MSJEzV48GB1797d5f7jx487/iJZWSkpKRo6dKgGDx6sl19+udQxJcudzvX6nvme/frrr8rNzVWvXr2cXo/ly5fLbrfrmWeecfn+KW12sjwff/yxgoKC1K9fPx05csTxFRMTo/r167ss3WzSpInTX+cDAwM1bNgwbd++XZmZmaUeY/bs2frll180adKkUu8/deqUjhw5on379umll16Sl5eXrrrqKsf9Z74mBQUFOnLkiHr27CnTNLV9+3a3nm9Zli1bpq+//lovvfTSOcc+//zzCgoK0iOPPGLJsSUpLS1Ne/bs0Z133qlffvnF8T4UFBSob9++2rRpk9OSKEn65ZdfNGDAADVo0EArVqyQn5+f4z673a7ly5dr4MCBTueMlnDn+yQjI0NpaWkaMWKEQkJCHNs7deqkfv36lTr7V1L/rl279OabbyogIMDx2VMaK+st7/N16dKluvzyy0udYXL3Z0eSVq9erdjYWF199dWObfXr19f999+v/fv3a+fOnU7j3fmMLXkNy5t5KSws1JEjR5SWlqZ58+YpPDxcl112maM2SRo/frzTY0pmT85e0njy5EkdOXJE2dnZWrt2rTZs2KC+ffs6janI51OJkn9zzvw6depUuc+5vPfu448/Vq9evdSwYUOnfcbFxclms2nTpk1O47t27ar27ds7ZlUPHDigzz77zGUJ4rlMmjRJoaGhioiI0LXXXqt9+/Zp6tSpuvXWWyUVr8iQ5FbTisWLF6tbt26OWe4GDRrohhtuYMkgHAhZgKTY2FjFxcUpLi5Od911l1atWqXo6GiNHTu2zPMIEhIS1KtXrzIbY5w4cUKhoaGKjIzUPffcoyeeeEJPPPGE4/62bdvqiiuucPpAXrx4sa688kqnpUlHjx7Vo48+qvDwcNWrV0+hoaGKioqSVBx+zpabm1uhcwFKvPLKKzpx4oSeeuqpMscMGDBAERERiouLU7t27fThhx863b9w4UJ16tRJfn5+uuSSSxQaGqpVq1aVWl9lLF68WN9//32Zyx579Oihf/3rX1qyZIkyMjJ05MgRFRYWVnj/hw4d0g033KCCggL98ssvZf6iduzYMUk65+u7cuVKXXnllfLz81NISIhCQ0M1Z84cp9dj37598vLyUnR0dIXrLMuePXuUm5ursLAwhYaGOn3l5+crOzvbaXzr1q1dnmPJL3VnnoNVIjc3V1OmTNH48eMVHh5eag3r169XaGioWrdurbfffltLlixx+oX84MGDjl/w69evr9DQUPXu3dux//Nls9n01FNP6a677lKnTp3KHZuenq65c+dq8uTJTqHmfO3Zs0eSNHz4cJf34e2339bJkyddnuuNN96oH374QceOHXOcs1kiJydHeXl56tChw3nXduDAAUkqdalfu3btHGHwTCW1R0dHa926dVq8eLEiIyPLPIaV9Zb3+bpv3z5LjlHiwIEDZb4uJfef6dixYxX6jC0oKHC8hvXq1VOzZs00c+ZMl3HPPfecQkND1aVLF+3fv18bN250/LJ/4MABeXl5Of2bIEkREREKDg52qe2DDz5QaGiowsPD1b9/f0VGRurtt992GlORz6cS77zzjsv3csk5o2Up773bs2ePkpKSXPYZFxcnSS6fVZI0cuRIzZ8/X1LxuaI9e/ZUmzZtyq3hbPfff7/Wrl2r9evXa9u2bcrOztZf/vIXx/2BgYGSiv9gVxHHjh3T6tWr1bt3b+3du9fxddVVV2nr1q1ltnvHxYVzsoBSeHl5qU+fPpo5c6b27Nmj9u3bO92fnJysdevWOZpTlKZu3bpau3atCgsL9fnnn2vq1KmKjIzUAw884BgzbNgwPfroo/r5558d7WRff/11p/0MHTpUX375pZ544gl17txZ9evXl91uV3x8vMtfxY8ePaqioqIKrwc/cuSIXn75ZU2cONHpr9tnmzVrlo4cOaKdO3cqMTFRDz74oBYtWiSpuHHDiBEjdPPNN+uJJ55QWFiYvL29lZiY6Fj3fj6Kior09NNPa9SoUY4gcLa33npLd9xxh4YMGVKpY+zdu1ddu3bVq6++qj//+c9auHBhqR2iSmZ5ynt9P//8cw0aNEjXXHON3njjDTVu3Fh16tTR/PnzXRppWMVutyssLKzMv6CGhoae1/6nTp0qLy8vPfHEE2U2XLniiiu0du1a/frrr1q0aJHuueceRUZGqlu3brLZbOrXr5+OHj2qJ598Um3btlVAQIAOHTqkESNGuHwfV8Y777yj/fv3a82aNecc+9e//lVt2rTR8OHDnc5VOV8lz+Pll18u81zEs3853717tz799FMNHTpUEyZMcPwyWROsXbtWUnFYWLp0qYYOHaqVK1eWe96eFSry+VqdMjMz1bx583OO8/Pzc5y7evz4cf3jH//QuHHj1LhxYw0dOtQx7t5771Xfvn31888/69VXX9XgwYP15ZdfKigoyDGmojN0/fv3d/wx7+eff9bUqVPVp08fbd26VfXq1XP78+mmm25yaX7xt7/9rcwZ73O9d3a7Xf369XMKOGcq7TP+7rvv1l/+8hd99dVXWrhwof72t7+V+xqUpk2bNo4gV5q2bdtKkr777jvH+bbl+fjjj3Xy5ElNnz5d06dPd7l/8eLFmjx5stt1onYhZAFlOH36tCQ5Gg+UME1TCQkJuuWWW8pdOuPl5eX4UB80aJCOHj2qZ555xilk3X777Ro/frzef/99/fbbb6pTp47TBQ1//fVXrV+/XpMnT9Yzzzzj2F7yF/OzlSxrKfkL7Lm88MILatCggR599NFyx5WcOH7dddcpLCxMw4YN01//+le1a9dOS5YsUcuWLbVs2TKnXwTKWlbmrjfeeEPZ2dlOnbvO1qJFCy1atEgdO3bUPffco5tvvlnvvvuuU0OA8jRu3FirV69WeHi4/v3vf2vChAm6/vrrXcLJzp07ZRhGuSf+L126VH5+flqzZo3TkqKzf3lu1aqV7Ha7du7ced7NQVq1aqV169bpqquucloKVJa9e/fKNE2n96vkL69nNz84fPiwZs6cqcTERDVo0KDMkHXJJZc4vt8HDx6sP/zhD3r55Zf14Ycf6rvvvtN///tfLVy4UMOGDXM8puSX+PNVWFioyZMn66GHHjrnL7/bt2/XBx98oOXLl8vb29uS45do1aqVpOK/ipf3C92ZVqxYoV69eikxMVFjx47V3Xff7VjeFRoa6mg4c75KXpcffvjB5b7du3erUaNGCggIcNp+5nO46aabtGXLFk2bNq3MkGVFvRX5fG3VqpUlr0mJ5s2bl/m6lNxf4tSpU9q7d6/i4+PPuV9vb2+n1/CGG25QSEiIkpKSnEJW69atHTNVcXFxatasmd577z2NHj1azZs3l91u1549e5w+17OysnTs2DGX7/fGjRs7HfMPf/iDevbsqeXLl+uOO+6o8OdTiUsvvdTle3nGjBmlhqyKvnf5+fkV/vmQij9bBg0apAceeEDZ2dkaOnToObvGumvgwIFKTEzUokWLKhSyFi9erA4dOpT679zcuXP13nvvEbLAckGgNKdOnVJycrLq1q3rElg++OADffvtt0pMTHRrn0eOHHFpuduoUSNdd911WrRokRYvXqz4+HinzlglvwSevYzo7A5MZ9ZWt25dp3MLyrJ//37NmTNHzz77bIV+MT/zeUhyPJfSatyyZYslf4U+fvy4XnzxRT322GPlzh6dPn1ad911l9q3b69XX31VcXFxatmyZYWPc9lllzmWwc2aNUt2u90leJ4+fVpLly5VbGxsuUuFvL29ZRiGbDabY9v+/ftd2hDffPPN8vLy0nPPPecyk3P2+30uQ4cOlc1m0/PPP+9y3+nTpx3LHEscPnzYqStZXl6e3n33XXXu3NnldZ48ebLCw8Nd2oqX58SJEyooKCj3e8Q0zVKXTlXGzJkzVVBQUGqHzLMlJCQ4rpFjtZiYGLVq1UrTpk1z+eOMVLyc7mwlv9A99NBD6tmzpx544AFHW3svLy/dfPPN+uSTT7R161aXx7rzfdK4cWN17txZCxcudPp+2LFjh5KTk3X99deX+3ibzaaioiKXz7AzWVFvRT5fBw8erG+++abU7qHu/uxI0vXXX6+UlBSnz6yCggK99dZbatGihdOS3n//+9/67bffHC3A3VFSW3nh/uzP15L35ezP/FdeeUWSztkNsOR76cyfxYp8PlVGRd67oUOHavPmzaXOOB87dszxx82z3XPPPfr22281ZMgQt5bDV1SPHj0UHx+vt99+u9TXoqioSI8//rgk6aefftKmTZs0dOhQ/elPf3L5GjlypPbu3astW7ZYXic8CzNZgKRPP/3U8VfL7Oxsvffee9qzZ48SEhIca7VLJCcn67777it3NmPw4MFq3bq1WrVqpaKiIiUlJWnVqlWlXnNk2LBh+tOf/iRJLr8kBwYG6pprrtHf//53nTp1Sk2bNlVycrLj2h4l9uzZo0mTJun9998vtebS/N///Z/atWunkSNHljnmueee06FDh9ShQwf5+voqNTVV8+fPV6dOnRznvdx4441atmyZbrnlFt1www1KT0/Xm2++qejo6FJ/0fzhhx+UlJTktC0/P19eXl5KSkpy+gtxamqqGjVqVObSkhKTJ0/Wd999p+3btzu1Kq+MiIgIvfzyy7r33nt199136/rrr9e6dev09NNP69tvv3Us/ynLDTfcoFdeeUXx8fG68847lZ2drdmzZ6t169b69ttvHeNat26tv/71r3r++efVq1cv3XrrrfL19dXXX3+tJk2a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UvPmzWUYhlauXKmcnBzl5+erQYMGevzxx/XYY49p4cKF2rdvn1JTUzVr1iwtXLjQredUErCaNWumadOmKScnR5mZmcrMzKzci1RBhCwAAACgBolrHqdXrn1FYf5hTtvD/cP1yrWvVNl1slq2bKnU1FT16dNHEyZMUIcOHdSvXz+tX79ec+bMKfUxderU0fvvv6/du3erU6dOmjp1ql544QWnMTabTWPGjFG7du0UHx+vyy67TG+88YYkqWnTppo8ebISEhIUHh6usWPHSpKef/55Pf3000pMTHQ8btWqVYqKinLrOa1du1Z79+7V+vXrdemll6px48aOr6pkmFV5llstkJeXp6CgIOXm5iowMLC6ywEAAEANduLECaWnpysqKkp+fn7ntS+b3abU7FTlFOYo1D9UXcO6VskMFpyV9x5WNBvQ+AIAAACogby9vC1t044Lh+WCAAAAAGAhQhYAAAAAWIiQBQAAAAAWImQBAAAAgIUIWQAAAABgIUIWAAAAAFiIkAUAAAAAFiJkAQAAAICFCFkAAAAAKswwDC1fvry6y6jRCFkAAABADWTabCrYkqLclatUsCVFps1W5cfMzMzUww8/rJYtW8rX11eRkZEaOHCg1q9fXyXH27hxowzD0LFjx6pk/5I0aNAgNWvWTH5+fmrcuLH+/Oc/6/Dhw1V2PEnyqdK9AwAAAHBbXnKysqYk6nRmpmObT0SEwp+aqMD+/avkmPv379dVV12l4OBgvfzyy+rYsaNOnTqlNWvWaMyYMdq9e3eVHNcKpmnKZrPJx8c13vTp00dPPfWUGjdurEOHDunxxx/Xn/70J3355ZdVVg8zWQAAAEANkpecrEOPjnMKWJJ0OitLhx4dp7zk5Co57kMPPSTDMJSSkqLBgwfrsssuU/v27TV+/Hh99dVXpT6mtJmotLQ0GYah/fv3S5IOHDiggQMHqmHDhgoICFD79u21evVq7d+/X3369JEkNWzYUIZhaMSIEZIku92uxMRERUVFqV69err88su1ZMkSl+N++umniomJka+vr7744otSa3zsscd05ZVXqnnz5urZs6cSEhL01Vdf6dSpU+f/opWBmSwAAACghjBtNmVNSZRMs5Q7TckwlDUlUQ369pXh7W3ZcY8ePaqkpCS9+OKLCggIcLk/ODi40vseM2aMioqKtGnTJgUEBGjnzp2qX7++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AgBPlJ9l7TgAAGAZQhYAeKL64daOAwAAliFkAYAnat6zuIugjDIGGFJg0+JxAADggiJkAYAn8vIubtMuyTVo/X47/iWulwUAQDUgZAGAp4oeJA19Vwps7Lw9sEnxdq6TBQBAteBixADgyaIHSW1vKO4imJ9VfA5W857MYAEAUI0IWQDg6by8pahe1V0FAAD4HcsFAQAAAMBChCwAAAAAsBAhCwAAAAAsRMgCAAAAAAsRsgAAAADAQoQsAAAAALAQIQsAAAAALETIAgAAAAALEbIAAAAAwEKELAAAAACwECELAAAAACxEyAIAAAAACxGyAAAAAMBChCwAAAAAsBAhCwAAAAAsRMgCAAAAAAsRsgAAAADAQoQsAAAAALAQIQsAAAAALOQxIevo0aO66667FBgYqODgYI0aNUr5+fkVeqxpmrruuutkGIaWL19etYUCAAAAuKh5TMi666679P3332vt2rVauXKlNm3apPvvv79Cj50xY4YMw6jiCgEAAABA8qnuAipi165dSkpK0tdff61u3bpJkmbNmqXrr79e06ZNU5MmTcp8bFpamqZPn66tW7eqcePG5zzWyZMndfLkScftvLy8838CAAAAAC4aHjGTtXnzZgUHBzsCliTFxcXJy8tLW7ZsKfNxhYWFuvPOOzV79mxFRERU6FiJiYkKCgpyfEVGRp53/QAAAAAuHh4RsjIzMxUWFua0zcfHRyEhIcrMzCzzcY899ph69uypm266qcLHmjhxonJzcx1fP/30U6XrBmo8u01K/1z6bknxf+226q4IAADA41XrcsGEhARNnTq13DG7du2q1L5XrFihDRs2aPv27W49ztfXV76+vpU6JuBRdq6Qkp6U8g7/b1tgEyl+qhQ9qPrqAgAA8HDVGrImTJigESNGlDumZcuWioiIUHZ2ttP206dP6+jRo2UuA9ywYYP27dun4OBgp+2DBw9Wr169tHHjxvOoHPBwO1dIHw2TZDpvz8so3j70XYIWAABAJRmmaZrnHla9du3apejoaG3dulUxMTGSpOTkZMXHx+vnn38utfFFZmamjhw54rStY8eOmjlzpgYOHKioqKgKHTsvL09BQUHKzc1VYGDg+T8ZoLrZbdKMDs4zWE6M4hmtcd9JXt4XtDQAAICarKLZwCO6C7Zr107x8fG677779Oabb+rUqVMaO3asbr/9dkfA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oEOHDtX6+d79eVT9ubbX5cuXVV5ersjISHl7e6tTp04aOHCg1q5dW+Nnfad169bp1VdfVd++fe/ZFwDaGkIWAECGYUiSEhMTlZOTo6NHj1rsv3XrloYMGaJPPvlEmZmZioqK0rRp06r1mz17tnJycpSZmanHHntM06dPt6qOoqIivfDCC0pNTdXJkycVEhKicePGKSsry9wnJiZGFy5cUEpKinJycvTvf/+73ucvLy/X1KlTVVRUpN27d8vR0VGStHbtWq1atUrx8fE6ffq0goODNX78eH377bcWxzs6Omrnzp3m7X/84x/q1atXtfcJCQlRTk6O+ZWQkGCxf9euXXr99dcVExOjzMxMzZkzRzNmzNDBgwfrfS2SFB0drfT0dO3YsUOnT5/WpEmTFBISUq3u2nh5eZlrrPpZHj161Nzm5eWliooK9e7dWx9++KHOnj2rN998U0uWLFFSUpJVtQJAe8LtggAAlZaWSpJcXV3l4eGhW7duWezv1auXYmNjzduvvfaa9u3bp6SkJA0bNszc3rlzZ3l4eKisrExubm7q1q2bVXUMHjxYgwcPNm+vWLFCu3btUnJysqKjoyVJp06d0ssvv6wnn3xSktSjR496ndswDM2YMUMXL17U559/rq5du5r3xcfHa9GiRZo6daok6Z133tHBgweVkJCg9evXm/vNnDlTGzdu1NSpU1VcXKykpCTNnj272qxe1cxhlbs/h/j4eEVERGju3LmSpIULF+rLL79UfHy8nn322XpdT1ZWlhITE5WVlSVPT09JUmxsrFJSUpSYmKi33nrrnufo0KGDuc6qn3nVGLizz5/+9Cfztre3t9LT05WUlKTJkyfXq1YAaG8IWQAAFRQUSJK6dOlS4/7y8nK99dZbSkpKUnZ2tm7fvq2SkpJq67r+9re/adOmTSopKZGLi4uSk5Mt9u/Zs8ci3JSVlaljx47m7aKiIi1btkyffPKJcnJyVFZWpps3b1rMZHl7e+vTTz/V7373u3oHLEl64403lJqaqhkzZlgcV1BQoCtXrujpp5+26P/000/rq6++smgbP368Nm3apIsXL+rw4cMaOXKk3N3d611DlXPnzikqKqra+919G15YWJg6dOhg3r5586b5IRJnzpxReXm5BgwYYHFMSUmJHnzwQfN2fn6+xWdeNWtpjfXr1+v9999XVlaWbt68qdu3b/MwCwCoAyELAKArV65IknlG5G7vvvuu1q5dq4SEBA0aNEhdunTR/PnzLdYnSVJ4eLj+8Ic/6NatW9qyZYsmTZqks2fPmtd/Pfvss9qwYYO5/86dOy1mXGJjY7V//37Fx8erf//+6tSpk1566SWL91mzZo3Cw8PVs2dPde7cWeXl5fW6xnPnzmnv3r168cUXNWXKFAUHB9fvw7mDvb29IiIitGnTJh08eFDLly/XuXPnrD5Pfa1Zs0ZBQUHm7fDwcPOfi4qK1KFDBx0/ftwiiEmyCFVOTk46ceKEeTs7O1vPPPNMvWvYsWOHYmNjtWrVKg0fPlxOTk569913lZGR0YArAoD2gZAFANCxY8fk5OSkfv361bg/LS1NEyZM0Msvvyyp8kERFy5ckK+vr0W/bt26qX///pKkuLg4xcfH6+jRo+ag0KVLF/N+SXJzc6v2PhEREfrNb34jqTJIXL582aLPgAEDFBERoZ9//lkff/yx+fbBe9m2bZuee+45rVixQrNnz1ZmZqacnZ3l7OwsT09PpaWlaeTIkRa13HkrZJXZs2fLz89PPXr00PPPP9+gkPXoo48qLS3NYs1aWlpatc/Tw8PD4vPq1KmT+c/+/v4qLy/XtWvXNGLEiFrfy87OzuIc9vbW/dWflpamwMBA862NUuUDSgAAtSNkAUA7VlFRoT179mjJkiV65ZVXqs2IVPHx8dFHH32kL774Qt27d9fq1at19erVaqGguLhYubm5Kikp0ZYtW2Rvb2/xD/x78fHx0c6dOzVu3DiZTCb98Y9/VEVFhUWfL7/8UkuWLNHBgwf1y1/+UtevX6/XuatuEVywYIF27typhQsXatOmTZIqbyWMi4tTv3795Ofnp8TERJ06dUrbt2+vdh5vb2+tXr1avXv3lp1dw54f9cYbb2jy5Mny9/dXUFCQPv74Y+3cubPakxTrMmDAAIWHh+uVV17RqlWr5O/vr+vXrys1NVWPP/64xo4d26Da7ubj46OtW7dq37598vb21rZt23Ts2DF5e3vXedzFixdVVFSk3Nxc3bx50/x0R19fXzk4ONikNgBoqQhZANCO/ec//9HcuXM1ffp0rVixotZ+S5cu1Xfffafg4GB17txZUVFRCg0NVX5+vkW/jRs3auPGjXJwcJCPj4+2b99u8Xjze1m9erVmzpypwMBA9ezZU4sWLTKvF5Ok69eva9KkSVq9erWeeOIJq69XqpzZSUxMlJ+fnyZPnqzRo0dr3rx5ys/PV0xMjK5duyZfX18lJyfLx8enxnNERkY26L2rhIaGau3atYqPj9frr78ub29vJSYmWnUbn1T5NMg///nPiomJUXZ2tnr27KmnnnpKv/71rxtV353mzJmjkydPasqUKTKZTAoLC9PcuXO1d+/eOo+bNWuWPv/8c/O2v7+/JOn777+3akwAQGtkMhqyAhYAAAAAUCO+JwsAAAAAbIiQBQAAAAA2RMgCAAAAABsiZAEAAACADRGyAAAAAMCGCFkAAAAAYEOELAAAAACwIUIWAAAAANgQIQsAAAAAbIiQBQAAAAA2RMgCAAAAABv6f4jgyliSE3ZFAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
textclusterpca_1pca_2
02 2 техническое задание 2 2 1 общие сведения п...20.3792670.009187
12 2 техническое задание 2 2 1 общие сведения п...00.4537260.042687
22 2 техническое задание общие сведения данной ...20.4900690.078381
3техническое задание 2 2 1 общие сведения интер...00.0734030.132265
42 2 техническое задание 2 2 1 общие сведения 1...00.494253-0.036965
\n", + "
" + ], + "text/plain": [ + " text cluster pca_1 \\\n", + "0 2 2 техническое задание 2 2 1 общие сведения п... 2 0.379267 \n", + "1 2 2 техническое задание 2 2 1 общие сведения п... 0 0.453726 \n", + "2 2 2 техническое задание общие сведения данной ... 2 0.490069 \n", + "3 техническое задание 2 2 1 общие сведения интер... 0 0.073403 \n", + "4 2 2 техническое задание 2 2 1 общие сведения 1... 0 0.494253 \n", + "\n", + " pca_2 \n", + "0 0.009187 \n", + "1 0.042687 \n", + "2 0.078381 \n", + "3 0.132265 \n", + "4 -0.036965 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
textclusterpca_1pca_2
36этапы разработки проекта заключительные стадии...3-0.471378-0.163534
37этапы разработки проекта определение стратегии...1-0.350179-0.501840
38этапы разработки проекта реализация тестирован...1-0.230170-0.509385
39этапы разработки проекта стратегия анализ введ...1-0.277140-0.409235
402 1 3 язык манипуляции данными ямд язык манипу...3-0.2673090.168029
\n", + "
" + ], + "text/plain": [ + " text cluster pca_1 \\\n", + "36 этапы разработки проекта заключительные стадии... 3 -0.471378 \n", + "37 этапы разработки проекта определение стратегии... 1 -0.350179 \n", + "38 этапы разработки проекта реализация тестирован... 1 -0.230170 \n", + "39 этапы разработки проекта стратегия анализ введ... 1 -0.277140 \n", + "40 2 1 3 язык манипуляции данными ямд язык манипу... 3 -0.267309 \n", + "\n", + " pca_2 \n", + "36 -0.163534 \n", + "37 -0.501840 \n", + "38 -0.509385 \n", + "39 -0.409235 \n", + "40 0.168029 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "from sklearn.manifold import TSNE\n", + "import numpy as np\n", + "\n", + "num_clusters = 5 # Количество кластеров!\n", + "kmeans = KMeans(n_clusters=num_clusters, random_state=42)\n", + "clusters = kmeans.fit_predict(X)\n", + "\n", + "# Визуализация кластеров с помощью t-SNE\n", + "tsne = TSNE(n_components=2, random_state=42)\n", + "X_embedded = tsne.fit_transform(X.toarray()) # Преобразуем разреженную матрицу в плотную\n", + "\n", + "# Уменьшение размерности с помощью PCA для визуализации\n", + "pca = PCA(n_components=2)\n", + "X_pca = pca.fit_transform(X.toarray()) # Преобразуем разреженную матрицу в плотную\n", + "\n", + "# Создаем DataFrame для удобства\n", + "df = pd.DataFrame({\n", + " \"text\": texts, # Исходные тексты\n", + " \"cluster\": clusters, # Метки кластеров\n", + " \"pca_1\": X_pca[:, 0], # Первая компонента PCA\n", + " \"pca_2\": X_pca[:, 1] # Вторая компонента PCA\n", + "})\n", + "\n", + "# Визуализация кластеров\n", + "plt.figure(figsize=(10, 8))\n", + "for cluster in range(num_clusters):\n", + " # Выбор точек, принадлежащих текущему кластеру\n", + " cluster_points = df[df[\"cluster\"] == cluster]\n", + " plt.scatter(cluster_points[\"pca_1\"], cluster_points[\"pca_2\"], label=f'Cluster {cluster}')\n", + "\n", + "plt.title(\"Визуализация кластеризации текстов с использованием PCA\")\n", + "plt.xlabel(\"Главная компонента 1\")\n", + "plt.ylabel(\"Главная компонента 2\")\n", + "plt.legend()\n", + "plt.show()\n", + "\n", + "# Вывод первых и последних строк DataFrame\n", + "display(df.head(), df.tail())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Классификация текстов (пример с использованием SVM)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Отчет о классификации:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.57 1.00 0.73 4\n", + " 1 1.00 1.00 1.00 3\n", + " 2 0.00 0.00 0.00 3\n", + " 3 1.00 1.00 1.00 3\n", + "\n", + " accuracy 0.77 13\n", + " macro avg 0.64 0.75 0.68 13\n", + "weighted avg 0.64 0.77 0.69 13\n", + "\n", + "Точность: 0.77\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n", + "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n", + "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n" + ] + } + ], + "source": [ + "from sklearn.svm import SVC\n", + "\n", + "y = kmeans.labels_ # Пример меток классов\n", + "\n", + "# Разделение данных на обучающую и тестовую выборки!\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n", + "\n", + "# Обучение модели SVM\n", + "svm_model = SVC(kernel='linear')\n", + "svm_model.fit(X_train, y_train)\n", + "\n", + "# Предсказание на тестовой выборке\n", + "y_pred = svm_model.predict(X_test)\n", + "\n", + "# Оценка качества классификации\n", + "print(\"Отчет о классификации:\")\n", + "print(classification_report(y_test, y_pred))\n", + "print(f\"Точность: {accuracy_score(y_test, y_pred):.2f}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "aimenv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}