{ "cells": [ { "cell_type": "markdown", "id": "793785ea-f1d5-433a-9f01-44b378a5c3df", "metadata": {}, "source": [ "1. Загрузка и объединение текстовых признаков" ] }, { "cell_type": "code", "execution_count": 23, "id": "75eb3861-598c-4313-91cb-f9d4f09e0dc4", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "\n", "# Загрузка CSV\n", "df = pd.read_csv(\"Dataset_Malawi_National_Football_Team_Matches.csv\")\n", "\n", "# Объединяем категориальные текстовые колонки в один текстовый столбец\n", "df[\"text\"] = df[[\"Opponent\", \"Result\", \"Venue\", \"Competition\"]].fillna(\"\").agg(\" \".join, axis=1)\n", "texts = df[\"text\"].tolist()\n" ] }, { "cell_type": "markdown", "id": "77b3eb9f-f116-476f-b24c-9d0c61b9d660", "metadata": {}, "source": [ "2. Подготовка функций токенизации" ] }, { "cell_type": "code", "execution_count": 24, "id": "b815fe8c-0362-4bb4-8d7f-5763de7192b0", "metadata": {}, "outputs": [], "source": [ "import re\n", "from collections import defaultdict\n", "\n", "def tokenize(doc):\n", " return (tok.lower() for tok in re.findall(r\"\\w+\", doc))\n", "\n", "def token_freqs(doc):\n", " freq = defaultdict(int)\n", " for tok in tokenize(doc):\n", " freq[tok] += 1\n", " return freq\n" ] }, { "cell_type": "markdown", "id": "69867160-c219-4bff-b268-679a8abe2498", "metadata": {}, "source": [ "3. Сравнение методов векторизации" ] }, { "cell_type": "code", "execution_count": 25, "id": "527d49e0-5e45-4e6d-bdd5-d743b69e56f1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "DictVectorizer: (73, 70) — 0.00s\n", "FeatureHasher: (73, 4096) — 0.00s\n", "CountVectorizer: (73, 69) — 0.00s\n", "HashingVectorizer: (73, 4096) — 0.00s\n", "TfidfVectorizer: (73, 69) — 0.00s\n" ] } ], "source": [ "from sklearn.feature_extraction import DictVectorizer, FeatureHasher\n", "from sklearn.feature_extraction.text import CountVectorizer, HashingVectorizer, TfidfVectorizer\n", "import numpy as np\n", "from time import time\n", "\n", "def n_nonzero_columns(X):\n", " return len(np.unique(X.nonzero()[1]))\n", "\n", "data_size_mb = sum(len(s.encode(\"utf-8\")) for s in texts) / 1e6\n", "vectorizer_stats = defaultdict(list)\n", "\n", "# DictVectorizer\n", "t0 = time()\n", "dv = DictVectorizer()\n", "X_dv = dv.fit_transform(token_freqs(d) for d in texts)\n", "duration = time() - t0\n", "vectorizer_stats[\"vectorizer\"].append(\"DictVectorizer\")\n", "vectorizer_stats[\"speed\"].append(data_size_mb / duration)\n", "print(f\"DictVectorizer: {X_dv.shape} — {duration:.2f}s\")\n", "\n", "# FeatureHasher\n", "t0 = time()\n", "fh = FeatureHasher(n_features=2**12)\n", "X_fh = fh.transform(token_freqs(d) for d in texts)\n", "duration = time() - t0\n", "vectorizer_stats[\"vectorizer\"].append(\"FeatureHasher\")\n", "vectorizer_stats[\"speed\"].append(data_size_mb / duration)\n", "print(f\"FeatureHasher: {X_fh.shape} — {duration:.2f}s\")\n", "\n", "# CountVectorizer\n", "t0 = time()\n", "cv = CountVectorizer()\n", "X_cv = cv.fit_transform(texts)\n", "duration = time() - t0\n", "vectorizer_stats[\"vectorizer\"].append(\"CountVectorizer\")\n", "vectorizer_stats[\"speed\"].append(data_size_mb / duration)\n", "print(f\"CountVectorizer: {X_cv.shape} — {duration:.2f}s\")\n", "\n", "# HashingVectorizer\n", "t0 = time()\n", "hv = HashingVectorizer(n_features=2**12)\n", "X_hv = hv.fit_transform(texts)\n", "duration = time() - t0\n", "vectorizer_stats[\"vectorizer\"].append(\"HashingVectorizer\")\n", "vectorizer_stats[\"speed\"].append(data_size_mb / duration)\n", "print(f\"HashingVectorizer: {X_hv.shape} — {duration:.2f}s\")\n", "\n", "# TfidfVectorizer\n", "t0 = time()\n", "tv = TfidfVectorizer()\n", "X_tv = tv.fit_transform(texts)\n", "duration = time() - t0\n", "vectorizer_stats[\"vectorizer\"].append(\"TfidfVectorizer\")\n", "vectorizer_stats[\"speed\"].append(data_size_mb / duration)\n", "print(f\"TfidfVectorizer: {X_tv.shape} — {duration:.2f}s\")\n" ] }, { "cell_type": "markdown", "id": "503cdc6e-e68e-4618-97e1-1535cfc36788", "metadata": {}, "source": [ "4. Визуализация сравнения" ] }, { "cell_type": "code", "execution_count": 26, "id": "bdfd45e3-03fa-47f5-b9e4-4d286e50e6dd", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6IAAAIjCAYAAAAZY6ZOAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAUzFJREFUeJzt3QW4VVX6P/AFEooCiiiIooLd3YWJ3d3tGGPnzCgydreOMXa3jmN3d2IH2B2AMsbA+T/v+v33nXOTe4lNfT7Pc7zcc/bZsc4+x/O971prt6pUKpUEAAAAJWld1oYAAAAgCKIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBSCaIAAACUShAFGIs+/PDDtMcee6TevXunySefPHXq1Cktt9xy6ayzzkr/+c9/xvXuAQCME23GzWYBJn7//ve/02abbZbat2+ftt9++zT//POn33//PT355JPpkEMOSW+++Wa66KKLxvVuAgCUrlWlUqmUv1mAidvAgQPTggsumGaaaab08MMPpxlmmKHW4x988EEOqvvtt98420cAgHFF11yAseDkk09OP//8c/rnP/9ZL4SG2WefvVYIbdWqVdpnn33SNddck+aaa67cjXexxRZLjz/+eK3nffzxx2mvvfbKy0wxxRRp2mmnzVXXQYMG1Vru8ssvz+ssbh06dEgLLLBAuuSSS2ott+OOO6apppqq3v7dfPPN+XmPPvporfufe+65tOaaa6bOnTvnda600krpqaeeqrXM0UcfnZ/73Xff1br/xRdfzPfHvlVvf9ZZZ6213KeffpqPLZate1z33HNPWmGFFdKUU06ZOnbsmNZZZ51cWW6On376KR1wwAF5e1Gljj8SRKW62M841rrH/MUXX+TlF1988fx6Fr755pu0yy67pG7duuXXaqGFFkpXXHFFre3Fvsf6Tj311HTGGWekWWaZJR9XtNmAAQPq7V/8waI4tqmnnjptsMEG6e2336633Oeff5633aNHj3wcvXr1SnvuuWeuttd93Ru6Fe3f0ravK55fvd5pppkm9enTJz3xxBP1lm3O69bQ/lx99dWpdevW6cQTT2xwmw3dqvf7/PPPT/PNN19up2ivvffeO58H1WKfo7fCSy+9lJZddtl8/NGm//jHP2ot19D5EeJY4v447wsXXHBBPififRLHHP+Oz4Jqr7/+ej6eott+9+7d084775y+//77UX4/Fedc9X0hjjvuj+0VinOlur1GjBiR/4DW0DqqteQ8C++8807adNNNU5cuXfKxxvvpzjvvbHCd1fsT50icV+uuu27673//26z3cvE6NXWrfq1eeeWVtNZaa+VhE/FZuOqqq6Znn312lD5PgZbRNRdgLPjXv/6Vv2DGF9vmeuyxx9INN9yQ9t133/zlKr5ER+h7/vnn8xfl8MILL6Snn346bbnllvnLV3xpiy+98WX6rbfeyl+QqkUA6tq1axoyZEi69NJL02677Za/vK222motPqYISvGFLQJyv379ckC47LLL0iqrrJLDx5JLLpnGhKOOOir9+uuv9e6/6qqr0g477JD69u2bTjrppDRs2LB87Msvv3z+Mlk3xFSLEBlBKIJdfNlfdNFF85fW+DL82Wef5Taqa/Dgwfl427Ztm+6+++6awB5je6O9o6odfzyI0HLTTTflL/nxBblulfvKK69MQ4cOzWEgjivGB0ebvfHGGznIhgcffDBvK86Z+JIc2zjnnHPyeOKXX3655tgiGEc7x3Z23333NPfcc+dgGn84iPZYccUVczsVjjvuuPzzr3/9a819TZ2TjbV9Y6Ld4hwL0Y5xbGuvvXYOtBGmR+d1u//++/NrFW18+OGH5/tivHX1ubvddtuljTbaKG288cY190033XT5Z7Rj//798/IR1N9999283XgPxR9P4nUt/Pjjj3m/N99887TVVlulG2+8MT+nXbt2eR8aE38oinOjrni911hjjTTbbLOl6HgW69t1111zm2yyySZ5mQceeCB99NFHaaeddsohtOiqHz8jCEXgGRPiPL344oubtWy8VnFejkxLzrM4njiPZ5xxxvw6RjCP9thwww3TLbfckl+/hsQ5FJ9/cY7H8m3atGnWe3meeeaptW/RprFscZ6GCNvFvsW6IoQeeuih+Zy48MIL8/s7Po+XWmqpsfZ5CqQUH5AAjEGDBw+OIQ+VDTbYoNnPieXj9uKLL9bc9/HHH1cmn3zyykYbbVRz37Bhw+o995lnnsnPvfLKK2vuu+yyy/J9AwcOrLnvvffey/edfPLJNfftsMMOlSmnnLLeOm+66aa87COPPJJ/HzFiRGWOOeao9O3bN/+7en969epVWX311Wvu69evX37ut99+W2udL7zw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oFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpJpog2qpVq3T77benSUmfPn3S/vvvP653AwAAYOIKojvuuGMOmXFr27Zt6tatW1p99dXTpZdemkaMGFGz3JdffpnWWmutZq3z6KOPTgsvvHDN77///nvq2rVrOvHEExtc/phjjsnb/eOPP0brWOpud3Tdeuuted8AAAAmJON9EA1rrrlmDpqDBg1K99xzT1p55ZXTfvvtl9Zdd9303//+Ny/TvXv31L59+1Faf7t27dK2226bLrvssnqPVSqVdPnll6ftt98+B+HxQQTn0KVLl9SxY8extp3RDd4AAAATbBCNgBlBc8YZZ0yLLrpo+stf/pLuuOOOHEojJDbUNfezzz5LW221VQ5rU045ZVp88cXTc889l5fv379/eu2112oqrXHfLrvskt5777305JNP1tr2Y489lj766KP8eLjkkkvSPPPMkyaffPI099xzp/PPP7/W8i3dbvjkk0/SBhtskKaaaqrUqVOntPnmm6evv/66XiU1tt2rV6+87bpdcx999NGa9VbfoqJciDaL9ovn9+7dO+9PEeSLNrzgggvS+uuvn/f9uOOOG6OvIwAAQGgzoTbDKquskhZaaKHcPXXXXXet9djPP/+cVlpppRxc77zzzhxiX3755dyVd4sttkgDBgxI9957b3rwwQfz8p07d05TTDFFWmKJJXKX3+WXX75mXVElXXbZZXPovOaaa9JRRx2Vzj333LTIIoukV155Je222245tO2www6jtN14rAihEXojGO699955+QiXhQ8++CDdcsst+Xgnm2yyeu0R+xhV48Lbb7+d1l577bTiiivm35944olc1T377LPTCiuskD788MO0++6758f69etXK/RGF+UzzzwztWnT8Onx22+/5VthyJAho/AKAgAAk6oJNoiGCIevv/56vfuvvfba9O2336YXXnghVybD7LPPXvN4hL4IWREUq0XV8+CDD85hLZYZOnRouvnmm/PvRWA77bTT0sYbb5x/j+rkW2+9lS688MIcREdluw888EB644030sCBA1PPnj3zfVdeeWWab7758noiHBfdceP+6aabrtHuxcV6v//++xzOd95553wLUf08/PDD836GqIjG+NJDDz20VhDdeuut00477dRku59wwgl5fQAAABNt19zGxPjN6E5a16uvvporlkUYbK7oUjt8+PB044035t9vuOGG1Lp161yd/OWXX3IVMcJqBMriduyxx+b7R3W7UbmMAFqE0DDvvPOmqaeeOj9WmGWWWRoNoXXHdW6yySZ5+bPOOqvm/ugS/Pe//73Wvkc1N6qow4YNq1kuuhKPzBFHHJEGDx5cc/v000+bfbwAAAATdEU0glpUJeuKbrajIsZnbrrpprk7blQS42eM14zQVozZvPjii9NSSy1V63lFV9lR3W5zRPff5thzzz1zMHz++edrda2NbsNRxSyqudWKMafN3U6M2R3ViaEAAAAm2CD68MMP5y6tBxxwQL3HFlxwwTyxzw8//NBgdTK6sUblsyFR8YxJgO6666709NNPp1NOOSXfH5dv6dGjR564aJtttmnwuaOy3Zj4KIJj3IqqaHT3/emnn3JltCVOP/30XM2N/Z522mlrPRaTFL377ru1ugoDAACMCxNE19yYGOerr75Kn3/+eZ785/jjj88T/MTlW2ICnoa62MZ4yQ033DA99dRTOTzGRD/PPPNMfnzWWWfNYzKjK+13331Xa+KdmNwnwlqsN8agxiRAhagoxvjIGDMaM+xGEI6qaQTAUd3uaqutlhZYYIEcbuPYopIZ245Jj5rTTbYQEyDFeM8IznFN1GivuEXX2RCTLMUY0ziGN998M1eTr7/++vS3v/1tNF4ZAACAiTSIxkyzM8wwQw5ycU3RRx55JIfBuBxJQzPIRuXx/vvvT9NPP32eOTaCXswEWywbYyhjPXE90hh3ed1119U8N8acRrfcH3/8sWain0JMABQVzwifsc4Ii3EJlqJ78KhsN7YXxzHNNNPkEBzBNCYSivGpLRGXnYlq65/+9KfcVsUtrrca+vbtm6u8sX8xAdLSSy+dzjjjjDyWFAAAoEytKjHjD4yGuHxLXIqm5/43ptbtO4zr3QEAxmODTlxnXO8CUEI2iJ6ZMQfPBF0RBQAAYOIhiAIAAFAqQRQAAIBSCaIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBSCaIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBSCaIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBSCaIAAACUqk25m2NiNqB/39SpU6dxvRsAAMB4TkUUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQqjblbo6J2fz97kut23cY17sBAACTjEEnrpMmRCqiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBNGJRKtWrdLtt98+rncDAABgwguiO+64Yw5VdW8ffPDBaK/78ssvT1NPPXUaHwJiHOeGG25Y6r4AAACMD9qk8dCaa66ZLrvsslr3TTfddGl88scff6S2bdumidnvv/+e2rVrN653AwAAmMiMdxXR0L59+9S9e/dat8kmmyzdcccdadFFF02TTz556t27d+rfv3/673//W/O8008/PS2wwAJpyimnTD179kx77bVX+vnnn/Njjz76aNppp53S4MGDa6qsRx99dKNVy6icRgU1DBo0KC9zww03pJVWWilv/5prrsmPXXLJJWmeeebJ980999zp/PPPH6Vjvvfee9Pyyy+ftzvttNOmddddN3344Ye1QuE+++yTZphhhrytWWaZJZ1wwgm11vHdd9+ljTbaKHXo0CHNMccc6c4776z1+IABA9Jaa62VpppqqtStW7e03Xbb5ecU+vTpk7ex//77p65du6a+ffuO0rEAAABMcEG0IU888UTafvvt03777ZfeeuutdOGFF+ageNxxx9Us07p163T22WenN998M11xxRXp4YcfToceemh+bNlll01nnnlm6tSpU/ryyy/z7eCDD27RPhx++OF5+2+//XYOaRFGjzrqqLwPcd/xxx+fjjzyyLztlvrll1/SgQcemF588cX00EMP5WOJUDlixIj8eBxXBMsbb7wxvfvuu3nbs846a611RDDffPPN0+uvv57WXnvttM0226QffvghP/bTTz+lVVZZJS2yyCJ5GxF8v/7667x8tdj3qII+9dRT6R//+EeD+/rbb7+lIUOG1LoBAABM0F1z77rrrly1K0QV78cff8xBcIcddsj3RUX0mGOOyUGzX79++b6o5BUipB177LHpT3/6U65SRrjq3LlzrmxGhXVUxPo33njjmt9ju6eddlrNfb169aoJycV+hq222ipXdOuGuXXWWafm90022aTW45deemnujhzrm3/++dMnn3ySq5xRNY1jiIpoQ+NOY1shQnGE1+effz53dT733HNzCI37q7cRleP33nsvzTnnnPm+2MbJJ5/cZDtEJTZCLwAAwEQTRFdeeeV0wQUX1PweXW0XXHDBXKWrroAOHz48/frrr2nYsGG5O+qDDz6YQ9I777yTq3TRbbf68dG1+OKL16pgRtfZXXbZJe22224198c2I/BWO+OMM9Jqq61W677DDjss73/h/fffz9XV5557LneXLSqhEUAjiEbIXH311dNcc82Vg2V03V1jjTVqrTPaqLrNovr7zTff5N9fe+219Mgjj9QK+IU4jiKILrbYYiNthyOOOCJXbwvR1hFoAQAAJtggGiFq9tlnr3VfjPWMKlx1RbIQYyZjHGeEsz333DOH1S5duqQnn3wyB8UYX9lUEI0KY6VSqTcZUUP7Vb0/4eKLL05LLbVUreXqVj+jAlv3eDp27Ji7yxbWW2+9XOWM9fXo0SMH0Qigse8hxsYOHDgw3XPPPTlwR5faCLc333xzzTrqTp4Ux1UE2tjf2MZJJ51U77hi3GlDx9jUGN64AQAATDRBtCERxGJsZN1AV3jppZdy6IqusjG+MsR4ymrRPbe6ClmILrAxZrS6OhlV1KbEZD8RGD/66KM8FnN0fP/99/nYIoSusMIK+b4I0XVFhXOLLbbIt0033TRXRmMMaITu5rTfLbfckrsst2kzwbzsAADARGiCSSTRbTUqnjPPPHMOYRE2o7tpzAQbY0EjoEYV85xzzsmVv4Ym24kQFpXBmAxooYUWylXSuMUkPjGGcplllslBNbrNNufSLFGh3XfffXNX3AiFMe4zJgKK8azVXVdHZppppskz5V500UW5OhndcWM8bLWYETgei3Gecew33XRTrrQ297qoe++9dw66MYY0xtVGeI1rs15//fV55t+6VVwAAIA0qc+aG7PUxiRG999/f1piiSXS0ksvncdeFpP2RLCMsBZdT6NLa8wqW/fyJjFzbkxeFBXFqIIWk/JEFTXGOEY1cuutt86z6TZnTOmuu+6aQ1xc8zQuGxOXdomZfGPSopaIYBmBMKq6se8HHHBAOuWUU+p15Y39jXGqcfzRFfnuu++uqf6OTFRvI5xH0I6xpbG/MflSBNnmrgMAAGBMaFWpOzgSWigmK4qqcM/9b0yt24/+pFAAAEDzDDrxf1fiGJ+yweDBg/PQwsYohQEAAFAqQRQAAIBSCaIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBSCaIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBSCaIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBSCaIAAACUShAFAACgVG3K3RwTswH9+6ZOnTqN690AAADGcyqiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlKpNuZtjYjZ/v/tS6/YdxvVuAAATsEEnrjOudwEogYooAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBSCaIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBSCaIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBSCaIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQXQC9uijj6ZWrVqln376aVzvCgAAwPgbRL/66qv05z//OfXu3Tu1b98+9ezZM6233nrpoYceKnU/IsDdfvvtNb+fdtppaZpppkm//vprvWWHDRuWOnXqlM4+++wxvt3Rseyyy6Yvv/wyde7ceYysDwAAYKILooMGDUqLLbZYevjhh9Mpp5yS3njjjXTvvfemlVdeOe29995pXNpuu+3SL7/8km699dZ6j918883p999/T9tuu20aX/zxxx+pXbt2qXv37jncjg1xzAAAABN0EN1rr71yaHr++efTJptskuacc84033zzpQMPPDA9++yzeZlPPvkkbbDBBmmqqabKVcjNN988ff311zXr2HHHHdOGG25Ya737779/6tOnT83v8e999903HXrooalLly45rB199NE1j88666z550YbbZT3J36ffvrpc2X20ksvrbffcV9sM9b16aef5n2aeuqp8++xrxGw6y4fxxUV3xlmmCHts88+jW63cMEFF6TZZpsth8u55porXXXVVbXWGcvHMuuvv36acsop03HHHVeva24cd/xe91bsXyy36667pummmy637SqrrJJee+21mm1EGy288MLpkksuSb169UqTTz55i15fAACA8SqI/vDDD7n6GZXPCFJ1RbAbMWJEDnax7GOPPZYeeOCB9NFHH6Utttiixdu74oor8naee+65dPLJJ6e///3veX3hhRdeyD8vu+yy3LW1+H2XXXbJ1dqPP/64Zj2x/ccffzw/FlXIvn37po4dO6YnnngiPfXUUzkwr7nmmjXVwwiLcYy77757rvjeeeedafbZZ29yu7fddlvab7/90kEHHZQGDBiQ9thjj7TTTjulRx55pNYxRVCMEBvr3Xnnnesdc1RzY73FbeONN86htlu3bvnxzTbbLH3zzTfpnnvuSS+99FJadNFF06qrrprbu/DBBx+kW265Ja/r1VdfbbBtf/vttzRkyJBaNwAAgOZqk0oSAadSqaS555670WVinGiErIEDB+axo+HKK6/M1cUIbUsssUSzt7fgggumfv365X/PMccc6dxzz83rX3311XNFsAi/US0tRMjs0aNHDopFBfXyyy/P+xKB7dprr81hOSqGRXfYWDbWE9XJNdZYIx177LE5UEawLBT73dh2Tz311FzpjYpxKCrEcX90Wy5svfXWOaBWh+RqUaEtnHHGGTlURxCfYoop0pNPPpkr0RFEo1JbbDfGq0bX4wjOIQJ1tHmxrw054YQTUv/+/Zv9WgAAAIyTimiE0JF5++23c+grQmiYd955c3CLx1oigmi16CIbIawpk002Wdphhx1y+Iz9jdAZldUIf61bt87dWCNQR0U0KqFxi/AXExx9+OGHef1ffPFFDq0tEce23HLL1bovfq97zIsvvniz1hcVz8MPPzzdcMMNuftziH3/+eef07TTTluz73GL0B/7XphlllmaDKHhiCOOSIMHD665RXdlAACA8a4iGlXJqCK+8847o7WeCIR1Q210ma2rbdu2tX6PbUewHJno8hoVv6gmxvIRsooqZAS5mGzpmmuuqfe8CG+xb2NTQ12a63rrrbfSlltumU488cRcoS3EvkcYj8ptXRH0W7KNqKgWVVUAAIDxNohG5TC6vp533nl5IqG6gScm0plnnnly8ItbURWNYBWPRWW0CHwxjrJajGWsGzxHJpYfPnx4vftjwqCVVlopTzgUgXe11VbLVcIQYyqjyhgTG8VkPw2JCYiiC3B1l9qRbTeOO8abRjW2EL8Xx9xc3333XZ5wKSaCOuCAA2o9Fvsel85p06ZNrUmSAAAAJupZcyOERghbcskl84Q477//fu5+GtfnXGaZZXLoW2CBBdI222yTXn755Tymcfvtt8/BsOiWGjO9vvjii3kcYzw/xoHWDabNUQTGCGc//vhjrcdiYqKYrCcmEYp/F2K/unbtmidUismKoltrVBgjWH/22Wd5mRhbGtckjWOK/YvjOOecc5rc7iGHHJK7A8dER/Gc008/PW//4IMPbtExRQDt0KFD3odYf3GLNo+2jTaO2X/vv//+PJPu008/nf7617/m9gQAAJgog2jv3r1zMItqYUzoM//88+fJgyKYRQiL7rN33HFHmmaaadKKK66Yw1M8J6qQhaiqHnnkkfnSLDEJ0NChQ3NYbakIizGLblReF1lkkXqBLrqeRqirvlRM/B4z6M4888x5RtqoZEZQjTGiRYU0qppnnnlmOv/88/MkS+uuu24Ol01tN7Zx1lln5cmD4jkXXnhhngSp+pI0zRH7FqE8KrjRDbe4RYU52vbuu+/O7RpdjWPsaHThjRmCi1l1AQAAytCq0pxZhKAJcfmWzp07p57735hat+8wrncHAJiADTpxnXG9C8AYyAYxqWljwxlLr4gCAACAIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQqjblbo6J2YD+fVOnTp3G9W4AAADjORVRAAAASiWIAgAAUCpBFAAAgFIJogAAAJRKEAUAAKBUgigAAAClEkQBAAAolSAKAABAqQRRAAAASiWIAgAAUCpBFAAAgFIJogAAAJRKEAUAAKBUgigAAAClEkQBAAAolSAKAABAqdqUuzkmZvP3uy+1bt9hXO8GAADjiUEnrjOud4HxlIooAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBSCaIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBSCaIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBSCaIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAADBpB9Edd9wxbbjhhk0uM+uss6YzzzwzTcoGDRqUWrVqlV599dVxvSsAAABjL4g2FhIfffTRHIp++umnVIYXXngh7b777mNsfbfcckuabLLJ0ueff97g43PMMUc68MADR3s7YzJA9+zZM3355Zdp/vnnHyPrAwAAmGQros0x3XTTpQ4dOoyx9a2//vpp2mmnTVdccUW9xx5//PH0wQcfpF122SWNL37//fccnLt3757atGkzVrYxfPjwNGLEiLGybgAAYNI2xoPo999/n7baaqs044wz5rC4wAILpOuuu67WMjfffHO+f4oppsgBcLXVVku//PJLrWVOPfXUNMMMM+TH99577/THH380WlmMauwll1ySNtpoo7zNqGDeeeedtdYXv8f9k08+eVp55ZVz6CyquG3btk3bbbdduvzyy+sdz6WXXpqWWmqpNN988+Vld9111xyEO3XqlFZZZZX02muv1Vr+X//6V1piiSXydrp27Zr3KfTp0yd9/PHH6YADDsjbjVt1RTbW3759+3xsp512Wq11xn3HHHNM2n777fN2oxpct2tuVKuL9Vbfolodfvvtt3TwwQfn12XKKafMx1Q8FuLYp5566txO8847b96XTz75pFmvOQAAwDgNor/++mtabLHF0r///e80YMCAHJoi5D3//PP58ehOGkF15513Tm+//XYOQxtvvHGqVCo163jkkUfShx9+mH9GYIyQ1FBIrNa/f/+0+eabp9dffz2tvfbaaZtttkk//PBDfmzgwIFp0003zd2KIzjuscce6a9//Wut50fF8/33388V0MLPP/+cQ3NRDd1ss83SN998k+6555700ksvpUUXXTStuuqqNduJY47gGdt/5ZVX0kMPPZSWXHLJ/Nitt96aZppppvT3v/89t0HcQqwn9nvLLbdMb7zxRjr66KPTkUceWe94I5gvtNBCeb3xeF1nnXVWzXrjtt9++6Xpp58+zT333PnxffbZJz3zzDPp+uuvz20Ux7LmmmvmYy4MGzYsnXTSSTnUv/nmm/n5DYlQO2TIkFo3AACA5mpVqU6AIxFVt6uvvjpX++p244wA+uOPP+aqWl3rrrtuDkQRpl5++eUcVKOiN8ssszS4jQinEUSj+2mIoNa6descoooK4f77759v+SBatUp/+9vfctUwRHV1qqmmyoExwtbhhx+eQ2IEvUIsf9xxx9Xa52WWWSbNNddcNSEwqqF//vOf01dffZUD7DrrrJODaFQLC7PPPns69NBDc+BedtllU+/evXMbNaTufocIzN9++226//77a+6L9cX+RhgsnrfIIouk2267rWaZaL9evXrlYLrwwgvX2k6E3ljvgw8+mJZbbrlc2Yz9ip89evSoWS4q0RGUjz/++HzMO+20U66wRuBtSoTlCP519dz/xtS6/ZjrMg0AwIRt0InrjOtdoGRRpOrcuXMaPHhw7s05xiqi0a01wkr1LSpo1aE0AmF0ve3SpUsOhPfdd19NN88IOVFFjMejKnfxxRfnMFgtuqkWITREF90IgE1ZcMEFa/4dXU/joIvnvPvuu7m7bLWiUlktqrRRAR06dGhNEI197NixYw6iUSGNrsJxTMUtqq0RmkO0RRxbS0RVOMJitfg9KpXRloXFF1+8WeuLYBoV6HPPPbdmvRHAY11zzjlnrX1/7LHHavY9tGvXrlY7NuaII47IJ1Zx+/TTT1twxAAAwKSuxTPdRMiLKmC1zz77rObfp5xySu4mGmM4I2zG8lEBjAl2QgTMBx54ID399NO5CnjOOefkbrLPPfdcrvCFGLNZLSqeI5s4Z1SeU1d0j40xnDfeeGNaccUV01NPPZVOOOGE/FiE0AjE1eMqC0VFNca8ji3RjiMTlduYeCnGsVZPrhT7Hu0e3YCrA36IQFqI/a8eu9qYqAhXV4UBAABaYoxPuRrhbYMNNkjbbrtt/j3C4HvvvZcnwClE2IlqXdyOOuqo3EU3up2OiUukNCS629599931LgFTV1Q+owIaldCoFEYFcYUVVsiPxXjQCHoxS210lW1IVBNjXGh0cW1IVByrq5xhnnnmyW1WLX6PbdcNjU2JrtHR7tEF+vTTT6/1WHTrje1Ghbg4HgAAgIlmsqKYmbaoeEa305gY6Ouvv655PCqfMSbxxRdfzN11YzxjjJGMQDa2xD6888476bDDDsuhOCqexTjQuhXAqCTGvv/jH//IXXWrx1PGGNKY8CgquTFGM5aLam4cS+jXr1+eITh+xrFHl9iY/KcQATYmQ4rrlX733Xf5voMOOiiH1+jOHPsWkzNFt9qY4balxxhdZM8+++zcnhGa4xaV6Ai1MWY0Zt2N9o7uxDF5VFR7YywqAADABB1EYxKgqB727ds3X7IkrnUZ4a0QYzcjjMXMshGQYvm4XMlaa62Vxpbo8htjPyOERdXyggsuqJk1t24X0+WXXz5XUGOQbQS3QgTWqKpGl92oeMa+R1feuCRLt27d8jJxvDfddFO+BEpMIBSXdylmCw4xY24E2Nlmmy1fAiZEW0UwjomY5p9//lwhjuVi0qaWiPGeMVtuVJ6jC3Fxi7AcLrvssnw8EXzj+OI1iarwzDPPPBotCwAAMJZnzZ2YxIy5UfU00c6YmxnLrLkAAFQza+6kZ0gzZ80d42NEx1fnn39+njk3Zr2NMZgxqVJcWxMAAIByTTJBNC6Hcuyxx6Yffvghd0eNLqpxGRIAAADKNckE0TPOOCPfAAAAmMgmKwIAAICmCKIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBSCaIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBSCaIAAACUShAFAACgVIIoAAAApRJEAQAAKJUgCgAAQKkEUQAAAEoliAIAAFAqQRQAAIBStSl3c0zMBvTvmzp16jSudwMAABjPqYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQqjblbo6J2fz97kut23cY17sBQEpp0InrjOtdAIBGqYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKWaIIPoU089lRZYYIHUtm3btOGGG6ZHH300tWrVKv3000+NPufyyy9PU089da37LrrootSzZ8/UunXrdOaZZ6YJTXOOGwAAYHwzXgXRCFVN3Y4++ui83IEHHpgWXnjhNHDgwBwwl1122fTll1+mzp07N3tbQ4YMSfvss0867LDD0ueff55++eWXNM0006Rff/213rLDhg1LnTp1SmefffYYOcbbb789jQmjctwAAADj2ngVRCNUFbeoUEb4q77v4IMPzst9+OGHaZVVVkkzzTRTrnK2a9cude/ePYe85vrkk0/SH3/8kdZZZ500wwwzpN122y2H0VtvvbXesjfffHP6/fff07bbbpvGF7Hvo3LcLRHHDAAAMFEH0QhVxS2qfBGwqu/77rvv8n3ff/992nnnnfO/oyLaUBfVuH/mmWdOHTp0SBtttFF+TvVj0bU39O7dOz83qp7rrbdeuvTSS+vtV9wXXYC7dOmSPv3007T55pvnABy/b7DBBmnQoEH1lp9vvvlS+/btc8iNymuYddZZ88/Yn9hm8Xu44IIL0myzzZbD5VxzzZWuuuqqWuuM5WOZ9ddfP0055ZTpuOOOq3fcffr0abCSXOxfLLfrrrum6aabLof8CPOvvfZazTai4hyV5ksuuST16tUrTT755KP5igIAAIznQXRkYjxnVEYjREXFNP69xRZb1FvuueeeS7vssksOgK+++mpaeeWV07HHHlvzeDznwQcfzP9+/vnn83pi3fGchx9+OH388cc1y3700Ufp8ccfz49FFbJv376pY8eO6YknnshjVaeaaqq05ppr1lQPIyzuvffeaffdd09vvPFGuvPOO9Pss8+eH3vhhRfyz8suuyxvs/j9tttuS/vtt1866KCD0oABA9Iee+yRdtppp/TII4/UOq4IihFiY70RxOuKam51BXnjjTfOobZbt2758c022yx988036Z577kkvvfRSWnTRRdOqq66afvjhh5p1fPDBB+mWW27J64q2a8hvv/2WuzZX3wAAAJqrTZqATDbZZDVdUaNiGv9uyFlnnZXD4aGHHpp/n3POOdPTTz+d7r333vz7FFNMkaaddtr876gOFuuJkNmjR48cFIvxqFE9jZAage3aa69NI0aMyBXDojtsLBvV0ahOrrHGGjnwRqCMYFlYYoklarYVYvnqfT/11FPTjjvumPbaa6+aMbDPPvtsvj9CdGHrrbfOAbU6JFeLCm3hjDPOyKE6Qnkc75NPPplDdwTRqNQW243xqtH1OIJziEB95ZVX1uxrQ0444YTUv3//Jl8rAACAiaIi2lxvv/12WmqppWrdt8wyyzQr6O6www45fFYqlRw6r7jiihz+Ymbd6MYaFcOoiEYlNG4R/mKCoxi3GiHviy++yKG1pfu73HLL1bovfo/7qy2++OLNWl9UPA8//PB0ww035BAeYt9//vnnHMCLfY9bTPgU+16YZZZZmgyh4YgjjkiDBw+uuUV3ZQAAgImyIlqG6PIaFb+oJkYQjZBVVCEjyC222GLpmmuuqfe8CG8RVsemGBs6Mm+99Vbacsst04knnpgrtIXY9xivGpXbuqova9OcbURFtaiqAgAAtNREGUTnmWee3CW1WnR1bY6YMGillVbKEw5FVXS11VbLVcIQYyqjyjj99NPncaoNiQmIHnrooVpdaqvFtU+HDx9eb39jvGlUYwvx+7zzzptaIiZzigmXNtlkk3TAAQfUeiz2/auvvkpt2rSpNUkSAABA2SbKrrn77rtvHg8aYyDff//9dO6559aMD22OmJgoJuuJSYTi34Vtttkmde3aNc+UG5MVRbfWqDDG9j777LO8TIwtPe200/I1R2PbL7/8cjrnnHPqBdUIhT/++GO+75BDDsndgWOio3jO6aefnrdfXK6muSKAxizBsQ+x/uIWwTcCdXRPjtl/77///jyTboyb/etf/5pefPHFFm0HAABgdEyUQXTppZdOF198cZ60aKGFFsrB629/+1uLAl10PY1QF8GtEL/HDLpxWZiYkTYqmRFUY4xoUSGNqmbM6Hv++efnS7isu+66OVwWIqQ+8MADeQKkRRZZJN8X24h9jeAcz7nwwgvzJEhxOZaWiH2LWXejghvdcItbdC+OyZXuvvvutOKKK+auxjF2NLrwxgzBxay6AAAAZWhVif6nMBri8i0xi3HP/W9Mrdt3GNe7A0BKadCJ64zrXQBgEs4GgwcPbnQ440RbEQUAAGD8JYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlEoQBQAAoFSCKAAAAKUSRAEAACiVIAoAAECpBFEAAABKJYgCAABQKkEUAACAUgmiAAAAlKpNuZtjYjagf9/UqVOncb0bAADAeE5FFAAAgFIJogAAAJRKEAUAAKBUgigAAAClEkQBAAAolSAKAABAqQRRAAAASiWIAgAAUCpBFAAAgFIJogAAAJRKEAUAAKBUgigAAAClEkQBAAAolSAKAABAqQRRAAAASiWIAgAAUCpBFAAAgFIJogAAAJRKEAUAAKBUbcrdHBOjSqWSfw4ZMmRc7woAADAOFZmgyAiNEUQZbd9//33+2bNnz3G9KwAAwHhg6NChqXPnzo0+Logy2rp06ZJ/fvLJJ02ebIz+X5ci7H/66aepU6dO43p3JkrauBzauRzauRzaeezTxuXQzuWYFNq5UqnkENqjR48mlxNEGW2tW//fUOMIoRPrG2p8Em2snccubVwO7VwO7VwO7Tz2aeNyaOdydJrI27k5xSmTFQEAAFAqQRQAAIBSCaKMtvbt26d+/frln4w92nns08bl0M7l0M7l0M5jnzYuh3Yuh3b+n1aVkc2rCwAAAGOQiigAAAClEkQBAAAolSAKAABAqQRRAAAASiWIUs95552XZp111jT55JOnpZZaKj3//PNNLn/TTTelueeeOy+/wAILpLvvvrvW4zEf1lFHHZVmmGGGNMUUU6TVVlstvf/++2lS15J2vvjii9MKK6yQpplmmnyLNqy7/I477phatWpV67bmmmumSV1L2vnyyy+v14bxvGrO59Fv5z59+tRr57its846Ncs4n2t7/PHH03rrrZd69OiR2+L2228f6XMeffTRtOiii+aZGWefffZ8fo/u5/3ErqXtfOutt6bVV189TTfddPnC9Msss0y67777ai1z9NFH1zuX4/+Zk7KWtnOcyw19Znz11Ve1lnM+j3obN/SZG7f55puvZhnncn0nnHBCWmKJJVLHjh3T9NNPnzbccMP07rvvjvR5vjv/H0GUWm644YZ04IEH5mmlX3755bTQQgulvn37pm+++abB5Z9++um01VZbpV122SW98sor+Q0YtwEDBtQsc/LJJ6ezzz47/eMf/0jPPfdcmnLKKfM6f/311zSpamk7x/+Eo50feeSR9Mwzz6SePXumNdZYI33++ee1losv6l9++WXN7brrrkuTspa2c4gvk9Vt+PHHH9d63Pk8+u0cX96r2zg+LyabbLK02Wab1VrO+fw/v/zyS27X+KLdHAMHDszBfuWVV06vvvpq2n///dOuu+5aKySNyvtjYtfSdo4v+xFE40vkSy+9lNs7vvzH/w+rxZf56nP5ySefTJOylrZzIb7gV7djfPEvOJ9Hr43POuusWm376aefpi5dutT7XHYu1/bYY4+lvffeOz377LPpgQceSH/88Uf+fhbt3xjfnavE5VugsOSSS1b23nvvmt+HDx9e6dGjR+WEE05ocPnNN9+8ss4669S6b6mllqrsscce+d8jRoyodO/evXLKKafUPP7TTz9V2rdvX7nuuusqk6qWtnNd//3vfysdO3asXHHFFTX37bDDDpUNNthgrOzvpNLOl112WaVz586Nrs/5PHbO5zPOOCOfzz///HPNfc7nxsX/um+77bYmlzn00EMr8803X637tthii0rfvn3H2Os2sWtOOzdk3nnnrfTv37/m9379+lUWWmihMbx3k1Y7P/LII3m5H3/8sdFlnM9j9lyO5Vu1alUZNGhQzX3O5ZH75ptvcns/9thjjS7ju/P/qIhS4/fff89/0Y3yf6F169b596jCNSTur14+xF9siuXjr/LRdaZ6mc6dO+cuM42tc2I3Ku1c17Bhw/Jf3eKvlXUrp/EX4rnmmivtueee6fvvv0+TqlFt559//jnNMsssueq8wQYbpDfffLPmMefz2Dmf//nPf6Ytt9wy/8W3mvN51I3ss3lMvG7UN2LEiDR06NB6n83RpS66SPbu3Ttts8026ZNPPhln+zghW3jhhXNXxahCP/XUUzX3O5/HvPhcjvaL/x9Wcy43bfDgwfln3c+Aar47/48gSo3vvvsuDR8+PHXr1q3W/fF73XEYhbi/qeWLny1Z58RuVNq5rsMOOyz/j6D6Qyq6MV555ZXpoYceSieddFLuLrLWWmvlbU2KRqWdI/Bceuml6Y477khXX311/lK57LLLps8++yw/7nwe8+dzjOGK7kjRbbSa83n0NPbZPGTIkPSf//xnjHwOUd+pp56a/5i1+eab19wXXx5jfO69996bLrjggvwlM8b8R2CleSJ8RhfFW265Jd/iD4Ux1jy64Abn85j1xRdfpHvuuafe57JzuWnxnSGGQSy33HJp/vnnb3Q5353/p03Vv4EJwIknnpiuv/76XC2qnkgnKkqFGPi+4IILptlmmy0vt+qqq46jvZ2wxEQjcStECJ1nnnnShRdemI455phxum8T81/d43xdcskla93vfGZCc+2116b+/fvnP2RVj12MP6AU4jyOL/NRZbrxxhvzGDFGLv5IGLfqz+YPP/wwnXHGGemqq64ap/s2MbriiivS1FNPncctVnMuNy3GisYfVif1cbMtoSJKja5du+YJQ77++uta98fv3bt3b/A5cX9Tyxc/W7LOid2otHP1X9sjiN5///35fwJNiW4zsa0PPvggTYpGp50Lbdu2TYssskhNGzqfx2w7x2QO8UeV5nyBmdTP55Zq7LM5JuOKGRjHxPuD/4nzOKpH8YW8bpe7uuIL/pxzzulcHk3xx6uiDZ3PY04MKY2eQdttt11q165dk8s6l/9nn332SXfddVeeVHKmmWZqclnfnf9HEKVGfOAstthiuStcdTeD+L26SlQt7q9ePsSsYcXyvXr1ym+a6mWia1jMANbYOid2o9LOxQxqUZWLLjGLL774SLcT3UljTF10aZoUjWo7V4uuXm+88UZNGzqfx2w7x/T1v/32W9p2221Hup1J/XxuqZF9No+J9wf/J2Zz3mmnnfLP6ksQNSa67kY1z7k8emI26KINnc9jTgyDiGDZnD8QOpf/L7hHCL3tttvSww8/nL8njIzvzlWqJi6CyvXXX59n5br88ssrb731VmX33XevTD311JWvvvoqP77ddttVDj/88Jrln3rqqUqbNm0qp556auXtt9/OM6q1bdu28sYbb9Qsc+KJJ+Z13HHHHZXXX389z4TZq1evyn/+85/KpKql7Rxt2K5du8rNN99c+fLLL2tuQ4cOzY/Hz4MPPrjyzDPPVAYOHFh58MEHK4suumhljjnmqPz666+VSVVL2zlmurzvvvsqH374YeWll16qbLnllpXJJ5+88uabb9Ys43we/XYuLL/88nkm17qcz5UG2+SVV17Jt/hf9+mnn57//fHHH+fHo32jnQsfffRRpUOHDpVDDjkkfzafd955lckmm6xy7733Nvt1mxS1tJ2vueaa/P/AaN/qz+aY4bJw0EEHVR599NF8Lsf/M1dbbbVK165d8+yak6qWtnPMrH377bdX3n///fz9Yr/99qu0bt06fzYUnM+j18aFbbfdNs/g2hDncn177rlnnm0/2qX6M2DYsGE1y/ju3DhBlHrOOeecyswzz5yDT0yH/uyzz9Y8ttJKK+XLKlS78cYbK3POOWdePi4X8O9//7vW4zEN9ZFHHlnp1q1b/p/EqquuWnn33Xcrk7qWtPMss8yS/0dS9xYfXiE+8NZYY43KdNNNlz/MYvnddtttkv0f8Ki28/7771+zbJyva6+9duXll1+utT7n85j53HjnnXfyOXz//ffXW5fzufHLV9S9Fe0aP6Od6z5n4YUXzq9J79698+WJWvK6TYpa2s7x76aWD/HHlhlmmCG38Ywzzph//+CDDyqTspa280knnVSZbbbZ8h8Gu3TpUunTp0/l4Ycfrrde5/PofWbEH1CmmGKKykUXXdTgOp3L9TXUxnGr/rz13blxreI/1RVSAAAAGJuMEQUAAKBUgigAAAClEkQBAAAolSAKAABAqQRRAAAASiWIAgAAUCpBFAAAgFIJogAAAJRKEAUAWmTQoEGpVatW6dVXX21yuXfffTd17949DR06NI0vfv/99zTrrLOmF198cVzvCsAkTRAFgPHQt99+m/bcc88088wzp/bt2+dA17dv3/TUU0+lCcURRxyR/vznP6eOHTvm3x999NEcYKeZZpr066+/1lr2hRdeyI/FrVAsX9ymmGKKNN9886WLLrqowe3ttNNO6W9/+1uT+9SuXbt08MEHp8MOO2yMHCMAo0YQBYDx0CabbJJeeeWVdMUVV6T33nsv3XnnnalPnz7p+++/TxOCTz75JN11111pxx13rPdYBNPbbrut1n3//Oc/c+hurLL65ZdfprfeeivtscceOaA/9NBDtZYZPnx43t76668/0n3bZptt0pNPPpnefPPNFh8XAGOGIAoA45mffvopPfHEE+mkk05KK6+8cpplllnSkksumSuM1UErqoQXXHBBWmuttXK1sHfv3unmm2+uta5PP/00bb755mnqqadOXbp0SRtssEHuWlvtkksuSfPMM0+afPLJ09xzz53OP//8Wo8///zzaZFFFsmPL7744jkgj8yNN96YFlpooTTjjDPWe2yHHXZIl156ac3v//nPf9L111+f72/I9NNPnyvCvXr1Svvuu2/++fLLL9da5umnn05t27ZNSyyxRO5+u88++6QZZpgh73O03wknnFCzbFRkl1tuubxNAMYNQRQAxjNTTTVVvt1+++3pt99+a3LZI488MldPX3vttVzp23LLLdPbb7+dH/vjjz9yd96oQEawjW69sd4111wzh7VwzTXXpKOOOiodd9xx+XnHH398XmdUYsPPP/+c1l133TTvvPOml156KR199NG5a+vIxPYitDZku+22y49H1TTccsstedzmoosu2uQ6K5VKuvfee/PzllpqqVqPRcV4vfXWy+H87LPPzr9HGI5qahxjrL9aBPvYBwDGDUEUAMYzbdq0SZdffnkOg1HJjOrdX/7yl/T666/XW3azzTZLu+66a5pzzjnTMccck8PfOeeckx+74YYb0ogRI3LFc4EFFshVz8suuywHuRh/Gfr165dOO+20tPHGG+dKY/w84IAD0oUXXpgfv/baa/M6outsjM+MUHrIIYeM9Bg+/vjj1KNHj0YrnFHFjWMMUR3deeedG13XTDPNlAN0jO9cZ5118j6vuOKKtZa54447aqrFcXxzzDFHWn755XM1NH5utdVWtZaPfYt9BGDcEEQBYDwUVc4vvvgiV/aighnBMSqGRXgrLLPMMvV+LyqiUSX94IMPckW0qLJG99yYKOjDDz9Mv/zyS/65yy671Dwet2OPPTbfH2JdCy64YO7i2tg2GxLdbaufU1cEzziWjz76KD3zzDO5mtuYqFzGDL1xi1AdVdvoklyIfYy2WnXVVfPvMS41lp1rrrlyV97777+/3jqjK/OwYcNGehwAjB1txtJ6AYDRFEFu9dVXz7foLhuVz6gGNjQBUEOiW+1iiy2Wu6bWNd100+XHw8UXX1yvq+tkk002WvvetWvX9OOPPzb6eFREd9999xyCo0vttNNO2+iyUamNynCIquxzzz2XuxLHpEUhwnq0URF8I7APHDgw3XPPPenBBx/MY2RXW221WuNnf/jhh9wGAIwbKqIAMIGIcZpRxaz27LPP1vs9uuAWgez999/PXWFnn332WrfOnTunbt265S6qUZWs+3iEvxDrii7B1ZdbqbvNhsTkRjHLbVPdj7fffvtc6W2qW25DIiRHxbW6W25MwlStU6dOaYsttsghO7ooxzjUCJ+FAQMG5H0EYNwQRAFgPBOXaFlllVXS1VdfnUNgVPduuummdPLJJ9cLXHF/jLGMS7xEtTRmuI0ZY0N0d43KZDwnurfGeiL4RXfVzz77LC/Tv3//PKNsTPAT63jjjTfyONLTTz89P7711lvnCYB22223HCzvvvvudOqpp470GGKSpOhyG5dVaUyMaY3rpcayTfnmm2/SV199lcd0xvFeddVVNe0Qj7344ot57Goh9v26665L77zzTj6meE7MultUVUO0xxprrDHS4wBg7NA1FwDGMzFOM7rKnnHGGXmsZsx+27NnzxwGY9KiahEk4zIke+21V75cSQSwqJyGDh06pMcffzwddthheRKioUOH5supxFjKqBiG6O4by51yyil5EqIpp5wyT2y0//771+zLv/71r/SnP/0pVxBj3XFZmRjD2pToehtVz+ga21jQjMmHIiiPTIz1DLG+aIe4lmjM3hti32IG3Or1xJjYCO1RDY7qaVzSJQJ069b/9/f3CMiDBw9Om2666Ui3DcDY0aoSc6EDABOcqFTedtttacMNN0zjo/POOy+P37zvvvvG2jZiptyYFffQQw9t9nOiy25c47RuqAegPCqiAMBYEZXLn376KVdio0o5NjR0aZamxPVTo+Ibl6gBYNxREQWACdT4XhEFgMaoiALABMrfkgGYUJk1FwAAgFIJogAAAJRKEAUAAKBUgigAAAClEkQBAAAolSAKAABAqQRRAAAASiWIAgAAkMr0/wCRglN64JfnPQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "fig, ax = plt.subplots(figsize=(10, 6))\n", "y_pos = np.arange(len(vectorizer_stats[\"vectorizer\"]))\n", "ax.barh(y_pos, vectorizer_stats[\"speed\"], align=\"center\")\n", "ax.set_yticks(y_pos)\n", "ax.set_yticklabels(vectorizer_stats[\"vectorizer\"])\n", "ax.invert_yaxis()\n", "ax.set_xlabel(\"Speed (MB/s)\")\n", "ax.set_title(\"Сравнение скорости векторизации текстов\")\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "cf1deab5-fbe4-4bb9-af74-6fbca8958636", "metadata": {}, "source": [ "Задание успешно выполнено. Самым быстрым оказался FeatureHasher, потому что он получил уже подготовленные словари, не делал никакой токенизации и разбора текста, а просто хешировал ключи - это очень быстро, тк это всего один проход по словарю." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.13.3" } }, "nbformat": 4, "nbformat_minor": 5 }