{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Sentiment Analysis" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "from __future__ import annotations\n", "\n", "from typing import TYPE_CHECKING\n", "\n", "if TYPE_CHECKING:\n", " from sklearn.base import BaseEstimator\n", "\n", "import re\n", "import warnings\n", "from functools import cache\n", "\n", "import matplotlib.pyplot as plt\n", "import nltk\n", "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns\n", "from joblib import Memory\n", "from nltk.corpus import stopwords\n", "from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.metrics import confusion_matrix\n", "from sklearn.model_selection import RandomizedSearchCV, train_test_split\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.svm import SVC\n", "\n", "from app.constants import CACHE_DIR, SENTIMENT140_PATH\n", "from app.model import TextCleaner, TextLemmatizer" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "SEED = 42\n", "MAX_FEATURES = 20000" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[nltk_data] Downloading package wordnet to /home/tymec/nltk_data...\n", "[nltk_data] Package wordnet is already up-to-date!\n", "[nltk_data] Downloading package stopwords to /home/tymec/nltk_data...\n", "[nltk_data] Unzipping corpora/stopwords.zip.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nltk.download(\"wordnet\")\n", "nltk.download(\"stopwords\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load the data" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
targetiddateflagusertextsentiment
001467810369Mon Apr 06 22:19:45 PDT 2009NO_QUERY_TheSpecialOne_@switchfoot http://twitpic.com/2y1zl - Awww, t...negative
101467810672Mon Apr 06 22:19:49 PDT 2009NO_QUERYscotthamiltonis upset that he can't update his Facebook by ...negative
201467810917Mon Apr 06 22:19:53 PDT 2009NO_QUERYmattycus@Kenichan I dived many times for the ball. Man...negative
301467811184Mon Apr 06 22:19:57 PDT 2009NO_QUERYElleCTFmy whole body feels itchy and like its on firenegative
401467811193Mon Apr 06 22:19:57 PDT 2009NO_QUERYKaroli@nationwideclass no, it's not behaving at all....negative
\n", "
" ], "text/plain": [ " target id date flag \\\n", "0 0 1467810369 Mon Apr 06 22:19:45 PDT 2009 NO_QUERY \n", "1 0 1467810672 Mon Apr 06 22:19:49 PDT 2009 NO_QUERY \n", "2 0 1467810917 Mon Apr 06 22:19:53 PDT 2009 NO_QUERY \n", "3 0 1467811184 Mon Apr 06 22:19:57 PDT 2009 NO_QUERY \n", "4 0 1467811193 Mon Apr 06 22:19:57 PDT 2009 NO_QUERY \n", "\n", " user text \\\n", "0 _TheSpecialOne_ @switchfoot http://twitpic.com/2y1zl - Awww, t... \n", "1 scotthamilton is upset that he can't update his Facebook by ... \n", "2 mattycus @Kenichan I dived many times for the ball. Man... \n", "3 ElleCTF my whole body feels itchy and like its on fire \n", "4 Karoli @nationwideclass no, it's not behaving at all.... \n", "\n", " sentiment \n", "0 negative \n", "1 negative \n", "2 negative \n", "3 negative \n", "4 negative " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Load the data\n", "data = pd.read_csv(\n", " SENTIMENT140_PATH,\n", " encoding=\"ISO-8859-1\",\n", " names=[\n", " \"target\", # 0 = negative, 2 = neutral, 4 = positive\n", " \"id\", # The id of the tweet\n", " \"date\", # The date of the tweet\n", " \"flag\", # The query, NO_QUERY if not present\n", " \"user\", # The user that tweeted\n", " \"text\", # The text of the tweet\n", " ],\n", ")\n", "\n", "# Ignore rows with neutral sentiment\n", "data = data[data[\"target\"] != 2]\n", "\n", "# Map the sentiment values\n", "data[\"sentiment\"] = data[\"target\"].map({0: \"negative\", 4: \"positive\"})\n", "\n", "# Show the first few rows\n", "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load the stopwords" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "stopwords_en = stopwords.words(\"english\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Explore the data" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAFzCAYAAADsTAnbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA5QElEQVR4nO3df1xW9f3/8Seg/PDHdeFPkInCslSWaWLh5arNRV426pOLmhZTUtR0YCmZSnPo+tRwtkqdJrU+n7BNl7rPcgWJEaaWkj9w5o/SrFFYeIGmcCUpINf5/tGXMy51AYY7Co/77XZutzjv13mfl9fNdzw9nHPwMQzDEAAAgEV8rW4AAAC0boQRAABgKcIIAACwFGEEAABYijACAAAsRRgBAACWIowAAABLEUYAAICl2ljdwOXM4/GopKREHTt2lI+Pj9XtAABwxTAMQ1999ZXCwsLk6/vt1z4II9+ipKRE4eHhVrcBAMAV68iRI+rZs+e31hBGvkXHjh0lffNB2mw2i7sBAODK4Xa7FR4ebn4v/TaEkW9R96MZm81GGAEA4CI05jYHbmAFAACWIowAAABLEUYAAIClCCMAAMBShBEAAGApwggAALAUYQQAAFiqSWGktrZWv/71rxUZGamgoCBdddVV+u///m8ZhmHWGIah9PR09ejRQ0FBQYqNjdXhw4e95jlx4oQSEhJks9kUHByspKQknTp1yqtm7969uvnmmxUYGKjw8HAtXLjwvH7Wrl2rfv36KTAwUAMGDNAbb7zhNd6YXgAAgMWMJnjyySeNLl26GNnZ2UZRUZGxdu1ao0OHDsbixYvNmgULFhh2u91Yt26d8f777xv/9V//ZURGRhqnT582a0aOHGkMHDjQeO+994x33nnH6NOnj3HfffeZ4xUVFUZISIiRkJBg7N+/3/jLX/5iBAUFGc8//7xZs3XrVsPPz89YuHCh8cEHHxhz58412rZta+zbt69JvXybiooKQ5JRUVHRlI8JAIBWrynfQ5sURuLi4owJEyZ47bv77ruNhIQEwzAMw+PxGKGhocZTTz1ljpeXlxsBAQHGX/7yF8MwDOODDz4wJBk7d+40a9avX2/4+PgYX3zxhWEYhvHcc88ZnTp1Mqqqqsya2bNnG3379jW//vnPf27ExcV59RITE2M8+OCDje6lIYQRAAAuTlO+hzbpxzTDhg1Tfn6+PvroI0nS+++/r3fffVe33367JKmoqEgul0uxsbHmMXa7XTExMSooKJAkFRQUKDg4WEOGDDFrYmNj5evrq+3bt5s1t9xyi/z9/c0ap9OpQ4cO6eTJk2ZN/fPU1dSdpzG9nKuqqkput9trAwAAl1aTfjfNnDlz5Ha71a9fP/n5+am2tlZPPvmkEhISJEkul0uSFBIS4nVcSEiIOeZyudS9e3fvJtq0UefOnb1qIiMjz5ujbqxTp05yuVwNnqehXs6VkZGh3/zmN434JFqeiDk5VreAZvbpgjirW0AzYo22LKxPb026MrJmzRqtXLlSq1at0u7du7VixQr9/ve/14oVKy5Vf/9RaWlpqqioMLcjR45Y3RIAAC1ek66MPProo5ozZ47GjBkjSRowYIA+++wzZWRkKDExUaGhoZKk0tJS9ejRwzyutLRUgwYNkiSFhoaqrKzMa96zZ8/qxIkT5vGhoaEqLS31qqn7uqGa+uMN9XKugIAABQQENO7DAAAAzaJJV0a+/vpr+fp6H+Ln5yePxyNJioyMVGhoqPLz881xt9ut7du3y+FwSJIcDofKy8tVWFho1mzcuFEej0cxMTFmzZYtW1RTU2PW5OXlqW/fvurUqZNZU/88dTV152lMLwAAwHpNCiN33nmnnnzySeXk5OjTTz/Vq6++qmeeeUY/+9nPJEk+Pj6aPn26nnjiCb322mvat2+fxo0bp7CwMI0aNUqS1L9/f40cOVKTJk3Sjh07tHXrVqWkpGjMmDEKCwuTJN1///3y9/dXUlKSDhw4oNWrV2vx4sVKTU01e3n44YeVm5urp59+WgcPHtT8+fO1a9cupaSkNLoXAABgvSb9mOYPf/iDfv3rX+uXv/ylysrKFBYWpgcffFDp6elmzaxZs1RZWanJkyervLxcN910k3JzcxUYGGjWrFy5UikpKbr11lvl6+ur+Ph4LVmyxBy32+168803lZycrOjoaHXt2lXp6emaPHmyWTNs2DCtWrVKc+fO1WOPPaarr75a69at07XXXtukXgAAgLV8DKPe61Phxe12y263q6KiQjabzep2Linu1G95uFu/ZWGNtiytYX025Xsov5sGAABYijACAAAsRRgBAACWIowAAABLEUYAAIClCCMAAMBShBEAAGApwggAALAUYQQAAFiKMAIAACxFGAEAAJYijAAAAEsRRgAAgKUI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uXOVnJysgIAASdKUKVO0dOlSzZo1SxMmTNDGjRu1Zs0a5eT8607y1NRUJSYmasiQIbrxxhu1aNEiVVZWavz48ZLUqF4AAMDloUlh5PPPP9d9992nL7/8Ut26ddNNN92k9957T926dZMkPfvss/L19VV8fLyqqqrkdDr13HPPmcf7+fkpOztbU6dOlcPhUPv27ZWYmKjHH3/crImMjFROTo5mzJihxYsXq2fPnnrxxRfldDrNmtGjR+vYsWNKT0+Xy+XSoEGDlJub63VTa0O9AACAy0OT3jPS2vCeEVzJWsN7DFoT1mjL0hrW5yV9zwgAAEBzIowAAABLEUYAAIClCCMAAMBShBEAAGApwggAALAUYQQAAFiKMAIAACxFGAEAAJYijAAAAEsRRgAAgKUIIwAAwFKEEQAAYCnCCAAAsBRhBAAAWIowAgAALEUYAQAAliKMAAAASxFGAACApQgjAADAUoQRAABgKcIIAACwFGEEAABYijACAAAsRRgBAACWIowAAABLfacwsmDBAvn4+Gj69OnmvjNnzig5OVldunRRhw4dFB8fr9LSUq/jiouLFRcXp3bt2ql79+569NFHdfbsWa+aTZs2afDgwQoICFCfPn2UlZV13vmXLVumiIgIBQYGKiYmRjt27PAab0wvAADAWhcdRnbu3Knnn39e1113ndf+GTNm6PXXX9fatWu1efNmlZSU6O677zbHa2trFRcXp+rqam3btk0rVqxQVlaW0tPTzZqioiLFxcVp+PDh2rNnj6ZPn66JEydqw4YNZs3q1auVmpqqefPmaffu3Ro4cKCcTqfKysoa3QsAALCej2EYRlMPOnXqlAYPHqznnntOTzzxhAYNGqRFixapoqJC3bp106pVq3TPPfdIkg4ePKj+/furoKBAQ4cO1fr163XHHXeopKREISEhkqTMzEzNnj1bx44dk7+/v2bPnq2cnBzt37/fPOeYMWNUXl6u3NxcSVJMTIxuuOEGLV26VJLk8XgUHh6uadOmac6cOY3qpSFut1t2u10VFRWy2WxN/ZiuKBFzcqxuAc3s0wVxVreAZsQabVlaw/psyvfQi7oykpycrLi4OMXGxnrtLywsVE1Njdf+fv36qVevXiooKJAkFRQUaMCAAWYQkSSn0ym3260DBw6YNefO7XQ6zTmqq6tVWFjoVePr66vY2FizpjG9nKuq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FKSBAwfqr3/9azN8UsDlISAgQKGhoerdu7emTp2q2NhYvfbaazp58qTGjRunTp06qV27drr99tt1+PBh87jPPvtMd955pzp16qT27dvrBz/4gd544w1J3j+mYT22ToQRWMrPz0+//e1v9Yc//EGff/75eeOffPKJRo4cqfj4eO3du1erV6/Wu+++q5SUFLNm3LhxKikp0aZNm/R///d/euGFF1RWVuY1j6+vr5YsWaIDBw5oxYoV2rhxo2bNmiXpm0vEixYtks1m09GjR3X06FHNnDnzvF4SEhL0+uuvmyFGkjZs2KCvv/5aP/vZzyR985ufX375ZWVmZurAgQOaMWOGfvGLX2jz5s3N8nkBl5ugoCBVV1frgQce0K5du/Taa6+poKBAhmHopz/9qWpqaiRJycnJqqqq0pYtW7Rv3z797ne/U4cOHc6bj/XYShmARRITE4277rrLMAzDGDp0qDFhwgTDMAzj1VdfNer+aiYlJRmTJ0/2Ou6dd94xfH19jdOnTxsffvihIcnYuXOnOX748GFDkvHss8/+23OvXbvW6NKli/n1Sy+9ZNjt9vPqevfubc5TU1NjdO3a1Xj55ZfN8fvuu88YPXq0YRiGcebMGaNdu3bGtm3bvOZISkoy7rvvvm//MIArQP016/F4jLy8PCMgIMAYNWqUIcnYunWrWXv8+HEjKCjIWLNmjWEYhjFgwABj/vz5F5z37bffNiQZJ0+eNAyD9dgatfjXwePK8Lvf/U4/+clPzvsX0Pvvv6+9e/dq5cqV5j7DMOTxeFRUVKSPPvpIbdq00eDBg83xPn36qFOnTl7zvPXWW8rIyNDBgwfldrt19uxZnTlzRl9//XWjfwbdpk0b/fznP9fKlSs1duxYVVZW6u9//7teeeUVSdLHH3+sr7/+WrfddpvXcdXV1br++uub9HkAl6vs7Gx16NBBNTU18ng8uv/++3X33XcrOztbMTExZl2XLl3Ut29fffjhh5Kkhx56SFOnTtWbb76p2NhYxcfH67rrrrvoPliPLQthBJeFW265RU6nU2lpaXrggQfM/adOndKDDz6ohx566LxjevXqpY8++qjBuT/99FPdcccdmjp1qp588kl17txZ7777rpKSklRdXd2kG+ISEhL0ox/9SGVlZcrLy1NQUJBGjhxp9ipJOTk5+t73vud1HL9rAy3F8OHDtXz5cvn7+yssLExt2rTRa6+91uBxEydOlNPpVE5Ojt58801lZGTo6aef1rRp0y66F9Zjy0EYwWVjwYIFGjRokPr27WvuGzx4sD744AP16dPngsf07dtXZ8+e1T/+8Q9FR0dL+uZfRPWfziksLJTH49HTTz8tX99vbpNas2aN1zz+/v6qra1tsMdhw4YpPDxcq1ev1vr163Xvvfeqbdu2kqSoqCgFBASouLhYP/rRj5r2hweuEO3btz9vPfbv319nz57V9u3bNWzYMEnSl19+qUOHDikqKsqsCw8P15QpUzRlyhSlpaXpj3/84wXDCOux9SGM4LIxYMAAJSQkaMmSJea+2bNna+jQoUpJSdHEiRPVvn17ffDBB8rLy9PSpUvVr18/xcbGavLkyVq+fLnatm2rRx55REFBQeZjgn369FFNTY3+8Ic/6M4779TWrVuVmZnpde6IiAidOnVK+fn5GjhwoNq1a/dvr5jcf//9yszM1EcffaS3337b3N+xY0fNnDlTM2bMkMfj0U033aSKigpt3bpVNptNiYmJl+BTA6x39dVX66677tKkSZP0/PPPq2PHjpozZ46+973v6a677pIkTZ8+XbfffruuueYanTx5Um+//bb69+9/wflYj62Q1TetoPWqfzNcnaKiIsPf39+o/1dzx44dxm233WZ06NDBaN++vXHdddcZTz75pDleUlJi3H777UZAQIDRu3dvY9WqVUb37t2NzMxMs+aZZ54xevToYQQFBRlOp9N4+eWXvW6YMwzDmDJlitGlSxdDkjFv3jzDMLxvmKvzwQcfGJKM3r17Gx6Px2vM4/EYixYtMvr27Wu0bdvW6Natm+F0Oo3Nmzd/tw8LuAxcaM3WOXHihDF27FjDbreb6+yjjz4yx1NSUoyrrrrKCAgIMLp162aMHTvWOH78uGEY59/Aahisx9bGxzAMw8IsBDS7zz//XOHh4Xrrrbd06623Wt0OAKABhBFc8TZu3KhTp05pwIABOnr0qGbNmqUvvvhCH330kfnzYwDA5Yt7RnDFq6mp0WOPPaZ//vOf6tixo4YNG6aVK1cSRADgCsGVEQAAYCleBw8AACxFGAEAAJYijAAAAEsRRgAAgKUIIwCuKJs2bZKPj4/Ky8utbgVAMyGMALgox44d09SpU9WrVy8FBAQoNDRUTqdTW7dubbZz/PjHP9b06dO99g0bNkxHjx6V3W5vtvNcrAceeECjRo2yug3gisd7RgBclPj4eFVXV2vFihX6/ve/r9LSUuXn5+vLL7+8pOf19/dXaGjoJT0HgP8wK99FD+DKdPLkSUOSsWnTpm+tSUpKMrp27Wp07NjRGD58uLFnzx5zfN68ecbAgQONl19+2ejdu7dhs9mM0aNHG2632zCMb34PiiSvraio6LzfY/LSSy8ZdrvdeP31141rrrnGCAoKMuLj443KykojKyvL6N27txEcHGxMmzbNOHv2rHn+M2fOGI888ogRFhZmtGvXzrjxxhuNt99+2xyvmzc3N9fo16+f0b59e8PpdBolJSVm/+f2V/94AI3Hj2kANFmHDh3UoUMHrVu3TlVVVResuffee1VWVqb169ersLBQgwcP1q233qoTJ06YNZ988onWrVun7OxsZWdna/PmzVqwYIEkafHixXI4HJo0aZKOHj2qo0ePKjw8/ILn+vrrr7VkyRK98sorys3N1aZNm/Szn/1Mb7zxht544w396U9/0vPPP6+//vWv5jEpKSkqKCjQK6+8or179+ree+/VyJEjdfjwYa95f//73+tPf/qTtmzZouLiYs2cOVOSNHPmTP385z/XyJEjzf6GDRv2nT9boFWyOg0BuDL99a9/NTp16mQEBgYaw4YNM9LS0oz333/fMAzDeOeddwybzWacOXPG65irrrrKeP755w3D+ObKQrt27cwrIYZhGI8++qgRExNjfv2jH/3IePjhh73muNCVEUnGxx9/bNY8+OCDRrt27YyvvvrK3Od0Oo0HH3zQMAzD+Oyzzww/Pz/jiy++8Jr71ltvNdLS0v7tvMuWLTNCQkLMr7/tt9gCaDzuGQFwUeLj4xUXF6d33nlH7733ntavX6+FCxfqxRdfVGVlpU6dOqUuXbp4HXP69Gl98skn5tcRERHq2LGj+XWPHj1UVlbW5F7atWunq666yvw6JCREERER6tChg9e+urn37dun2tpaXXPNNV7zVFVVefV87rwX2x+Ab0cYAXDRAgMDddttt+m2227Tr3/9a02cOFHz5s3TL3/5S/Xo0UObNm0675jg4GDzv8/9ZYY+Pj7yeDxN7uNC83zb3KdOnZKfn58KCwvl5+fnVVc/wFxoDoNf5wU0O8IIgGYTFRWldevWafDgwXK5XGrTpo0iIiIuej5/f3/V1tY2X4P/3/XXX6/a2lqVlZXp5ptvvuh5LlV/QGvDDawAmuzLL7/UT37yE/35z3/W3r17VVRUpLVr12rhwoW66667FBsbK4fDoVGjRunNN9/Up59+qm3btulXv/qVdu3a1ejzREREaPv27fr00091/Pjxi7pqciHXXHONEhISNG7cOP3tb39TUVGRduzYoYyMDOXk5DSpv7179+rQoUM6fvy4ampqmqU/oLUhjABosg4dOigmJkbPPvusbrnlFl177bX69a9/rUmTJmnp0qXy8fHRG2+8oVtuuUXjx4/XNddcozFjxuizzz5TSEhIo88zc+ZM+fn5KSoqSt26dVNxcXGz/RleeukljRs3To888oj69u2rUaNGaefOnerVq1ej55g0aZL69u2rIUOGqFu3bs36wjegNfEx+AEoAACwEFdGAACApQgjAADAUoQRAABgKcIIAACwFGEEAABYijACAAAsRRgBAACWIowAAABLEUYAAIClCCMAAMBShBEAAGApwggAALDU/wOo97ayD2CTygAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot the distribution\n", "_, ax = plt.subplots(figsize=(6, 4))\n", "data[\"sentiment\"].value_counts().plot(kind=\"bar\", ax=ax)\n", "ax.set_xticklabels([\"Negative\", \"Positive\"], rotation=0)\n", "ax.set_xlabel(\"Sentiment\")\n", "ax.grid(False)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "@cache\n", "def extract_words(text: str) -> list[str]:\n", " return re.findall(r\"(\\b[^\\s]+\\b)\", text.lower())" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "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", "
wordcount
0i750749
1to564469
2the520036
3a377506
4my314024
\n", "
" ], "text/plain": [ " word count\n", "0 i 750749\n", "1 to 564469\n", "2 the 520036\n", "3 a 377506\n", "4 my 314024" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Extract words and count them\n", "words = data[\"text\"].apply(extract_words).explode()\n", "word_counts = words.value_counts().reset_index()\n", "word_counts.columns = [\"word\", \"count\"]\n", "word_counts.head()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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WNBxPMYY07lzZ+Pt7W1KlSplunbtambNmmWef/55I8nMnDnznj/n7777zkgyO3fudLQl9UfLli0dbV9//bWRZHbt2mWMMebq1asmJCTEeHp6moEDB5rp06ebmjVrGknm3Xffdaz3xx9/GEmmZMmSplChQmbixIlm6tSp5ujRo2bHjh3Gx8fH5M+f30yYMMGMGzfO5MiRw5QpU8b8/c/K/cYKACBtItcg10gPuUaRIkVMixYtbmvftWuXCQwMNCVLljRvvfWWmTFjhqlVq5ax2WxO4yDpuKdNm2aMMSYhIcFUr17d5MiRw5w7d86x3OjRo40kU61aNTNp0iQzbdo00759e/PKK684lqldu7apXbu243nSz/ePP/5wii1p7P3yyy+Otrlz5zq2P336dDNgwACTOXNmU6hQIadtJvX3vHnzHG0POj4SEhJMWFiYcXd3N3379jUzZsww9evXN6Ghobdt805effVVY7PZTI8ePcyHH35opkyZYtq1a2cmTpxojDHm119/NfXr1zeSHO/nzz77zBjz4L83jLn5vipdurTJli2bGTt2rHnrrbdMgQIFjI+Pj2McJyQkmMyZM5vBgwc71ps6dapxc3Mzbm5uJjo62rFcQECAGTJkiGO5UaNGGUmmXr165r333jN9+/Y17u7uplKlSiYuLs7p55kzZ04THBxs+vXrZ+bMmWMWL15sEhMTTa1atYybm5t56aWXzHvvvWfq1KnjGNd/78dq1aqZwMBAM2LECDN37lzz5ptvmqeeesqsWrXK6ZhPnDhhJJn33nvvnj8DPF4U1oB05u/J7owZM4y/v7+5evWqMcaYVq1aORKzfya7ixcvNpLM+PHjnbbXsmVLY7PZzMGDB40xN//wSDJnz569awwbN258oD+ySTp16mTc3NzMxo0bb3stMTHRGGPMgAEDjCSzZs0ax2uXLl0yTzzxhClYsKBJSEgwxtxKOEqXLu30B65du3bGZrOZhg0bOm0/LCzMFChQwKlNkrHb7U7JzJw5c4wkkzNnThMTE+NoHz58uFPiExcXZ7Jnz25Kly5trl275lju+++/N5LM66+/7mjr3LmzkWTGjh3rtP9y5cqZChUq3KvLTFRUlFPSc/HiRePm5mZatWplcuTI4Viuf//+JigoyNGP7777rpFkPv/8c8cycXFxJiwszGTKlMlxbEnJV0BAgImK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27fvtvY7xedKSXHcKdZ9+/Yla5xJf+xXrlypjRs3Op4nfdu2Zs0a+fn5OZ0OX6BAAR04cOC2b3IftB+Dg4Pl4+Nzx1P573TM9xsrAIC0j1wjZZFrOLOSa3h4eKhw4cL6448/nNqTzvLy9PRUvXr17vj4+5lTK1as0Ny5c/Xyyy8rODhYnTt3drrkt3DhwkpMTLztMuL7SbpE9Z+zRf7zrKikvvxnX8XHx992bI+iQIECOn36tK5everUfvDgwQfeRlBQkLp06aIvvvhCx48fV5kyZTR69GjH63d7Tz/M7w3p9r6QpP3798vX19dxZp6Xl5dj9tS/F9Bq1qyp2NhYLViwQGfOnFGtWrWc4pBuH4NxcXH6448/Huh9l9SPly9fdmq/07iWbo6fwYMH68cff9SuXbsUFxenKVOmOC1z8uRJxcXFOc7gg2tQWAPSuUyZMmnWrFkaPXq0mjZtetflGjVqpISEBM2YMcOpferUqbLZbGrYsKGkm/ee+KeyZctKkmMqeT8/P0m3JwN34ubmpubNm+s///mPNm3adNvrSd/ONmrUSL/99pvWr1/veO3KlSv64IMPVLBgwcd2iv3DqlixorJnz67Zs2c7+kOSli9frj179qhx48bJtq8nnnhCefLk0dSpUxUfH6/q1atLupkUHDp0SN98842qVq0qDw8PxzqNGjXSn3/+qS+//NLRduPGDb333nvKlCmTateufc99uru7q0GDBlq8eLGOHTvmaN+zZ4/jG9skDzJWAABpH7lGyiLXuOVRco2wsLDbxkP27NkVHh6uOXPm6PTp07etk3QpoXRz7HXv3l2VK1fWm2++qblz52rLli168803Hcs0b95cbm5uGjt27G2FxnudgVi4cGFJctzfTrp5ttoHH3zgtFzFihUVHBys2bNnKy4uztE+f/78B3pvPKgGDRooPj5eH374oaMtMTFR77///gOtf/78eafnmTJlUpEiRZx+Rnd7Tz/o740k69ev15YtWxzPjx8/riVLlujpp592OjuvZs2a2rBhg3755RdHYS1btmwKCQnRW2+95VgmSb169eTl5aXp06c7/ew++ugjRUdHP9D7rlGjRrpx44ZmzZrlaEtISNB7773ntNzVq1d1/fp1p7bChQvL39//tnG9efNmSVK1atXuu388Ph73XwRAWte5c+f7LtO0aVM99dRTeu21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7ZqJiYkxxty6rGfSpEnG3d3dfPvtt8YY47g0wxhjGjZsaHr27JnygbpARh4XeLzI8x6Pf16aePLkSZMnTx7TokULx+U9SctcuHDBuLu7m2+++SbF40xt6Dfrbty4YYy59XcyKirKVK9e3dSrV8/s3LnTadnLly+bTJkymVmzZqV4nKkN/fZ4ZOTPv48qI/Rdhjlj7e+eeuopff3115o7d6569eqlL7/8Unv27NG0adMUFRWlfPnyuTrEVOXs2bPasWOHdu3a5bis7aOPPpKXl5eaNWummJgYeXh4OJavU6eOPD090+Upxf+cxenrr79WXFycxowZo4YNG6pBgwZatWqVPD09Hd+ee3p6KnPmzK4N/DG4cOGCTpw4oRMnTji+XZgzZ46ioqLUqFEjSTe/gU36ViIsLMzx//SGcXEL4+KWf87ANWnSJF29elVDhgxR79691bZtW33++eeOMxakm9/ipccb9zMukJLI85Lfvn37NGrUKEVERGju3LnatWuXcufOrcWLF+vHH39Uv379dPr0acffuBs3bqhMmTIKCgpyceSuRb9Zt2fPHvXr10/NmzfXq6++qg0bNig4OFiff/65du7cqQEDBui3335zLO/h4aGyZcsqW7ZsLoza9ei35MHnX+sybN+5urLnSps3bza1a9c2BQoUMIULFzbFihUzW7ZscXVYqcqOHTvME088YUqVKmXc3d1N48aNzdy5c40xxuzatcsUKVLElC1b1mzbts1xM+5evXqZunXrprub1u7fv98EBgaaF154wbzxxhumWrVqply5cqZnz57m+vXr5uzZs6ZDhw7GZrOZ1157zbzzzjtm0KBBJjAw0Ozfv9/V4SerHTt2mBIlSphSpUoZLy8v061bN7Ns2TJjjDHff/+9yZUrl6lbt66Jjo52fCPRpUsX89xzzzmdtZUeMC5uYVzccvDgQZMlSxbTo0cP88EHH5h27dqZcuXKmXr16jluEvzyyy8bNzc307VrVzN06FDTt29f4+/vb/bs2ePi6JMX4wKuQp6XPH7//XcTGBhonn/+eVOtWjVTpUoVkzdvXvPDDz8YY4z55ZdfjL+/v6lfv775+OOPzaZNm8wrr7xicuTIYY4ePeri6F2HfrNuz549JiAgwHTu3Nk8//zzpn79+sZut5uPP/7YGGPM4cOHTaFChUzNmjXNqFGjzMqVK83AgQNNUFCQOXz4sIujdx36LXnw+de6jNx3GbqwZowx0dHR5o8//jA7duxwulwAxpw5c8YUKFDADBw40Bw6dMgsW7bMdOnSxeTNm9dMmDDBGGPMkSNHTNWqVU3+/PlNaGioadiwofH39zfbtm1zcfTJ726zOJUvX9688MILJjY21hhjzMyZM02VKlVM+fLlTd26dc3WrVtdFPHjcfLkSZM7d24zcOBAs3HjRvP555+bunXrmvLly5tPP/3UGHMzWSxatKjJnz+/adCggWnevLnx8/MzO3bscHH0yY9xcRPjwtndZuAqX768CQsLcxTXvv76a9O6dWtTvXp106JFC7N9+3ZXhp3sGBdwNfK8R3Pjxg3zwgsvmA4dOjjatm7darp162bc3d3Nf/7zH2OMMfv27TPPPPOMKVasmClUqJApVapUhi5i0m+P5qWXXjLNmzd3PD9z5owZMWKEcXNzM9OmTTPGGHPs2DHz4osvmtDQUFOsWDFTsWLFDN939Nuj4/OvdRm97zJ8YQ13t2nTJlO6dGlz/PhxR9vRo0fNuHHjTFBQkJkyZYqj/eOPPzbjxo0zb775ptm3b58rwn3s+vTpYypWrOjUdv36dTNz5kxTqVIl8/rrrzvOtrhw4YKJj49Pl9NXr1ixwoSGhpro6GhH29atW02vXr1MSEiIWbRokTHm5n0dxo4da/r3728GDx6cbqZS/ifGxU2MC2cjR440+fPnd2q7ceOGWbZsmalUqZLp0KGD455iSd/QpfVv6u6EcQGkbXFxcaZ27dpm2LBhTu1RUVHmxRdfNN7e3mb16tXGmJv3ajp58qTZu3evOX/+vCvCTTXot0fTokUL061bt9va33zzTWOz2cySJUuMMcbExsaaK1eumFOnTjnuZ5qR0W+Pjs+/1mX0vqOwhrvatm2b8fHxcZyynuTPP/80I0eONKVLl77ttfQo6YyTDz/80FSqVMls377d6dKky5cvmwEDBpjy5cs7vg3/+83I05uffvrJZM6c2WzatMmpfffu3aZLly6mTp066e6smzthXDhjXNyUdMPglStXmrJly5olS5Y4/dyvX79upk+fbsqWLWt27dpljGFcZIRxAaRlffr0MWFhYY4b7Sc5duyYef75503Dhg3NhQsXXBNcKka/WTd69GiTL18+c/LkSWPMrckd4uLiTO/evU1ISIjjNdxCvz06Pv9al9H7LkNOXoAHkyNHDlWrVk1Lly51TI+b1N6hQwfZ7Xbt2LFDkhw33zZ/uwl3Wpd0LG5uN98mjRo10qlTpzRmzBhdvHjRsYyfn59GjRql7du3O6YKTlonPcqVK5dy586tlStXKi4uztEeEhKiHj16aPfu3dq5c6fTOowLxkV6HxdJU9on3YA6NDRUfn5+eu+997R7927Hcna7XV27dtXBgwe1Zs0aSYyL9DwugPSgVq1aunbtmubNm6dLly452vPly6emTZtq+/btTu24iX6zrkGDBsqXL58mTJigqKgo2Ww2JSYmytPTUy1btlR0dLSioqJcHWaqQ789uoz++fdRZPS+S7/ZPB5aTEyMzpw5o7/++kuSlDNnTrVu3VqfffaZPv30U8esHpJUvHhxFStWTL/88osSExMdHyaT/k3rmMXplmvXrunixYuOGfpCQkLUrl07jRw5UosXL3ZaNiwsTGXKlNHKlSud2hkXjIv0PC6YgesWxgWQth05ckQffvihPvroI/3www+SpNatW6tGjRqaM2eOPv/8c0eeKEmVKlWSr69vhi8Q0W/WHTp0SG+99ZbGjx+vzz77TJJUtWpVPf/881q7dq0mT56skydPOr6EKlGihPz8/HTlyhVXhu1y9Fvy4POvdfSdM4/7L4KMYOfOnerdu7f+/PNPZc2aVSVLltTHH3+snj176vz583rttdcUFxendu3aqXDhwpJuVpgLFy6crt4QkrR7925Vq1ZN9erV0+nTp7V3716NGTNGH330kZ5++mn95z//0bPPPquoqCi1a9dOZcqU0ddff61Tp045+ia92LVrlwYPHqzjx4/riSeeUPny5TVu3DiNGDFCp0+fVufOnXX16lU1b95cmTNnlnSzaJA/f37XBv4YMC5uYVzcsnfvXlWtWlXPPfecPDw8tGXLFr377ruaNWuWunTpovXr16tevXoaMmSI6tSpoxo1amjZsmXavXu3KlSo4OrwkxXjAkjbdu7cqaeeekpFixbV2bNndebMGbVs2VLTp0/Xe++9p+7du2vmzJnav3+/+vbtq8DAQH3yySdyc3NTjhw5XB2+y9Bv1u3atUs1atRQ2bJldfXqVe3YsUMLFy7U22+/rUGDBunatWtasmSJ9u7dq3HjxsnPz08fffSR4uLi0l1u9TDot+TB51/r6Ls7SPmrT5HaHDlyxAQH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UX+biIiIiL4bx3lE1JIwsUZEVsnHxweOjo44cODAt17r3r07ioqKUFtbqx775JNPoNFo4OvrCwBwc3NDeXm5+rrBYEBJSckPiqFVq1bqe4mIiIioaXCcR0QtCRNrRGSVWrdujQULFiAxMRFbt27FF198gU8//RSbN2/GxIkT0bp1a0yePBklJSXIz8/H7NmzERMTo+67MXjwYOTm5iI3NxdnzpzBjBkzUFVV9YNi6NixIxwdHZGXl4dr166hurq6GT4pERERkW3hOI+IWhIm1ojIaqWkpGD+/PlYtGgRunfvjnHjxqGiogJt2rTB3r17UVlZiZCQEIwZMwYRERFYt26d+t6pU6di8uTJmDRpEsLCwuDt7Y1Bgwb9oL9vb2+PtWvXIjMzE507d8aIESOa+iMSERER2SSO84iopVDkfx8uJyIiIiIiIiIiou/FFWtERERERERERERmYGKNiIiIiIiIiIjIDEysERERERERERERmYGJNSIiIiIiIiIiIjMwsUZERERERERERGQGJtaIiIiIiIiIiIjMwMQaERERERERERGRGZhYIyIiIiIiIiIiMgMTa0RERERERERERGZgYo2IiIiIiIiIiMgMTKwRERERERERERGZ4f8ByXWyJL1524cAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot the most common words\n", "_, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))\n", "\n", "sns.barplot(data=word_counts.head(10), x=\"count\", y=\"word\", ax=ax1)\n", "ax1.set_title(\"Most common words\")\n", "ax1.grid(False)\n", "ax1.tick_params(axis=\"x\", rotation=45)\n", "\n", "ax2.set_title(\"Most common words (excluding stopwords)\")\n", "sns.barplot(\n", " data=word_counts[~word_counts[\"word\"].isin(stopwords_en)].head(10),\n", " x=\"count\",\n", " y=\"word\",\n", " ax=ax2,\n", ")\n", "ax2.grid(False)\n", "ax2.tick_params(axis=\"x\", rotation=45)\n", "ax2.set_ylabel(\"\")\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Split the data" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# Set the features and target\n", "X, y = data[\"text\"].tolist(), data[\"sentiment\"].tolist()\n", "\n", "# Split the data\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=SEED)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Preprocess and tokenize the data" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "# Create the preprocessing pipeline\n", "preprocess_pipeline = Pipeline(\n", " [\n", " # Text preprocessing\n", " (\"clean\", TextCleaner()),\n", " (\"lemma\", TextLemmatizer()),\n", " # Preprocess (NOTE: Can be replaced with TfidfVectorizer, but left for clarity)\n", " (\"vectorize\", CountVectorizer(stop_words=stopwords_en, ngram_range=(1, 2), max_features=MAX_FEATURES)),\n", " (\"tfidf\", TfidfTransformer()),\n", " ],\n", " memory=Memory(CACHE_DIR, verbose=0),\n", " verbose=True,\n", ")" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[Pipeline] ......... (step 3 of 4) Processing vectorize, total= 41.9s\n", "[Pipeline] ............. (step 4 of 4) Processing tfidf, total= 0.0s\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/tymec/university/projekt-psi/.venv/lib/python3.12/site-packages/joblib/memory.py:577: UserWarning: Persisting input arguments took 0.55s to run.If this happens often in your code, it can cause performance problems (results will be correct in all cases). The reason for this is probably some large input arguments for a wrapped function.\n", " return self._cached_call(args, kwargs, shelving=False)[0]\n" ] }, { "data": { "text/html": [ "
Pipeline(memory=Memory(location=.cache),\n",
       "         steps=[('clean', TextCleaner()), ('lemma', TextLemmatizer()),\n",
       "                ('vectorize',\n",
       "                 CountVectorizer(max_features=20000, ngram_range=(1, 2),\n",
       "                                 stop_words=['i', 'me', 'my', 'myself', 'we',\n",
       "                                             'our', 'ours', 'ourselves', 'you',\n",
       "                                             "you're", "you've", "you'll",\n",
       "                                             "you'd", 'your', 'yours',\n",
       "                                             'yourself', 'yourselves', 'he',\n",
       "                                             'him', 'his', 'himself', 'she',\n",
       "                                             "she's", 'her', 'hers', 'herself',\n",
       "                                             'it', "it's", 'its', 'itself', ...])),\n",
       "                ('tfidf', TfidfTransformer())],\n",
       "         verbose=True)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(memory=Memory(location=.cache),\n", " steps=[('clean', TextCleaner()), ('lemma', TextLemmatizer()),\n", " ('vectorize',\n", " CountVectorizer(max_features=20000, ngram_range=(1, 2),\n", " stop_words=['i', 'me', 'my', 'myself', 'we',\n", " 'our', 'ours', 'ourselves', 'you',\n", " \"you're\", \"you've\", \"you'll\",\n", " \"you'd\", 'your', 'yours',\n", " 'yourself', 'yourselves', 'he',\n", " 'him', 'his', 'himself', 'she',\n", " \"she's\", 'her', 'hers', 'herself',\n", " 'it', \"it's\", 'its', 'itself', ...])),\n", " ('tfidf', TfidfTransformer())],\n", " verbose=True)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Fit the pipeline\n", "with warnings.catch_warnings():\n", " warnings.simplefilter(\"ignore\")\n", " preprocess_pipeline.fit(X_train)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "# Transform the data\n", "X_train_preprocessed = preprocess_pipeline.transform(X_train)\n", "X_test_preprocessed = preprocess_pipeline.transform(X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pick the classifier" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def evaluate_model(clf: BaseEstimator) -> None:\n", " # Calculate the accuracy\n", " accuracy = clf.score(X_test_preprocessed, y_test)\n", "\n", " # Calculate the confusion matrix\n", " y_pred = clf.predict(X_test_preprocessed)\n", " cm = confusion_matrix(y_test, y_pred)\n", "\n", " # Plot the confusion matrix\n", " categories = [\"Negative\", \"Positive\"]\n", " group_names = [\"True Neg\", \"False Pos\", \"False Neg\", \"True Pos\"]\n", " group_percentages = [f\"{value:.2%}\" for value in cm.flatten() / cm.sum()]\n", "\n", " labels = [f\"{v1}\\n{v2}\" for v1, v2 in zip(group_names, group_percentages)]\n", " labels = np.asarray(labels).reshape(2, 2)\n", "\n", " _, ax = plt.subplots(figsize=(8, 6))\n", " ax.grid(False)\n", " ax.set_title(f\"Accuracy: {accuracy:.2%}\")\n", " sns.heatmap(\n", " cm,\n", " xticklabels=categories,\n", " yticklabels=categories,\n", " annot=labels,\n", " square=True,\n", " cbar=False,\n", " cmap=\"viridis\",\n", " linewidths=0.5,\n", " fmt=\"\",\n", " ax=ax,\n", " )\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def random_search(clf: BaseEstimator, param_distributions: dict) -> tuple[BaseEstimator, dict]:\n", " # Create the search\n", " search = RandomizedSearchCV(\n", " clf,\n", " param_distributions,\n", " n_iter=10,\n", " scoring=\"accuracy\",\n", " n_jobs=-1,\n", " cv=3,\n", " random_state=SEED,\n", " verbose=1,\n", " )\n", "\n", " # Fit the search\n", " search.fit(X_train_preprocessed, y_train)\n", "\n", " # Print the best parameters\n", " print(f\"Best parameters: {search.best_params_}\")\n", "\n", " return search.best_estimator_, search.best_params_" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfkAAAIQCAYAAACCFRczAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABM8ElEQVR4nO3dd3QUVR/G8Wez6QRCKCGUUCO9KCC9iIBIExFBmoAgAkqRooAVUAlNqghKEyRUKdIsKB0RRXrvNaHXEAhJ9r5/7EswJrQlGBy+n3NySO7cmf1lYXl27ty9YzPGGAEAAMtxS+kCAADAw0HIAwBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBRhDwg6csvv5TNZlPp0qVTupT/PJvNdtuv6tWrx/fr06fPHfuuXbv2ro+1dOlSVahQQb6+vgoICNDLL7+sw4cPJ+qXM2fOJB+jffv2Cfrt3LlTFStWVOrUqVWyZEmtW7cu0bGGDh2qQoUKKTY29v6fHOBfZmPtekAqX768wsPDdfjwYe3bt08hISEpXdJ/1tSpUxO1bdiwQSNGjNCgQYP0zjvvSJK2bt2qrVu3Jur73nvvKTIyUidPnpSnp+dtH2fRokWqV6+eihcvrldffVWXL1/WiBEj5OXlpU2bNiljxozxfXPmzKmAgAB17949wTHy5s2rUqVKSZLi4uJUqFAhpUuXTi1atNCCBQu0YcMG7d+/X2nSpJEknT59Wnnz5tWsWbP03HPP3f+TA/zbDPCYO3jwoJFk5s6dazJmzGj69OmT0iXdVmRkZEqX4JI2bdoYm81mjh07dsd+R48eNTabzbRt2/auxyxYsKAJCQkx0dHR8W2bN282bm5uplu3bgn65siRw9SuXfuOx9u1a5eRZI4cOWKMMebq1avGx8fH/Pjjjwl+j7p16961NuBRwXA9HnthYWEKCAhQ7dq19fLLLyssLCzJfhcvXlTXrl2VM2dOeXl5KVu2bGrRooXOnj0b3+f69evq06eP8ubNK29vb2XOnFkvvfSSDhw4IElasWKFbDabVqxYkeDYhw8fls1m0zfffBPf1qpVK/n5+enAgQOqVauWUqdOrWbNmkmSVq9erYYNGyp79uzy8vJScHCwunbtqmvXriWqe/fu3WrUqJEyZswoHx8f5cuXT++//74kafny5bLZbJo3b16i/aZNmyabzaZ169bp0qVL2r17ty5dunRfz60kRUdHa86cOapcubKyZct2x77Tp0+XMSb+97yd8+fPa+fOnapfv36Cs/1ixYqpQIECmjFjRpL73bhxQ1evXk1y283nLiAgQJLk6+srHx8fRUVFSZI2btyosLAwDR069I61AY8SQh6PvbCwML300kvy9PRUkyZNtG/fPv35558J+kRGRqpixYoaNWqUnnvuOY0YMULt27fX7t27dfz4cUnO4d46deqob9++KlGihD7//HN16dJFly5d0vbt212qLTY2VjVq1FBgYKCGDBmiBg0aSJJmz56tqKgodejQQaNGjVKNGjU0atQotWjRIsH+W7duVenSpbVs2TK1bdtWI0aM0IsvvqiFCxdKkp555hkFBwcn+cYmLCxMefLkUdmyZTVv3jwVKFAgyTcDd7NkyRJdvHjxrsF98zGDg4NVqVKlO/aLjo6WJPn4+CTa5uvrq/DwcJ08eTJB+7Jly+Tr6ys/Pz/lzJlTI0aMSLA9b9688vf3V58+fXTkyBENHjxYly9fVvHixSVJnTt3VseOHbmUg/+WlB5KAFLShg0bjCSzdOlSY4wxDofDZMuWzXTp0iVBv48++ih+SP+fHA6HMcaYiRMnGklm6NCht+2zfPlyI8ksX748wfZDhw4ZSWbSpEnxbS1btjSSTK9evRIdLyoqKlFbaGiosdls8cPNxhhTqVIlkzp16gRtf6/HGGN69+5tvLy8zMWLF+PbTp8+bdzd3c3HH39sjDFm0qRJieq7Vw0aNDBeXl7mwoULd+y3fft2I8m8++67dz1mXFycSZs2ralatWqC9rNnz5pUqVIZSWbDhg3x7XXr1jUDBw408+fPNxMmTDAVK1ZM8rGmTZtmfHx8jCRjt9vNkCFDjDHGhIWFmUyZMplLly7d428NPBoIeTzWunbtajJlymRiY2Pj27p3756orVChQqZYsWJ3PFbt2rVNhgwZTExMzG37uBLy/wzof4qMjDRnzpwxK1euNJLM/PnzjTHOoJaU6A3LP928Fj1+/Pj4tlGjRhlJZt++fXfc924uXbpkvL29Tf369e/at3fv3kaS2bJlyz0du2fPnvFvgvbu3Ws2bNhgnn32WePh4WEkmdWrV992X4fDYWrUqGHc3d0TzRM4f/68WbdunTl58qQxxnltPlu2bGb8+PEmLi7O9OnTx+TKlcsUKVIkyTd9wKOE4Xo8tuLi4jRjxgxVqVJFhw4d0v79+7V//36VLl1ap06d0q+//hrf98CBAypcuPAdj3fgwAHly5dP7u7uyVaju7t7ktexjx49qlatWildunTy8/NTxowZVblyZUmKv25+8OBBSbpr3fnz59fTTz+dYMg+LCxMZcqUeeCh6Tlz5uj69et3Hao3xmjatGkqXLiwihYtek/H7tevn9q0aaNBgwYpb968KlmypNzd3dWmTRtJkp+f3233tdls6tq1q2JjYxPNjwgICFCZMmWUKVMmSVJoaKgCAwP12muvaeLEiRo7dqzGjx+vt99+W6+88or2799/T/UCKYGQx2Nr2bJlioiI0IwZM/TEE0/EfzVq1EiSbjsB70HYbLYk2+Pi4pJs9/LykpubW6K+1atX1+LFi9WzZ0/Nnz9fS5cujZ+053A47ruuFi1aaOXKlTp+/LgOHDig33//Xc2bN7/v4/xTWFiY/P39VadOnTv2W7t2rY4cOXJP1+1v8vT01Pjx4xUeHq5Vq1Zpz549+umnn3Tp0iW5ubnd9Q1KcHCwJOckvts5fPiwPv/8c40YMUJubm6aPn262rVrp2effVatW7dW2bJlbzvJD3gUJN8pB/AfExYWpsDAQI0ePTrRtrlz52revHkaO3asfHx8lCdPnrtOnsuTJ4/Wr1+vmJgYeXh4JNnn5sztixcvJmg/cuTIPde9bds27d27V5MnT04w0W7p0qUJ+uXOnVuS7mnSX+PGjdWtWzdNnz5d165dk4eHh1555ZV7rikpERERWr58uVq1aiUvL6879g0LC5PNZlPTpk3v+3EyZcoUf9YdFxenFStWqHTp0nc8k5dujXT8/fP0/9SjRw+98MILqlChgiQpPDxcWbJkid+eJUsWnThx4r5rBv4tnMnjsXTt2jXNnTtXderU0csvv5zoq2PHjrpy5YoWLFggSWrQoIG2bNmS5Oxy8//1pBo0aKCzZ8/qiy++uG2fHDlyyG63a9WqVQm2f/nll/dcu91uT3DMm9//c7Z4xowZValSJU2cOFFHjx5Nsp6bMmTIoJo1a2rq1KkKCwvT888/rwwZMsRvd+UjdDNmzJDD4bjr2XlMTIxmz56tChUqKHv27En2iYiI0O7duxUTE3PHYw0ZMkQREREJFr05f/58opGSmJgYDRgwQJ6enqpSpUqSx1q+fLmWLFmiQYMGxbdlypRJu3fvjv95165dCgoKumNNQIpKyQkBQEqZMWNGgklq/xQXF2cyZswYv/DJlStXTMGCBY3dbjdt27Y1Y8eONf379zdlypQxmzdvNsYYExsba5555hkjyTRu3NiMHj3aDBo0yDz33HMJHqdx48bG3d3ddOvWzYwePdrUrFnTlChRIsmJd6lSpUpU240bN0yePHlMhgwZzGeffWZGjRplnnnmGVOsWLFEx9i8ebPx8/Mz6dOnN7179zZff/21ee+995KcRPjdd98ZSUaSmTlzZoJtrsyuL1GihMmSJYuJi4u7Y7+FCxcaSWbs2LG37XNzEuKhQ4fi27799lvz4osvmqFDh5qvv/7aNGrUyEgyr7/+eqLa8+TJY3r27Bn/91a4cGEjyfTv3z/Jx4uNjTVFixY1H330UYL2UaNGGR8fH9O/f3/Trl074+bmZrZv336XZwJIOYQ8Hkt169Y13t7e5urVq7ft06pVK+Ph4WHOnj1rjDHm3LlzpmPHjiZr1qzG09PTZMuWzbRs2TJ+uzHOj7a9//77JleuXMbDw8MEBQWZl19+2Rw4cCC+z5kzZ0yDBg2Mr6+vCQgIMO3atYv/+Ni9hLwxxuzcudNUq1bN+Pn5mQwZMpi2bduaLVu2JBnE27dvN/Xr1zdp06Y13t7eJl++fObDDz9MdMzo6GgTEBBg/P39zbVr1xJsu9+Q3717t5GUaOW5pDRu3Nh4eHiYc+fO3bZPUiG/fv16U6lSJRMQEGC8vb1NsWLFzNixYxN8PNAY58ck69atG//35ufnZypUqGBmzZp128cbPXq0yZYtW6J/HzExMaZbt24mQ4YMJkeOHGby5Ml3/f2AlMTa9QAkORfeyZIli+rWrasJEyakdDkAkgHX5AFIkubPn68zZ84kWjUPwH8XZ/LAY279+vXaunWrPvnkE2XIkEEbN25M6ZIAJBPO5IHH3JgxY9ShQwcFBgZqypQpKV0OgGTEmTwAABbFmTwAABZFyAMAYFGEPAAAFkXIAwBgUY/UDWrWH8mV0iUA+IfSOQ6pZnCXlC4DwD/8cGzEXftwJg8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWJTLIb969Wo1b95cZcuW1YkTJyRJ3377rdasWZNsxQEAANe5FPJz5sxRjRo15OPjo02bNik6OlqSdOnSJfXv3z9ZCwQAAK5xKeQ//fRTjR07VuPGjZOHh0d8e/ny5bVx48ZkKw4AALjOpZDfs2ePKlWqlKjd399fFy9efNCaAABAMnAp5IOCgrR///5E7WvWrFHu3LkfuCgAAPDgXAr5tm3bqkuXLlq/fr1sNpvCw8MVFhamHj16qEOHDsldIwAAcIG7Kzv16tVLDodDVatWVVRUlCpVqiQvLy/16NFDnTp1Su4aAQCAC2zGGOPqzjdu3ND+/fsVGRmpggULys/P74GKWX8k1wPtDyD5lc5xSDWDu6R0GQD+4YdjI+7ax6Xh+qlTpyoqKkqenp4qWLCgSpUq9cABDwAAkpdLId+1a1cFBgaqadOmWrJkieLi4pK7LgAA8IBcCvmIiAjNmDFDNptNjRo1UubMmfXWW2/pt99+S+76AACAi1wKeXd3d9WpU0dhYWE6ffq0hg0bpsOHD6tKlSrKkydPctcIAABc4NLs+r/z9fVVjRo1dOHCBR05ckS7du1KjroAAMADcvkGNVFRUQoLC1OtWrWUNWtWDR8+XPXr19eOHTuSsz4AwN9Ua1hKs7eHpnQZ+I9w6Uy+cePGWrRokXx9fdWoUSN9+OGHKlu2bHLXhgfQ4jnPO25/sXmcXmrx70yY7N/DXbu3uunN3rEqU8UR3/7jXDf9PM+uod/G/Ct1AI+KbkObqnrD0onaW1f8RBGHz6ZARbdUa1hK3Yc2kyQ5HA6dP3VZG1fv0cT+C3TpXGSK1ob751LI2+12zZo1SzVq1JDdbk/umpAMRs64Ef/9+pVumjvZroETb4Wpt8+tvsZIDof0MP8qPTyNvptsV8mKDrk/8EUi4L/vz+U7Naz7tARtj0qIXr18TW2f+Uw2N5tyF8iqrp83VfpMafRB87EpXRruk0v/3YaFhSV3HUhmadPd+t43lWSz3WrbtcWm0Hc81P3TGM35xq5jh216NzRWq392U1SkTW/3jY3fd+oYu44esOm9Ic42h0NaPNNNy5fYdemCFJTNqF7TOJWqdOc1lcpUcWjTOjetWOKmai84btvvr99smj/VrvAjNqVNL1WoHqcXmjri34CEH5UmDHPX4b02ZcwsNX8zVoN6eajLxzEqUd7ldZ2Af13MjVhdOHMlUXv9ts+oeqPSypw9va5cjNL6X3Zowmff63rUjSSOIuUqkEXt+rykJ4oGS0Y6ceiMRvWeqX1bj0mSCj2dW6161dETRYN1+fxV/fbjVk0asEjR15I+niQZY+JrO3/qshZMWqVXe9SSp7eHYqJj1aTzc6rZrJz80/np6P6TmjRgof5asVuS5O5hV9uPXlSFmsXk5++rC2evaMnUtZo1+pcHfcrggnsO+ZEjR+qNN96Qt7e3Ro4cece+nTt3fuDC8PDNmmhXk7ZxypjZKNU9rmW0aIab1v5qV6susQrKarRnm5u+GuiuNGljlb/o7UPWx1d6oUmcvg+zq2J1h7x8EvfZs82mrwe5q/mbccpXxKHT4TZNHO78J1r/VYcccdKIPh5KH2j08chYXbsmTf+KkSRYi3EYjf1ojk4eO6/M2dPrrc8aqs379TT6/dlJ9n93VAsd2H5cX7w3S444o9yFsio2xnkpLnOO9Prk2/aaMnixhnWfLv/0qfTmJy/rzU9fTjSKcCfR12Nkt7vJbndTrTaV9dIbVTSq90zt335CNV4prY8ntFX7qgMUfviM6rWupDLVi6j/m9/ozIkLypglQBmypE2OpwYuuOeQHzZsmJo1ayZvb28NGzbstv1sNhsh/x/xUos4FS5x72e/MTekBdPt6jkwVk8UdO4XmNmhvdttWrbYTfmL3vkaf9W6Dv08364f5rjpxeaJz+bnTbWrzitxqvic4//HNmrQMk4zx9tV/1WHtm+06XSE1HtIbPyoxMuvxWlQL5fnjwIppnTVQpq7e1D8zxuW71T/Dt9o/oSV8W2nj5/XlMGL1TG00W1DPjBLgOaM/VXHD5yWJIUfPhO/rdFb1bV83ob4Y4YfPqOxH8/VwNmd9MV7sxQTHZvkMf8uS86Mqt28nPZuOaprV6PVoF0VzR7zq1Yu2CRJmhi6UEXLPaEXX6+sLz/4ThmzBCj80Bnt+OOg83c4ceE+nxkkp3sO+UOHDiX5Pf67cuW9v+HtU+E23Yi2aVCvhP9sYmOlHHnufiwPT+cbi29H21W1buKQP3bQpn077Fow/dbZucMhxdywKfq6FHHcpnQZE16KyJOPIXr8N235bb++eH9W/M83h+OfrJBXr7xVXdlCAuXr5y27u5u8vD3l5e2h6OuJJ6nOHbdcXQY10bMvPa1Na/ZqzeJNijhyTpKUu2BW5cqfRVXql4zvb7NJdrubgoLT69j+U0nW5ufvq7m7B8nmZpOnl7t2/HlQI96ZIV8/L2UISqudGw4m6L9zwyHlKpBFkrR09h/qP+1NjVv5vv5asUt//LpDG1ftebAnCy5z6Zp8v3791KNHD/n6+iZov3btmgYPHqyPPvooWYrDw+XlnfBnm5v0z8iM+9sb/ehrzj+7fxqrgPQJe7p73Ntjlqvq0A/fuen7aXZlyJTwGNevOd8ElCyf+A2Ax50/LAD851y/Fp1oJn1gtnTqO+kNLZ66VpMHLdKVi1EqVCq3ug5pKndP9yRDPmzYj1ox/y89XbWQnq5SQK92q6kBHSfrtx+3ytvXU0vC1ur7SasS7XfmDmfYUVeuq2OtwTIOo/OnL+vG/x/X18/rrr/Xge3H9Vq5vipZpaCerJBXvb9spc1r9uqz9pPuui+Sn0vjnH379lVkZOJZoFFRUerbt+8DF4WUkcZfunQ+YdvRA7b477PkMPLwMDp32qZMWZXgK33gvT2Gm5vUsHWcli1y09lTtgTbcoYYRRxLfOxMWZ37Zc5mdP6MdOlv/zcd3GsTYBVPFAmWzc2mcf3ma/emIzpx6IzSZfK/634nDp3R/PEr9H6zMVr74xZVb1RKkjNwsz8RpIjDZxN93bxunxSHw6GIw2d18ui5+ICXpKjIaJ09eVEFS+ZO0L9gyVw6uu9kgn6rFm7SyJ4zFfrWZFWo/aT80iY8KcS/w6WQN8bIZkv8n+uWLVuULl26JPbAf0GBJx06tNemNUvddPKENHeKXccP3/p79vGVar7sUNhYu1b/7KZT4dLhfTb9PN9Nq3++939KT5Y2ypPPaPnihPvUax6ntb+4ad63bjp+2KYTR6Xfl7vpu0nO4fvCxY0CM0tfD3bX0YM27d1h03ff/H9on6yHBYQfPiMPT3e98FolBWVPr2dfKqnazcvftr+nt4c6fNJARcqEKDBrgAqWzKW8xbLr2D7nMPysL39VgZK51OGTBspdMKuy5MyoMs8VVodPGrhc45yxy9SwQ1VVqvuUsuYO1Gu96ip3waz6foJztKB+22dUuV5xZcsTqKy5Mqpi7Sd1/tQlXb10zeXHhOvua7g+ICBANptNNptNefPmTRD0cXFxioyMVPv27ZO9SPw7ipY0qtfMoZnj7Yq5YVfFGg6Vr+7Q8UO3/p4btIpT6rRGi2bYdfqkXb6ppJxPGNVtfH8L6zR6PU6fvO2hv18gKFrSqOsnsfp+ql2LZ9lkt0uZg40q13QO37vZpS59YjRhmLv6dHJXxiCpcdtYDfvIjeF8WMKhXeH6qu88NXyzqlr1qqPt6w9o0oCFemfEq0n2d8Q5lCYglXoMb66ADKl16UKkfvthq74d+oMk6fDucPVsOEot362twXM6y2azKeLIWa1auMnlGr+fuEq+qX3U9sMX5Z/eT0f3nVTfNuPiJ/xdi4xWw/ZVlSVXRjniHNq75ag+avmVjGH+TEqwmft45idPnixjjFq3bq3hw4fL3//WMJKnp6dy5sz5QCvfrT+Sy+V98Xjau8OmT7t6aPA3N5QpS0pXY02lcxxSzeAuKV0GgH/44diIu/a5rzP5li1bSpJy5cqlcuXKycPjHmdbAclkwxqbvH2kTFmNToXbFDbGricKOQh4AEiCS7PrK1euHP/99evXdeNGwpWT0qRJ82BVAbdx/ZpNMyfYdf605OcvFXrKoSbt/p01+AHgv8alkI+KitK7776rWbNm6dy5c4m2x8Xd+T/d6OhoRUdHJ2jz8rr7RzOACtUdqlD99sviAgBucWl2/TvvvKNly5ZpzJgx8vLy0vjx49W3b19lyZJFU6ZMuev+oaGh8vf3T/AVGsqtEwEASE73NfHupuzZs2vKlCl65plnlCZNGm3cuFEhISH69ttvNX36dC1ZsuSO+9/uTH7zyfz3WwqAh4yJd8CjKdkn3t10/vx55c7tXAwhTZo0On/euYJKhQoV1KFDh7vu7+XlxfB8Cvl1oZuWLXLTmf8vRJM1h9GLzeJUrJTRmZNS9xZJfxat4wcxd7zT3Imj0qzx7tq91aa4OOdxO30UqwyBuqfjRl52fv591xabMmU1er17nHKG3Hq8yaPsCsxsVPNlhuphTYVL59HL7Z5VSNFgpc/kr36vj9e6n7ZJkuzubmr5Tm2VfLagMmdPr6tXrmvT6j2aNGChzp+67NIxb7pdUIz/9HvN+WqZPDzt6jKoico+V0Tnz1zW6Pdna/OavfH9GrR7VoFZAzTmoznJ8CwgubkU8rlz59ahQ4eUPXt25c+fX7NmzVKpUqW0cOFCpU2bNplLRHJKl8GoUZs4ZcpqZIy0Zqldw/u465MvY5Ul2CS4D70krVjipiWz7Sr69O0D/lS49GlXD1V+3qH6LeLk42t04ohNnv//8EX6jLrrcRdMt+v6NanflzFattCuicPs6jfauabu/l02Hdht06tvMsEO1uXt46mDu07o51nr9eG4Ngm2efl4Kk/hYE0f8ZMO7gxXan8ftev7kj6e2FZdan/u0jFvalr8gwQ/l6xSUG8Pbqy1P2yRJNVsWk5PFAlW1xeH6ekqBdRzVAs1ecq5T6bgdHq+aVl1qT3kQX51PEQuhfxrr72mLVu2qHLlyurVq5fq1q2rL774QjExMRo6dGhy14hk9FTZhGHd8DXnErMHdtmULadJcPMXSdqw1k2lKjnkncStYW/6bpJdxUo51LjtrRDOlOXW47jZddfjhh+1qcwzDmXOJj1TO07LlzjfIcTGSt+MsKt1tzi5cVdZWNiGFbu0YcWuJLdFXbmu95t9maBtzIdzNGJRd2XMEqAz4UmvQ3+nY970z3val3musLb+tl8njzonVQc/EaTfl27X0b0ndfLoOb3+wYvyT5dKl85fVcf+jTQpdKGiIqOTOjQeAS6FfNeuXeO/r1atmnbv3q2//vpLISEhKlq0aLIVh4fLESf9scpN0delkIKJh8EP7bXp6AE3teyY+KYY8cdwSFv+cFOthnEa1NtdR/bblDHIuQJeifJJn/0nddzsuY12brapck1p2wY3Bed27rtklpvyFzPKfZ93zAOszje1txwOh65ejkq2Y6bNkFqlni2kz7uFxbcd3HlCVV96Wp7eHipROb/OnbqkS+evqsqLJXQjOka//bg12R4fyc+lkP+nHDlyKEeOHMlxKPwLjh2yqV8Xd8XckLx9pC4fxyprEn99K390U5bsRk8Uun3AXr7o/Oz6opl2vdwqTq+8brT1T5tG9nNX78Gxyl808b5JHbdO4zh9M9KuHi09lCGT0evdYnXyhLR6qV0fjYjRpBF2bf/LTbnyOtS6a5x8UyXHMwH8N3l4uat17xe08vuNyXoWXe3lp3Xt6vX4oXpJ+nnm78pVIIu++rW3Ll+4qtAO38gvra9e7VFL7zYcpRbv1FLlF4or4shZDesxXedOXkq2evDgXAr5kSNHJtlus9nk7e2tkJAQVapUSXY746uPoszZjD4dE6Ooqzb9udpNXw9213tDYhIE/Y1o581h6jW783Xwm5/NKF7OoecbOEcDcuQx2r/TOcEvf9GE+9/uuL6ppDd7x0m61R76jrsat43Vul/ddCbCpoETYzRxmF3zp9rVlAVw8Jiyu7vpvTGtZLNJX7w36+473IfnXimj5fP+Ukz0rXtMx8U69OUH3yXo1/Xzpvp+4irlKZxNZWsU1ZvPDVLDDlXVvm8DfdZuYrLWhAfjUsgPGzZMZ86cUVRUlAICAiRJFy5ckK+vr/z8/HT69Gnlzp1by5cvV3BwcLIWjAfn7uG8fatklCtvnA7utenneXa99vat4PxztZuio6Xy1e48mz11GsluN8qaPeEZe5bsRnu3J7413L0ed9VPbvL1k0qUMxrR167i5Rxyd5dKVXJo7mTePOLx5Az41xSYNZ16vfJFsp7FFyqVW8EhmRT65jd37Fe0bIhy5A3SiHemq80H9fTnsp2KvnZDqxZt0uBWFZOtHiQPlxbD6d+/v55++mnt27dP586d07lz57R3716VLl1aI0aM0NGjRxUUFJTg2j0eXcYhxfzjsvvKH91UvIxRmrR33tfdQ8qVzyjieMJAP3ncpvSZkh6qv9txL1+U5k+169W3nGcTDod0cxHFuFjnz8Dj5mbAZ8mVUe81Ga0rF5PvWrwk1WhcRnu3HtWhXeG37ePh5a63Pm2oUb1myuEwcnNzk7uH8023u7tdbm7c8/lR41LIf/DBBxo2bJjy5MkT3xYSEqIhQ4aod+/eypYtmwYNGqS1a9cmW6FIHrMm2LV7q01nTjqvzd/8udyzt5Lz1AlpzzabKtdMeki8Z2sPbVhz68Vc6+U4rV/ppuVL3HTqhLT0ezdt+t2mqnUTpvHdjntT2Bi7ar4cp3QZnD/nLeTQ2l/cdOKotHyJ/Y5zBID/Km9fT+UumFW5C2aVJGUKTq/cBbMqY5YA2d3d9P5XrfVE0WAN6jRFbnY3BWRMrYCMqeNDVpJCp7+lui0r3tMx/87Xz0sVaz+pn6b/fscam3apoT+X79SBHSckSTs3HFS554sqZ/4sqtuqonZuOJQszwWSj0vD9REREYqNjU3UHhsbq5MnT0qSsmTJoitXriTqg5R1+aJz0ZmL5yUfXyk4t9E7/WNVuMSt4Fz1k10BGZSg7e8ijtt0Lcqmm/eCL1nBqFXnOC2aYdfUL+3KnM25EE6+wgn3v9txJWnrBptOhdvUruetNwLVXnDo0F6b+nb2UO58RvWbcz0e1vNE0ewaNLtT/M/tPq4vSVo6e72mDv1RZZ8rIkn68ueeCfZ7t+Eobft9vyQpc470SpPu1qzUOx1zaLdp8e2VXygu2Wxa8f1ft60vR77MqljnKb1VY1B825rFW1S07BMaMqezjh88rYGd7r6sOf5dLi1rW7t2bZ08eVLjx4/XU089JUnatGmT2rZtq6CgIC1atEgLFy7Ue++9p23btt3laLdwP3ng0cOytsCj6V6WtXVpuH7ChAlKly6dSpQoEb9EbcmSJZUuXTpNmDBBkuTn56fPP7/9SkwAAODhcmm4PigoSEuXLtXu3bu1d69zDeN8+fIpX7588X2qVKmSPBUCAACXPNBiOLlz55bNZlOePHnk7p4s6+oAAIBk4tJwfVRUlNq0aSNfX18VKlRIR48elSR16tRJAwYMSNYCAQCAa1wK+d69e2vLli1asWKFvL2949urVaummTNnJltxAADAdS6Nsc+fP18zZ85UmTJlZLPd+rx0oUKFdODAgWQrDgAAuM6lM/kzZ84oMDAwUfvVq1cThD4AAEg5LoV8yZIltXjx4vifbwb7+PHjVbZs2eSpDAAAPBCXhuv79++vmjVraufOnYqNjdWIESO0c+dO/fbbb1q5cmVy1wgAAFzg0pl8hQoVtHnzZsXGxqpIkSL6+eefFRgYqHXr1qlEiRLJXSMAAHCByx9uz5Mnj8aNG5ectQAAgGR0XyHv5uZ214l1NpstyZvXAACAf9d9hfy8efNuu23dunUaOXKkHNzsGwCAR8J9hXy9evUSte3Zs0e9evXSwoUL1axZM/Xr1y/ZigMAAK5zaeKdJIWHh6tt27YqUqSIYmNjtXnzZk2ePFk5cuRIzvoAAICL7jvkL126pJ49eyokJEQ7duzQr7/+qoULF6pw4cIPoz4AAOCi+xquHzRokAYOHKigoCBNnz49yeF7AADwaLAZY8y9dnZzc5OPj4+qVasmu91+235z5851qZj1R3K5tB+Ah6d0jkOqGdwlpcsA8A8/HBtx1z73dSbfokUL1qYHAOA/4r5C/ptvvnlIZQAAgOTm8ux6AADwaCPkAQCwKEIeAACLIuQBALAoQh4AAIsi5AEAsChCHgAAiyLkAQCwKEIeAACLIuQBALAoQh4AAIsi5AEAsChCHgAAiyLkAQCwKEIeAACLIuQBALAoQh4AAIsi5AEAsChCHgAAiyLkAQCwKEIeAACLIuQBALAoQh4AAIsi5AEAsChCHgAAiyLkAQCwKEIeAACLIuQBALAoQh4AAIsi5AEAsChCHgAAiyLkAQCwKEIeAACLIuQBALAoQh4AAIsi5AEAsChCHgAAiyLkAQCwKEIeAACLIuQBALAoQh4AAIsi5AEAsChCHgAAiyLkAQCwKEIeAACLIuQBALAoQh4AAIsi5AEAsChCHgAAiyLkAQCwKEIeAACLIuQBALAoQh4AAIsi5AEAsChCHgAAiyLkAQCwKEIeAACLIuQBALAoQh4AAIsi5AEAsChCHgAAiyLkAQCwKEIeAACLIuQBALAoQh4AAIsi5AEAsChCHgAAiyLkAQCwKEIeAACLIuQBALAoQh4AAIsi5AEAsChCHgAAiyLkAQCwKEIeAACLIuQBALAoQh4AAIsi5AEAsChCHgAAiyLkAQCwKEIeAACLIuQBALAomzHGpHQRAAAg+bmndAF/V92tYUqXAOAfljpmy3Eyb0qXAeAf3IL23r3Pv1AHAABIAYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUS6H/OrVq9W8eXOVLVtWJ06ckCR9++23WrNmTbIVBwAAXOdSyM+ZM0c1atSQj4+PNm3apOjoaEnSpUuX1L9//2QtEAAAuMalkP/00081duxYjRs3Th4eHvHt5cuX18aNG5OtOAAA4DqXQn7Pnj2qVKlSonZ/f39dvHjxQWsCAADJwKWQDwoK0v79+xO1r1mzRrlz537gogAAwINzKeTbtm2rLl26aP369bLZbAoPD1dYWJh69OihDh06JHeNAADABe6u7NSrVy85HA5VrVpVUVFRqlSpkry8vNSjRw916tQpuWsEAAAusBljjKs737hxQ/v371dkZKQKFiwoPz+/ByqmulvDB9ofQPJb6pgtx8m8KV0GgH9wC9p79z6uHHjq1KmKioqSp6enChYsqFKlSj1wwOPR8FzLZzTv/DcpXQYAIBm4FPJdu3ZVYGCgmjZtqiVLliguLi6568IDeGfiW1rqmJ3oK0ueoJQuTc+1fEZLHbPVf8n7CdpT+ftqqWO2ilYumEKVAf++ApVtd/z6YtK/V0uLLrfqKVZdqtNCmjbv33t8PBwuXZOPiIjQjz/+qOnTp6tRo0by9fVVw4YN1axZM5UrVy65a4QL/vhhk4a0/jJB26Uzl1OomoRiY2JVvFoRFXumkLas2JHS5QApZtXcW1dLf1gujZooLfn21nZfn1vfGyPFxUnuLv2vfW8a1jHq1Fq6Hi19/5P0yXCb/FMb1a728B4TD5dL/1zc3d1Vp04d1alTR1FRUZo3b56mTZumKlWqKFu2bDpw4EBy14n7FBMdowunLiZqb9C1jmq0qqKg3IG6cj5Svy/6S+PenarrV68neZzcRXOow7BWylsyj4wxOrHvpEa0/0p7/zooSSpUPr/a9G+qvCXz6NLZy1o7/w9N7D1N16Oib1vb9avRWjl7ndqENlPnsu/dtl/GbOnVbkgLlXiumBwOo+2rd+nLtyfp1JEzkiQ3u5vaD22p6q9WliPOoR8m/KqATGmVyt9XfV4afB/PFpAyMqa/9X3qVJLNdqvtj01Sy7dt+mqg0YgJ0r6D0vgh0rwfpSuR0hef3dq3/yhp935pygjnzw6HNH6aNGuhdPa8lDNY6tBCqvHMnevx9r71+B1fkxb9YrRsrVS7mhR+SvpshPT7RmedFUtJ73eRMqRz9t+9XwodJW3f49yeI5vUt7tUOH+yPFVw0QPfoMbX11c1atRQzZo19cQTT+jw4cPJUBYeFofDodFdJqpt4W4a3Gq0nqxSWG0HNb9t/15TO+vs8fPqWKqX3irZUzMHzlNsjPPyTObcmRT6w/taPfd3tSvWXZ81HqbC5fOr46g2d63j2z6zlKtIdlVsUCbJ7XZ3u0J//EBRkdfVtdJH6lrhA12LvK7+P7wvdw/ne9PGPV9U1aYVNaT1l3q7wgfyTeOr8i+WcuFZAR5dQ7+Wur0hLZoi5c1zb/t8HeY8E+/TXVo4WWrZUHr3M+mPzff32N5eUkys801Dx/ekS5edbyQmfC4di5C69b3V951PpUwZpdlfSd+Nk9o2fbijDrg3Lv8V3DyDDwsL06+//qrg4GA1adJE3333XXLWBxeVqVNCCy7fGvf784dN+uSVoZo3Ykl826kjZ/TNhzPUZUxbjXprfJLHCcyeQbOHLNCxPeGSpBP7T8Zva9K7vn6dtjr+mCf2n9ToLpP0+Yq+GvHmOMVEx9y2vnMRFzRv5BK99mkTrZ3/R6Ltz7xSTjY3m4a+Pia+bUjrLzXvwjcq9kxB/bV0q+p1rKnpA+bF7/9FxwkqVfOpe3l6gP+MTq2l8k/fe/8bN6SvpzqD+KnCzrbgLNJf26RZC6RST979GHFx0uJfpT0HbGpY12jdX9LeQ9LSGVLmQGefAe9JdVvatG2XUZECUsQpqU1jKXcO5/ac2e7r18RD4lLIN27cWIsWLZKvr68aNWqkDz/8UGXLlk3u2vAANi/foZFvjov/+eZw/FNVi6hJr/oKzp9Vvml8ZHe3y8vHU14+noq+diPRceYMW6Ru49qrWvNK2vjrNq2avU4RB09Jcg7l5yqaQ1WbVry1g02y292UOVegju4+cccaZw6cr9pvVNfzrZ/Vylm/JdiWu1hOZQ0JSvBGRZI8vT2UOU+QfNfvV7qgtNrzx62VFx0Oh/b9dVA2N9u9PUnAf0DhfPfX/8gJ6dp1m17vkfDT0TExUoEn7rzvjPnSnMXOvm5uUsuGRk3qSWFzpaCMtwJekkJySmn8jA4ckYoUkFo1kj4cJH3/s1SuhPPSQPas91c7kp9LIW+32zVr1izVqFFDdrs9uWtCMrh+9brCD5xM0JYpR0Z9urCXFo79WZM+mK7L5yNVuEJ+9Zjwptw93ZMM+W/7ztayaWtUunZxlXr+KbXo00j9mwzX2vl/yMfPW4u/Xqr5I39ItN/po2fvWuPVS1GaMWCeXv2oodYv+ivBNh8/b+3966AGNB+ZaL+Lj8gEQuDf4OOd8Gc3m3MS3t/Fxt76Puqa888xA6RMGRL28/S882PVqSa1e9U5TJ8xvTPo71XH15zX7leuk1avl0ZNkj7/SKqe+DYn+Be5FPJhYWHJXQf+BU+UyC2bm5u+6j5FN9dAqtzo7iMwJ/ZFaO7wxZo7fLHeC+uiGq2qaO38P7Rv4yHlKJAt0ZuJ+zF/1A96sVNN1e9SK0H7vo0HVblROV08fUlRV64lue/5kxeV7+k82rZ6lyTJzc1NIcVz6cDmwy7XAzzqAtJK+w4lbNu9/9b175CckqenUcSpexua/zs/P+eEuX/KnUM6eUaKOH3rbH7/YelypE0hOW+948gV7Pxq1Ujq3lea9wMhn9LuOeRHjhypN954Q97e3ho5MvHZ1d917tz5gQtD8gvff1Ienu56sVNNrVu4QYXL51edds/dtr+nt6feGPyqVn23TicPnVbGbOmV9+kQrZn7uyRp5qD5GrmuvzqOaqMfxv+q61evK3vBbCpRvZi+6DThnmqKiY7RlD6z1OmL1xO0LwtbrUY9XlDf+e9q8sczdfb4eQXmyKAKL5XWrEHf6+yJ8/r+ix/UuFd9ndh/Usd2h+vFTjWVOsAv0VkOYCVliksTZ0jzf5SeLCwt/NkZ+jeH4lP5Sq+9Ig0Y7TzjL15EunJV2rRN8kslvfj8/T9muZJS3lzSO59IvTs5r9n3GyY9/aRR4fzOj9wNHiPVqCxlzSydOuOcZU/Ap7x7Dvlhw4apWbNm8vb21rBhw27bz2azEfKPqINbj2hMt2/0yrv11Lp/U21btUsT35umnlOSvt+AI86hNOn81HNyJ6XN5K/LZ69ozbz1mvzxLEnSoW1H1f2Zj9X60yYauqqf82ZFB04mur5+N0snr9TL3eoqZ6Hg+LboazfUrfLHen1AM3085x35pvbW2RPntWnZdkVddp7Zzxg4XwFBadVzcifFxTm0ZNwv2vDTZjniHC4+Q8Cjr0Ip58fhPv9Kir4hvVRTqvecc2LcTV3aSOnSOmfZHw+XUvtJBfNKb9z+gzR3ZLNJX/R3foSuReeEH6GTnMP6Fy9JvfpLZy9IAf5S9YpSp9ce+NfFA3qgteuTG2vX40HYbDZN2DlcK2f/pskfzUzpciyDteuBR9NDW7u+X79+ioqKStR+7do19evXz5VDAvctMHsG1Xy9qrI+kVk5C2dX5zFtFZQrUMunrUnp0gDgkeDSmbzdbldERIQCAwMTtJ87d06BgYEur2XPmTzuR8Zs6fX+9LeVs3B2ySYd3n5ME3qHxU/EQ/LgTB54NN3LmbxLs+uNMbLZEn8WecuWLUqXLt1d94+OjlZ0dMJlT728vFwpBY+xM8fP6e2KH6Z0GQDwyLqvkA8ICJDNZpPNZlPevHkTBH1cXJwiIyPVvn37ux4nNDRUffv2TdD28ccf308pAADgLu5ruH7y5Mkyxqh169YaPny4/P3947d5enoqZ86c97Ty3e3O5Ov4uDj1E8BDw3A98GhK9uH6li1bSpJy5cqlcuXKycPDw6XCvLy8GJ5/hPj4eavVJ41V/sVSShvor/2bDunLtydp74bb303w2aYV1Oidesr6RGZdvRSlP3/cpK/f+VZXzkfG96nfpZbqtq+hwOwZdOnsZa2e87sm9J4Wv6b9s00rqE1oM/n4eeunb1boq+6T4/fNlCOjBvz0gd56utdtF8MBrGxcmDT0a5tefdnovf9/yjU6Whr4pbRkmXPp2fJPSx91vXUnuH+KiZVGjJdW/S4dj3B+Tr5sCal7Oynwb6vhHTomDRkjbdzuPG6+PFLn1lLp4s7tFy9Lvfs7b3CTI6v0aU/nR/Ju6jfMuT7+a688lKcCD+CeZ9dfvnxrKdGnnnpK165d0+XLl5P8wn9Lt3EdVLxaUQ1sMUpvFO2uv5Zu0aClHyl9lqT/5yhULp/endxJP05cpraFu+mTRkOV7+kQdfv61qWaKk0q6PXQZvq232y1Kfi2hr4+Rs80KqfW/ZtKktKkT61u4zro63e+Va8an6pqs4oqXbt4/P6dR7+uCb3DCHg8lrbtkmYukPLlSTjQGvqFtOI3aXhf593gTp+VOt9hWsr169LOvc7P1c8ZJ438RDp8THrzH3d47tBLio2TvhnmvINcvjxSh97SmXPO7V99K1295tz29FPSR0Nu7bt5h7R1l9Ti5WT65ZGs7jnkAwICdPr0aUlS2rRpFRAQkOjrZjv+Ozy9PVWxQWmN6zlV21bvUviBk/q272yd2H9SdTskvRpegbJ5derwac0f9YNOHj6tHWt3a/HXS5WvVEh8n0Ll8mnH2j1aPn2NTh05o7+WbtXyGWuV/2lnn8y5M+nqpSitnPWb9m44oC3Ldyh7Aed6mlUal1dsTJzWzEt8dzrA6q5GOW/b2u8dKU3qW+1XIqW5S6SebzlXvSuUT+rfS9q03abNO5I+Vmo/aeJQqeazUq7s0pOFpA+6SDv22BTuvM+ULlyUjhy3qW1TZ7jnzOY807923Ra/fO6BI1KtZ51L1jaqIx084myPiZX6DpX6dJO4jcmj6Z6H65ctWxY/c3758uUPrSD8u+zubrK72xVzPeHNaW5cu6HC5fMnuc+udXvV+rOmKlXzKf3xwyalDfRXpQZl9ccPm+L77Phtj6o2q6h8T4doz5/7FZQrUKVqPqVfpq6S5FwP38vXU3mezKnTR84q39N59NOkZfJLm0ot+zXWO8/2eVi/MvBI+2S4VLmscynZsX+7CeOOvVJMrE1lS9w6u8+dQ8qcyWjzDmeA34srVyWbzSiNn/PntP5SruxG3//kHIL39HCOIqQPMCr0/zvg5Q+R1m+UXq4trflTypvb2T5huvT0k1LhpP+rwCPgnkO+cuXKSX6P/7Zrkde147c9avbByzq664QunLqkKk3Kq0DZvArfn/SNZ3b8tkcDmo/Q+zO6ytPbQ+4e7lq3YEOCe9Ivn75G/hlSa9jqT2SzSe4e7lo49mdND50nSYq8eFWDW41Wz8md5OnjqaXfrtSGn7eo2/gO+n70DwrKFah+3/eU3cOub/vO1uo5v/8rzweQkhb/6hxen/1V4m1nz0keHibB2b0kZQiQzp6/t+NHRzuXw61d1Xl9XnIuUTvxc6njB1LJms4latOllb4eJPn//7HaNnWesT/XVMoa5Lwmf/i4c/386V9KfT6X1v7pvC1uv3ecIwh4NLj0Ofkff/xRfn5+qlChgiRp9OjRGjdunAoWLKjRo0czZP8fM7DFKPWY8KZmnPhacbFx2rfxkJZPX6O8JXIn2T97gWx6c/hrmvrJd9rw02alzxygtoNeVZexb2jo62MkSUUrF1ST3i9p1FvjtGv9fmUNCdKbw19Tsw8aKOzTOZKktfP/0Nr5t4bki1YqqNxFsmt0pwmavG+U+jcdofMnL+qL9aHatmont5iFpUWclkJHSRM+lx7GvOSYWKlrH+dNaz7udqvdGOfoQbq00tRRzsf+bpHzuv2sr6TA9M7QHvJRwuO1elt6p4O0aKl0LFxaMlX6aLD05WTnJQU8Glxa1vadd96Jn2C3bds2devWTbVq1dKhQ4fUrVu3u+yNR03EwVPqXuVj1fVrrqbZ26tTmd5y93BXxMHTSfZv0qu+dqzdo9lDFujQtqPa8PMWjXxrvGq2flbpgtJKklr1a6xfpq7SDxOW6fD2o1o7/w9NfH+aGveqn+RCSh6e7uo0+nUNb/+1soQEyc3drq2rdur43nAd3xuu/KWfeJhPAZDiduyRzl2wqUFbqfCzzq8/N9s0dY7z+/TppJgYmy5fSbjf2Qu3n11/U0ys1PVjKfyU803EzbN4Sfp9o7RinTT0Y+cd6wrldb4J8PKUvv8x6ePNXeIM/qoVnDPuq1aQPNylGs84f8ajw6Uz+UOHDqlgwYKSpDlz5qhu3brq37+/Nm7cqFq1at1lbzyqrkdF63pUtPzSplLJGsU0rufUJPt5+XoqLjbhnd5u3vntZoB7+XrJOG7f55/LMzT9oIE2/LRZ+zcdUp4nc8rufmsWj7uHu9zsLr0fBf4zypaQvp+U8HXx/gCjXNml15s67+Pu4W70+0bpuf9fMT10VIo4ZdOThW6/3MnNgD9yQpo83HmHuL+7ft355z/fe7u5SY4kbuh4/qLzbD3sC+fPDodzZr4kxcYmvQ9Sjksh7+npGX+Dml9++UUtWrSQJKVLl46P0P0HlXyumGSz6fiecGUJCdIbg17Vsd0n9NMk5wTL1v2bKkOWdBrUyvmq/n3RX+r6dTvVaf9c/HB9h2GttGv9Pp2LuPD/PhvUoGsd7d90SLvX71eWkCC17NdYvy/8S45//C+QvUA2PdOonDoUf1eSdGx3uIzDoedbP6vzJy8qOH8W7fnz9p/ZB6wgle+tCW03+fg4J8bdbH+plvM+8f6pnWfjn46QnixkEky6q/Wq1LWt817uMbHS2x85r/OPGeC8D/zNj8X5p3FOsnuykHMWf+9Q6c2Wt4brT0Q4JwD+U+go5+fhM2V0/vxUYWnBz1L5ktKshc6f8ehwKeQrVKigbt26qXz58vrjjz80c6bztp579+5VtmzZkrVAPHy+/r5q07+pMmRLryvnI7Vm7npNfH+64v7/9jx9UIACs99aOePnySvkk9pb9d56Xu2GtNDVi1e1adl2je8VFt8n7NM5Msao1SdNlCFrOl06c1m/L9qgie9PT/T4Xb9qp7HdJ+t6lHMVxBvXb2jwa6PV6YvX5eHloS86TdC58HucWQRYWO+OzjPsLh9JN/62GM7fHTpqU+RV55n96TPSsrXOU/T6bRL2mzzcqNRTUkBaadwgafh4qVVX59l4SE7pi8+cs+r/bs0f0tET0sD3b7U1e8l5qeGVDlKRAtJbrZL1V8YDcukudEePHtWbb76pY8eOqXPnzmrTxvmvp2vXroqLi9PIkSNdKoa70AGPHpa1BR5N97KsrUsh/7AQ8sCjh5AHHk0P7VazkvOuc/Pnz9euXc57dxcqVEgvvPCC7Cx7BADAI8GlkN+/f79q1aqlEydOKF8+55JIoaGhCg4O1uLFi5UnT55kLRIAANw/lz6X1LlzZ+XJk0fHjh3Txo0btXHjRh09elS5cuVS586dk7tGAADgApfO5FeuXKnff/89fi17SUqfPr0GDBig8uXLJ1txAADAdS6dyXt5eenKlSuJ2iMjI+Xp6fnARQEAgAfnUsjXqVNHb7zxhtavXy9jjIwx+v3339W+fXu98MILyV0jAABwgUshP3LkSIWEhKhcuXLy9vaWt7e3ypcvr5CQEI0YMSK5awQAAC64r2vyDodDgwcP1oIFC3Tjxg29+OKLatmypWw2mwoUKKCQkJC7HwQAAPwr7ivkP/vsM/Xp00fVqlWTj4+PlixZIn9/f02cOPFh1QcAAFx0X8P1U6ZM0ZdffqmffvpJ8+fP18KFCxUWFpbohiMAACDl3VfIHz16NMGtZKtVqyabzabw8PBkLwwAADyY+wr52NhYeXt7J2jz8PBQTExMshYFAAAe3H1dkzfGqFWrVvLy8opvu379utq3b69UqVLFt82dOzf5KgQAAC65r5Bv2bJlorbmzZsnWzEAACD53FfIT5o06WHVAQAAkplLi+EAAIBHHyEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBFEfIAAFgUIQ8AgEUR8gAAWBQhDwCARRHyAABYFCEPAIBF2YwxJqWLgHVER0crNDRUvXv3lpeXV0qXA+D/eG0+ngh5JKvLly/L399fly5dUpo0aVK6HAD/x2vz8cRwPQAAFkXIAwBgUYQ8AAAWRcgjWXl5eenjjz9mYg/wiOG1+Xhi4h0AABbFmTwAABZFyAMAYFGEPAAAFkXII0XlzJlTw4cPT+kyAMtasWKFbDabLl68eMd+vBatiZC3sFatWslms2nAgAEJ2ufPny+bzfav1vLNN98obdq0idr//PNPvfHGG/9qLcCj6Obr1WazydPTUyEhIerXr59iY2Mf6LjlypVTRESE/P39JfFafNwQ8hbn7e2tgQMH6sKFCyldSpIyZswoX1/flC4DeCQ8//zzioiI0L59+9S9e3f16dNHgwcPfqBjenp6Kigo6K5v7HktWhMhb3HVqlVTUFCQQkNDb9tnzZo1qlixonx8fBQcHKzOnTvr6tWr8dsjIiJUu3Zt+fj4KFeuXJo2bVqiob2hQ4eqSJEiSpUqlYKDg/Xmm28qMjJSknO48LXXXtOlS5fiz1T69OkjKeEQYdOmTfXKK68kqC0mJkYZMmTQlClTJEkOh0OhoaHKlSuXfHx8VKxYMX333XfJ8EwBKc/Ly0tBQUHKkSOHOnTooGrVqmnBggW6cOGCWrRooYCAAPn6+qpmzZrat29f/H5HjhxR3bp1FRAQoFSpUqlQoUJasmSJpITD9bwWHz+EvMXZ7Xb1799fo0aN0vHjxxNtP3DggJ5//nk1aNBAW7du1cyZM7VmzRp17Ngxvk+LFi0UHh6uFStWaM6cOfr66691+vTpBMdxc3PTyJEjtWPHDk2ePFnLli3Tu+++K8k5XDh8+HClSZNGERERioiIUI8ePRLV0qxZMy1cuDD+zYEk/fTTT4qKilL9+vUlSaGhoZoyZYrGjh2rHTt2qGvXrmrevLlWrlyZLM8X8Cjx8fHRjRs31KpVK23YsEELFizQunXrZIxRrVq1FBMTI0l66623FB0drVWrVmnbtm0aOHCg/Pz8Eh2P1+JjyMCyWrZsaerVq2eMMaZMmTKmdevWxhhj5s2bZ27+1bdp08a88cYbCfZbvXq1cXNzM9euXTO7du0yksyff/4Zv33fvn1Gkhk2bNhtH3v27Nkmffr08T9PmjTJ+Pv7J+qXI0eO+OPExMSYDBkymClTpsRvb9KkiXnllVeMMcZcv37d+Pr6mt9++y3BMdq0aWOaNGly5ycDeMT9/fXqcDjM0qVLjZeXl3nxxReNJLN27dr4vmfPnjU+Pj5m1qxZxhhjihQpYvr06ZPkcZcvX24kmQsXLhhjeC0+btxT9B0G/jUDBw7Us88+m+hd+5YtW7R161aFhYXFtxlj5HA4dOjQIe3du1fu7u4qXrx4/PaQkBAFBAQkOM4vv/yi0NBQ7d69W5cvX1ZsbKyuX7+uqKioe77O5+7urkaNGiksLEyvvvqqrl69qu+//14zZsyQJO3fv19RUVGqXr16gv1u3Lihp5566r6eD+BRtGjRIvn5+SkmJkYOh0NNmzbVSy+9pEWLFql06dLx/dKnT698+fJp165dkqTOnTurQ4cO+vnnn1WtWjU1aNBARYsWdbkOXovWQcg/JipVqqQaNWqod+/eatWqVXx7ZGSk2rVrp86dOyfaJ3v27Nq7d+9dj3348GHVqVNHHTp00GeffaZ06dJpzZo1atOmjW7cuHFfk3maNWumypUr6/Tp01q6dKl8fHz0/PPPx9cqSYsXL1bWrFkT7Md63LCCKlWqaMyYMfL09FSWLFnk7u6uBQsW3HW/119/XTVq1NDixYv1888/KzQ0VJ9//rk6derkci28Fq2BkH+MDBgwQE8++aTy5csX31a8eHHt3LlTISEhSe6TL18+xcbGatOmTSpRooQk57v4v8/W/+uvv+RwOPT555/Lzc05zWPWrFkJjuPp6am4uLi71liuXDkFBwdr5syZ+uGHH9SwYUN5eHhIkgoWLCgvLy8dPXpUlStXvr9fHvgPSJUqVaLXYoECBRQbG6v169erXLlykqRz585pz549KliwYHy/4OBgtW/fXu3bt1fv3r01bty4JEOe1+LjhZB/jBQpUkTNmjXTyJEj49t69uypMmXKqGPHjnr99deVKlUq7dy5U0uXLtUXX3yh/Pnzq1q1anrjjTc0ZswYeXh4qHv37vLx8Yn/SE5ISIhiYmI0atQo1a1bV2vXrtXYsWMTPHbOnDkVGRmpX3/9VcWKFZOvr+9tz/CbNm2qsWPHau/evVq+fHl8e+rUqdWjRw917dpVDodDFSpU0KVLl7R27VqlSZNGLVu2fAjPGpCynnjiCdWrV09t27bVV199pdSpU6tXr17KmjWr6tWrJ0l6++23VbNmTeXNm1cXLlzQ8uXLVaBAgSSPx2vxMZPSkwLw8Px9Is9Nhw4dMp6enubvf/V//PGHqV69uvHz8zOpUqUyRYsWNZ999ln89vDwcFOzZk3j5eVlcuTIYaZNm2YCAwPN2LFj4/sMHTrUZM6c2fj4+JgaNWqYKVOmJJjsY4wx7du3N+nTpzeSzMcff2yMSTjZ56adO3caSSZHjhzG4XAk2OZwOMzw4cNNvnz5jIeHh8mYMaOpUaOGWbly5YM9WUAKS+r1etP58+fNq6++avz9/eNfY3v37o3f3rFjR5MnTx7j5eVlMmbMaF599VVz9uxZY0ziiXfG8Fp8nHCrWdy348ePKzg4WL/88ouqVq2a0uUAAG6DkMddLVu2TJGRkSpSpIgiIiL07rvv6sSJE9q7d2/8NToAwKOHa/K4q5iYGL333ns6ePCgUqdOrXLlyiksLIyAB4BHHGfyAABYFMvaAgBgUYQ8AAAWRcgDAGBRhDwAABZFyAMAYFGEPAAAFkXIAwBgUYQ8AAAWRcgDAGBR/wO2kPstui7CrgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Logistic Regression\n", "lr_clf = LogisticRegression(max_iter=1000, random_state=SEED)\n", "\n", "# Find optimal hyperparameters\n", "best_lr_clf, lr_params = random_search(\n", " lr_clf,\n", " {\n", " \"C\": np.logspace(-4, 4, 20),\n", " \"solver\": [\"liblinear\", \"saga\"],\n", " \"penalty\": [\"l1\", \"l2\"],\n", " },\n", ")\n", "\n", "# Evaluate the model\n", "evaluate_model(best_lr_clf)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# SVM\n", "svm_clf = SVC(random_state=SEED)\n", "\n", "# Find optimal hyperparameters\n", "best_svm_clf, svm_params = random_search(\n", " svm_clf,\n", " {\n", " \"C\": np.logspace(-4, 4, 20),\n", " \"kernel\": [\"linear\", \"poly\", \"rbf\", \"sigmoid\"],\n", " \"degree\": [2, 3, 4],\n", " },\n", ")\n", "\n", "# Evaluate the model\n", "evaluate_model(best_svm_clf)" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "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.3" } }, "nbformat": 4, "nbformat_minor": 2 }