{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: transformers in /home/divya/.venv/lib/python3.8/site-packages (4.31.0)\n", "Requirement already satisfied: filelock in /home/divya/.venv/lib/python3.8/site-packages (from transformers) (3.12.2)\n", "Requirement already satisfied: huggingface-hub<1.0,>=0.14.1 in /home/divya/.venv/lib/python3.8/site-packages (from transformers) (0.16.4)\n", "Requirement already satisfied: numpy>=1.17 in /home/divya/.venv/lib/python3.8/site-packages (from transformers) (1.24.3)\n", "Requirement already satisfied: packaging>=20.0 in /home/divya/.venv/lib/python3.8/site-packages (from transformers) (23.1)\n", "Requirement already satisfied: pyyaml>=5.1 in /home/divya/.venv/lib/python3.8/site-packages (from transformers) (6.0.1)\n", "Requirement already satisfied: regex!=2019.12.17 in /home/divya/.venv/lib/python3.8/site-packages (from transformers) (2023.6.3)\n", "Requirement already satisfied: requests in /home/divya/.venv/lib/python3.8/site-packages (from transformers) (2.31.0)\n", "Requirement already satisfied: tokenizers!=0.11.3,<0.14,>=0.11.1 in /home/divya/.venv/lib/python3.8/site-packages (from transformers) (0.13.3)\n", "Requirement already satisfied: safetensors>=0.3.1 in /home/divya/.venv/lib/python3.8/site-packages (from transformers) (0.3.2)\n", "Requirement already satisfied: tqdm>=4.27 in /home/divya/.venv/lib/python3.8/site-packages (from transformers) (4.65.0)\n", "Requirement already satisfied: fsspec in /home/divya/.venv/lib/python3.8/site-packages (from huggingface-hub<1.0,>=0.14.1->transformers) (2023.6.0)\n", "Requirement already satisfied: typing-extensions>=3.7.4.3 in /home/divya/.venv/lib/python3.8/site-packages (from huggingface-hub<1.0,>=0.14.1->transformers) (4.7.1)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /home/divya/.venv/lib/python3.8/site-packages (from requests->transformers) (3.1.0)\n", "Requirement already satisfied: idna<4,>=2.5 in /home/divya/.venv/lib/python3.8/site-packages (from requests->transformers) (3.4)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/divya/.venv/lib/python3.8/site-packages (from requests->transformers) (1.26.16)\n", "Requirement already satisfied: certifi>=2017.4.17 in /home/divya/.venv/lib/python3.8/site-packages (from requests->transformers) (2023.5.7)\n", "Requirement already satisfied: torch in /home/divya/.venv/lib/python3.8/site-packages (2.0.1)\n", "Requirement already satisfied: filelock in /home/divya/.venv/lib/python3.8/site-packages (from torch) (3.12.2)\n", "Requirement already satisfied: typing-extensions in /home/divya/.venv/lib/python3.8/site-packages (from torch) (4.7.1)\n", "Requirement already satisfied: sympy in /home/divya/.venv/lib/python3.8/site-packages (from torch) (1.12)\n", "Requirement already satisfied: networkx in /home/divya/.venv/lib/python3.8/site-packages (from torch) (3.1)\n", "Requirement already satisfied: jinja2 in /home/divya/.venv/lib/python3.8/site-packages (from torch) (3.1.2)\n", "Requirement already satisfied: nvidia-cuda-nvrtc-cu11==11.7.99 in /home/divya/.venv/lib/python3.8/site-packages (from torch) (11.7.99)\n", "Requirement already satisfied: nvidia-cuda-runtime-cu11==11.7.99 in /home/divya/.venv/lib/python3.8/site-packages (from torch) (11.7.99)\n", "Requirement already satisfied: nvidia-cuda-cupti-cu11==11.7.101 in /home/divya/.venv/lib/python3.8/site-packages (from torch) (11.7.101)\n", "Requirement already satisfied: nvidia-cudnn-cu11==8.5.0.96 in /home/divya/.venv/lib/python3.8/site-packages (from torch) (8.5.0.96)\n", "Requirement already satisfied: nvidia-cublas-cu11==11.10.3.66 in /home/divya/.venv/lib/python3.8/site-packages (from torch) (11.10.3.66)\n", "Requirement already satisfied: nvidia-cufft-cu11==10.9.0.58 in /home/divya/.venv/lib/python3.8/site-packages (from torch) (10.9.0.58)\n", "Requirement already satisfied: nvidia-curand-cu11==10.2.10.91 in /home/divya/.venv/lib/python3.8/site-packages (from torch) (10.2.10.91)\n", "Requirement already satisfied: nvidia-cusolver-cu11==11.4.0.1 in /home/divya/.venv/lib/python3.8/site-packages (from torch) (11.4.0.1)\n", "Requirement already satisfied: nvidia-cusparse-cu11==11.7.4.91 in /home/divya/.venv/lib/python3.8/site-packages (from torch) (11.7.4.91)\n", "Requirement already satisfied: nvidia-nccl-cu11==2.14.3 in /home/divya/.venv/lib/python3.8/site-packages (from torch) (2.14.3)\n", "Requirement already satisfied: nvidia-nvtx-cu11==11.7.91 in /home/divya/.venv/lib/python3.8/site-packages (from torch) (11.7.91)\n", "Requirement already satisfied: triton==2.0.0 in /home/divya/.venv/lib/python3.8/site-packages (from torch) (2.0.0)\n", "Requirement already satisfied: setuptools in /home/divya/.venv/lib/python3.8/site-packages (from nvidia-cublas-cu11==11.10.3.66->torch) (68.0.0)\n", "Requirement already satisfied: wheel in /home/divya/.venv/lib/python3.8/site-packages (from nvidia-cublas-cu11==11.10.3.66->torch) (0.40.0)\n", "Requirement already satisfied: cmake in /home/divya/.venv/lib/python3.8/site-packages (from triton==2.0.0->torch) (3.26.4)\n", "Requirement already satisfied: lit in /home/divya/.venv/lib/python3.8/site-packages (from triton==2.0.0->torch) (16.0.6)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /home/divya/.venv/lib/python3.8/site-packages (from jinja2->torch) (2.1.3)\n", "Requirement already satisfied: mpmath>=0.19 in /home/divya/.venv/lib/python3.8/site-packages (from sympy->torch) (1.3.0)\n" ] } ], "source": [ "# Install Transformers\n", "!pip install transformers\n", "# To get model summary\n", "!pip install torch" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: seaborn in /home/divya/.venv/lib/python3.8/site-packages (0.12.2)\n", "Requirement already satisfied: numpy!=1.24.0,>=1.17 in /home/divya/.venv/lib/python3.8/site-packages (from seaborn) (1.24.3)\n", "Requirement already satisfied: pandas>=0.25 in /home/divya/.venv/lib/python3.8/site-packages (from seaborn) (2.0.2)\n", "Requirement already satisfied: matplotlib!=3.6.1,>=3.1 in /home/divya/.venv/lib/python3.8/site-packages (from seaborn) (3.7.1)\n", "Requirement already satisfied: contourpy>=1.0.1 in /home/divya/.venv/lib/python3.8/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (1.1.0)\n", "Requirement already satisfied: cycler>=0.10 in /home/divya/.venv/lib/python3.8/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (0.11.0)\n", "Requirement already satisfied: fonttools>=4.22.0 in /home/divya/.venv/lib/python3.8/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (4.40.0)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /home/divya/.venv/lib/python3.8/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (1.4.4)\n", "Requirement already satisfied: packaging>=20.0 in /home/divya/.venv/lib/python3.8/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (23.1)\n", "Requirement already satisfied: pillow>=6.2.0 in /home/divya/.venv/lib/python3.8/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (10.0.0)\n", "Requirement already satisfied: pyparsing>=2.3.1 in /home/divya/.venv/lib/python3.8/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (3.1.0)\n", "Requirement already satisfied: python-dateutil>=2.7 in /home/divya/.venv/lib/python3.8/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (2.8.2)\n", "Requirement already satisfied: importlib-resources>=3.2.0 in /home/divya/.venv/lib/python3.8/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (5.12.0)\n", "Requirement already satisfied: pytz>=2020.1 in /home/divya/.venv/lib/python3.8/site-packages (from pandas>=0.25->seaborn) (2023.3)\n", "Requirement already satisfied: tzdata>=2022.1 in /home/divya/.venv/lib/python3.8/site-packages (from pandas>=0.25->seaborn) (2023.3)\n", "Requirement already satisfied: zipp>=3.1.0 in /home/divya/.venv/lib/python3.8/site-packages (from importlib-resources>=3.2.0->matplotlib!=3.6.1,>=3.1->seaborn) (3.15.0)\n", "Requirement already satisfied: six>=1.5 in /home/divya/.venv/lib/python3.8/site-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.1->seaborn) (1.16.0)\n" ] } ], "source": [ "!pip install seaborn" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2023-08-14 03:17:51.971632: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", "To enable the following instructions: AVX2 AVX512F FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", "2023-08-14 03:17:52.770602: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n" ] } ], "source": [ "#import required package\n", "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns\n", "import re\n", "import torch\n", "import random\n", "import torch.nn as nn\n", "import transformers\n", "from transformers import BertModel, BertTokenizer, AdamW, get_linear_schedule_with_warmup\n", "import matplotlib.pyplot as plt\n", "from torch.utils.data import Dataset, DataLoader\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import confusion_matrix, classification_report\n", "from collections import defaultdict\n", "import pickle\n", "from tqdm import tqdm\n", "import gradio as gr" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# specify GPU\n", "device = torch.device(\"cuda\")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import os\n", "os.environ[\"CUDA_DEVICE_ORDER\"]=\"PCI_BUS_ID\" \n", "os.environ['CUDA_VISIBLE_DEVICES']='1'" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "#read the reviews of fine food from .csv file\n", "reviews_df=pd.read_csv(\"/home/divya/vivek5/amazon question answer/Reviews.csv\")" ] }, { "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", " \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", "
IdProductIdUserIdProfileNameHelpfulnessNumeratorHelpfulnessDenominatorScoreTimeSummaryText
01B001E4KFG0A3SGXH7AUHU8GWdelmartian1151303862400Good Quality Dog FoodI have bought several of the Vitality canned d...
12B00813GRG4A1D87F6ZCVE5NKdll pa0011346976000Not as AdvertisedProduct arrived labeled as Jumbo Salted Peanut...
23B000LQOCH0ABXLMWJIXXAINNatalia Corres \"Natalia Corres\"1141219017600\"Delight\" says it allThis is a confection that has been around a fe...
34B000UA0QIQA395BORC6FGVXVKarl3321307923200Cough MedicineIf you are looking for the secret ingredient i...
45B006K2ZZ7KA1UQRSCLF8GW1TMichael D. Bigham \"M. Wassir\"0051350777600Great taffyGreat taffy at a great price. There was a wid...
\n", "
" ], "text/plain": [ " Id ProductId UserId ProfileName \\\n", "0 1 B001E4KFG0 A3SGXH7AUHU8GW delmartian \n", "1 2 B00813GRG4 A1D87F6ZCVE5NK dll pa \n", "2 3 B000LQOCH0 ABXLMWJIXXAIN Natalia Corres \"Natalia Corres\" \n", "3 4 B000UA0QIQ A395BORC6FGVXV Karl \n", "4 5 B006K2ZZ7K A1UQRSCLF8GW1T Michael D. Bigham \"M. Wassir\" \n", "\n", " HelpfulnessNumerator HelpfulnessDenominator Score Time \\\n", "0 1 1 5 1303862400 \n", "1 0 0 1 1346976000 \n", "2 1 1 4 1219017600 \n", "3 3 3 2 1307923200 \n", "4 0 0 5 1350777600 \n", "\n", " Summary Text \n", "0 Good Quality Dog Food I have bought several of the Vitality canned d... \n", "1 Not as Advertised Product arrived labeled as Jumbo Salted Peanut... \n", "2 \"Delight\" says it all This is a confection that has been around a fe... \n", "3 Cough Medicine If you are looking for the secret ingredient i... \n", "4 Great taffy Great taffy at a great price. There was a wid... " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "reviews_df.head()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def itemfreq(data):\n", " items, inv = np.unique(data, return_inverse=True)\n", " freq = np.bincount(inv)\n", " return items,freq" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([ 18296., 0., 10575., 0., 0., 15624., 0.,\n", " 29118., 0., 126387.]),\n", " array([1. , 1.4, 1.8, 2.2, 2.6, 3. , 3.4, 3.8, 4.2, 4.6, 5. ]),\n", " )" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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avr06Ro3bpxuvvlmvf7662ppadFDDz3k72kDAIAA1CU3S5/Pa6+9puDgYE2ZMkWtra1KSUnRG2+8YY/36tVLJSUlevTRR5WUlKQ+ffpo+vTpev755+2auLg4rVu3To8//rgWL16sQYMG6a233lJKSopdM3XqVB08eFD5+flyu91KSEhQaWnpaTdQAwAAM3XZc4R6Ap4jBAAIJDxH6AeXxXOEAAAALncEIQAAYCyCEAAAMBZBCAAAGIsgBAAAjEUQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAwFkEIAAAYiyAEAACMRRACAADGIggBAABjEYQAAICxCEIAAMBYBCEAAGAsghAAADAWQQgAABiLIAQAAIxFEAIAAMYiCAEAAGP17u4GAAA935C8dd3dQqd9uSi1u1vAJcAVIQAAYCyCEAAAMBZBCAAAGIsgBAAAjEUQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAwFkEIAAAYiyAEAACMRRACAADGIggBAABjEYQAAICxCEIAAMBYBCEAAGAsghAAADAWQQgAABiLIAQAAIzl9yC0cOFC3XTTTerbt68iIyOVlpam3bt3+9QcPXpUWVlZGjBggK666ipNmTJFjY2NPjX79u1TamqqrrzySkVGRuqpp57SiRMnfGo2bNigMWPGKDQ0VNdee62KiopO62fZsmUaMmSIwsLClJiYqC1btvh7ygAAIED5PQht3LhRWVlZ+uyzz1RWVqbjx49r0qRJamlpsWsef/xxffDBB1qzZo02btyoAwcO6Oc//7k93tbWptTUVB07dkybN2/WO++8o6KiIuXn59s1e/fuVWpqqu666y7V1tYqJydHjzzyiD7++GO7ZvXq1crNzdX8+fO1bds2jR49WikpKWpqavL3tAEAQAAKsizL6soTHDx4UJGRkdq4caNuv/12eTweXX311Vq1apXuu+8+SVJDQ4NGjBihyspKjR8/Xh999JHuueceHThwQFFRUZKkwsJCzZkzRwcPHlRISIjmzJmjdevWaefOnfa50tPT1dzcrNLSUklSYmKibrrpJi1dulSS1N7ertjYWD322GPKy8s7b+9er1dOp1Mej0cOh8PfHw0AGGNI3rrubqHTvlyU2t0tdBqf8w868/O7y+8R8ng8kqT+/ftLkmpqanT8+HElJyfb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N954oz7//PMu6u7HCQkJ0bXXXitJGjt2rKqrq7V48WK9+eabp9UG4tpJnZvjqS739aupqVFTU5PPFeO2tjZVVFRo6dKlam1tVa9evXzeE0jreDHzO9XlvoanioiI0HXXXXfWfrtr/bhH6DKQlJSk8vJyn31lZWXn/F1/T1BbW6uYmJjubuOMLMtSdna21q5dq/Xr1ysuLu687wmkdbyY+Z2qra1NdXV1l+0anqq9vV2tra1nHAuktTuXc83xVJf7+k2cOFF1dXWqra21t3HjxikjI0O1tbVnDAmBtI4XM79TXe5reKojR47oiy++OGu/3bZ+XXortqG+/fZba/v27db27dstSdarr75qbd++3frqq68sy7KsvLw864EHHrDr//znP1tXXnml9dRTT1m7du2yli1bZvXq1csqLS3trimcV2fn+Nprr1nFxcXWnj17rLq6OmvWrFlWcHCw9Yc//KG7pnBOjz76qOV0Oq0NGzZY33zzjb199913ds0DDzxg5eXl2a83bdpk9e7d23r55ZetXbt2WfPnz7euuOIKq66urjumcE4XM7/nnnvO+vjjj60vvvjCqqmpsdLT062wsDCrvr6+O6ZwTnl5edbGjRutvXv3Wjt27LDy8vKsoKAg65NPPrEsK7DXrkNn5xhI63c2p36rqies48nON79AW8MnnnjC2rBhg7V3715r06ZNVnJysjVw4ECrqanJsqzLZ/0IQl2g46vip27Tp0+3LMuypk+fbt1xxx2nvSchIcEKCQmxfvKTn1hvv/32Je+7Mzo7xxdffNH66U9/aoWFhVn9+/e37rzzTmv9+vXd0/wFONPcJPmsyx133GHPt8N7771nXXfddVZISIh1/fXXW+vWrbu0jV+gi5lfTk6Odc0111ghISFWVFSUNXnyZGvbtm2XvvkL8PDDD1uDBw+2QkJCrKuvvtqaOHGiHRAsK7DXrkNn5xhI63c2pwaFnrCOJzvf/AJtDadOnWrFxMRYISEh1l/8xV9YU6dOtT7//HN7/HJZvyDLsqyuveYEAABweeIeIQAAYCyCEAAAMBZBCAAAGIsgBAAAjEUQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAwFkEIAAAYiyAEAACM9f8AQxIzkurvBREAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.hist(reviews_df.Score)" ] }, { "cell_type": "code", "execution_count": 14, "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", "
IdProductIdUserIdProfileNameHelpfulnessNumeratorHelpfulnessDenominatorScoreTimeSummaryTextsentiment
01B001E4KFG0A3SGXH7AUHU8GWdelmartian1151303862400Good Quality Dog FoodI have bought several of the Vitality canned d...2
12B00813GRG4A1D87F6ZCVE5NKdll pa0011346976000Not as AdvertisedProduct arrived labeled as Jumbo Salted Peanut...0
\n", "
" ], "text/plain": [ " Id ProductId UserId ProfileName HelpfulnessNumerator \\\n", "0 1 B001E4KFG0 A3SGXH7AUHU8GW delmartian 1 \n", "1 2 B00813GRG4 A1D87F6ZCVE5NK dll pa 0 \n", "\n", " HelpfulnessDenominator Score Time Summary \\\n", "0 1 5 1303862400 Good Quality Dog Food \n", "1 0 1 1346976000 Not as Advertised \n", "\n", " Text sentiment \n", "0 I have bought several of the Vitality canned d... 2 \n", "1 Product arrived labeled as Jumbo Salted Peanut... 0 " ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def get_sentiment(score):\n", " if score<=2:\n", " return 0 # negative sentiment\n", " elif score==3:\n", " return 1 # neutral sentiment\n", " else:\n", " return 2 # positive sentiment\n", " \n", "\n", "reviews_df['sentiment'] = reviews_df.Score.apply(get_sentiment)\n", "reviews_df.head(2)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkYAAAGzCAYAAADKathbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA+UklEQVR4nO3df1gVdd7/8ReI/BA9B38EeDZUWl2VYjWxEDctizymuVG2aVqSka4GlaL5owztJ0VrmWmSu3tHdeuVed/JbVokacqmhIqaSmK2q2npgUrhBCYizPcPh/l6xDIURO35uK65rj2fz3s+85lzNc5r58wMXoZhGAIAAIC8G3sCAAAAFwqCEQAAgIlgBAAAYCIYAQAAmAhGAAAAJoIRAACAiWAEAABgIhgBAACYCEYAAAAmghGA34SMjAx5eXlp7969jT0VABcwghGAS8pzzz2nzMzMxp7GWXvttdeUkZHR2NMAfrO8+FtpAC4lzZs315133lkrXFRVVamyslJ+fn7y8vJqnMn9CldddZXatGmjNWvWNPZUgN8kn8aeAACcD02aNFGTJk0aexoALnD8lAagwfz4448aP368OnToID8/PwUHB+vmm2/W5s2brZq8vDwNGDBAdrtdzZo10/XXX69169Z5jDNz5kx5eXnpq6++0n333aegoCDZ7XaNGjVKR44cseq8vLxUXl6uN998U15eXvLy8tJ9990n6fT3GHXo0EG33nqr1qxZo549eyogIECRkZHW1Zr33ntPkZGR8vf3V1RUlLZs2VJrHwsLC3XnnXeqVatW8vf3V8+ePbVs2TKPmpptr1u3TsnJybrssssUGBio22+/Xd99953HfAoKCrR27Vpr/jfccMNZfvsAzgbBCECDGTt2rObPn68hQ4botdde06RJkxQQEKCdO3dKklavXq2+ffvK7XZrxowZeu6551RSUqIbb7xRGzZsqDXeXXfdpR9//FGpqam66667lJGRoSeffNLqf/vtt+Xn56c+ffro7bff1ttvv62//vWvvzjHr776SsOHD9fgwYOVmpqqw4cPa/DgwVq4cKEmTJige+65R08++aT+/e9/66677lJ1dbW1bkFBgXr16qWdO3dq6tSpmjVrlgIDAxUXF6elS5fW2tZDDz2kzz//XDNmzNC4ceP0/vvvKykpyeqfPXu2Lr/8cnXp0sWa/+OPP17n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U1P15JNPns1uAwCAS0C9XzF69913tXDhQi1atEibN2/Wm2++qb/97W96880363tT9W7atGkqLS21lv379zf2lAAAwHlU71eMHn30UU2dOlXDhg2TJEVGRurrr79Wamqq4uPjFRoaKkkqKipS27ZtrfWKiorUvXt3SVJoaKiKi4s9xj1+/LgOHTpkrR8aGqqioiKPmprPZ6qp6T+Vn5+f/Pz8zma3AQDAJaDerxgdOXJE3t6ewzZp0kTV1dWSpPDwcIWGhmrVqlVWv9vtVl5enmJiYiRJMTExKikpUX5+vlWzevVqVVdXKzo62qrJyclRZWWlVZOdna3OnTurZcuWVs3J26mpqdkOAADAyeo9GA0ePFjPPvusVqxYob1792rp0qV66aWXdPvtt0uSvLy8NH78eD3zzDNatmyZtm/frpEjR8rhcCguLk6S1LVrVw0YMECjR4/Whg0btG7dOiUlJWnYsGFyOBySpOHDh8vX11cJCQkqKCjQ4sWL9corryg5OdmayyOPPKKsrCzNmjVLhYWFmjlzpjZt2qSkpKT63m0AAHAJqPef0l599VU98cQTevDBB1VcXCyHw6G//vWvSklJsWomT56s8vJyjRkzRiUlJbruuuuUlZUlf39/q2bhwoVKSkrSTTfdJG9vbw0ZMkRz5syx+u12u1auXKnExERFRUWpTZs2SklJ8XjXUe/evbVo0SJNnz5djz32mDp16qTMzExdddVV9b3bAADgElDv7zG6lPAeIwDAxYT3GJ1wQb3HCAAA4GJFMAIAADARjAAAAEwEIwAAABPBCAAAwEQwAgAAMBGMAAAATAQjAAAAE8EIAADARDACAAAwEYwAAABMBCMAAAATwQgAAMBEMAIAADARjAAAAEwEIwAAABPBCAAAwEQwAgAAMBGMAAAATAQjAAAAE8EIAADARDACAAAwEYwAAABMBCMAAAATwQgAAMBEMAIAADARjAAAAEwEIwAAABPBCAAAwEQwAgAAMBGMAAAATAQjAAAAE8EIAADARDACAAAwEYwAAABMDRKMvv32W91zzz1q3bq1AgICFBkZqU2bNln9hmEoJSVFbdu2VUBAgGJjY7V7926PMQ4dOqQRI0bIZrMpKChICQkJKisr86jZtm2b+vTpI39/f4WFhSktLa3WXJYsWaIuXbrI399fkZGR+uCDDxpilwEAwCWg3oPR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CZHL5bJqTg5FNf01fb9U43a79dNPP+nw4cOqqqo6bU1hYeFp552amqonn3zy1+8oAAC4pNT7FaP9+/frkUce0cKFC+Xv71/fwzeoadOmqbS01Fr279/f2FMCAADnUb0Ho/z8fBUXF6tHjx7y8fGRj4+P1q5dqzlz5sjHx0chISE6duyYSkpKPNYrKipSaGioJCk0NLTWU2o1n89UY7PZFBAQoDZt2qhJkyanrakZ41R+fn6y2WweCwAA+O2o92B00003afv27dq6dau19OzZUyNGjLD+d9OmTbVq1SprnV27dmnfvn2KiYmRJMXExGj79u0eT49lZ2fLZrMpIiLCqjl5jJqamjF8fX0VFRXlUVNdXa1Vq1ZZNQAAACer93uMWrRooauuusqjLTAwUK1bt7baExISlJycrFatWslms+mhhx5STEyMevXqJUnq37+/IiIidO+99yotLU0ul0vTp09XYmKi/Pz8JEljx47V3LlzNXnyZN1///1avXq13n33Xa1Y8f/vyE9OTlZ8fLx69uypa6+9VrNnz1Z5eblGjRpV37sNAAAuAQ1y8/WZvPzyy/L29taQIUNUUVEhp9Op1157zepv0qSJli9frnHjxikmJkaBgYGKj4/XU089ZdWEh4drxYoVmjBhgl555RVdfvnl+sc//iGn02nVDB06VN99951SUlLkcrnUvXt3ZWVl1bohGwAAQGrA9xhdCniPEQDgYsJ7jE64IN9jBAAAcLEhGAEAAJgIRgAAACaCEQAAgIlgBAAAYCIYAQAAmAhGAAAAJoIRAACAiWAEAABgIhgBAACYCEYAAAAmghEAAICJYAQAAGAiGAEAAJgIRgAAACaCEQAAgIlgBAAAYCIYAQAAmHwaewK/ZR2mrmjsKdTZ3ucHNfYUAABoMFwxAgAAMBGMAAAATAQjAAAAE8EIAADARDACAAAwEYwAAABMBCMAAAATwQgAAMBEMAIAADARjAAAAEwEIwAAABPBCAAAwEQwAgAAMBGMAAAATAQjAAAAU70Ho9TUVF1zzTVq0aKFgoODFRcXp127dnnUHD16VImJiWrdurWaN2+uIUOGqKioyKNm3759GjRokJo1a6bg4GA9+uijOn78uEfNmjVr1KNHD/n5+aljx47KyMioNZ958+apQ4cO8vf3V3R0tDZs2FDfuwwAAC4R9R6M1q5dq8TERH322WfKzs5WZWWl+vfvr/LycqtmwoQJev/997VkyRKtXbtWBw4c0B133GH1V1VVadCgQTp27JjWr1+vN998UxkZGUpJSbFq9uzZo0GDBqlfv37aunWrxo8frwceeEAfffSRVbN48WIlJydrxowZ2rx5s7p16yan06ni4uL63m0AAHAJ8DIMw2jIDXz33XcKDg7W2rVr1bdvX5WWluqyyy7TokWLdOedd0qSCgsL1bVrV+Xm5qpXr1768MMPdeutt+rAgQMKCQmRJKWnp2vKlCn67rvv5OvrqylTpmjFihXasWOHta1hw4appKREWVlZkqTo6Ghdc801mjt3riSpurpaYWFheuihhzR16tQzzt3tdstut6u0tFQ2m62+vxp1mLqi3sdsaHufH9TYUwAA/AzOKyecy/m7we8xKi0tlSS1atVKkpSfn6/KykrFxsZaNV26dFG7du2Um5srScrNzVVkZKQViiTJ6XTK7XaroKDAqjl5jJqamjGOHTum/Px8jxpvb2/FxsZaNaeqqKiQ2+32WAAAwG9Hgwaj6upqjR8/Xn/605901VVXSZJcLpd8fX0VFBTkURsSEiKXy2XVnByKavpr+n6pxu1266efftL333+vqqqq09bUjHGq1NRU2e12awkLCzu7HQcAABelBg1GiYmJ2rFjh955552G3Ey9mTZtmkpLS61l//79jT0lAABwHvk01MBJSUlavny5cnJydPnll1vtoaGhOnbsmEpKSjyuGhUVFSk0NNSqOfXpsZqn1k6uOfVJtqKiItlsNgUEBKhJkyZq0qTJaWtqxjiVn5+f/Pz8zm6HAQDARa/erxgZhqGkpCQtXbpUq1evVnh4uEd/VFSUmjZtqlWrVlltu3bt0r59+xQTEyNJiomJ0fbt2z2eHsvOzpbNZlNERIRVc/IYNTU1Y/j6+ioqKsqjprq6WqtWrbJqAAAATlbvV4wSExO1aNEi/d///Z9atGhh3c9jt9sVEBAgu92uhIQEJScnq1WrVrLZbHrooYcUExOjXr16SZL69++viIgI3XvvvUpLS5PL5dL06dOVmJhoXdEZO3as5s6dq8mTJ+v+++/X6tWr9e6772rFiv9/R35ycrLi4+PVs2dPXXvttZo9e7bKy8s1atSo+t5tAABwCaj3YDR//nxJ0g033ODR/sYbb+i+++6TJL388svy9vbWkCFDVFFR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08Z46623rP67777bGDp0qGEYhnH06FGjWbNmxvr16z3GSEhIMO6+++5f/jKAC0h9HJuGYRiSjKVLl3rU2O1244033jAMwzD27NljSDK2bNlSa/shISFGRUXFL85z48aNhiTjxx9/NAzDMD755BNDknH48OE67jFwYTn5GKyurjays7MNPz8/Iy4uzpBkrFu3zqr9/vvvjYCAAOPdd981DMMwIiMjjZkzZ5523FOPkQvp3HfJ/620unrhhRd044031kqrn3/+ubZt26aFCxdabYZhqLq6Wnv27NGXX34pHx8f9ejRw+rv2LGjWrZs6THOxx9/rNTUVBUWFsrtduv48eM6evSojhw58qt/R/Xx8dFdd92lhQsX6t5771V5ebn+7//+T++8844k6auvvtKRI0d08803e6x37NgxXX311XX6PoALxdkem127dj2n7UZGRsrX19ejLT8/XzNnztTnn3+uw4cPq7q6WpK0b98+RUREnNP2gAvN8uXL1bx5c1VWVqq6ulrDhw/XHXfcoeXLlys6Otqqa926tTp37qydO3dKkh5++GGNGzdOK1euVGxsrIYMGaI//vGPZz2P83XuIxidom/fvnI6nZo2bZrHpfGysjL99a9/1cMPP1xrnXbt2unLL78849h79+7VrbfeqnHjxunZZ59Vq1at9OmnnyohIUHHjh2r0w1mI0aM0PXXX6/i4mJlZ2crICBAAwYMsOYqSStWrNDvfvc7j/UupD/UB9TF2R6b0ol7jIxT/ixkzeX+MwkMDPT4XF5eLqfTKafTqYULF+qyyy7Tvn375HQ6uTkbl6R+/fpp/vz58vX1lcPhkI+Pj5YtW3bG9R544AE5nU6tWLFCK1euVGpqqmbNmqWHHnrorOdyPs59BKPTeP7559W9e3frRktJ6tGjh7744gt17NjxtOt07txZx48f15YtWxQVFSXpRHo9+Uma/Px8VVdXa9asWfL2PnF717vvvusxjq+vr6qqqs44x969eyssLEyLFy/Whx9+qL/85S9q2rSpJCkiIkJ+fn7at2+frr/++rrtPHABO5tjUzrxZMvBgwetz7t379aRI0eszzVXhH7NsVdYWKgffvhBzz//vMLCwiRJmzZtqvO+ABeLwMDAWsdX165ddfz4ceXl5al3796SpB9++EG7du3yuGoaFhamsWPHauzYsZo2bZr+/ve/nzYYXUjnPoLRaURGRmrEiBGaM2eO1TZlyhT16tVLSUlJeuCBBxQYGKgvvvhC2dnZmjt3rrp06aLY2FiNGTNG8+fPV9OmTTVx4kQFBARYjyN27NhRlZWVevXVVzV48GCtW7dO6enpHtvu0KGDysrKtGrVKnXr1k3NmjX72StJw4cPV3p6ur788kt98sknVnuLFi00adIkTZgwQdXV1bruuutUWlqqdevWyWazKT4+vgG+NaDhnc2xKUk33nij5s6dq5iYGFVVVWnKlCnWP6aSFBwcrICAAGVlZenyyy+Xv7+/9X6VU7Vr106+vr569dVXNXbsWO3YsUNPP/10w+44cIHp1KmTbrvtNo0ePVqvv/66WrRooalTp+p3v/udbrvtNknS+PHjdcstt+gPf/iDDh8+rE8++eRnf9q+oM59v/pupEvYyTeX1dizZ4/h6+trnPwVbdiwwbj55puN5s2bG4GBgcYf//hH49lnn7X6Dxw4YNxyyy2Gn5+f0b59e2PRokVGcHCwkZ6ebtW89NJLRtu2bY2AgADD6XQab731Vq2bNMeOHWu0bt3akGTMmDHDMAzPG9BqfPHFF4Yko3379kZ1dbVHX3V1tTF79myjc+fORtOmTY3LLrvMcDqdxtq1a8/tywLOo/o6Nr/99lujf//+RmBgoNGpUyfjgw8+8Lj52jAM4+9//7sRFhZmeHt7G9dff/3Pbt8wDGPRokVGhw4dDD8/PyMmJsZYtmyZx83b3HyNS8XPHQOGYRiHDh0y7r33XsNut1vntC+//NLqT0pKMn7/+98bfn5+xmWXXWbce++9xvfff28YxumPkQvl3OdlGKf88I5688033ygsLEwff/yxbrrppsaeDgAAOAOCUT1avXq1ysrKFBkZqYMHD2ry5Mn69ttv9eWXX3pctgcAABcm7jGqR5WVlXrsscf0n//8Ry1atFDv3r21cOFCQhEAABcJrhgBAACY+JMgAAAAJoIRAACAiWAEAABgIhgBAACYCEYAAAAmghEAAICJYAQAAGAiGAEAAJj+H9L5thjgcTKkAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.hist(reviews_df['sentiment'])\n", "plt.xticks([0, 1, 2],['Negative','Neutral','Positive'])\n", "plt.title('sentiment')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "originally gave this a 2 star\n", "============================================================\n", "['originally', 'gave', 'this', 'a', '2', 'star']\n", "============================================================\n", "[2034, 1522, 1142, 170, 123, 2851]\n" ] } ], "source": [ "MODEL_NAME = 'bert-base-cased'\n", "tokenizer = transformers.BertTokenizer.from_pretrained(MODEL_NAME)\n", "\n", "sample_text = \"originally gave this a 2 star\"\n", " \n", "tokens = tokenizer.tokenize(sample_text)\n", "ids = tokenizer.convert_tokens_to_ids(tokens)\n", "print(f'{sample_text}')\n", "print('='*60)\n", "print(tokens)\n", "print('='*60)\n", "print(ids)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[SEP] 102\n", "[CLS] 101\n", "[UNK] 100\n", "[PAD] 0\n" ] } ], "source": [ "print(tokenizer.sep_token , tokenizer.sep_token_id)\n", "print(tokenizer.cls_token,tokenizer.cls_token_id)\n", "print(tokenizer.unk_token,tokenizer.unk_token_id)\n", "print(tokenizer.pad_token,tokenizer.pad_token_id)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Truncation was not explicitly activated but `max_length` is provided a specific value, please use `truncation=True` to explicitly truncate examples to max length. Defaulting to 'longest_first' truncation strategy. If you encode pairs of sequences (GLUE-style) with the tokenizer you can select this strategy more precisely by providing a specific strategy to `truncation`.\n" ] } ], "source": [ "# Store length of each review \n", "token_lens = []\n", "\n", "# Iterate through the content slide\n", "for txt in reviews_df['Text']:\n", " tokens = tokenizer.encode(txt, max_length=512)\n", " token_lens.append(len(tokens))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_2118880/3831590266.py:2: UserWarning: \n", "\n", "`distplot` is a deprecated function and will be removed in seaborn v0.14.0.\n", "\n", "Please adapt your code to use either `displot` (a figure-level function with\n", "similar flexibility) or `histplot` (an axes-level function for histograms).\n", "\n", "For a guide to updating your code to use the new functions, please see\n", "https://gist.github.com/mwaskom/de44147ed2974457ad6372750bbe5751\n", "\n", " sns.distplot(token_lens)\n" ] }, { "data": { "text/plain": [ "Text(0.5, 0, 'Token count')" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkoAAAGwCAYAAABWwkp7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABgQUlEQVR4nO3deXhTZfo+8PskbZJuSfd9BQrI1rKWsohIxyKgVtRh8SvIoLjBD0RcYBR01GFccBBhxG1EZ0QZRgYdBqtYVqEWoWWHsnWjbbqnadM9Ob8/2kYiLbQl7WnS+3NduQonb9InObS5ec573iOIoiiCiIiIiK4hk7oAIiIiou6KQYmIiIioFQxKRERERK1gUCIiIiJqBYMSERERUSsYlIiIiIhawaBERERE1AoHqQuwVSaTCXl5eXBzc4MgCFKXQ0RERG0giiIqKioQGBgImezG/SIGpQ7Ky8tDSEiI1GUQERFRB+Tk5CA4OPiG4xiUOsjNzQ1A4xutVqslroaIiIjaQq/XIyQkxPw5fiMMSh3UfLhNrVYzKBEREdmYtk6b4WRuIiIiolYwKBERERG1gkGJiIiIqBUMSkREREStYFAiIiIiagWDEhEREVErGJSIiIiIWsGgRERERNQKBiUiIiKiVjAoEREREbWCQYmIiIioFQxKRERERK1gUCIiIiJqBYMSERERUSsYlIiIiIha4SB1AWQ/NqdkW/X5ZseEWvX5iIiI2osdJSIiIqJWMCgRERERtYJBiYiIiKgVDEpERERErWBQIiIiImoFgxIRERFRKxiUiIiIiFrBoERERETUCgYlIiIiolYwKBERERG1gkGJiIiIqBUMSkREREStYFAiIiIiagWDEhEREVErGJSIiIiIWsGgRERERNQKBiUiIiKiVjAoEREREbWCQYmIiIioFQxKRERERK1gUCJJ1NYbYRJFqcsgIiK6LgepC6CepcFkwv7zxdibXgg3lQOmDA7AgAA1BEGQujQiIqJrMChRl8kprcK2tCso0NcCAMqq6vFFSjZ6ebtg6pAABGicJK6QiIjIEoMSdbraBiN+OFOAny+VQATgrJBjyqAAlBhqceBCMS4XG7B+90WMivBE3C1+cFHynyUREXUPks9R2rBhA8LDw6FSqRATE4PDhw9fd/zWrVvRv39/qFQqDB48GDt37rS4f9u2bbjjjjvg5eUFQRBw7Nixa56jpqYGTz31FLy8vODq6or77rsPBQUF1nxZ1CS3rBrv/ngByU0haWiIO56O64thYR743QB/PB3XF4MC1RABpGSU4p1d56HV10hdNhEREQCJg9KWLVuwdOlSrFq1CqmpqYiKikJ8fDwKCwtbHH/o0CHMmjUL8+fPR1paGhISEpCQkIBTp06ZxxgMBowbNw5vvPFGq9/36aefxn//+19s3boV+/btQ15eHqZPn27119fTiaKIbWlXoKuuh4ezI+aNCccDI0IsOkYeLgrMjgnDI+Mj4KdWorreiK8OZ6PeaJKwciIiokaCKEp36lFMTAxGjhyJ9evXAwBMJhNCQkKwaNEivPDCC9eMnzFjBgwGA3bs2GHeNnr0aERHR2Pjxo0WYzMzMxEREYG0tDRER0ebt5eXl8PHxwebN2/G/fffDwA4d+4cbrnlFiQnJ2P06NEt1lpbW4va2lrz3/V6PUJCQlBeXg61Wt3h98CebE7Jtvj7paJKfPJTBhzlAp6L73/DQ2oVNfV4b/dFVNY2ICbCE1sei+3McomIqAfS6/XQaDRt/vyWrKNUV1eHo0ePIi4u7tdiZDLExcUhOTm5xcckJydbjAeA+Pj4Vse35OjRo6ivr7d4nv79+yM0NPS6z7N69WpoNBrzLSQkpM3fs6f66UIxAGBYqEeb5h25qRxx//BgAI2H4X44re3U+oiIiG5EsqBUXFwMo9EIPz8/i+1+fn7Qalv+gNRqte0a39pzKBQKuLu7t+t5li9fjvLycvMtJyenzd+zJyrU1yC9oAICgLF9vNv8uL5+bhjXNP65r09AW875SkREJB3JJ3PbCqVSCbVabXGj1h281NhN6h+ghrersl2PvWOgHwLdVdBV1WPJljQYTVyYkoiIpCFZUPL29oZcLr/mbLOCggL4+/u3+Bh/f/92jW/tOerq6qDT6W7qeah1lbUNSMvWAYC5O9QeDjIZZo4IhbNCjp8vl2LjvktWrpCIiKhtJFuwRqFQYPjw4UhKSkJCQgKAxsncSUlJWLhwYYuPiY2NRVJSEpYsWWLetmvXLsTGtn3S7/Dhw+Ho6IikpCTcd999AID09HRkZ2e363nsxW8nYFtDyuUSNJhEBLk7IdzLuUPP4e2mxCt3D8Sz/z6Bd3adR2xvLwwL9bBypURERNcn6cp+S5cuxdy5czFixAiMGjUKa9euhcFgwLx58wAAc+bMQVBQEFavXg0AWLx4MSZMmIA1a9Zg6tSp+Oqrr3DkyBF8+OGH5ucsLS1FdnY28vLyADSGIKCxk+Tv7w+NRoP58+dj6dKl8PT0hFqtxqJFixAbG9vqGW/UdvVGE36+XAIAGBfpfVOXJrl/eDD2XyjGf4/nYfnXJ7Fz8XjIZbzUCRERdR1J5yjNmDEDb7/9NlauXIno6GgcO3YMiYmJ5gnb2dnZyM/PN48fM2YMNm/ejA8//BBRUVH497//je3bt2PQoEHmMd9++y2GDh2KqVOnAgBmzpyJoUOHWiwf8Ne//hXTpk3Dfffdh1tvvRX+/v7Ytm1bF71q+3YsRwdDnRHuTo4YFKi5qecSBAGv3TMIGidHpBdU4OvUK1aqkoiIqG0kXUfJlrV3HYbuypqH3kyiiHeTLqCoohZ3DvLH+Eifm3q+2TGhAICP9l/G6zvPwl+twp5lt8FJIbdGuURE1APZzDpKZH8uFFSiqKIWSgcZRoZ7Wu15H4oNQ5C7E7T6Gvz9YIbVnpeIiOhGGJTIan66WAQAGBHmAZWj9bo+Kkc5lsX3BQBs3HsJpYY6qz03ERHR9TAokVXoqupwqcgAAcCYDiwJcCP3RAVhQIAaFbUNeG/3Bas/PxERUUsYlMgqMooNAIAgDyd4OCus/vwymYDlU/oDAP75cxaySgxW/x5ERES/xaBEVtEclCK8XTrte4yP9MH4SG/UG0W89X16p30fIiKiZgxKZBVdEZQA4IU7+0MQgB0n8nE8R9ep34uIiIhBiW5aeXU9Sgx1EACEe3VuUBoYqMG9Q4MAAH/eeRZc3YKIiDoTgxLdtOZuUqC7k1XPdmvNM3f0g8JBhpSMUvx0sbjTvx8REfVcDEp007rqsFuzIHcnzB7VuBjluqQL7CoREVGnYVCim5ZRXAmg64ISADw+oTcUchl+ySzDz5dLu+z7EhFRz8KgRDdFX1OP4squmZ90NX+NCjNGhgBo7CoRERF1BgYluimZTYfd/DWqLr8G2+O39YajXEDy5RIczmBXiYiIrI9BiW7K5S6en3S1IHcn3D+8savE1bqJiKgzMCjRTWmeyN1LgqAEAE/e1hsOMgEHLhTjaFaZJDUQEZH9YlCiDqusbUBRRS2Arp2fdLUQT2fcNywYALtKRERkfQxK1GHN3SR/tQrOSgfJ6nhyYm/IZQL2phdxtW4iIrIqBiXqsOZlAcIlOuzWLMzLBQnRjat1s6tERETWxKBEHSb1/KSrPTWxN2QC8OPZQpzKLZe6HCIishPSHS8hm2aobUCBvml+UicFpc0p2e0aPyTYHcdydHju3yfwf6PDrrl/dkyotUojIqIegh0l6pDmbpKvmxKuEs5PutqEvj4AgDP5ehToaySuhoiI7AGDEnVIRol06ye1xk+twsBANQBg3/kiiashIiJ7wKBEHZIp4UKT1zOxny8A4HiODiWVtRJXQ0REto5Bidqtqq4B2vLGQ1vdLSgFujuhn58bRLCrREREN49Bidots7gKIgBvVyXcVI5Sl3ON2/o1zlVKy9ZBV1UncTVERGTLGJSo3bJLmw+7OUtcScvCvFzQy9sFRlHEgQvFUpdDREQ2jEGJ2k3bdEZZoLuTxJW07ramuUq/ZJaioqZe4mqIiMhWMShRuzWvn+TnppK4ktb19nFBiIcTGkwiDl5kV4mIiDqGQYnapabeiPLqxg6Nn7r7BiVBEMxnwP2cUYqqugaJKyIiIlvEoETt0ryQo1rlACeFXOJqrq+fvxsCNCrUNZhw6FKJ1OUQEZENYlCidmk+7Oav6b7dpGaCIJjnKiVfKuFcJSIiajcGJWqX5o5Sd56fdLWBgWp4uypRXW/EP39u37XjiIiIGJSoXZrPeOvO85OuJhME87pKn/x0GdV1RokrIiIiW8KgRG0miuKvHSUbCUoAEBXsDg9nRxRX1uGrX9hVIiKitmNQojarrG1AVZ0RAgAfN6XU5bSZXCbg1r6NXaUP919GXYNJ4oqIiMhWMChRmzVP5PZ0UUDhYFv/dIaHesBPrUR+eQ22pV6RuhwiIrIRtvVpR5KyxcNuzRzkMiy4tTcA4G97L6HByK4SERHdGIMStdmvQcl2DrtdbdaoEHi6KJBdWoUdJ/KlLoeIiGwAgxK1mS13lADAWeGA+eMiAAAb9lyEySRKXBEREXV3DErUJqIooqCi6RpvNhqUAOCh2DC4qRxwobASP5zRSl0OERF1cwxK1Ca6qnrUNZggFwR4u9rmoTcAUKsc8fCYcADAe7svQhTZVSIiotYxKFGbNB9283FTQi4TJK7m5swbGwFnhRyn8/TYm14kdTlERNSNMShRmzQHJV8bnch9NU8XBf5vdBgA4N2kC+wqERFRqxiUqE2a5yf52/D8pKs9Or4XVI4yHMvR4cCFYqnLISKibopBidrE1s94+y0fNyUejGFXiYiIro9BiW7IaBJRaAdnvP3WY7f2gtJBhqNZZTh4sUTqcoiIqBtiUKIbKjHUwmgSoZDL4O7sKHU5VuOrVmHWqFAAwLtJ59lVIiKiazAo0Q01X+PNV62ETLDtM95+64nbekPhIMMvmWVIvsyuEhERWWJQohuyt/lJV/NTqzBrZAgA4N0fL0hcDRERdTcMSnRD9hyUAODx23pDIZchJaMUP7OrREREV2FQohuy9Yvh3kiAxgm/HxkMAFiXxK4SERH9ikGJrqveaEJJZR0A++0oAcATt/WBo1zAoUsl+CWzVOpyiIiom2BQousqqqiFCMBZIYeb0kHqcjpNkLsTHhjROFdp7Y/nJa6GiIi6CwYluq6r5ycJdnbG2289eVtvOMoFHLxYghTOVSIiInSDoLRhwwaEh4dDpVIhJiYGhw8fvu74rVu3on///lCpVBg8eDB27txpcb8oili5ciUCAgLg5OSEuLg4XLhgOe/k/PnzuOeee+Dt7Q21Wo1x48Zhz549Vn9t9sCe5idtTsm+7m3/+WIMDfUAALyw7eR1xxIRUc8gaVDasmULli5dilWrViE1NRVRUVGIj49HYWFhi+MPHTqEWbNmYf78+UhLS0NCQgISEhJw6tQp85g333wT69atw8aNG5GSkgIXFxfEx8ejpqbGPGbatGloaGjA7t27cfToUURFRWHatGnQarWd/pptTfMaSvY8P+lqt/X1gVwmIKPYgEtFlVKXQ0REEhNECZcjjomJwciRI7F+/XoAgMlkQkhICBYtWoQXXnjhmvEzZsyAwWDAjh07zNtGjx6N6OhobNy4EaIoIjAwEM888wyWLVsGACgvL4efnx82bdqEmTNnori4GD4+Pti/fz/Gjx8PAKioqIBarcauXbsQFxfXptr1ej00Gg3Ky8uhVqtv9q2QzI26I28mnoOuuh4LxvdCuLdLF1Ulrf8ez0Py5RKEeTpjwa29WjzkODsmVILKiIjoZrX381uyjlJdXR2OHj1qEUxkMhni4uKQnJzc4mOSk5OvCTLx8fHm8RkZGdBqtRZjNBoNYmJizGO8vLzQr18/fP755zAYDGhoaMAHH3wAX19fDB8+vNV6a2trodfrLW72rq7BBF11PYDGi8j2FBP6+sBBJiCrtAoXCtlVIiLqySQLSsXFxTAajfDz87PY7ufn1+ohMK1We93xzV+vN0YQBPz4449IS0uDm5sbVCoV3nnnHSQmJsLDw6PVelevXg2NRmO+hYSEtO8F26DSqsZlAVSOMjgr5BJX03XUTo6IifAEAPx4toDXgCMi6sEkn8zd1URRxFNPPQVfX18cOHAAhw8fRkJCAu666y7k5+e3+rjly5ejvLzcfMvJyenCqqVR2rR+kpeL0u7PePutW/v6wFEu4EpZNdILKqQuh4iIJCJZUPL29oZcLkdBQYHF9oKCAvj7+7f4GH9//+uOb/56vTG7d+/Gjh078NVXX2Hs2LEYNmwY/va3v8HJyQmfffZZq/UqlUqo1WqLm70rMTRO5PZ0UUhcSddzUzkitpcXAHaViIh6MsmCkkKhwPDhw5GUlGTeZjKZkJSUhNjY2BYfExsbazEeAHbt2mUeHxERAX9/f4sxer0eKSkp5jFVVVUAGudDXU0mk8FkMt38C7MjJYamjpJrzwtKADA+0gcKBxnydDU4m2//c9KIiOhakh56W7p0KT766CN89tlnOHv2LJ544gkYDAbMmzcPADBnzhwsX77cPH7x4sVITEzEmjVrcO7cObz88ss4cuQIFi5cCKBx/tGSJUvw2muv4dtvv8XJkycxZ84cBAYGIiEhAUBj2PLw8MDcuXNx/PhxnD9/Hs8++ywyMjIwderULn8PurPS5qDUAztKAOCidMCY3s1dpUKY2FUiIupxJL0mxYwZM1BUVISVK1dCq9UiOjoaiYmJ5snY2dnZFp2fMWPGYPPmzXjxxRexYsUKREZGYvv27Rg0aJB5zHPPPQeDwYAFCxZAp9Nh3LhxSExMhErVuA6Qt7c3EhMT8cc//hG333476uvrMXDgQHzzzTeIiorq2jegmyupbD701nPOePutcX28kXypBFp9DU7llmNIsLvUJRERUReSdB0lW2bv6yg1mExY9c1piABeuLM/1CrHri2sG0k6V4Cks4XwclFgSVxfyGUC11EiIrJRNrOOEnVvuqp6iAAc5YJdXwy3Lcb19oaLQo4SQx1Ss8qkLoeIiLoQgxK1qKQHLw3wW0pHOW7r5wugsbtUb+SkfyKinoJBiVrUk5cGaMmoCE9onByhr2nAz5dLpC6HiIi6CIMStainn/H2W45yGSb1b+wq7TtfhIqaeokrIiKirsCgRC1qPvTm2UPXUGrJ0FAP+LgqUVVnxEcHMqQuh4iIugCDErXIvNhkD14a4LfkMgG/G9C4dMUnBy6bl08gIiL7xaBE1zCJIsqqeOitJQMD1Qhyd4KhzogNey5JXQ4REXUyBiW6Rnl1PYwmEXJBgMa5566f1BJBEHDHwMau0j9/zsKVsiqJKyIios7EoETXaJ6f5OGigKyHLw3Qkj4+rojt5YU6owlrf7wgdTlERNSJGJToGjzj7foEQcBzk/sBAL5OvcIL5hIR2TEGJbqGeQ0lnvHWqqGhHpg6JACiCPx551mpyyEiok7CoETX+HVVbgal63k+vj8c5QIOXCjGvvNFUpdDRESdgEGJrsFDb20T6uWMObHhAIDVO8/CaOL1pYmI7A2DElkQRfGqoMQ1lG5k0e19oFY54Jy2Al8fvSJ1OUREZGUMSmShsrYBdUYTBADuLlwa4EbcnRVYdHskAGDNrnRU1TVIXBEREVkTgxJZaJ6f5O7sCAcZ/3m0xZwxYQj2cEKBvhYf89ImRER2hZ+EZIGXLmk/pYMcz03uDwDYuO8SCitqJK6IiIishUGJLJQ2Lw3AidztcteQAESFuKOqzshFKImI7AiDElkwd5S4hlK7CIKAP065BQDw1eFspGsrJK6IiIisgUGJLHANpY4bFeGJyQP9YRKBP+04DVHkcgFERLaOQYksNC8N4Mk5Sh3yx6m3QOEgw8GLJfj+tFbqcoiI6CYxKJFZVV0DquuNADhHqaNCPJ2xYHwvAMBr/zuLmqb3k4iIbBODEpk1H3ZTqxygcOA/jY56cmJv+KtVuFJWjY/2X5a6HCIiugn8NCSzXw+7sZt0M5wVDlg+pXG5gL/tvYT88mqJKyIioo5iUCKzkqalAbiG0s27OyoQI8M9UF1vxOqd56Quh4iIOohBiczMZ7xxaYCbJggCVt01EIIAfHs8D79klkpdEhERdQCDEpnx0Jt1DQrSYObIEADAy9+ehtHE5QKIiGwNgxKZ8fIl1rfsjn5wUzngdJ4eW37JkbocIiJqJwYlAgDU1htRWdt45Xt2lKzHy1WJp+P6AgDeSDyHkspaiSsiIqL2YFAiAEBpVWM3yVkhh5NCLnE19mVObBhuCVCjvLoeq7/jxG4iIlviIHUB1D3w0iXtszklu13jJ/T1wbl8Pf599Ao8nBWI8HaxuH92TKg1yyMiIithR4kAAGVNHSUPBqVOEerpjBHhngCAb47losFkkrgiIiJqCwYlAnDVGW/ODEqdJX6gH1wUchRW1OLgxRKpyyEiojZgUCIAgK6qHgDgwaDUaZwVDrhzcAAAYPe5ApQ1hVMiIuq+GJQIwK+Tud1dHCWuxL4NDXFHhLcL6o0i/nsiT+pyiIjoBhiUCKIoQlfFQ29dQRAE3B0VCJkAnNNW4EyeXuqSiIjoOhiUCJW1Dag3ihAAaJzYUepsfmoVxkf6AAD+eyIPtfVGiSsiIqLWMCiReX6S2skRDnL+k+gKE/v5wsPZEeXV9fj+TIHU5RARUSv4qUjmpQHcndlN6ioKBxnuHRoMAEi5XIIjvGguEVG3xAUnyXz2Fecnda0+vq4YFuqB1OwyPPHPVCy8vQ8crdTR4wKWRETWwY4Soazp0Js7g1KXmzLYH65KBxRV1mJveqHU5RAR0W8wKNGvq3Lz0FuXc1Y44K6oQADAvvNFyC+vlrgiIiK6GoMS8fIlEhsUqMaAADVMIrAtNRdGkyh1SURE1IRBqYcziaL50BtX5ZZG89pKKkcZcnXVOHSpWOqSiIioSYeC0uXLl61dB0mksqYBRpMImcA1lKSkdnLEnYMaL2/y49kClFTWSlwREREBHQxKffr0wcSJE/HPf/4TNTU11q6JulDzYTe1kyPkMkHianq2EWEe6NV0eZOvU6/AJPIQHBGR1DoUlFJTUzFkyBAsXboU/v7+eOyxx3D48GFr10Zd4NeJ3DzsJjVBEDB9WDAUchkyS6qQfKlE6pKIiHq8DgWl6OhovPvuu8jLy8Pf//535OfnY9y4cRg0aBDeeecdFBUVWbtO6iScn9S9eLooMHmQPwDghzNaFFfwEBwRkZRuajK3g4MDpk+fjq1bt+KNN97AxYsXsWzZMoSEhGDOnDnIz8+3Vp3USZoXm+TSAN1HTIQn+vi4ot4o4t88BEdEJKmbCkpHjhzBk08+iYCAALzzzjtYtmwZLl26hF27diEvLw/33HOPteqkTsKlAbqfxkNwQVA6yJBdWoWDF3kWHBGRVDoUlN555x0MHjwYY8aMQV5eHj7//HNkZWXhtddeQ0REBMaPH49NmzYhNTXV2vWSlfHQW/fk7qzA1MGNZ8HtOlOAQj1PmiAikkKHgtL777+P2bNnIysrC9u3b8e0adMgk1k+la+vLz755BOrFEmdw2gSoeOq3N3W8DAP9PVzRYOp8RAcF6IkIup6HQpKu3btwvPPP4+AgACL7aIoIjs7GwCgUCgwd+7cm6+QOk2BvgYmEZALAtRcQ6nbEQQB9w4NhspRhitl1ThwgSdJEBF1tQ4Fpd69e6O4+Np5E6WlpYiIiLjpoqhr5JRWAQA0zo6QCVxDqTvSODli2pDGa8ElnS1Eno7XgiMi6kodCkpiK2fhVFZWQqVSteu5NmzYgPDwcKhUKsTExNxwPaatW7eif//+UKlUGDx4MHbu3HlNbStXrkRAQACcnJwQFxeHCxcuXPM8//vf/xATEwMnJyd4eHggISGhXXXbgytljR+6POzWvQ0NcceAADWMooh/HclBvdEkdUlERD2GQ3sGL126FEDjIYGVK1fC2dnZfJ/RaERKSgqio6Pb/HxbtmzB0qVLsXHjRsTExGDt2rWIj49Heno6fH19rxl/6NAhzJo1C6tXr8a0adOwefNmJCQkIDU1FYMGDQIAvPnmm1i3bh0+++wzRERE4KWXXkJ8fDzOnDljDnFff/01Hn30Ufz5z3/G7bffjoaGBpw6dao9b4VdyClr7ChxInf3JggCEoYGIbu0CoUVtfjhtBZTm7pMRETUuQSxtfZQCyZOnAgA2LdvH2JjY6FQ/PoBq1AoEB4ejmXLliEyMrJNzxcTE4ORI0di/fr1AACTyYSQkBAsWrQIL7zwwjXjZ8yYAYPBgB07dpi3jR49GtHR0di4cSNEUURgYCCeeeYZLFu2DABQXl4OPz8/bNq0CTNnzkRDQwPCw8PxyiuvYP78+W196dfQ6/XQaDQoLy+HWq3u8PNIadnW4/j30Sv43QA/TOx3bTCl7iVdq8dnyVkAgD+MjUAfX9dWx86OCe2qsoiIbEp7P7/b1VHas2cPAGDevHl49913byog1NXV4ejRo1i+fLl5m0wmQ1xcHJKTk1t8THJysrmr1Sw+Ph7bt28HAGRkZECr1SIuLs58v0ajQUxMDJKTkzFz5kykpqYiNzcXMpkMQ4cOhVarRXR0NN566y1zV6oltbW1qK39dZVkvV7fkZfdrTTPUeKhN9vQz1+NmAhPpGSU4t9Hc7B4Ul84KeRSl0VEZNc6NEfp008/vekuSnFxMYxGI/z8/Cy2+/n5QavVtvgYrVZ73fHNX6835vLlywCAl19+GS+++CJ27NgBDw8P3HbbbSgtLW213tWrV0Oj0ZhvISEh7Xi13dOvc5R46M1W3DkoAN6uCuhrGvDN8VypyyEisntt7ihNnz4dmzZtglqtxvTp0687dtu2bTddWGcxmRonwv7xj3/EfffdB6Ax+AUHB2Pr1q147LHHWnzc8uXLLbpZer3epsNSg9EEbdMihgxKtkPhIMMDw0Pwwf5LOHGlHP39dYgOcZe6LCIiu9XmoKTRaCA0nUKu0Whu+ht7e3tDLpejoKDAYntBQQH8/f1bfIy/v/91xzd/LSgosFjjqaCgwDzJvHn7gAEDzPcrlUr06tXLvAZUS5RKJZRKZRtfXfeXX14Do0mEg0yAq6pdR2BJYiGezpjY3xdJZwvx7fFchHs5w51hl4ioU7T5E/LTTz9t8c8dpVAoMHz4cCQlJZlPzTeZTEhKSsLChQtbfExsbCySkpKwZMkS87Zdu3YhNjYWABAREQF/f38kJSWZg5Fer0dKSgqeeOIJAMDw4cOhVCqRnp6OcePGAQDq6+uRmZmJsLCwm35dtqL5jDd3rqFkk27r64vz2grklFXjX0dy8Mj4XtyPRESdoENzlKqrq1FVVWX+e1ZWFtauXYsffvihXc+zdOlSfPTRR/jss89w9uxZPPHEEzAYDJg3bx4AYM6cORaTvRcvXozExESsWbMG586dw8svv4wjR46Yg5UgCFiyZAlee+01fPvttzh58iTmzJmDwMBAcxhTq9V4/PHHsWrVKvzwww9IT083h6gHHnigI2+HTbpSyvlJtkwuEzBjZCiUDjJkllRhT3qh1CUREdmlDh1zueeeezB9+nQ8/vjj0Ol0GDVqFBQKBYqLi/HOO++Yg8eNzJgxA0VFRVi5cqX57LPExETzZOzs7GyLa8iNGTMGmzdvxosvvogVK1YgMjIS27dvtzhb7bnnnoPBYMCCBQug0+kwbtw4JCYmWiyE+dZbb8HBwQEPPfQQqqurERMTg927d8PDw6Mjb4dNusI1lGyep4sC90QH4l9HrmD32UL08XFFmJeL1GUREdmVdq2j1Mzb2xv79u3DwIED8fHHH+O9995DWloavv76a6xcuRJnz57tjFq7FVtfR2nplmPYlpaL+AF+mMA1lGza1iM5SMvRwd3JEYtuj4STQs51lIiIWtHez+8OHXqrqqqCm5sbAOCHH37A9OnTIZPJMHr0aGRlZXXkKamLmVfldmFHydbdHRUITxcFdNX12H4st9VLDBERUft1KCj16dMH27dvR05ODr7//nvccccdAIDCwkKb7K70RFxDyX4oHeWYMSIEMgE4mVuOo1llUpdERGQ3OhSUVq5ciWXLliE8PBwxMTHms85++OEHDB061KoFkvXVNhjNayi5c1VuuxDi6Yzf3dI4t++/J/JwsbBS4oqIiOxDh4LS/fffj+zsbBw5cgSJiYnm7ZMmTcJf//pXqxVHnSNfVwNRBFSOMrgquYaSvRjf1we9fFxQbxSx6Ms01NQbpS6JiMjmdSgoAY2LOw4dOtTirLRRo0ahf//+VimMOk/z/KRgD2fzIqJk+2SCgN8PD4GLQo6z+Xq8uuOM1CUREdm8DrUTDAYD/vKXvyApKQmFhYXmy4I0a76eGnVPzfOTQjycJK6ErE3t5IjfjwjBpuRMfJGSjVERnrgnOkjqsoiIbFaHgtIjjzyCffv24aGHHkJAQAC7EjbmylUdJbI/kX5uWDixD97bfRErtp3E4CANevm4Sl0WEZFN6lBQ+u677/C///0PY8eOtXY91AVymlblDvFkR8leLZ4UicMZpUjJKMVTm9PwnyfHQOUol7osIiKb06E5Sh4eHvD09LR2LdRF2FGyfw5yGdbNGgovFwXO5uvxJ85XIiLqkA4FpVdffRUrV660uN4b2Y6cpjlKwZyjZNf81CqsnRkNQQA2p2Tjm2O5UpdERGRzOnTobc2aNbh06RL8/PwQHh4OR0fLtXhSU1OtUhxZX029EUUVtQCAEA9nnMrVS1wRdabxkT5YNLEP1jXNVxoYqEYfXzepyyIishkdCkoJCQlWLoO6SvMZby4KOReb7CEWx/XFL5llSL5cgsf+cRTfLBzH9bOIiNqoQ78tV61aZe06qIs0z08K8eQaSj2FXCbgvdlDcdd7P+FSkQHL/nUc7//fMO5/IqI26PCCkzqdDh9//DGWL1+O0tJSAI2H3HJzOQ+iO7vC+Uk9krerEn97cBgUchkST2uxcR/XOiMiaosOBaUTJ06gb9++eOONN/D2229Dp9MBALZt24bly5dbsz6yshye8dZjDQ31wMt3DwQAvPX9Ofx0oVjiioiIur8OBaWlS5fi4YcfxoULF6BSqczbp0yZgv3791utOLI+dpR6tlmjQvD7EcEwicCiL1PNh2KJiKhlHQpKv/zyCx577LFrtgcFBUGr1d50UdR5rpSyo9STCYKAP90zCEOCNSirqscT/0zlxXOJiK6jQ0FJqVRCr7/2tPLz58/Dx8fnpouizmO+zhtX5e6xVI5y/O3BYfBwdsTJ3HKs+M9JiKIodVlERN1Sh4LS3XffjT/96U+or68H0Pi/1OzsbDz//PO47777rFogWY+htgElhjoA7Cj1dMEezlg/exjkMgHbUnPx0QFO7iYiakmHgtKaNWtQWVkJHx8fVFdXY8KECejTpw/c3Nzw+uuvW7tGspJcXWM3Sa1ygMaJayj1dGP7eGPltAEAgNXfnUPS2QKJKyIi6n46tI6SRqPBrl27cPDgQRw/fhyVlZUYNmwY4uLirF0fWRGv8dZzbE7JbtM4B5mAUeGeOJxZiie+SMXjE3rDX62yGDM7JrQzSiQisgntDkomkwmbNm3Ctm3bkJmZCUEQEBERAX9/f4iiyEXsurGcUp7xRpYEQcBdUYEoqqxFRrEB/0jOxJO39YELV+4mIgLQzkNvoiji7rvvxiOPPILc3FwMHjwYAwcORFZWFh5++GHce++9nVUnWcHVq3ITNZPLBDw4KhSeLgqUVdXji5RsNJhMUpdFRNQttCsobdq0Cfv370dSUhLS0tLw5Zdf4quvvsLx48fx448/Yvfu3fj88887q1a6SewoUWuclQ54aHQYlA4yZJYY8O2xPJ4JR0SEdgalL7/8EitWrMDEiROvue/222/HCy+8gC+++MJqxZF1XdE1dZQ4R4la4KdWYebIUAgAjmSVYf/5IqlLIiKSXLuC0okTJzB58uRW77/zzjtx/Pjxmy6KOoe5o8Q1lKgV/fzdMG1IAADg+zMFOJajk7YgIiKJtSsolZaWws/Pr9X7/fz8UFZWdtNFkfXpa+pRXt247hXPeqPrie3tjXF9vAEAXx+9gkOXeE04Iuq52hWUjEYjHBxaPxtGLpejoaHhposi68ttWpHbw9kRrjyjiW5g8iB/DApUwyiKeOwfR3G+oELqkoiIJNGuT0xRFPHwww9DqVS2eH9tba1ViiLry+E13qgdZIKAB0aEoOKnDGSVVmHep7/gP0+Oge9v1lgiIrJ37QpKc+fOveGYOXPmdLgY6jy8xhu1l6NchodGh2Hz4WxcLjZg3qZfsOWxWHYkiahHaddvvE8//bSz6qBOlsNVuakDnJUO2DRvFO7920GcztPj8X8cxScPj4DSQS51aUREXaJD13oj22PuKHENJWqnUC9n/P3hkXBWyPHTxWI8veUYjCausUREPQODUg/RHJTYUaKOiApxx4cPjYBCLsPOk1q8uP0UF6Qkoh6BQakHEEURV0qbL1/CjhJ1zLhIb7w7MxoyAfjycDbe/iFd6pKIiDodg1IPoK9uQEVt47INQe7sKFHH3Tk4AK/fOxgAsGHPJXx84LLEFRERdS4GpR6geSK3t6sCTgpOwqWbM2tUKJ6b3A8A8Nr/zmLrkRyJKyIi6jwMSj3AFZ7xRlb2xITeeHR8BADg+a9P4H8n8iWuiIioczAo9QDma7zxjDeyEkEQsGLKLZgxIgQmEVj8VRp+PFMgdVlERFbHoNQDNHeUQjzZUSLrEQQBf54+GPdEB6LBJOLJL1Jx4EKR1GUREVkVg1IP8OvSAOwokXXJZQLWPBCFyQP9UWc04dHPjyDlconUZRERWQ2DUg/AVbmpMznIZVg3aygm9vNBTb0Jf9j0C9Kyy6Qui4jIKnjRJjsniiJX5aabsjklu03jbuvni6zSKlwuMmDWRz9j/theCGrh39zsmFBrl0hE1GnYUbJzpYY6VNUZAQCB7gxK1Hkc5TLMGR2OME9n1NSb8PeDGcjVVUtdFhHRTWFQsnPN3SQ/tRIqR66hRJ1L4SDD3DHhCPV0RnW9EX//iWGJiGwbg5Kd4/wk6moqRzkeZlgiIjvBoGTnOD+JpMCwRET2gkHJznFVbpLKb8PSJz9dRm4ZwxIR2RYGJTvHVblJSleHpZp6Ez45eBknr5RLXRYRUZsxKNk5rspNUlM5yjHvqrD04Mc/MywRkc1gULJjV6+hxI4SSUl5VVjS1zQwLBGRzWBQsmNFlbWobTBBJgABGgYlklZzWBoe5sGwREQ2g0HJjjXPT/JXq6Bw4K4m6Skd5fjsD6MYlojIZvDT045llxoAAKFenJ9E3Yer0uGasMRrwxFRd8WgZMcyixsncod7uUhcCZGl5rA0oiks/d/HKUi+VCJ1WURE1+gWQWnDhg0IDw+HSqVCTEwMDh8+fN3xW7duRf/+/aFSqTB48GDs3LnT4n5RFLFy5UoEBATAyckJcXFxuHDhQovPVVtbi+joaAiCgGPHjlnrJXULWSWNHaUwBiXqhlyVDvh8/iiM7eMFQ50RD396GHvSC6Uui4jIguRBacuWLVi6dClWrVqF1NRUREVFIT4+HoWFLf/CPHToEGbNmoX58+cjLS0NCQkJSEhIwKlTp8xj3nzzTaxbtw4bN25ESkoKXFxcEB8fj5qammue77nnnkNgYGCnvT4pZZY0d5R46I26J2eFAz6ZOxKT+vuitsGEBZ8fQeKpfKnLIiIykzwovfPOO3j00Ucxb948DBgwABs3boSzszP+/ve/tzj+3XffxeTJk/Hss8/illtuwauvvophw4Zh/fr1ABq7SWvXrsWLL76Ie+65B0OGDMHnn3+OvLw8bN++3eK5vvvuO/zwww94++23b1hnbW0t9Hq9xa27Y0eJbIHKUY6NDw3H1CEBqDeKeGpzGv6TdkXqsoiIAEgclOrq6nD06FHExcWZt8lkMsTFxSE5ObnFxyQnJ1uMB4D4+Hjz+IyMDGi1WosxGo0GMTExFs9ZUFCARx99FP/4xz/g7Hzjjsvq1auh0WjMt5CQkHa91q5WXl2Psqp6AEAYO0rUzTnKZVg3cygeGB4Mo0nE0n8dxxcpWVKXRUQkbVAqLi6G0WiEn5+fxXY/Pz9otdoWH6PVaq87vvnr9caIooiHH34Yjz/+OEaMGNGmWpcvX47y8nLzLScnp02Pk0p202E3b1clXJQOEldDdGNymYA37huCubFhEEXgj/85hY8PXJa6LCLq4XrkJ+h7772HiooKLF++vM2PUSqVUCqVnViVdWU2HXbj/CSyJTKZgJfvHghnpQPe33sJr/3vLAy1Rvy/SX0gCILU5RFRDyRpR8nb2xtyuRwFBQUW2wsKCuDv79/iY/z9/a87vvnr9cbs3r0bycnJUCqVcHBwQJ8+fQAAI0aMwNy5c2/+hXUDnJ9EtkoQBDw/uT+eje8HAPjrj+ex+rtzEEVR4sqIqCeSNCgpFAoMHz4cSUlJ5m0mkwlJSUmIjY1t8TGxsbEW4wFg165d5vERERHw9/e3GKPX65GSkmIes27dOhw/fhzHjh3DsWPHzMsLbNmyBa+//rpVX6NUeMYb2bqnJvbBS9MGAAA+3H8ZL31zCiYTwxIRdS3JD70tXboUc+fOxYgRIzBq1CisXbsWBoMB8+bNAwDMmTMHQUFBWL16NQBg8eLFmDBhAtasWYOpU6fiq6++wpEjR/Dhhx8CaPzf6JIlS/Daa68hMjISEREReOmllxAYGIiEhAQAQGhoqEUNrq6uAIDevXsjODi4i1555zJ3lLzZUaLuZXNKdpvHOjnKce/QIGxPy8U/f87G6Vw9pg8Lhlz262G42TGh13kGIqKbI3lQmjFjBoqKirBy5UpotVpER0cjMTHRPBk7OzsbMtmvja8xY8Zg8+bNePHFF7FixQpERkZi+/btGDRokHnMc889B4PBgAULFkCn02HcuHFITEyESqXq8tcnFXaUyF6MDPeEo1yGfx/NQVqODlV1RswaFcrrFxJRlxBEHvjvEL1eD41Gg/LycqjVaqnLsWCobcDAVd8DAI6vvAMaZ8dWx7bnf/dEUjqbr8eXh7PRYBIR6umMObFhcFY4sKNERO3S3s9v/pfMDmU1dZM8nB2vG5KIbMktAWrMHxcBlaMM2aVV+HD/ZZRX10tdFhHZOQYlO8Qz3shehXm5YMGtvaFWOaCwohYb913CxcIKqcsiIjvGoGSHOD+J7Jm/WoXHJvSGt6sS5dX1uH9jMo5mlUpdFhHZKQYlO5Rdyo4S2TcPZwUeu7UXgj2coKuqx6yPUrDzJC+mS0TWx6BkhzKLGztKvMYb2TMXpQMeGdcLcbf4oq7BhCe/SMWH+y9xYUoisioGJTvEOUrUUygcZPjgoRGYGxsGAPjzznNY+c1pNBhNEldGRPaCQcnO1NQbkVdeA4BzlKhnkDddH+7FqbdAEIB//JyFBf84CkNtg9SlEZEdYFCyMzmljYfd3JQO8HRRSFwNUdcQBAGPjO+F9x8cBqWDDLvPFeKBjcnI01VLXRoR2TgGJTvTfMZbmLczr7ZOPc7kQQH4csFoeLkocCZfj7vXH8TRrDKpyyIiG8agZGc4P4l6umGhHvhm4Vj093dDcWUtZn34M/599IrUZRGRjWJQsjOZTUGJ85OoJwv2cMbXT4xB/EA/1BlNWLb1OF7/3xkYTTwjjojah0HJzjRfvoQdJerpXJQOeP/B4fh/t/cBAHx0IAPzP/sF5VW87AkRtR2Dkp3JMq/KzaBEJJMJWHpHP6yfPRQqRxn2phfhrvU/4XReudSlEZGNcJC6ALKeugYTrpTx8iXUs2xOyW7TuPnjemFzShayS6twz/qDuCc6EMPDPC3GzI4J7YwSiciGsaNkR3J11TCJgJOjHD5uSqnLIepWgtyd8NTEPujn54YGk4ivU3OxLfUK6rk4JRFdB4OSHck0n/HGpQGIWuKscMBDsWH43QA/CACOZJXhg/2XUGqok7o0IuqmGJTsSFbxr0GJiFomEwRM7OeLh8eGw1khR56uBu/tvoDjOTqpSyOibohByY5kciI3UZtF+rph4cQ+CPV0Rm2DCVuO5OCZfx1HJS99QkRXYVCyI1xskqh93J0VeHR8L9ze3xcCgK9Tr2DaugM4cUUndWlE1E0wKNmRX5cG4KE3oraSywTE3eKHR8b3QqBGhcySKkz/2yFs3HeJC1QSEYOSvWgwmpBT1nydN3aUiNorwtsF3y2+FVMG+6PBJOIv353DjA+SkdE094+IeiYGJTuRX16DeqMIhYMMAWqV1OUQ2SSNsyM2zB6GN+4bDBeFHEeyynDnu/ux6WAGTOwuEfVIDEp2ovmwW6inM2QyLg1A1FGCIGDGyFB8//StGNPbCzX1Jrz83zOY/fHPyCmtkro8IupiDEp2ghfDJbKuYA9n/HN+DF69ZyCcHOX4+XIp4tfux2eHMjl3iagHYVCyEzzjjcj6ZDIBD8WG4/slt2JUhCeq6oxY9e1p3L/xEM5p9VKXR0RdgEHJTlwuYkeJqLOEejnjq0dH49V7BsJV6YC0bB2mrfsJb3+fjpp6o9TlEVEnYlCyE+cLKwAAfXzdJK6EyD41d5d+XDoBdwzwQ4NJxPo9F3Hnuwdw6GKx1OURUSdhULIDVXUNyCmtBgD09XOVuBoi++avUeHDOSOw8f+Gw0+tREaxAbM/TsH/+zINBfoaqcsjIitzkLoAunkXCysBAN6uCni5KiWuhsh2bU7Jbtf4x27tjR/OaJFyuRTfHs9D4mktJvX3xZje3pDLBMyOCe2kSomoq7CjZAfStY2H3SJ52I2oS6kc5bg7KghPTuyDEA8n1DWY8N0pLd7bfQGXiiqlLo+IrIBByQ5caOoo9fNnUCKSQpC7Ex6b0Bv3DQuCs0KOwopafPJTBhZ9mQZtOQ/HEdkyBiU7YO4ocX4SkWRkgoDhYZ545nf9EBPhCQHAf4/nYdKavfhw/yXUG01Sl0hEHcCgZAcuFDQGpX5+7CgRSc1JIcc90Y2H44aGusNQZ8Sfd57DlHcP4NAlnh1HZGsYlGxcRU098ppa+5EMSkTdRpC7E75+fAzevH8IPF0UuFBYidkfpWDh5lTk6qqlLo+I2ohBycadL2icn+SnVkLj5ChxNUR0NZlMwO9HhGDPM7fhodFhkAnAjhP5mLRmL9b+eB7VdVyskqi7Y1Cycc2H3fqym0TUbWmcHfFqwiB8u3AcRoV7oqbehLU/XkDcO/uw40QeRJHXjiPqrhiUbFw6gxKRzRgUpMGWx0Zj/eyhCNSokKurxsLNaZjxwc84lVsudXlE1AIuOGnjLjQdeuNEbqLu53oLWC64tTcOXCzC/vNFOJxZirve+wkjwj3xuwF+cFW2/KuZC1gSdT12lGzc+QIuDUBkixQOMkzq74en4/piSLAGIoBfMkvxzq50HLxYDKOJh+OIugMGJRumq6pDYUUtAJ7xRmSr3J0VmDkyFI+O74VAjQo19Sb872Q+1iVdMP9HiIikw6Bkw5rPeAtyd2q1VU9EtiHC2wVPTuyDe4cGwUUhR1FlLTYdysRnhzJR3PQfIiLqevx0tWG/TuTmYTcieyATBIwM98SgQA32pBfi0KVipBdU4GJhJcb09sJdUQFwU3EZEKKuxI6SDTMvDcBrvBHZFSeFHFMGB2DxpL7o6+cKoyjiwMViTHx7L7b8ks35S0RdiB0lG9Y8f6GvL4MSkT3ycVPi4TERSNfq8b+T+SiurMPzX5/EX3ddwORB/je1LAjPoCNqGwYlG9Y8R6kfO0pEdq2fvxq9fV3x86US7E4vhFZfg02HMtHH1xV3DvJHgMZJ6hKJ7BYPvdmo4spalBrqIAhAbx/OUSKydw4yGcZF+mDZHf0wtrcX5IKAi4WVWL/7Iv59NAe6qjqpSySyS+wo2ajz2sbDbqGeznBSyCWuhoi6irPCAVOHBCK2tze+P63FydxypGbrcPxKOUZHeGJCP1+eBUtkRfxpslHneekSoh7N00WBWaNCMa60ComntcgoNuDgpRL8klWGsb29MT7SGypH/ieK6GYxKNmo84WN85O4NABRzxbi6YxHxkXgYmElfjhTgFxdNfakF+LnyyWY0NcHMb08oXRgYCLqKAYlG9V86I0dJSISBAGRfm7o4+uK03l67DpTgKLKWiSe1mL/hSKM7+ON0b28oGSHiajdGJRskCiKPPRGRNcQBAGDgjS4JUCN4zk67E4vRKmhDt+fKcD+C8UYH9kYmHhIjqjtGJRsUIG+FvqaBshlAnr5uEhdDhF1M3KZgGFhHogKcceJKzrsSS9EcWUdfjhTgAMXijG6lxfiB/rBy1UpdalE3R6XB7BBzd2kcC9nzj0golbJZQKGhnpgSVxf/H5EMLxdlaiuN2JPeiHGvrEbK785hZzSKqnLJOrWukVHacOGDXjrrbeg1WoRFRWF9957D6NGjWp1/NatW/HSSy8hMzMTkZGReOONNzBlyhTz/aIoYtWqVfjoo4+g0+kwduxYvP/++4iMjAQAZGZm4tVXX8Xu3buh1WoRGBiI//u//8Mf//hHKBSKTn+9N2NzSjZ+ulAEAFA5yrE5JVviioiou5MJAqJDPDAk2B2n8/TYf74IubpqfJ6chS9SsjF1cAAW3NoLg4I0UpdK1O1I3lHasmULli5dilWrViE1NRVRUVGIj49HYWFhi+MPHTqEWbNmYf78+UhLS0NCQgISEhJw6tQp85g333wT69atw8aNG5GSkgIXFxfEx8ejpqYGAHDu3DmYTCZ88MEHOH36NP76179i48aNWLFiRZe85ptV0HQlcT+1SuJKiMiWyAQBg4M0ePK23tj8SAzGR3rDaBLx7fE8THvvJ/z+g2QkntLyWnJEVxFEUZT0JyImJgYjR47E+vXrAQAmkwkhISFYtGgRXnjhhWvGz5gxAwaDATt27DBvGz16NKKjo7Fx40aIoojAwEA888wzWLZsGQCgvLwcfn5+2LRpE2bOnNliHW+99Rbef/99XL58uU116/V6aDQalJeXQ61Wt/dld9jmlGy8v/cicsqqMWtUKAbzf4BE1AHN13o7lVuOD/dfxs6T+WhoCkjBHk54eEw4HhgRAo2To5RlElldez+/Je0o1dXV4ejRo4iLizNvk8lkiIuLQ3JycouPSU5OthgPAPHx8ebxGRkZ0Gq1FmM0Gg1iYmJafU6gMUx5enq2en9tbS30er3FTQqiKP7aUXLjREwiujmDgjRYN2sofnr+djw1sTc8nB1xpawar/3vLGJXJ2H5thM4eaVc6jKJJCNpUCouLobRaISfn5/Fdj8/P2i12hYfo9Vqrzu++Wt7nvPixYt477338Nhjj7Va6+rVq6HRaMy3kJCQ67+4TlJqqENdgwlymcAzVojIavw1Kjwb3x/JyyfhL9MHo6+fK6rqjPjycA7uWv8T7nrvJ3x1OBuG2gapSyXqUpLPUZJabm4uJk+ejAceeACPPvpoq+OWL1+O8vJy8y0nJ6cLq/xVdtMZKoEaFeQyQZIaiMh+qRzlmDkqFN8vuRVfLRiNu6MCoZDLcDK3HC9sO4mYPyfhxe0ncSZPmq46UVeT9Kw3b29vyOVyFBQUWGwvKCiAv79/i4/x9/e/7vjmrwUFBQgICLAYEx0dbfG4vLw8TJw4EWPGjMGHH3543VqVSiWUSuk7OM1BKcyL6ycRUce19YzZ0b28MChIg7TsMhzOKEWJoQ7//Dkb//w5GyEeThgV4YnBQe54eGx45xZMJBFJO0oKhQLDhw9HUlKSeZvJZEJSUhJiY2NbfExsbKzFeADYtWuXeXxERAT8/f0txuj1eqSkpFg8Z25uLm677TYMHz4cn376KWQy22iuNQelEE9niSshop7CVemA8ZE+ePp3ffGHsREYFKSBTAByyqrxdWou/pJ4Fqu+OYVTuZzLRPZH8nWUli5dirlz52LEiBEYNWoU1q5dC4PBgHnz5gEA5syZg6CgIKxevRoAsHjxYkyYMAFr1qzB1KlT8dVXX+HIkSPmjpAgCFiyZAlee+01REZGIiIiAi+99BICAwORkJAA4NeQFBYWhrfffhtFRUXmelrrZHUHhtoGaMsblzgIZVAioi4mEwT08XVFH19XVNTUIzWrDIczS1FWVY/PkrPwWXIWBgSo8cCIYCREB8HDpXuvS0fUFpIHpRkzZqCoqAgrV66EVqtFdHQ0EhMTzZOxs7OzLbo9Y8aMwebNm/Hiiy9ixYoViIyMxPbt2zFo0CDzmOeeew4GgwELFiyATqfDuHHjkJiYCJWqcd2hXbt24eLFi7h48SKCg4Mt6pF4tYTrOp6jgwjA3cmRp+wSkaTcVI6Y0M8X4/v64GJhJYoqarHrTAHO5Ovxyn/P4M87z+J3A/zwwPAQjI/0hoPcNrr2RL8l+TpKtkqKdZTW776At384j8FBGswaFdol35OIqC1mx4SizFCHb4/nYevRHJzK/XWyt6+bEvcND8YDw4PRy8dVwiqJ2v/5LXlHidouNVsHgIfdiKh78nBRYO6YcMwdE44zeXpsPZqD7Wm5KKyoxft7L+H9vZcwPMwD9w8PxpTBAeyMk01gR6mDurqjJIoihr66C7qqejx5W28EezAsEVH312Ay4Vx+BY5mleF8QQWaP3AcZAL6+bthaIg7+vq5WRyaa141nKgzsKNkpy4XG6CrqoeDTIC/htd4IyLb4CCTYVCQBoOCNNDX1ONYtg6p2WUorKjF6Tw9Tufp4eQox+AgDaJD3BHqxf8EUvfCoGQjjmaVAQCCPJzgYCNLGRARXU2tcsStfX0wPtIbWn0NjmXrcPyKDvqaBhzOLMXhzFJ4ODtCW16DhKFB6OPL+UwkPQYlG5GW3RiUwjg/iYhsnCAICNA4IWCwE+IH+eNykQHHcnQ4lVeOsqp6rN9zEev3XMTgIA3ujgrEnYP9Od2AJMOgZCNSs3QAOJGbiOzL1Wsz3R0ViHNaPYoqarHvfBFO5pbjZG45Xt95FkOCNbhzUADuHOSPcG9emYC6DoOSDdDX1ON8YQUArshNRPZL4SDDkGB3zI4JRUllLf53Mh87T+bjcEYpTlwpx4kr5Xgj8Rz6+7sh7hY/3H6LL6KC3XndS+pUDEo24Fi2DqLY2E1yU/F0WiKyf16uSsyJDcec2HAUVdTihzNaJJ7S4tClEpzTVuCctgLr91yEl4sCE/r5YFJ/P4zr4w2NM39HknUxKNmA1Kb5ScNC3aUthIhIAj5uSjwYE4YHY8JQZqjDnvRCJJ0rxP7zRSgx1GFbai62peZCEIABAWqM6e2F2N5eGBnuyf9c0k1jULIBzWe8DQvzkLgSIiJpebgoMH1YMKYPC0a90YQjmWXYfa4Ae9KLcLGw0rzkwEcHMiCXCRgUpEFsr+bg5AFnBT/2qH34L6abM5lEHMvRAQCGhXrgxBVenZuICAAc5TLENnWP/jgVKNTXIPlyCZIvlSD5cgmySqpwPEeH4zk6bNx3CQ4yAdEh7ojt7YWYCC8MDXWHi5Ifg3R9/BfSzV0sqkRFTQOcFXL093djUCIiu7c5JfumHj8k2B1Dgt2hq6rD5WIDACD5UglyddU4klWGI1lleA8XGztOgWqMivDEyPDGm4eLwhovgewIg1I313zYbUiwhlffJiJqB3dnBYaFKjA7JhSiKCKntBrJl4uRfKkEv2SWIVdXjeNXynH8Sjk+OpABAOjr54qR4Z4YFdF4C9A4SfwqSGoMSt1calNQGs75SUREHfLbDtWoCC+MivBCWVUdMosNyCypQmaJAUUVtThfUInzBZX4oukxHs6OCPdyQbi3C8K9XODtqsCDo8OkeBkkEQalbu6o+Yw3BiUiImvycFbAI1SBoU2/XytrG5BVYjCHpzxdNcqq6lFWpUNa01xRF6UDfrpYbO463RKg5jpOdo5BqRvTVdXhclHj8fWhDEpERJ3KVemAgYEaDAzUAABq6o3ILm3sNmUWV+FKWRUMtQ347pQW353SAgDclA4YHu6BkeGeiInwxOBgDZQOcilfBlkZg1I3lpatAwD08naBJycYEhF1KZWjHH393NDXzw0A0GA04UpZNTTOjjicUYqjWWWoqG3A3vQi7E0vAgAoHWSIDnE3z3EaFurBM+tsHPdeN5aSUQqA3SQiou7AQS5DuLcLZseE4qmJgNEk4my+HoczSvFLZikOZ5SixFCHlIxS8+/v5jPrmg/V8cw628Og1E2JoogfTje2dif085G4GiIi+q3mBS0HBWnwh3EREEURl4sNjcEpoxSHM0txpezXM+s+/unXM+tGhDd2m4aFuiPC2wWCwHlO3RWDUjd1obASl4sNUMhluL2/r9TlEBFRk7as8zQi3BMjwj2hq6prPKuu2IDMEgMKrzqzbvNVZ9YNbQpNQ0M9EBXiDlcerus2uCe6qe9ONnaTxkd68weGiMhGuTsrEO2sQHSIOwDA0HRmXVZJFbJLq5Cvr0FZVT12nyvE7nOFAACZAPT1c8OwMA92nboBfgJ3U9+dygcATB7kL3ElRERkLS5KBwwI1GBA05l19w8Pxpl8PdKyy5CarUNqVuNCmOe0FTinrTB3ndydHTE0xL0xOIWx69SV+C53Q5nFBpzTVkAuE/C7AX5Sl0NERJ3k30evAACUDvLGi/f28oK+ph7ZJVXIKW3sOuXqqqGrqsee9CLsaTq7TgDgp1YhxNMZoU03LobZORiUuqHEpkncsb284O7MsyOIiHoStcrRPEkcABpMJuTrapBT1hicskuroKuqh1ZfA62+Br9kNp5h5+Qox49nCzAs1KNprpMGbipHKV+KXWBQ6oaaFzLjYTciInKQyRDi6YwQT2eM6d24raWuU3W90bLrJAD9/NzME8WHhXmgF+c6tRuDUjeTp6vG8RwdBAG4YyAPuxER0bVa6jppy2vMHafmrlPzXKcvDzfOdXJylCPE0wmhns4I9nBGgEZ13a7T7JjQLnk93RmDUjfzfdNhtxFhHvB1U0lcDRER2QIHmQzBHo3h55quU9Mhu9yyxq5T8/IEzdxUDgjUOCHAXYVAjRMC3Z3g4ezIzlMTBqVu5tfDbgESV0JERLbsRl2nPF0NSiprUVHTgPSaCqQXVJgfq3KUIUDjhEtFlRgYqEZfPzdEeLv0yMux9LxX3I0VVdSaJ+VxfhIREVlTS12n2gYjtOU1yNNVI6+8Bvm6ahToa1FTb0JGsQGfNK0m3ixQo0JvX1f09nFFbx8X9PZxRR9fV/i4Ke22A8Wg1I3sOlMAUQSGBGsQ5O4kdTlERGTnlA5yhHm5IMzLxbytwWRCob4W+eXVcFM54kyeHpeKKlFiqENeeQ3yymtw4EKxxfO4KR3Qy9cVvb0bnyvUywmhni4I83KGl4vCpkMUg1I3wkUmiYhIag4yGQLdG+cqXT2Zu8xQh0tFlU03Ay4VNv45u7QKFbUNOJ6jw/Ec3TXP56KQm9d7CvNyRqiXS+OfPZ0R5OEER7msC19d+zEodRPlVfVIvlQCAJg8kEGJiIik19p17cK9XBDu5YJJt/ihwWhCiaEORRW1KK6sRYmhDqVNN311PQx1RvPZd78lE4BAd6fGAOXpjFBPFwR7OCHIwwnB7k7wdlVCJpO2G8Wg1E38eLYADSYR/fzc0MvHVepyiIiI2sRBLoOfWgU/9bVnatcbTdBV1aPUUItePq7ma9xllxqQXVqFmnoTrpRV40pZNQ6i5JrHK+QyBLirEOTu1HjzaOx0BTf9OUDjBIVD53akGJS6iebVuHnYjYiI7IWjXAYfNyV83JTXrMkkiiKKKmqRVVqF7JKqpq8G5OqqkVtWDa2+BnVGE7JKqpBVUtXi8wsC4OumROBVQao5RAW5OyPQ/frrRLUFg1I3kKurxr6mlVQZlIiIyB61dhivmb9aBf+rulJGkwh9TT10VfXQVdWhrOmrrrrpa1U9GkwiCvS1KNDXIi1b1+Lzqhxl8HBWwN3JERpnBZxR2666GZS6gQ17LqLOaEJsLy/cEqCWuhwiIiLJyWUCPJwV8HBWAHC55n5RFGGoM1qGqKp6iyBVXW9ETb0J+eU1yC+vAQCYalvuTrWGQUliOaVV2HokBwDw9O/6SlwNERGRbRAEAa5KB7gqHRDs0fKY2nojypqCU3l1Y3eqqKQMOe34PgxKEtuw5yLqjSLG9fHGqAhPqcshIiKyG0pHOfwd5RaH9KoMLviuHc/RvRcvsHPZJVXYevQKAODp30VKXA0RERH9FoOShN7bfQFGk4gJfX0wPIzdJCIiou6GQUkiGcUGbEvLBcC5SURERN0Vg5JE3ktq7Cbd3t8X0SHuUpdDRERELWBQksClokpsP9bUTYpjN4mIiKi7YlCSwLqkCzCJwO8G+GFwsEbqcoiIiKgVDEpd7HReOb49ngcAWBLHM92IiIi6MwalLlSgr8Gjnx2BKAJTBvtjYCC7SURERN0Zg1IXMdQ2YP5nvyCvvAa9fFzw53sHS10SERER3QCDUhdoMJqw6Ms0nMrVw8tFgU0Pj4K7s0LqsoiIiOgGGJQ6mSiKeOW/Z7D7XCGUDjJ8PHcEQr2cpS6LiIiI2oBBqZN98lMG/vFzFgQBeHdmNIaGtnLlPiIiIup2GJQ60ddHr+D1nWcBAH+ccgsmDwqQuCIiIiJqDwepC7BHV8qq8PK3Z/Dj2QIAwNzYMMwfFyFxVURERNReDEpWVG804e8/ZWDtjxdQXW+Eo1zAY7f2xtO/6wtBEKQuj4iIiNqJQckKRFHEL5llWPnNKZzTVgAARoV74vV7ByHSz03i6oiIiKijusUcpQ0bNiA8PBwqlQoxMTE4fPjwdcdv3boV/fv3h0qlwuDBg7Fz506L+0VRxMqVKxEQEAAnJyfExcXhwoULFmNKS0vx4IMPQq1Ww93dHfPnz0dlZWW7a1+98yzGv7kHv/8gGee0FfBwdsSb9w/BlsdGMyQRERHZOMmD0pYtW7B06VKsWrUKqampiIqKQnx8PAoLC1scf+jQIcyaNQvz589HWloaEhISkJCQgFOnTpnHvPnmm1i3bh02btyIlJQUuLi4ID4+HjU1NeYxDz74IE6fPo1du3Zhx44d2L9/PxYsWNDu+r9IycaVsmooHWSYOTIESc/cht+PCOGhNiIiIjsgiKIoSllATEwMRo4cifXr1wMATCYTQkJCsGjRIrzwwgvXjJ8xYwYMBgN27Nhh3jZ69GhER0dj48aNEEURgYGBeOaZZ7Bs2TIAQHl5Ofz8/LBp0ybMnDkTZ8+exYABA/DLL79gxIgRAIDExERMmTIFV65cQWBg4A3r1uv10Gg0WPzZQUwd0Rvj+njDSSG3xltyXZtTsjv9exAREdmrKkMFHp00COXl5VCr1TccL+kcpbq6Ohw9ehTLly83b5PJZIiLi0NycnKLj0lOTsbSpUsttsXHx2P79u0AgIyMDGi1WsTFxZnv12g0iImJQXJyMmbOnInk5GS4u7ubQxIAxMXFQSaTISUlBffee+8137e2tha1tbXmv5eXlwMAlt0eCrXaCfU1BtTXXPMw/OtIzo3fCCIiIuoS1YbGaTZt7RNJGpSKi4thNBrh5+dnsd3Pzw/nzp1r8TFarbbF8Vqt1nx/87brjfH19bW438HBAZ6enuYxv7V69Wq88sor12wPCQlp7eURERFRN1VRUQGN5sYXp+dZb220fPlyi06WTqdDWFgYsrOz2/RGk/Xp9XqEhIQgJyenTe1Tsj7uA2nx/Zce94H02rsPRFFERUVFm6bZABIHJW9vb8jlchQUFFhsLygogL+/f4uP8ff3v+745q8FBQUICAiwGBMdHW0e89vJ4g0NDSgtLW31+yqVSiiVymu2azQa/nBITK1Wcx9IjPtAWnz/pcd9IL327IP2NDgkPetNoVBg+PDhSEpKMm8zmUxISkpCbGxsi4+JjY21GA8Au3btMo+PiIiAv7+/xRi9Xo+UlBTzmNjYWOh0Ohw9etQ8Zvfu3TCZTIiJibHa6yMiIiLbJvmht6VLl2Lu3LkYMWIERo0ahbVr18JgMGDevHkAgDlz5iAoKAirV68GACxevBgTJkzAmjVrMHXqVHz11Vc4cuQIPvzwQwCAIAhYsmQJXnvtNURGRiIiIgIvvfQSAgMDkZCQAAC45ZZbMHnyZDz66KPYuHEj6uvrsXDhQsycObPNrTgiIiKyf5IHpRkzZqCoqAgrV66EVqtFdHQ0EhMTzZOxs7OzIZP92vgaM2YMNm/ejBdffBErVqxAZGQktm/fjkGDBpnHPPfcczAYDFiwYAF0Oh3GjRuHxMREqFQq85gvvvgCCxcuxKRJkyCTyXDfffdh3bp1ba5bqVRi1apVLR6Oo67BfSA97gNp8f2XHveB9Dp7H0i+jhIRERFRdyX5ytxERERE3RWDEhEREVErGJSIiIiIWsGgRERERNQKBqUO2LBhA8LDw6FSqRATE4PDhw9LXZLdevnllyEIgsWtf//+5vtramrw1FNPwcvLC66urrjvvvuuWZCU2mf//v246667EBgYCEEQzNdRbCaKIlauXImAgAA4OTkhLi4OFy5csBhTWlqKBx98EGq1Gu7u7pg/fz4qKyu78FXYthvtg4cffvian4vJkydbjOE+6LjVq1dj5MiRcHNzg6+vLxISEpCenm4xpi2/e7KzszF16lQ4OzvD19cXzz77LBoaGrrypdistuyD22677Zqfg8cff9xijDX2AYNSO23ZsgVLly7FqlWrkJqaiqioKMTHx1+z0jdZz8CBA5Gfn2++/fTTT+b7nn76afz3v//F1q1bsW/fPuTl5WH69OkSVmv7DAYDoqKisGHDhhbvf/PNN7Fu3Tps3LgRKSkpcHFxQXx8PGpqfr0q9IMPPojTp09j165d2LFjB/bv348FCxZ01UuweTfaBwAwefJki5+LL7/80uJ+7oOO27dvH5566in8/PPP2LVrF+rr63HHHXfAYDCYx9zod4/RaMTUqVNRV1eHQ4cO4bPPPsOmTZuwcuVKKV6SzWnLPgCARx991OLn4M033zTfZ7V9IFK7jBo1SnzqqafMfzcajWJgYKC4evVqCauyX6tWrRKjoqJavE+n04mOjo7i1q1bzdvOnj0rAhCTk5O7qEL7BkD8z3/+Y/67yWQS/f39xbfeesu8TafTiUqlUvzyyy9FURTFM2fOiADEX375xTzmu+++EwVBEHNzc7usdnvx230giqI4d+5c8Z577mn1MdwH1lVYWCgCEPft2yeKYtt+9+zcuVOUyWSiVqs1j3n//fdFtVot1tbWdu0LsAO/3QeiKIoTJkwQFy9e3OpjrLUP2FFqh7q6Ohw9ehRxcXHmbTKZDHFxcUhOTpawMvt24cIFBAYGolevXnjwwQeRnZ0NADh69Cjq6+st9kf//v0RGhrK/dFJMjIyoNVqLd5zjUaDmJgY83uenJwMd3d3jBgxwjwmLi4OMpkMKSkpXV6zvdq7dy98fX3Rr18/PPHEEygpKTHfx31gXeXl5QAAT09PAG373ZOcnIzBgwebF08GgPj4eOj1epw+fboLq7cPv90Hzb744gt4e3tj0KBBWL58Oaqqqsz3WWsfSL4yty0pLi6G0Wi0eNMBwM/PD+fOnZOoKvsWExODTZs2oV+/fsjPz8crr7yC8ePH49SpU9BqtVAoFHB3d7d4jJ+fH7RarTQF27nm97Wln4Hm+7RaLXx9fS3ud3BwgKenJ/eLlUyePBnTp09HREQELl26hBUrVuDOO+9EcnIy5HI594EVmUwmLFmyBGPHjjVfAaItv3u0Wm2LPyfN91HbtbQPAGD27NkICwtDYGAgTpw4geeffx7p6enYtm0bAOvtAwYl6tbuvPNO85+HDBmCmJgYhIWF4V//+hecnJwkrIxIOjNnzjT/efDgwRgyZAh69+6NvXv3YtKkSRJWZn+eeuopnDp1ymJuJHWt1vbB1XPuBg8ejICAAEyaNAmXLl1C7969rfb9eeitHby9vSGXy685s6GgoAD+/v4SVdWzuLu7o2/fvrh48SL8/f1RV1cHnU5nMYb7o/M0v6/X+xnw9/e/5uSGhoYGlJaWcr90kl69esHb2xsXL14EwH1gLQsXLsSOHTuwZ88eBAcHm7e35XePv79/iz8nzfdR27S2D1oSExMDABY/B9bYBwxK7aBQKDB8+HAkJSWZt5lMJiQlJSE2NlbCynqOyspKXLp0CQEBARg+fDgcHR0t9kd6ejqys7O5PzpJREQE/P39Ld5zvV6PlJQU83seGxsLnU6Ho0ePmsfs3r0bJpPJ/IuMrOvKlSsoKSlBQEAAAO6DmyWKIhYuXIj//Oc/2L17NyIiIizub8vvntjYWJw8edIisO7atQtqtRoDBgzomhdiw260D1py7NgxALD4ObDKPujA5PMe7auvvhKVSqW4adMm8cyZM+KCBQtEd3d3i1n1ZD3PPPOMuHfvXjEjI0M8ePCgGBcXJ3p7e4uFhYWiKIri448/LoaGhoq7d+8Wjxw5IsbGxoqxsbESV23bKioqxLS0NDEtLU0EIL7zzjtiWlqamJWVJYqiKP7lL38R3d3dxW+++UY8ceKEeM8994gRERFidXW1+TkmT54sDh06VExJSRF/+uknMTIyUpw1a5ZUL8nmXG8fVFRUiMuWLROTk5PFjIwM8ccffxSHDRsmRkZGijU1Nebn4D7ouCeeeELUaDTi3r17xfz8fPOtqqrKPOZGv3saGhrEQYMGiXfccYd47NgxMTExUfTx8RGXL18uxUuyOTfaBxcvXhT/9Kc/iUeOHBEzMjLEb775RuzVq5d46623mp/DWvuAQakD3nvvPTE0NFRUKBTiqFGjxJ9//lnqkuzWjBkzxICAAFGhUIhBQUHijBkzxIsXL5rvr66uFp988knRw8NDdHZ2Fu+9914xPz9fwopt3549e0QA19zmzp0rimLjEgEvvfSS6OfnJyqVSnHSpElienq6xXOUlJSIs2bNEl1dXUW1Wi3OmzdPrKiokODV2Kbr7YOqqirxjjvuEH18fERHR0cxLCxMfPTRR6/5zxr3Qce19N4DED/99FPzmLb87snMzBTvvPNO0cnJSfT29hafeeYZsb6+votfjW260T7Izs4Wb731VtHT01NUKpVinz59xGeffVYsLy+3eB5r7AOhqSAiIiIi+g3OUSIiIiJqBYMSERERUSsYlIiIiIhawaBERERE1AoGJSIiIqJWMCgRERERtYJBiYiIiKgVDEpERERErWBQIiKbkZmZCUEQzNd0IiLqbAxKRNSlBEG47u3ll1+WusRuae/evRAE4Zor1hNR53KQugAi6lny8/PNf96yZQtWrlyJ9PR08zZXV1cpyiIiahE7SkTUpfz9/c03jUYDQRDMf/f19cU777yD4OBgKJVKREdHIzExsdXnMhqN+MMf/oD+/fsjOzsbAPDNN99g2LBhUKlU6NWrF1555RU0NDSYHyMIAj7++GPce++9cHZ2RmRkJL799tvr1lxbW4vnn38eISEhUCqV6NOnDz755BPz/fv27cOoUaOgVCoREBCAF154weJ7hoeHY+3atRbPGR0dbdE9u15dmZmZmDhxIgDAw8MDgiDg4Ycfvm7NRGQdDEpE1G28++67WLNmDd5++22cOHEC8fHxuPvuu3HhwoVrxtbW1uKBBx7AsWPHcODAAYSGhuLAgQOYM2cOFi9ejDNnzuCDDz7Apk2b8Prrr1s89pVXXsHvf/97nDhxAlOmTMGDDz6I0tLSVuuaM2cOvvzyS6xbtw5nz57FBx98YO585ebmYsqUKRg5ciSOHz+O999/H5988glee+21dr/+1uoKCQnB119/DQBIT09Hfn4+3n333XY/PxF1gEhEJJFPP/1U1Gg05r8HBgaKr7/+usWYkSNHik8++aQoiqKYkZEhAhAPHDggTpo0SRw3bpyo0+nMYydNmiT++c9/tnj8P/7xDzEgIMD8dwDiiy++aP57ZWWlCED87rvvWqwxPT1dBCDu2rWrxftXrFgh9uvXTzSZTOZtGzZsEF1dXUWj0SiKoiiGhYWJf/3rXy0eFxUVJa5atarNde3Zs0cEIJaVlbVYBxF1Ds5RIqJuQa/XIy8vD2PHjrXYPnbsWBw/ftxi26xZsxAcHIzdu3fDycnJvP348eM4ePCgRQfJaDSipqYGVVVVcHZ2BgAMGTLEfL+LiwvUajUKCwtbrOvYsWOQy+WYMGFCi/efPXsWsbGxEATBoubKykpcuXIFoaGhbXwH2lcXEXUNBiUisjlTpkzBP//5TyQnJ+P22283b6+srMQrr7yC6dOnX/MYlUpl/rOjo6PFfYIgwGQytfi9rg5iHSWTySCKosW2+vr6a8a1py4i6hqco0RE3YJarUZgYCAOHjxosf3gwYMYMGCAxbYnnngCf/nLX3D33Xdj37595u3Dhg1Deno6+vTpc81NJuvYr7vBgwfDZDJZfJ+r3XLLLUhOTrYIQgcPHoSbmxuCg4MBAD4+PhZn++n1emRkZLSrDoVCAaCxQ0ZEXYcdJSLqNp599lmsWrUKvXv3RnR0ND799FMcO3YMX3zxxTVjFy1aBKPRiGnTpuG7777DuHHjsHLlSkybNg2hoaG4//77IZPJcPz4cZw6dapDk6uBxjPW5s6diz/84Q9Yt24doqKikJWVhcLCQvz+97/Hk08+ibVr12LRokVYuHAh0tPTsWrVKixdutQczm6//XZs2rQJd911F9zd3bFy5UrI5fJ21REWFgZBELBjxw5MmTIFTk5OXEqBqAswKBFRt/H//t//Q3l5OZ555hkUFhZiwIAB+PbbbxEZGdni+CVLlsBkMmHKlClITExEfHw8duzYgT/96U9444034OjoiP79++ORRx65qbref/99rFixAk8++SRKSkoQGhqKFStWAACCgoKwc+dOPPvss4iKioKnpyfmz5+PF1980fz45cuXIyMjA9OmTYNGo8Grr77a7o5SUFAQXnnlFbzwwguYN28e5syZg02bNt3U6yKiGxPE3x44JyIiIiIAnKNERERE1CoGJSIiIqJWMCgRERERtYJBiYiIiKgVDEpERERErWBQIiIiImoFgxIRERFRKxiUiIiIiFrBoERERETUCgYlIiIiolYwKBERERG14v8DS/5YtwH0ZQQAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot the distribution of review lengths \n", "sns.distplot(token_lens)\n", "plt.xlim([0, 256])\n", "plt.xlabel('Token count')" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "MAX_LEN = 250" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "class GPReviewDataset(Dataset):\n", " # Constructor Function \n", " def __init__(self, reviews, targets, tokenizer, max_len):\n", " self.reviews = reviews\n", " self.targets = targets\n", " self.tokenizer = tokenizer\n", " self.max_len = max_len\n", " \n", " # Length magic method\n", " def __len__(self):\n", " return len(self.reviews)\n", " \n", " # get item magic method\n", " def __getitem__(self, item):\n", " review = str(self.reviews[item])\n", " target = self.targets[item]\n", " \n", " # Encoded format to be returned \n", " encoding = self.tokenizer.encode_plus(\n", " review,\n", " add_special_tokens=True,\n", " max_length=self.max_len,\n", " return_token_type_ids=False,\n", " pad_to_max_length=True,\n", " return_attention_mask=True,\n", " return_tensors='pt',\n", " )\n", " return {\n", " 'review_text': review,\n", " 'input_ids': encoding['input_ids'].flatten(),\n", " 'attention_mask': encoding['attention_mask'].flatten(),\n", " 'targets': torch.tensor(target, dtype=torch.long)\n", " }" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(160000, 11) (20000, 11) (20000, 11)\n" ] } ], "source": [ "df_train, df_test = train_test_split(reviews_df, test_size=0.2, random_state=46)\n", "df_val, df_test = train_test_split(df_test, test_size=0.5, random_state=46)\n", "\n", "print(df_train.shape, df_val.shape, df_test.shape)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "def create_data_loader(df, tokenizer, max_len, batch_size):\n", " ds = GPReviewDataset(\n", " reviews=df.Text.to_numpy(),\n", " targets=df.sentiment.to_numpy(),\n", " tokenizer=tokenizer,\n", " max_len=max_len\n", " )\n", " \n", " return DataLoader(\n", " ds,\n", " batch_size=batch_size,\n", " num_workers=0\n", " )" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "# Create train, test and val data loaders\n", "BATCH_SIZE = 16\n", "train_data_loader = create_data_loader(df_train, tokenizer, MAX_LEN, BATCH_SIZE)\n", "val_data_loader = create_data_loader(df_val, tokenizer, MAX_LEN, BATCH_SIZE)\n", "test_data_loader = create_data_loader(df_test, tokenizer, MAX_LEN, BATCH_SIZE)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_keys(['review_text', 'input_ids', 'attention_mask', 'targets'])\n", "torch.Size([16, 250])\n", "torch.Size([16, 250])\n", "torch.Size([16])\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/divya/.venv/lib/python3.8/site-packages/transformers/tokenization_utils_base.py:2393: FutureWarning: The `pad_to_max_length` argument is deprecated and will be removed in a future version, use `padding=True` or `padding='longest'` to pad to the longest sequence in the batch, or use `padding='max_length'` to pad to a max length. In this case, you can give a specific length with `max_length` (e.g. `max_length=45`) or leave max_length to None to pad to the maximal input size of the model (e.g. 512 for Bert).\n", " warnings.warn(\n" ] } ], "source": [ "# Examples \n", "data = next(iter(train_data_loader))\n", "print(data.keys())\n", "\n", "print(data['input_ids'].shape)\n", "print(data['attention_mask'].shape)\n", "print(data['targets'].shape)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "# Load the basic BERT model \n", "bert_model = BertModel.from_pretrained(MODEL_NAME)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "# Build the Sentiment Classifier class \n", "class SentimentClassifier(nn.Module):\n", " \n", " # Constructor class \n", " def __init__(self, n_classes):\n", " super(SentimentClassifier, self).__init__()\n", " self.bert = BertModel.from_pretrained(MODEL_NAME)\n", " self.drop = nn.Dropout(p=0.3)\n", " self.out = nn.Linear(self.bert.config.hidden_size, n_classes)\n", " \n", " # Forward propagaion class\n", " def forward(self, input_ids, attention_mask):\n", " output = self.bert(\n", " input_ids=input_ids,\n", " attention_mask=attention_mask\n", " )\n", " # Add a dropout layer \n", " output = self.drop(output.pooler_output)\n", " return self.out(output)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "class_names = ['negative', 'neutral', 'positive']\n", "# Instantiate the model and move to classifier\n", "model = SentimentClassifier(len(class_names))\n", "model = model.to(device)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "768\n" ] } ], "source": [ "# Number of hidden units\n", "print(bert_model.config.hidden_size)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/divya/.venv/lib/python3.8/site-packages/transformers/optimization.py:411: FutureWarning: This implementation of AdamW is deprecated and will be removed in a future version. Use the PyTorch implementation torch.optim.AdamW instead, or set `no_deprecation_warning=True` to disable this warning\n", " warnings.warn(\n" ] } ], "source": [ "# Number of iterations \n", "EPOCHS = 10\n", "\n", "# Optimizer Adam \n", "optimizer = AdamW(model.parameters(), lr=2e-5, correct_bias=False)\n", "\n", "total_steps = len(train_data_loader) * EPOCHS\n", "\n", "scheduler = get_linear_schedule_with_warmup(\n", " optimizer,\n", " num_warmup_steps=0,\n", " num_training_steps=total_steps\n", ")\n", "\n", "# Set the loss function \n", "loss_fn = nn.CrossEntropyLoss().to(device)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "# Function for a single training iteration\n", "def train_epoch(model, data_loader, loss_fn, optimizer, device, scheduler, n_examples):\n", " model = model.train()\n", " losses = []\n", " correct_predictions = 0\n", " \n", " for d in tqdm(data_loader):\n", " input_ids = d[\"input_ids\"].to(device)\n", " attention_mask = d[\"attention_mask\"].to(device)\n", " targets = d[\"targets\"].to(device)\n", " \n", " outputs = model(\n", " input_ids=input_ids,\n", " attention_mask=attention_mask\n", " )\n", " \n", " _, preds = torch.max(outputs, dim=1)\n", " loss = loss_fn(outputs, targets)\n", " correct_predictions += torch.sum(preds == targets)\n", " losses.append(loss.item())\n", " \n", " # Backward prop\n", " loss.backward()\n", " # Gradient Descent\n", " nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)\n", " optimizer.step()\n", " scheduler.step()\n", " optimizer.zero_grad()\n", " \n", " return correct_predictions.double() / n_examples, np.mean(losses)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "def eval_model(model, data_loader, loss_fn, device, n_examples):\n", " model = model.eval()\n", " \n", " losses = []\n", " correct_predictions = 0\n", " \n", " with torch.no_grad():\n", " for d in data_loader:\n", " input_ids = d[\"input_ids\"].to(device)\n", " attention_mask = d[\"attention_mask\"].to(device)\n", " targets = d[\"targets\"].to(device)\n", " \n", " # Get model ouptuts\n", " outputs = model(\n", " input_ids=input_ids,\n", " attention_mask=attention_mask\n", " )\n", " \n", " _, preds = torch.max(outputs, dim=1)\n", " loss = loss_fn(outputs, targets)\n", " \n", " correct_predictions += torch.sum(preds == targets)\n", " losses.append(loss.item())\n", " \n", " return correct_predictions.double() / n_examples, np.mean(losses)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/10\n", "----------\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 10000/10000 [48:27<00:00, 3.44it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Train loss 0.437259683095105 accuracy 0.8518\n", "Val loss 0.395620401853323 accuracy 0.88105\n", "\n", "Epoch 2/10\n", "----------\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 10000/10000 [48:42<00:00, 3.42it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Train loss 0.3355792592415586 accuracy 0.888475\n", "Val loss 0.3036631541714072 accuracy 0.89575\n", "\n", "Epoch 3/10\n", "----------\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 10000/10000 [48:32<00:00, 3.43it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Train loss 0.28131443123938515 accuracy 0.90975625\n", "Val loss 0.32476626813784243 accuracy 0.9003\n", "\n", "Epoch 4/10\n", "----------\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 10000/10000 [48:35<00:00, 3.43it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Train loss 0.2513500333808362 accuracy 0.9251312500000001\n", "Val loss 0.32960303543359043 accuracy 0.8998\n", "\n", "Epoch 5/10\n", "----------\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 10000/10000 [48:40<00:00, 3.42it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Train loss 0.22257677220288896 accuracy 0.9372812500000001\n", "Val loss 0.344810073299706 accuracy 0.9042\n", "\n", "Epoch 6/10\n", "----------\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 10000/10000 [48:36<00:00, 3.43it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Train loss 0.19210175439191515 accuracy 0.948725\n", "Val loss 0.3947672142362222 accuracy 0.904\n", "\n", "Epoch 7/10\n", "----------\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 10000/10000 [48:40<00:00, 3.42it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Train loss 0.16836651281533996 accuracy 0.95810625\n", "Val loss 0.4523221901897341 accuracy 0.9039\n", "\n", "Epoch 8/10\n", "----------\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 10000/10000 [48:36<00:00, 3.43it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Train loss 0.14673091283872491 accuracy 0.9650937500000001\n", "Val loss 0.4342103717836551 accuracy 0.9106000000000001\n", "\n", "Epoch 9/10\n", "----------\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 10000/10000 [48:42<00:00, 3.42it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Train loss 0.12769193379548377 accuracy 0.9709000000000001\n", "Val loss 0.4672267551389523 accuracy 0.9105000000000001\n", "\n", "Epoch 10/10\n", "----------\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 10000/10000 [49:31<00:00, 3.37it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Train loss 0.11631839626120637 accuracy 0.9739625000000001\n", "Val loss 0.46442474859515204 accuracy 0.9126500000000001\n", "\n" ] } ], "source": [ "history = defaultdict(list)\n", "best_accuracy = 0\n", "\n", "for epoch in range(EPOCHS):\n", " \n", " # Show details \n", " print(f\"Epoch {epoch + 1}/{EPOCHS}\")\n", " print(\"-\" * 10)\n", " \n", " train_acc, train_loss = train_epoch(\n", " model,\n", " train_data_loader,\n", " loss_fn,\n", " optimizer,\n", " device,\n", " scheduler,\n", " len(df_train)\n", " )\n", " \n", " print(f\"Train loss {train_loss} accuracy {train_acc}\")\n", " # Get model performance (accuracy and loss)\n", " val_acc, val_loss = eval_model(\n", " model,\n", " val_data_loader,\n", " loss_fn,\n", " device,\n", " len(df_val)\n", " )\n", " \n", " \n", " print(f\"Val loss {val_loss} accuracy {val_acc}\")\n", " print()\n", " \n", " history['train_acc'].append(train_acc.item())\n", " history['train_loss'].append(train_loss)\n", " history['val_acc'].append(val_acc.item())\n", " history['val_loss'].append(val_loss)\n", " \n", " # If we beat prev performance\n", " if val_acc > best_accuracy:\n", " torch.save(model.state_dict(), 'best_model_state.bin')\n", " best_accuracy = val_acc\n", " dict_={'model':model,\"SentimentClassifier\":SentimentClassifier}\n", " with open('/home/divya/vivek5/sentiment_analysis_finetune_bert.pkl','wb') as f:\n", " pickle.dump(dict_,f)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0.8518,\n", " 0.888475,\n", " 0.90975625,\n", " 0.9251312500000001,\n", " 0.9372812500000001,\n", " 0.948725,\n", " 0.95810625,\n", " 0.9650937500000001,\n", " 0.9709000000000001,\n", " 0.9739625000000001]" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "history['train_acc']" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.0, 1.0)" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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ExMT1bhx41KXmTJlim6//XbdddddkqSLLrpImZmZuueee/TEE0/Iw6NkVrNarbJardW/AwAAoFZy28iNxWJRt27dFBcX52yz2+2Ki4tTdHR0qctkZWWVCDBms1mS5HA4aq5YAABQZ7ht5EaSYmNjFRMTo+7du6tnz56aO3euMjMzNWbMGEnSqFGj1LRpU82aNUuSNHToUL344ovq2rWrevXqpX379mnKlCkaOnSoM+QAAID6za3hZvjw4Tp27JimTp2qhIQEdenSRWvXrnVOMj506JDLSM3kyZNlMpk0efJk/f3332rUqJGGDh2qZ555xl27AAAAahmTo54dz0lLS1NQUJBSU1MVGBjo7nIAAEAFVOb7u06dLQUAAFAewg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUwg0AADAUt4eb1157TVFRUfL29lavXr20efPms/ZPSUnR2LFjFRERIavVqn/84x/67LPPzlO1AACgtvN058ZXrlyp2NhYvf766+rVq5fmzp2rQYMGaffu3QoLCyvRPzc3VwMHDlRYWJhWrVqlpk2b6s8//1SDBg3Of/EAAKBWMjkcDoe7Nt6rVy/16NFD8+bNkyTZ7XZFRkZq3LhxmjhxYon+r7/+up5//nnt2rVLXl5eVdpmWlqagoKClJqaqsDAwHOqHwAAnB+V+f5222Gp3Nxcbd26VQMGDDhdjIeHBgwYoE2bNpW6zJo1axQdHa2xY8cqPDxcHTt21MyZM2Wz2crcTk5OjtLS0lweAADAuNwWbpKTk2Wz2RQeHu7SHh4eroSEhFKX2b9/v1atWiWbzabPPvtMU6ZM0Zw5c/T000+XuZ1Zs2YpKCjI+YiMjKzW/QAAALWL2ycUV4bdbldYWJgWLlyobt26afjw4XriiSf0+uuvl7nMpEmTlJqa6nwcPnz4PFYMAADON7dNKA4NDZXZbFZiYqJLe2Jioho3blzqMhEREfLy8pLZbHa2tWvXTgkJCcrNzZXFYimxjNVqldVqrd7iAQBAreW2kRuLxaJu3bopLi7O2Wa32xUXF6fo6OhSl+nTp4/27dsnu93ubNuzZ48iIiJKDTYAAKD+cethqdjYWL3xxht6++23tXPnTt1///3KzMzUmDFjJEmjRo3SpEmTnP3vv/9+nThxQg899JD27NmjTz/9VDNnztTYsWPdtQsAAKCWcet1boYPH65jx45p6tSpSkhIUJcuXbR27VrnJONDhw7Jw+N0/oqMjNQXX3yhRx55RJ06dVLTpk310EMP6bHHHnPXLgAAgFrGrde5cQeucwMAQN1TJ65zAwAAUBMqHW6ioqL01FNP6dChQzVRDwAAwDmpdLh5+OGH9cEHH+iCCy7QwIEDtWLFCuXk5NREbQAAAJVWpXATHx+vzZs3q127dho3bpwiIiL04IMPatu2bTVRIwAAQIWd84TivLw8zZ8/X4899pjy8vJ00UUXafz48RozZoxMJlN11VltmFAMAEDdU5nv7yqfCp6Xl6fVq1dr8eLFWrdunS655BLdeeed+uuvv/T444/ryy+/1LJly6q6egAAgCqpdLjZtm2bFi9erOXLl8vDw0OjRo3SSy+9pAsvvNDZ5/rrr1ePHj2qtVAAAICKqHS46dGjhwYOHKgFCxZo2LBh8vLyKtGnZcuWuvXWW6ulQAAAgMqodLjZv3+/WrRocdY+fn5+Wrx4cZWLAgAAqKpKny2VlJSkH3/8sUT7jz/+qJ9++qlaigIAAKiqSoebsWPH6vDhwyXa//77b25gCQAA3K7S4eb333/XxRdfXKK9a9eu+v3336ulKAAAgKqqdLixWq1KTEws0X706FF5err1JuMAAACVDzf//Oc/NWnSJKWmpjrbUlJS9Pjjj2vgwIHVWhwAAEBlVXqo5YUXXlC/fv3UokULde3aVZIUHx+v8PBwLVmypNoLBAAAqIxKh5umTZvq559/1tKlS7Vjxw75+PhozJgxGjFiRKnXvAEAADifqjRJxs/PT/fcc0911wIAAHDOqjwD+Pfff9ehQ4eUm5vr0n7ttdeec1EAAABVVaUrFF9//fX65ZdfZDKZVHRT8aI7gNtstuqtEAAAoBIqfbbUQw89pJYtWyopKUm+vr767bff9O2336p79+5av359DZQIAABQcZUeudm0aZO++uorhYaGysPDQx4eHrr00ks1a9YsjR8/Xtu3b6+JOgEAACqk0iM3NptNAQEBkqTQ0FAdOXJEktSiRQvt3r27eqsDAACopEqP3HTs2FE7duxQy5Yt1atXL82ePVsWi0ULFy7UBRdcUBM1AgAAVFilw83kyZOVmZkpSXrqqad0zTXXqG/fvgoJCdHKlSurvUAAAIDKMDmKTnc6BydOnFBwcLDzjKnaLC0tTUFBQUpNTVVgYKC7ywEAABVQme/vSs25ycvLk6enp3799VeX9oYNG9aJYAMAAIyvUuHGy8tLzZs351o2AACg1qr02VJPPPGEHn/8cZ04caIm6gEAADgnlZ5QPG/ePO3bt09NmjRRixYt5Ofn5/L+tm3bqq04AACAyqp0uBk2bFgNlAEAAFA9quVsqbqEs6UAAKh7auxsKQAAgNqu0oelPDw8znraN2dSAQAAd6p0uFm9erXL67y8PG3fvl1vv/22nnzyyWorDAAAoCqqbc7NsmXLtHLlSn300UfVsboaw5wbAADqHrfMubnkkksUFxdXXasDAACokmoJN6dOndIrr7yipk2bVsfqAAAAqqzSc27OvEGmw+FQenq6fH199c4771RrcQAAAJVV6XDz0ksvuYQbDw8PNWrUSL169VJwcHC1FgcAAFBZlQ43o0eProEyAAAAqkel59wsXrxY7733Xon29957T2+//Xa1FAUAAFBVlQ43s2bNUmhoaIn2sLAwzZw5s1qKAgAAqKpKh5tDhw6pZcuWJdpbtGihQ4cOVUtRAAAAVVXpcBMWFqaff/65RPuOHTsUEhJSLUUBAABUVaXDzYgRIzR+/Hh9/fXXstlsstls+uqrr/TQQw/p1ltvrYkaAQAAKqzSZ0vNmDFDBw8e1JVXXilPz4LF7Xa7Ro0axZwbAADgdlW+t9TevXsVHx8vHx8fXXTRRWrRokV111YjuLcUAAB1T2W+vys9clOkTZs2atOmTVUXBwAAqBGVnnNz44036rnnnivRPnv2bN18883VUhQAAEBVVTrcfPvttxoyZEiJ9sGDB+vbb7+tlqIAAACqqtLhJiMjQxaLpUS7l5eX0tLSqqUoAACAqqp0uLnooou0cuXKEu0rVqxQ+/btq6UoAACAqqr0hOIpU6bohhtu0B9//KErrrhCkhQXF6dly5Zp1apV1V4gAABAZVQ63AwdOlQffvihZs6cqVWrVsnHx0edO3fWV199pYYNG9ZEjQAAABVW5evcFElLS9Py5cu1aNEibd26VTabrbpqqxFc5wYAgLqnMt/flZ5zU+Tbb79VTEyMmjRpojlz5uiKK67QDz/8UNXVAQAAVItKHZZKSEjQW2+9pUWLFiktLU233HKLcnJy9OGHHzKZGAAA1AoVHrkZOnSo2rZtq59//llz587VkSNH9Oqrr9ZkbQAAAJVW4ZGbzz//XOPHj9f999/PbRcAAECtVeGRmw0bNig9PV3dunVTr169NG/ePCUnJ9dkbQAAAJVW4XBzySWX6I033tDRo0d17733asWKFWrSpInsdrvWrVun9PT0mqwTAACgQs7pVPDdu3dr0aJFWrJkiVJSUjRw4ECtWbOmOuurdpwKDgBA3XNeTgWXpLZt22r27Nn666+/tHz58nNZFQAAQLU4p3BTxGw2a9iwYVUetXnttdcUFRUlb29v9erVS5s3b67QcitWrJDJZNKwYcOqtF0AAGA81RJuzsXKlSsVGxuradOmadu2bercubMGDRqkpKSksy538OBBTZgwQX379j1PlQIAgLrA7eHmxRdf1N13360xY8aoffv2ev311+Xr66s333yzzGVsNptGjhypJ598UhdccMF5rBYAANR2bg03ubm52rp1qwYMGOBs8/Dw0IABA7Rp06Yyl3vqqacUFhamO++8s9xt5OTkKC0tzeUBAACMy63hJjk5WTabTeHh4S7t4eHhSkhIKHWZDRs2aNGiRXrjjTcqtI1Zs2YpKCjI+YiMjDznugEAQO3l9sNSlZGenq7bb79db7zxhkJDQyu0zKRJk5Samup8HD58uIarBAAA7lSpG2dWt9DQUJnNZiUmJrq0JyYmqnHjxiX6//HHHzp48KCGDh3qbLPb7ZIkT09P7d69W61atXJZxmq1ymq11kD1AACgNnLryI3FYlG3bt0UFxfnbLPb7YqLi1N0dHSJ/hdeeKF++eUXxcfHOx/XXnutLr/8csXHx3PICQAAuHfkRpJiY2MVExOj7t27q2fPnpo7d64yMzM1ZswYSdKoUaPUtGlTzZo1S97e3urYsaPL8g0aNJCkEu0AAKB+cnu4GT58uI4dO6apU6cqISFBXbp00dq1a52TjA8dOiQPjzo1NQgAALjROd1bqi7i3lIAANQ95+3eUgAAALUN4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABhKrQg3r732mqKiouTt7a1evXpp8+bNZfZ944031LdvXwUHBys4OFgDBgw4a38AAFC/uD3crFy5UrGxsZo2bZq2bdumzp07a9CgQUpKSiq1//r16zVixAh9/fXX2rRpkyIjI/XPf/5Tf//993muHAAA1EYmh8PhcGcBvXr1Uo8ePTRv3jxJkt1uV2RkpMaNG6eJEyeWu7zNZlNwcLDmzZunUaNGlds/LS1NQUFBSk1NVWBg4DnXDwAAal5lvr/dOnKTm5urrVu3asCAAc42Dw8PDRgwQJs2barQOrKyspSXl6eGDRuW+n5OTo7S0tJcHgAAwLjcGm6Sk5Nls9kUHh7u0h4eHq6EhIQKreOxxx5TkyZNXAJScbNmzVJQUJDzERkZec51AwCA2svtc27OxbPPPqsVK1Zo9erV8vb2LrXPpEmTlJqa6nwcPnz4PFcJAADOJ093bjw0NFRms1mJiYku7YmJiWrcuPFZl33hhRf07LPP6ssvv1Sn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devW6YUXXlDr1q3l4+Ojm266Sbm5udVW7ooVKzRhwgTNmTNH0dHRCggI0PPPP68ff/yx2rZR3JkTcU0mU4l5R8XFxMTo+PHjevnll9WiRQtZrVZFR0c7PwMfH5+zbq+89z08PORwOFza8vLySvTz83MdjSvvcytvu5I0atQoTZw4UZs2bdL333+vli1bqm/fvuUuBwBGRLgpj8lUoUND7ubt7a0bbrhBS5cu1b59+9S2bVtdfPHFzvc3btyo0aNH6/rrr5dUMJJz8ODBCq+/Xbt2WrJkibKzs52jNz/88INLn40bN6p379564IEHnG1//PGHSx+LxVLuHJV27drp/fffl8PhcI7ebNy4UQEBAWrWrFmFaz7Txo0bNX/+fA0ZMkSSdPjwYSUnJzvf79Spk/766y/t2bOn1NGbTp06KS4uzuUQUnGNGjXS0aNHna/T0tJ04MCBCtV1ts8tICBAUVFRiouLcx5mPFNISIiGDRumxYsXa9OmTSUOewFAfcJhKQMZOXKkPv30U7355psaOXKky3tt2rTRBx98oPj4eO3YsUO33XbbWUc5znTbbbfJZDLp7rvv1u+//67PPvtML7zwQolt/PTTT/riiy+0Z88eTZkyRVu2bHHpExUVpZ9//lm7d+9WcnJyqSMbDzzwgA4fPqxx48Zp165d+uijjzRt2jTFxsY6D7NVRZs2bbRkyRLt3LlTP/74o0aOHOkyKtK/f3/169dPN954o9atW6cDBw7o888/19q1ayVJkyZN0pYtW/TAAw/o559/1q5du7RgwQJnQLriiiu0ZMkSfffdd/rll18UExPjnIxcXl3lfW7Tp0/XnDlz9Morr2jv3r3atm2bXn31VZc+d911l95++23t3LlTMTExVf6cAKCuI9wYyBVXXKGGDRtq9+7duu2221zee/HFFxUcHKzevXtr6NChGjRokMvITnn8/f318ccf65dfflHXrl31xBNP6LnnnnPpc++99+qGG27Q8OHD1atXLx0/ftxlNEKS7r77brVt21bdu3dXo0aNnGf8FNe0aVN99tln2rx5szp37qz77rtPd955pyZPnlyJT6OkRYsW6eTJk7r44ot1++23a/z48QoLC3Pp8/7776tHjx4aMWKE2rdvr3//+9/OkaZ//OMf+r//+z/t2LFDPXv2VHR0tD766CN5ehYMgE6aNEn9+/fX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acLv4xwQbs5RaGiozGazEhMTXdoTExPVuHFjN1UFqeCeZZ988om+/fZbNWvWzN3l1Ftbt25VUlKSLr74YmebzWbTt99+q3nz5iknJ0dms9mNFdYvERERat++vUtbu3bt9P7777upovrt//2//6eJEyfq1ltvlSRddNFF+vPPPzVr1izCzTlgzs05slgs6tatm+Li4pxtdrtdcXFxio6OdmNl9ZfD4dCDDz6o1atX66uvvlLLli3dXVK9duWVV+qXX35RfHy889G9e3eNHDlS8fHxBJvzrE+fPiUujbBnzx61aNHCTRXVb1lZWfLwcP0qNpvNstvtbqrIGBi5qQaxsbGKiYlR9+7d1bNnT82dO1eZmZkaM2aMu0url8aOHatly5bpo48+UkBAgBISEiRJQUFB8vHxcXN19U9AQECJ+U5+fn4KCQlhHpQbPPLII+rdu7dmzpypW265RZs3b9bChQu1cOFCd5dWLw0dOlTPPPOMmjdvrg4dOmj79u168cUXdccdd7i7tDqNU8Grybx58/T8888rISFBXbp00SuvvKJevXq5u6x6yWQyldq+ePFijR49+vwWg1JddtllnAruRp988okmTZqkvXv3qmXLloqNjdXdd9/t7rLqpfT0dE2ZMkWrV69WUlKSmjRpohEjRmjq1KmyWCzuLq/OItwAAABDYc4NAAAwFMINAAAwFMINAAAwFMINAAAwFMINAAAwFMINAAAwFMINAAAwFMINgHrPZDLpww8/dHcZAKoJ4QaAW40ePVomk6nE46qrrnJ3aQDqKO4tBcDtrrrqKi1evNilzWq1uqkaAHUdIzcA3M5qtapx48Yuj+DgYEkFh4wWLFigwYMHy8fHRxdccIFWrVrlsvwvv/yiK664Qj4+PgoJCdE999yjjIwMlz5vvvmmOnToIKvVqoiICD344IMu7ycnJ+v666+Xr6+v2rRpozVr1tTsTgOoMYQbALXelClTdOONN2rHjh0aOXKkbr31Vu3cuVOSlJmZqUGDBik4OFhbtmzRe++9py+//NIlvCxYsEBjx47VPffco19++UVr1qxR69atXbbx5JNP6pZbbtHPP/+sIUOGaOTIkTpx4sR53U8A1cQBAG4UExPjMJvNDj8/P5fHM88843A4HA5Jjvvuu89lmV69ejnuv/9+h8PhcCxcuNARHBzsyMjIcL7/6aefOjw8PBwJCQkOh8PhaNKkieOJJ54oswZJjsmTJztfZ2RkOCQ5Pv/882rbTwDnD3NuALjd5ZdfrgULFri0NWzY0Pk8Ojra5b3o6GjFx8dLknbu3KnOnTvLz8/P+X6fPn1kt9u1e/dumUwmHTlyRFdeeeVZa+jUqZPzuZ+fnwIDA5WUlFTVXQLgRoQbAG7n5+dX4jBRdfHx8alQPy8vL5fXJpNJdru9JkoCUMOYcwOg1vvhhx9KvG7Xrp0kqV27dtqxY4cyMzOd72/cuFEeHh5q27atAgICFBUVpbi4uPNaMwD3YeQGgNvl5OQoISHBpc3T01OhoaGSpPfee0/du3fXpZdeqqVLl2rz5s1atGiRJGnkyJGaNm2aYmJiNH36dB07dkzjxo3T7bffrvDwcEnS9OnTdd999yksLEyDBw9Wenq6Nm7cqHHjxp3fHQVwXhBuALjd2rVrFRER4dLWtm1b7dq1S1LBmUwrVqzQAw88oIiICC1fvlzt27eXJPn6+uqLL77QQw89pB49esjX11c33nijXnzxRee6YmJilJ2drZdeekkTJkxQaGiobrrppvO3gwDOK5PD4XC4uwgAKIvJZNLq1as1bNgwd5cCoI5gzg0AADAUwg0AADAU5twAqNU4cg6gshi5AQAAhkK4AQAAhkK4AQAAhkK4AQAAhkK4AQAAhkK4AQAAhkK4AQAAhkK4AQAAhkK4AQAAhvL/AVnV1Tj8dqTcAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot training and validation accuracy\n", "plt.plot(history['train_acc'], label='train accuracy')\n", "plt.plot(history['val_acc'], label='validation accuracy')\n", "\n", "# Graph chars\n", "plt.title('Training history')\n", "plt.ylabel('Accuracy')\n", "plt.xlabel('Epoch')\n", "plt.legend()\n", "plt.ylim([0, 1])" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9063" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_acc, _ = eval_model(\n", " model,\n", " test_data_loader,\n", " loss_fn,\n", " device,\n", " len(df_test)\n", ")\n", "\n", "test_acc.item()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "def get_predictions(model, data_loader):\n", " model = model.eval()\n", "\n", " review_texts = []\n", " predictions = []\n", " prediction_probs = []\n", " real_values = []\n", "\n", " with torch.no_grad():\n", " for d in data_loader:\n", " texts = d[\"review_text\"]\n", " input_ids = d[\"input_ids\"].to(device)\n", " attention_mask = d[\"attention_mask\"].to(device)\n", " targets = d[\"targets\"].to(device)\n", "\n", " outputs = model(\n", " input_ids=input_ids,\n", " attention_mask=attention_mask\n", " )\n", " _, preds = torch.max(outputs, dim=1)\n", "\n", " review_texts.extend(texts)\n", " predictions.extend(preds)\n", " prediction_probs.extend(outputs)\n", " real_values.extend(targets)\n", "\n", " predictions = torch.stack(predictions).cpu()\n", " prediction_probs = torch.stack(prediction_probs).cpu()\n", " real_values = torch.stack(real_values).cpu()\n", "\n", " return review_texts, predictions, prediction_probs, real_values" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "y_review_texts, y_pred, y_pred_probs, y_test = get_predictions(\n", " model,\n", " test_data_loader\n", ")" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "Number of classes, 1, does not match size of target_names, 3. Try specifying the labels parameter", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[39], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[39mprint\u001b[39m(classification_report(y_test, y_pred, target_names\u001b[39m=\u001b[39;49mclass_names))\n", "File \u001b[0;32m~/.venv/lib/python3.8/site-packages/sklearn/metrics/_classification.py:2332\u001b[0m, in \u001b[0;36mclassification_report\u001b[0;34m(y_true, y_pred, labels, target_names, sample_weight, digits, output_dict, zero_division)\u001b[0m\n\u001b[1;32m 2326\u001b[0m warnings\u001b[39m.\u001b[39mwarn(\n\u001b[1;32m 2327\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mlabels size, \u001b[39m\u001b[39m{0}\u001b[39;00m\u001b[39m, does not match size of target_names, \u001b[39m\u001b[39m{1}\u001b[39;00m\u001b[39m\"\u001b[39m\u001b[39m.\u001b[39mformat(\n\u001b[1;32m 2328\u001b[0m \u001b[39mlen\u001b[39m(labels), \u001b[39mlen\u001b[39m(target_names)\n\u001b[1;32m 2329\u001b[0m )\n\u001b[1;32m 2330\u001b[0m )\n\u001b[1;32m 2331\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m-> 2332\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\n\u001b[1;32m 2333\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mNumber of classes, \u001b[39m\u001b[39m{0}\u001b[39;00m\u001b[39m, does not match size of \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 2334\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mtarget_names, \u001b[39m\u001b[39m{1}\u001b[39;00m\u001b[39m. Try specifying the labels \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 2335\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mparameter\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m.\u001b[39mformat(\u001b[39mlen\u001b[39m(labels), \u001b[39mlen\u001b[39m(target_names))\n\u001b[1;32m 2336\u001b[0m )\n\u001b[1;32m 2337\u001b[0m \u001b[39mif\u001b[39;00m target_names \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m 2338\u001b[0m target_names \u001b[39m=\u001b[39m [\u001b[39m\"\u001b[39m\u001b[39m%s\u001b[39;00m\u001b[39m\"\u001b[39m \u001b[39m%\u001b[39m l \u001b[39mfor\u001b[39;00m l \u001b[39min\u001b[39;00m labels]\n", "\u001b[0;31mValueError\u001b[0m: Number of classes, 1, does not match size of target_names, 3. Try specifying the labels parameter" ] } ], "source": [ "print(classification_report(y_test, y_pred, target_names=class_names))" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlsAAAHNCAYAAAApEr6yAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB4jElEQVR4nO3dd1gUV9sG8HvpSBWRpqjYEBR7w15QjCVqbEReK2o0oiJii71i790kdmOJJXZFjNgQK2LFhhojRUVEQPr5/uBjwqqr4O7SvH/vNdfrzpw588xmWR5OG5kQQoCIiIiI1EIjrwMgIiIiKsyYbBERERGpEZMtIiIiIjViskVERESkRky2iIiIiNSIyRYRERGRGjHZIiIiIlIjJltEREREasRki4iIiEiNtPI6AJL3MOp9XodA+UiJovp5HQIR5WP62rlwjRqeKqnn/fUVKqmnIGKyRURERIrJ2AmmLCZbREREpJhMltcRFHhMV4mIiIjUiC1bREREpBi7EZXGZIuIiIgUYzei0piuEhEREakRW7aIiIhIMXYjKo3JFhERESnGbkSlMV0lIiIiUiO2bBEREZFi7EZUGpMtIiIiUozdiEpjukpERESkRmzZIiIiIsXYjag0JltERESkGLsRlcZki4iIiBRjy5bS+A4SERERqRFbtoiIiEgxdiMqjckWERERKcZuRKXxHSQiIiJSIyZbREREpJhMQzVbDp05cwYdOnSAjY0NZDIZ9u/fr7Ds4MGDIZPJsGTJErn90dHRcHd3h7GxMUxNTeHh4YG4uDi5MiEhIWjcuDH09PRga2uLefPmfVT/7t27UalSJejp6cHJyQlHjhzJ0b0w2SIiIiLFNGSq2XIoPj4e1apVw8qVKz9bbt++fbh48SJsbGw+Oubu7o7bt2/Dz88Phw4dwpkzZzBo0CDpeGxsLFq3bo3SpUvj6tWrmD9/PqZOnYp169ZJZS5cuIAff/wRHh4euH79Ojp16oROnTrh1q1b2b4XmRBCZLs0qd3DqPd5HQLlIyWK6ud1CESUj+lr58I1ms9QST3v/5701efKZDLs27cPnTp1ktv/77//ol69ejh+/DjatWsHLy8veHl5AQDu3r0LR0dHXL58GbVr1wYAHDt2DG3btsXz589hY2OD1atXY8KECYiIiICOjg4AYNy4cdi/fz/u3bsHAOjRowfi4+Nx6NAh6br169dH9erVsWbNmmzFz5YtIiIiUkxF3YhJSUmIjY2V25KSkr46rPT0dPTq1QujR49G5cqVPzoeGBgIU1NTKdECABcXF2hoaCAoKEgq06RJEynRAgBXV1eEhobizZs3UhkXFxe5ul1dXREYGJjtWJlsERERkWIymUo2X19fmJiYyG2+vr5fHdbcuXOhpaWF4cOHf/J4REQELCws5PZpaWnBzMwMERERUhlLS0u5Mpmvv1Qm83h2cOkHIiIiUrvx48fD29tbbp+uru5X1XX16lUsXboU165dg6wArAPGli0iIiJSTEXdiLq6ujA2NpbbvjbZOnv2LKKiolCqVCloaWlBS0sLT58+xahRo1CmTBkAgJWVFaKiouTOS01NRXR0NKysrKQykZGRcmUyX3+pTObx7GCyRURERIqpqBtRlXr16oWQkBAEBwdLm42NDUaPHo3jx48DAJydnRETE4OrV69K5506dQrp6emoV6+eVObMmTNISUmRyvj5+cHe3h5FixaVyvj7+8td38/PD87OztmOl92IREREpFgerSAfFxeHhw8fSq/DwsIQHBwMMzMzlCpVCsWKFZMrr62tDSsrK9jb2wMAHBwc0KZNGwwcOBBr1qxBSkoKPD094ebmJi0T0bNnT0ybNg0eHh4YO3Ysbt26haVLl2Lx4sVSvSNGjEDTpk2xcOFCtGvXDjt27MCVK1fklof4ErZsERERUb5z5coV1KhRAzVq1AAAeHt7o0aNGpg8eXK269i2bRsqVaqEli1bom3btmjUqJFckmRiYoITJ04gLCwMtWrVwqhRozB58mS5tbgaNGiA7du3Y926dahWrRr+/PNP7N+/H1WqVMl2HFxnK5/hOluUFdfZIqLPyZV1tlwXqKSe98d9VFJPQcRuRCIiIlKMD6JWGt9BIiIiIjViyxYREREpVgDWscrvmGwRERGRYuxGVBrfQSIiIiI1YssWERERKcZuRKUx2SIiIiLF2I2oNL6DRERERGrEli0iIiJSjC1bSmOyRURERIpxzJbSmGwRERGRYmzZUhrfQSIiIiI1YssWERERKcZuRKUx2SIiIiLF2I2oNL6DRERERGrEli0iIiJSjN2ISmOyRURERArJmGwpjd2IRERERGrEli0iIiJSiC1bymOyRURERIox11IauxGJiIiI1IgtW0RERKQQuxGVx2SLiIiIFGKypTwmW0RERKQQky3lccyWAlOnTkX16tXzOgwiIiIq4GRCCJHXQeQ1mUyGffv2oVOnTtK+uLg4JCUloVixYrkay8Oo97l6PXXZteU3XDjjj+dPn0BHVxcOVaqh3xAvlCxVRiqzfP4MBF8JQvSrl9DTLwIHp2roN3gEbEvbSWWiIsOxcsEs3Lx+BXr6+mjZpgP6/jQcmloZjbIh1y9j/PCBH11/y/6TMCtmrvb7VLcSRfXzOgS12LVjO3bv/AMvXvwLAChXvgIGDf4ZjRo3BQD8uXsnjh4+hHt3byM+Ph5nLlyGsbHxJ+tKTk7G/37shvuh97Djz/2oVMkh1+6DVOdLn4mkpCQsnD8Hx48eQXJyMho0bIRfJk5BMfP/fs7nzp6J4OBrePjgPuzKlsOuPX/lyb3kJn1t9V/D5MctKqnn7R+9VFJPQcRuRAUMDQ1haGiY12EUWDeDr6Jd5x6o6FAZaWlp2LR2OSZ6D8GaLXuhp5+RQJS3d0DzVm1R3NIK72JjsW3DGkzyHoLfdh2GpqYm0tLSMHXMMBQ1K4b5qzfizetXWDhzErS0tNDnp+Fy11u37S/oGxhIr02LmuXq/VLOWFpZYfhIH5QqXRoQAgf+2g+vYUOx4899KF++AhIT36Nho8Zo2Kgxli1Z+Nm6Fi+ch+IWFrgfei+Xoid1+NJnYsHc2Th7JgDzFy2BoaER5syeAW8vT2zaukOuno6du+BWyA3cvx+aR3dSCLEXUWl52o3YrFkzDB8+HGPGjIGZmRmsrKwwdepU6XhMTAwGDBiA4sWLw9jYGC1atMCNGzfk6pg5cyYsLCxgZGSEAQMGYNy4cXLdf5cvX0arVq1gbm4OExMTNG3aFNeuXZOOlylTBgDQuXNnyGQy6XXWbsQTJ05AT08PMTExctceMWIEWrRoIb0+d+4cGjduDH19fdja2mL48OGIj49X+n0qiGYsXIVWbTuitF15lC1vD+9fpuNlZDgeht6Rynz3fVdUqV4LltYlUN7eAb0HDMXLqAhERbwAAFy/HIh/njyGz6TZKFehEmrXb4ReA37GoX27kJKSInc9k6JFYVbMXNo0NNhDnp81bdYCjZs0RenSZVC6jB2GjRiJIkWK4OaNYADA/3r1Rf8Bg+BUtdpn6zl3NgAXL5yHt8/YXIia1Olzn4l3795h3949GDVmHOrWc4Zj5SqYNmM2bgRfR8j/f2YAYOwvE+H2oztKlLTNuxsh+oQ8/420adMmGBgYICgoCPPmzcP06dPh5+cHAOjWrRuioqJw9OhRXL16FTVr1kTLli0RHR0NANi2bRtmzZqFuXPn4urVqyhVqhRWr14tV/+7d+/Qp08fnDt3DhcvXkSFChXQtm1bvHv3DkBGMgYAGzZsQHh4uPQ6q5YtW8LU1BR79uyR9qWlpWHnzp1wd3cHADx69Aht2rRBly5dEBISgp07d+LcuXPw9PRU/ZtWAMXHxwEADI1NPnk88f17+B35C5bWJWBuYQUAuHsrBKXLlkdRs/+6cmvWbYCE+Dg8C3skd/6w/j3wv44umDDyJ9wJua6muyB1SEtLw7Ejh/H+fQKqVq+R7fNev3qF6VMnYabvPOjp6akxQsptH34m7t65hdTUFNSr30AqY1e2HKytbXAjS7JF6iGTyVSyfcvyvBuxatWqmDJlCgCgQoUKWLFiBfz9/aGvr49Lly4hKioKurq6AIAFCxZg//79+PPPPzFo0CAsX74cHh4e6NevHwBg8uTJOHHiBOLi4qT6s7Y8AcC6detgamqKgIAAtG/fHsWLFwcAmJqawsrK6pMxampqws3NDdu3b4eHhwcAwN/fHzExMejSpQsAwNfXF+7u7vDy8pLuZdmyZWjatClWr179yV8GSUlJSEpK+mBfunS/hUV6ejrWLZsPR6fqKFO2vNyxQ/t2YsPqJUh8/x4lS5XBrMVroK2dMQjhTfQrFC0qP2bO1MxMOgYAZsWKw9NnIspXckRKcjJOHNqHccMHYtHaLShvz7E7+dmD+6Ho7e6G5OQk6BcpgkVLV6JcufJfPhGAEAKTJ45Dt+5uqFzFCf/++1zN0VJuUPSZCL13F9ra2h+N2zMrVgyvX73Mo2i/Hd96oqQKed6yVbVqVbnX1tbWiIqKwo0bNxAXF4dixYpJ46cMDQ0RFhaGR48yWjVCQ0NRt25dufM/fB0ZGYmBAweiQoUKMDExgbGxMeLi4vDs2bMcxenu7o7Tp0/jxYuMLq5t27ahXbt2MDU1BQDcuHEDGzdulIvV1dUV6enpCAsL+2Sdvr6+MDExkdvWLpufo7gKgtWLfPE07CHGTp370bHmrdpi2W87MHf5b7CxLQ3fyWOQ/EEC+jklS5XBdx27ooK9IxydqsNr/DQ4VKmG/bu2qvIWSA3K2Nlh55792LJ9F7p3/xGTJ4zFo0cPs3XuH9u2ID4+Hv0H/KTmKCk3KfOZIMrP8rxlK7MVI5NMJkN6ejri4uJgbW2N06dPf3ROZoKTHX369MHr16+xdOlSlC5dGrq6unB2dkZycnKO4qxTpw7KlSuHHTt2YMiQIdi3bx82btwoHY+Li8NPP/2E4cOHf3RuqVKlPlnn+PHj4e3tLbfvn7fpOYorv1u92BeXAs9g7vLfYW5h+dFxA0MjGBgaoYRtadhXrooebRvjwtlTaObyHYqameP+3Vty5WP+vwu5qJnimYYVHSrjzs1gld4HqZ62tg5KlSoNAHCsXAW3b9/E9q2bMWnK9C+ee+nSRYTcCEbdmk5y+917dMF37Tpg5uyPE3vK/xR9JlzbfIeUlBTExsbKtW5Fv36NYubF8yrcbwZbtpSX58mWIjVr1kRERAS0tLSkQesfsre3x+XLl9G7d29p34djrs6fP49Vq1ahbdu2AIB//vkHr169kiujra2NtLS0L8bk7u6Obdu2oWTJktDQ0EC7du3k4r1z5w7Kl89eNwgA6OrqftRlqJtYOJZ+EEJgzZI5CDxzCr7LfoWVTYnsnAQIIOX/E2GHKlWxa8uviHkTLc0uvH4lEEUMDFGqTFmF1Tx+GIqihWDZh29Nenp6tv8IGjt+IjyHeUmvo6Ki8PNPHpi7YDGcnD4/qJ4KjszPhINjFWhpaeNSUCBcWrkCAJ6EPUZ4+AtUq1Y9b4P8BjDZUl6+TbZcXFzg7OyMTp06Yd68eahYsSJevHiBw4cPo3PnzqhduzaGDRuGgQMHonbt2mjQoAF27tyJkJAQlC373y/iChUqYMuWLahduzZiY2MxevRo6OvLr11UpkwZ+Pv7o2HDhtDV1UXRokU/GZO7uzumTp2KWbNmoWvXrnKJ0tixY1G/fn14enpiwIABMDAwwJ07d+Dn54cVK1ao503Kx1Ytmo2Ak0cxafYS6BcxQPTrjATXwNAQurp6CH/xHGf9j6NGXWeYmBbFq6hI7N62ATq6uqjj3BgAUKOOM2zLlMXCGRPQ72cvvHn9GlvWr0T7zt2hraMDANi/ayssrUugtF05JCcn48ShvQi5dhkzFq5WGBvlvWWLF6Jh4yawsrZGQnw8jh4+hCuXL2HV2t8AAK9evcSrV6/wz/939z98cB9FDAxgbW0NExNTWFvbyNWnX6QIAKCkbSlYKhh7Sfnb5z4TRkZG6PxDFyycNwcmJiYwMDDEnNkzUbVaDVTNkmw9e/YUCQkJeP3qJZKSEnHv3l0AQLly5aCtrZNHd0aUj5MtmUyGI0eOYMKECejXrx9evnwJKysrNGnSBJaWGd1R7u7uePz4MXx8fJCYmIju3bujb9++uHTpklTPb7/9hkGDBqFmzZqwtbXF7Nmz4ePjI3ethQsXwtvbG+vXr0eJEiXw5MmTT8ZUvnx51K1bF5cuXcKSJUvkjlWtWhUBAQGYMGECGjduDCEEypUrhx49eqj0fSkojuzfDQAYN3yA3H6v8dPQqm1H6Ojo4HbINfy1exvi3sXC1KwYqlSriQWrN0mtWJqampg6dxlWLpwFn8F9oKunj5bfdcD/PH6W6ktNScFvKxfh9cso6OrpoUy5Cpi5eC2q1ayTezdLORYd/RoTfxmLVy+jYGhkhIoV7bFq7W9wbtAQALB75w6sXf3fHyn9+2TM+p020xcdO/2QJzGTen3pM+Ez9hfINDQwyms4klOS0aBBI/wyaYpcHdMmT8TVK/99/7t17QQAOHzcHyVKlMy1eyl02LCltEK3gnyrVq1gZWWFLVtUs+JtbissK8iTahTWFeSJSDVyYwV58747vlwoG15tdFNJPQVRvm3Zyo6EhASsWbMGrq6u0NTUxB9//IGTJ09K63QRERGRcjhmS3kFOtnK7GqcNWsWEhMTYW9vjz179sDFxSWvQyMiIiICUMCTLX19fZw8eTKvwyAiIiq02LKlvDxf1JSIiIjyMZmKthw6c+YMOnToABsbG8hkMuzfv186lpKSgrFjx8LJyQkGBgawsbFB7969pYXHM0VHR8Pd3R3GxsYwNTWFh4eH3FNmACAkJASNGzeGnp4ebG1tMW/evI9i2b17NypVqgQ9PT04OTnhyJEjOboXJltERESU78THx6NatWpYuXLlR8cSEhJw7do1TJo0CdeuXcPevXsRGhqK77//Xq6cu7s7bt++DT8/Pxw6dAhnzpzBoEGDpOOxsbFo3bo1SpcujatXr2L+/PmYOnUq1q1bJ5W5cOECfvzxR3h4eOD69evo1KkTOnXqhFu35Bfd/pxCNxuxoONsRMqKsxGJ6HNyYzai5YDdKqkn8tduX32uTCbDvn370KlTJ4VlLl++jLp16+Lp06coVaoU7t69C0dHR1y+fBm1a9cGABw7dgxt27bF8+fPYWNjg9WrV2PChAmIiIiAzv+v3zhu3Djs378f9+7dAwD06NED8fHxOHTokHSt+vXro3r16lizZk224mfLFhERESkkk8lUsiUlJSE2NlZuS8rBs3C/5O3bt5DJZNIj/QIDA2FqaiolWkDGgukaGhoICgqSyjRp0kRKtADA1dUVoaGhePPmjVTmw4l3rq6uCAwMzHZsTLaIiIhI7Xx9fWFiYiK3+fr6qqTuxMREjB07Fj/++KP0/MyIiAhYWFjIldPS0oKZmRkiIiKkMpkLpWfKfP2lMpnHs6NAz0YkIiIi9VLVbMTx48fD29tbbt+Hzwf+GikpKejevTuEEFi9On8+qo3JFhERESmkqmRLV1dXJclVVpmJ1tOnT3Hq1CmpVQsArKysEBUVJVc+NTUV0dHRsPr/Z6haWVkhMjJSrkzm6y+VscrBc1jZjUhEREQFTmai9eDBA5w8eRLFihWTO+7s7IyYmBhcvXpV2nfq1Cmkp6ejXr16UpkzZ84gJSVFKuPn5wd7e3sULVpUKuPv7y9Xt5+fH5ydnbMdK5MtIiIiUiyP1tmKi4tDcHAwgoODAQBhYWEIDg7Gs2fPkJKSgq5du+LKlSvYtm0b0tLSEBERgYiICCQnJwMAHBwc0KZNGwwcOBCXLl3C+fPn4enpCTc3N9jY2AAAevbsCR0dHXh4eOD27dvYuXMnli5dKtfdOWLECBw7dgwLFy7EvXv3MHXqVFy5cgWenp7Zfwu59EP+wqUfKCsu/UBEn5MbSz+UGLJPJfX8u7pzjsqfPn0azZs3/2h/nz59MHXqVNjZ2X3yvL///hvNmjUDkLGoqaenJw4ePAgNDQ106dIFy5Ytg6GhoVQ+JCQEQ4cOxeXLl2Fubo5hw4Zh7NixcnXu3r0bEydOxJMnT1ChQgXMmzcPbdu2zfa9MNnKZ5hsUVZMtojoc3Ij2Sr5836V1PN8VSeV1FMQsRuRiIiISI04G5GIiIgU4oOolcdki4iIiBRjrqU0diMSERERqRFbtoiIiEghdiMqj8kWERERKcRkS3nsRiQiIiJSI7ZsERERkUJs2VIeky0iIiJSiMmW8tiNSERERKRGbNkiIiIixdiwpTQmW0RERKQQuxGVx2SLiIiIFGKypTyO2SIiIiJSI7ZsERERkUJs2FIeky0iIiJSiN2IymM3IhEREZEasWWLiIiIFGLDlvKYbBEREZFC7EZUHrsRiYiIiNSILVtERESkEBu2lMdki4iIiBTS0GC2pSx2IxIRERGpEVu2iIiISCF2IyqPyRYREREpxNmIymOyRURERAox11Iex2wRERERqRFbtoiIiEghdiMqj8kWERERKcRkS3nsRiQiIiJSI7ZsERERkUJs2FIeky0iIiJSiN2IymM3IhEREZEasWWLiIiIFGLDlvKYbBEREZFC7EZUHrsRiYiIiNSILVtERESkEBu2lMdki4iIiBRiN6LymGwRERGRQsy1lMcxW0RERJTvnDlzBh06dICNjQ1kMhn2798vd1wIgcmTJ8Pa2hr6+vpwcXHBgwcP5MpER0fD3d0dxsbGMDU1hYeHB+Li4uTKhISEoHHjxtDT04OtrS3mzZv3USy7d+9GpUqVoKenBycnJxw5ciRH98Jki4iIiBSSyWQq2XIqPj4e1apVw8qVKz95fN68eVi2bBnWrFmDoKAgGBgYwNXVFYmJiVIZd3d33L59G35+fjh06BDOnDmDQYMGScdjY2PRunVrlC5dGlevXsX8+fMxdepUrFu3Tipz4cIF/Pjjj/Dw8MD169fRqVMndOrUCbdu3cr+eyiEEDl+B0htHka9z+sQKB8pUVQ/r0MgonxMX1v916g/J0Al9Vwc1/Srz5XJZNi3bx86deoEIKNVy8bGBqNGjYKPjw8A4O3bt7C0tMTGjRvh5uaGu3fvwtHREZcvX0bt2rUBAMeOHUPbtm3x/Plz2NjYYPXq1ZgwYQIiIiKgo6MDABg3bhz279+Pe/fuAQB69OiB+Ph4HDp0SIqnfv36qF69OtasWZOt+DlmK58pacZfrvSfxJS0vA6B8hltTXZIUFYFZ0BVUlISkpKS5Pbp6upCV1c3x3WFhYUhIiICLi4u0j4TExPUq1cPgYGBcHNzQ2BgIExNTaVECwBcXFygoaGBoKAgdO7cGYGBgWjSpImUaAGAq6sr5s6dizdv3qBo0aIIDAyEt7e33PVdXV0/6tb8HP7UEhERkUKq6kb09fWFiYmJ3Obr6/tVMUVERAAALC0t5fZbWlpKxyIiImBhYSF3XEtLC2ZmZnJlPlVH1msoKpN5PDvYskVEREQKqWo24vjx4z9qIfqaVq2CiMkWERERqd3Xdhl+ipWVFQAgMjIS1tbW0v7IyEhUr15dKhMVFSV3XmpqKqKjo6XzraysEBkZKVcm8/WXymQezw52IxIREZFCeTUb8XPs7OxgZWUFf39/aV9sbCyCgoLg7OwMAHB2dkZMTAyuXr0qlTl16hTS09NRr149qcyZM2eQkpIilfHz84O9vT2KFi0qlcl6ncwymdfJDiZbREREpJBMppotp+Li4hAcHIzg4GAAGYPig4OD8ezZM8hkMnh5eWHmzJk4cOAAbt68id69e8PGxkaasejg4IA2bdpg4MCBuHTpEs6fPw9PT0+4ubnBxsYGANCzZ0/o6OjAw8MDt2/fxs6dO7F06VK57s4RI0bg2LFjWLhwIe7du4epU6fiypUr8PT0zP57yKUf8pfE1LyOgPITzkakD3E2ImVloKP+2YiNF55TST1nRzXKUfnTp0+jefPmH+3v06cPNm7cCCEEpkyZgnXr1iEmJgaNGjXCqlWrULFiRalsdHQ0PD09cfDgQWhoaKBLly5YtmwZDA0NpTIhISEYOnQoLl++DHNzcwwbNgxjx46Vu+bu3bsxceJEPHnyBBUqVMC8efPQtm3bbN8Lk618hskWZcVkiz7EZIuyKszJVmHCAfJERESkEB9ErTwmW0RERKQQcy3lsT2aiIiISI1ynGxNnz4dCQkJH+1///49pk+frpKgiIiIKH/Ij0s/FDQ5HiCvqamJ8PDwj5bAf/36NSwsLJCWxgG9yuAAecqKA+TpQxwgT1nlxgD55ksvqKSev0c0UEk9BVGOf2qFEJ/MUG/cuAEzMzOVBEVERERUWGR7gHzRokWlpsCKFSvKJVxpaWmIi4vD4MGD1RIkERER5Y1vvQtQFbKdbC1ZsgRCCPTv3x/Tpk2DiYmJdExHRwdlypTJ0dL1RERElP8x11JetpOtPn36AMh4HlGDBg2gra2ttqCIiIiICoscr7PVtGlTpKen4/79+4iKikJ6errc8SZNmqgsOCIiIspbGmzaUlqOk62LFy+iZ8+eePr0KT6cyCiTyTgbkYiIqBBhrqW8HCdbgwcPRu3atXH48GFYW1tz4BwREVEhxt/zystxsvXgwQP8+eefKF++vDriISIiIipUcrzOVr169fDw4UN1xEJERET5jIZMNdu3LMctW8OGDcOoUaMQEREBJyenj2YlVq1aVWXBERERUd5iN6Lycvy4Hg2NjxvDZDKZtLI8B8grh4/roaz4uB76EB/XQ1nlxuN62q65pJJ6jgyuq5J6CqIct2yFhYWpIw4iIiLKh9iwpbwcJ1ulS5dWRxxERESUD8nAbEtZX9UevWXLFjRs2BA2NjZ4+vQpgIzH+fz1118qDY6IiIiooMtxsrV69Wp4e3ujbdu2iImJkcZomZqaYsmSJaqOj4iIiPIQZyMqL8fJ1vLly7F+/XpMmDABmpqa0v7atWvj5s2bKg2OiIiI8pZMJlPJ9i3LcbIVFhaGGjVqfLRfV1cX8fHxKgmKiIiIqLDIcbJlZ2eH4ODgj/YfO3YMDg4OqoiJiIiI8gmZTDXbtyzHsxG9vb0xdOhQJCYmQgiBS5cu4Y8//oCvry9+/fVXdcRIREREeUTjW8+UVCDHydaAAQOgr6+PiRMnIiEhAT179oSNjQ2WLl0KNzc3dcRIREREeYS5lvJyvIJ8VgkJCYiLi4OFhYUqY/qmcQV5yooryNOHuII8ZZUbK8h3+f2qSurZ07+WSuopiHLcspVVkSJFUKRIEVXFQkRERPnMtz6TUBVynGy9fv0akydPxt9//42oqCikp6fLHY+OjlZZcERERJS3mGspL8fJVq9evfDw4UN4eHjA0tKSGS8RERHRZ+Q42Tp79izOnTuHatWqqSMeIiIiykc4G1F5OU62KlWqhPfv36sjFiIiIspnmGopL8fTWlatWoUJEyYgICAAr1+/RmxsrNxGRERERP/JccuWqakpYmNj0aJFC7n9QgjIZDLpwdRERERU8HFstvJynGy5u7tDW1sb27dv5wB5IiKiQk6Dv+aVluNk69atW7h+/Trs7e3VEQ8RERFRoZLjMVu1a9fGP//8o45YiIiIKJ+RyWQq2b5lOW7ZGjZsGEaMGIHRo0fDyckJ2tracserVq2qsuCIiIgob33jeZJK5PjZiBoaHzeGyWQyDpBXET4bkbLisxHpQ3w2ImWVG89G7L09RCX1bO757TbG5LhlKywsTB1xEBERERVKOf4TqXTp0p/diIiIqPDQkKlmy4m0tDRMmjQJdnZ20NfXR7ly5TBjxgxk7YwTQmDy5MmwtraGvr4+XFxc8ODBA7l6oqOj4e7uDmNjY5iamsLDwwNxcXFyZUJCQtC4cWPo6enB1tYW8+bN++r3SpFstWwdOHAA3333HbS1tXHgwIHPlv3+++9VEhgRERHlvbwY3D537lysXr0amzZtQuXKlXHlyhX069cPJiYmGD58OABg3rx5WLZsGTZt2gQ7OztMmjQJrq6uuHPnDvT09ABkLFcVHh4OPz8/pKSkoF+/fhg0aBC2b98OAIiNjUXr1q3h4uKCNWvW4ObNm+jfvz9MTU0xaNAgld1PtsZsaWhoICIiAhYWFp8csyVVxjFbSuOYLcqKY7boQxyzRVnlxpitfjtuqqSeDW5O2S7bvn17WFpa4rfffpP2denSBfr6+ti6dSuEELCxscGoUaPg4+MDAHj79i0sLS2xceNGuLm54e7du3B0dMTly5dRu3ZtAMCxY8fQtm1bPH/+HDY2Nli9ejUmTJiAiIgI6OjoAADGjRuH/fv34969eyq5byCb3Yjp6emwsLCQ/q1oY6JFRERUuMhUtCUlJX30iL+kpKRPXrNBgwbw9/fH/fv3AQA3btzAuXPn8N133wHIGD8eEREBFxcX6RwTExPUq1cPgYGBAIDAwECYmppKiRYAuLi4QENDA0FBQVKZJk2aSIkWALi6uiI0NBRv3rxR5m2Tk+M/kTZv3vzJNyc5ORmbN29WSVBERESUP2jIZCrZfH19YWJiIrf5+vp+8prjxo2Dm5sbKlWqBG1tbdSoUQNeXl5wd3cHAERERAAALC0t5c6ztLSUjmX2yGWlpaUFMzMzuTKfqiPrNVQhx8lWv3798Pbt24/2v3v3Dv369VNJUERERFS4jB8/Hm/fvpXbxo8f/8myu3btwrZt27B9+3Zcu3YNmzZtwoIFC7Bp06Zcjlo1crz0Q+Z6Wh96/vw5TExMVBIUERER5Q+qGh+vq6sLXV3dbJUdPXq01LoFAE5OTnj69Cl8fX3Rp08fWFlZAQAiIyNhbW0tnRcZGYnq1asDAKysrBAVFSVXb2pqKqKjo6XzraysEBkZKVcm83VmGVXIdrJVo0YNacn9li1bQkvrv1PT0tIQFhaGNm3aqCwwIiIiynt5MRsxISHhowl5mpqaSE9PBwDY2dnBysoK/v7+UnIVGxuLoKAgDBkyBADg7OyMmJgYXL16FbVq1QIAnDp1Cunp6ahXr55UZsKECUhJSZGeiOPn5wd7e3sULVpUZfeT7WSrU6dOAIDg4GC4urrC0NBQOqajo4MyZcqgS5cuKgusMChTpgy8vLzg5eWV16EQEREVGB06dMCsWbNQqlQpVK5cGdevX8eiRYvQv39/ABkJoJeXF2bOnIkKFSpISz/Y2NhI+YqDgwPatGmDgQMHYs2aNUhJSYGnpyfc3NxgY2MDAOjZsyemTZsGDw8PjB07Frdu3cLSpUuxePFild5PtpOtKVOmAMhIIHr06CGtYVGYNGvWDNWrV8eSJUvyOpRC57f1a+HvdwJhYY+hq6eH6tVrwMvbB2XsykplPPr2wpXLl+TO69q9ByZNmS69vnUzBEsXL8TdO7cBmQxVqlTFyFGjYV+pUq7dCykvLS0N69esxLHDBxH9+hXMi1ug3fed0H/gYOmv6PWrV8Dv+FFERkRAW1sblRwdMdhzBKo4VZPq6fSdC8LDX8jV/fPwkejTf2Cu3g+p1oZf12H50kX48X+9MXrsL9L+G8HXsXL5Ety6GQJNDQ1UtHfAyrW/yv0+OnvmNNavWYUH90Oho6OLWrXrYNGylXlxG4VGXjwbcfny5Zg0aRJ+/vlnREVFwcbGBj/99BMmT54slRkzZgzi4+MxaNAgxMTEoFGjRjh27Jjc52Hbtm3w9PREy5YtoaGhgS5dumDZsmXScRMTE5w4cQJDhw5FrVq1YG5ujsmTJ6t0jS3gK8Zs9enTB0DG7MOoqCipSS9TqVKlVBNZPiWEQFpamlw3Kn3ZlcuX0ONHd1R2ckJaahqWL12EwQM9sPfAYRQpUkQq16Vrd/zsOVx6raevL/07IT4eP/80EE2bt8CESVOQmpaG1SuWY8ggDxz3P/3RQ9Ep/9qy4Vfs3b0Dk6f7omy58rh75xZmTpkAQ0ND9OjZCwBQqnQZ+IybgBIlbZGUmIg/tm3G8CEDsefAMRQ1M5PqGvTzMHT6oav0uoiBQa7fD6nO7Vs3sefPnahQ0V5u/43g6xg2ZCD6eQzC2PEToampifuhoXJdTf5+xzFj6mR4jhiJOnXrIS0tDQ8/WFGcck4jD7ItIyMjLFmy5LONHzKZDNOnT8f06dMVljEzM5MWMFWkatWqOHv27NeGmi05no344MEDNG7cGPr6+ihdujTs7OxgZ2eHMmXKwM7OTh0xAshodRo+fDjGjBkDMzMzWFlZYerUqdLxmJgYDBgwAMWLF4exsTFatGiBGzduSMf79u0rNS1m8vLyQrNmzaTjAQEBWLp0qTQ27cmTJzh9+jRkMhmOHj2KWrVqQVdXF+fOncOjR4/QsWNHWFpawtDQEHXq1MHJkyfVdv8F3ep1v6Fj5x9QvnwF2FeqhOmz5iA8/EVGC1UWenp6MC9eXNqydleHhT3G27cxGOo5HGXsyqJ8+QoY/PNQvH79CuEvXnx4ScrHQm4Eo0mzFmjUpClsSpRAy1auqOvcEHdu/bd4omvb9qhbvwFKlLRF2fIVMGLUWMTHxeHhg1C5uooUMUAx8+LSpq9f5MPLUQGRkBCPCeN8MGnKDBgbG8sdWzh/Dtx69kK/AYNQrnwFlLEri9ZtvpPWR0pNTcX8ObPhNWo0unZ3Q+kydihbrjxat/kuL26lUJHJVLN9y3KcbPXt2xcaGho4dOgQrl69imvXruHatWu4fv06rl27po4YJZs2bYKBgQGCgoIwb948TJ8+HX5+fgCAbt26ISoqCkePHsXVq1dRs2ZNtGzZEtHR0dmqe+nSpXB2dsbAgQMRHh6O8PBw2NraSsfHjRuHOXPm4O7du6hatSri4uLQtm1b+Pv74/r162jTpg06dOiAZ8+eqeXeC5u4d+8AAMYfzGA9cvggmjashx86tsfSxQvx/v176VgZOzuYmppi394/kZKcjMTEROzb8yfKli0HmxIlcjV+Uk7VatVxJeginj19AgC4H3oPN65fg3PDxp8sn5KSjP17dsHQ0AgVKsp3GW/esB6tmjqjV48fsGXjb0hN5WMYCqo5s6ajUeNmqOfcQG5/9OvXuBVyA2ZmZuj7Pze4NG2IAX3/h+vXrkpl7t29g6ioSMhkMvzYrTNaN28Mz8ED8fDB/dy+DaKP5LgvLDg4GFevXkWlPBgjU7VqVWnsWIUKFbBixQr4+/tDX18fly5dQlRUlDStdMGCBdi/fz/+/PPPbPW9mpiYQEdHB0WKFPnkdM/p06ejVatW0mszMzNUq/bf2JEZM2Zg3759OHDgADw9PbN1P0lJSR8tECs0sz81tqBKT0/HvLmzUb1GTVSoUFHa/13b9rC2sYGFhQXu3w/FkkUL8ORJGBYvXQEAMDAwxK8bt2DksKFYt2YVAKBU6dJYve43dusWML37D0R8fDy6d2oHDU1NpKelYbDnCLRp10Gu3LkzpzFx7CgkJibC3Lw4lq/5FaZZZgh17/k/2FdyhLGJCW7euI5Vy5bg9atX8PIZm9u3REo6fvQw7t25gy07/vzo2PPn/wAA1q5eAa9RY2BfyQGHDvyFwQP6Yve+gyhVugz+lcqsxKjRY2FtUwJbN23AoP69se/QMZiYmObm7RQqeTEbsbDJ8W8oR0dHvHr1Sh2xfFHVqlXlXltbWyMqKgo3btxAXFwcihUrJnf8/fv3ePTokUqunXW5fwCIi4vD1KlTcfjwYYSHhyM1NRXv37/PUcuWr68vpk2bJrdvwqQpmDh5qipCzrdmz5yGRw8eYOMW+X70rt17SP+uUNEe5ubFMcijL/559gy2pUohMTERUydNQPUaNTFn/kKkp6dj04bf4TnkJ2zf+WehnLRRWJ08cQzHjhzCdN/5KFuuPO6H3sPi+b4o/v8D5TPVqlMXW3buRUxMDP7auxu/jPHG71t3wMws42e9Z6++UtkKFe2hpa2NOTOn4efhI+Uev0H5W0REOObPmY1V637/5B+bQmSMDf6hWw907Jwx672SgyMuBQXir317MMxrlDR+2GPgT2jZyhUAMHWmL9q4NIXf8WPo2t0tl+6m8OHTOJWX42Rr7ty5GDNmDGbPng0nJ6ePBiV/2M+uSh9eSyaTIT09HXFxcbC2tsbp06c/OsfU1BRAxsO0P3zmdkpKSravbfDBoFsfHx/4+flhwYIFKF++PPT19dG1a1ckJydnu87x48fD29tbbp/QLNytWrNnTseZgNP4fdNWWH5hwTinqhkth8+ePYVtqVI4cvggXrz4F1u275QGxc6ZtwCNGtTF36f88V3bdmqPn1Rj+eIF6N1vAFq3aQsAKF+hIiLCX2DT7+vlki19/SKwLVUatqVKw6lqNXTp0AYH9u1BX49Pt1ZXqVIVaampCH/xL0qXUd8YUlKtu7dvIzr6Ndx7/CDtS0tLw7WrV7Drj23Ye/AoAKBs2fJy59mVLYeI8HAAgHnx4hllyv1XRkdHByVL2iIiIlzdt0D0WTlOtjIf+tiyZUu5/Zkry+fFw6hr1qyJiIgIaGlpoUyZMp8sU7x4cdy6dUtuX3BwsFwCp6Ojk+34z58/j759+6Jz584AMlq6njx5kqO4P7WabmIhHW4ihIDvrBk45e+H3zZuQcmStl88J/TeXQAZ/+0AIDExERoyDbkmbZmGBmSQQXwwK5byt8TE9x8tWKihofHR7OYPCSGQ8pk/aO6H3oOGhobcbEXK/+rWr49dew/I7Zs66ReUsSuLvv0HoGRJWxS3sMDTJ2FyZZ49fYIGjTLG+Tk4VoGOjg6ePglDjZoZC1impKTgxb//wtraJndupJBiN6Lycpxs/f333+qIQykuLi5wdnZGp06dMG/ePFSsWBEvXrzA4cOH0blzZ9SuXRstWrTA/PnzsXnzZjg7O2Pr1q24desWatSoIdVTpkwZBAUF4cmTJzA0NITZZ76wK1SogL1796JDhw6QyWSYNGnSF39RfMtmz5iGo0cOYcnyVTAoYoBXL18CAAyNjKCnp4d/nj3DkcMH0bhJU5iYmuJBaCjmz/NFrdp1UNE+Y3ygs3MDLF4wD7NnTMOP7r2QLtLx+6/roKWliTr/vxowFQyNmzTHhl/XwtLK+v+7Ee/ij62b0KFjRsvG+/cJ2LB+LRo3awFzc3PExMTgz53b8TIqUuoiunkjGLduhqBWnbowMDDAzRvBWLJgLtq07QBjYz46rCAxMDBE+SzjNwFAX18fJqam0v7efT2wdtVyVLS3R8VKDjj01348CXuMeYuWAgAMDQ3Rpbsb1qxcDksrK1hb22Dzxt8BAK1a8+kmytBgrqW0HCdbTZs2VUccSpHJZDhy5AgmTJiAfv364eXLl7CyskKTJk2kp3e7urpi0qRJGDNmDBITE9G/f3/07t0bN2/+N9Xcx8cHffr0gaOjI96/f4+wsDBFl5RWsm3QoAHMzc0xduxYxMbGqv1eC6pdO/8AkLFwaVbTZ/qiY+cfoK2tjaCLgdi2ZTPev0+AlZU1XFxaY+Dgn6WydmXLYdnKNVizagV6u/eATKaBSg4OWLX2VxQvLv9kd8rfRo2bgLUrl2G+73S8iY6GeXELdO7SHR4/ZTxmQ0NDE0+fhOHIqBGIiXkDE1NTOFSugrW/b0HZ8hUAANo6OvA7fgS/rlmJlJRkWJcoAbf/9ZYbx0WFh3uvPkhOSsLCeXPwNvYtKla0x6p1v8PW9r+1Hb28R0NLUxOTxo9FUlIiqjhVw9rfNn4065kot8nEhwOZsuHs2bNYu3YtHj9+jN27d6NEiRLYsmUL7Ozs0KhRI3XE+c0orN2I9HUSU3K/W57yN21NDlem/xjoqL/ZyfvAPZXUs+j7b/dJHzn+qd2zZw9cXV2hr6+Pa9euSUsXvH37FrNnz1Z5gERERJR3Mhf6Vnb7luU42Zo5cybWrFmD9evXyw0ub9iwodoXNSUiIiIqaHI8Zis0NBRNmjT5aL+JiQliYmJUERMRERHlExwgr7wct2xZWVnh4cOHH+0/d+4cypYtq5KgiIiIKH/gsxGVl+Nka+DAgRgxYgSCgoIgk8nw4sULbNu2DT4+PhgyZIg6YiQiIqI8oiGTqWT7luW4G3HcuHFIT09Hy5YtkZCQgCZNmkBXVxc+Pj4YNmyYOmIkIiIiKrC+aukHAEhOTsbDhw8RFxcHR0dHGBoaqjq2bxKXfqCsuPQDfYhLP1BWubH0wy9H7qukntltK365UCH11T+1Ojo6cHR0RKVKlXDy5EncvXtXlXERERFRPsAxW8rLcbLVvXt3rFixAgDw/v171KlTB927d0fVqlWxZ88elQdIREREVJDlONk6c+YMGjfOePDnvn37kJ6ejpiYGCxbtgwzZ85UeYBERESUdzhAXnk5Trbevn0rPaD52LFj6NKlC4oUKYJ27drhwYMHKg+QiIiI8g67EZWX42TL1tYWgYGBiI+Px7Fjx9C6dWsAwJs3b6Cnp6fyAImIiIgKshwv/eDl5QV3d3cYGhqidOnSaNasGYCM7kUnJydVx0dERER5iCvIKy/HydbPP/+MevXq4dmzZ2jVqhU0NDIax8qWLcsxW0RERIXMtz7eShW+ep0tUg+us0VZcZ0t+hDX2aKscmOdrel+Hz+i72tMblVeJfUURDlu2SIiIqJvBxu2lMdki4iIiBTimC3lMdkiIiIihWRgtqUsdv4TERERqdFXJVtnz57F//73Pzg7O+Pff/8FAGzZsgXnzp1TaXBERESUtzRkqtm+ZTlOtvbs2QNXV1fo6+vj+vXrSEpKApCxsvzs2bNVHiARERHlHSZbystxsjVz5kysWbMG69evh7a2trS/YcOGuHbtmkqDIyIiIirocjxAPjQ0FE2aNPlov4mJCWJiYlQRExEREeUTMq79oLQct2xZWVnh4cOPFzg7d+4cypYtq5KgiIiIKH9gN6LycpxsDRw4ECNGjEBQUBBkMhlevHiBbdu2wcfHB0OGDFFHjEREREQFVo67EceNG4f09HS0bNkSCQkJaNKkCXR1deHj44Nhw4apI0YiIiLKI+xFVN5XPxsxOTkZDx8+RFxcHBwdHWFoaKjq2L5JfDYiZcVnI9KH+GxEyio3no245GyYSurxamynknoKoq9eQV5HRweOjo6qjIWIiIio0MlxstW8efPPzkw4deqUUgERERFR/vGtD25XhRwnW9WrV5d7nZKSguDgYNy6dQt9+vRRVVxERESUD3DMlvJy3Pm/ePFiuW3FihU4d+4cvLy85BY5JSIiooJPAzKVbDn177//4n//+x+KFSsGfX19ODk54cqVK9JxIQQmT54Ma2tr6Ovrw8XFBQ8ePJCrIzo6Gu7u7jA2NoapqSk8PDwQFxcnVyYkJASNGzeGnp4ebG1tMW/evK97oz5DZSMt//e//+H3339XVXVERET0jXrz5g0aNmwIbW1tHD16FHfu3MHChQtRtGhRqcy8efOwbNkyrFmzBkFBQTAwMICrqysSExOlMu7u7rh9+zb8/Pxw6NAhnDlzBoMGDZKOx8bGonXr1ihdujSuXr2K+fPnY+rUqVi3bp1K7+erZyN+aMuWLRg7dixevHihiuq+WZyNSFlxNiJ9iLMRKavcmI246sITldTzc4My2S47btw4nD9/HmfPnv3kcSEEbGxsMGrUKPj4+ADIeEazpaUlNm7cCDc3N9y9exeOjo64fPkyateuDQA4duwY2rZti+fPn8PGxgarV6/GhAkTEBERAR0dHena+/fvx71795S74SxyPGbrhx9+kHsthEB4eDiuXLmCSZMmqSwwIiIiynuqGiCflJSEpKQkuX26urrQ1dX9qOyBAwfg6uqKbt26ISAgACVKlMDPP/+MgQMHAgDCwsIQEREBFxcX6RwTExPUq1cPgYGBcHNzQ2BgIExNTaVECwBcXFygoaGBoKAgdO7cGYGBgWjSpImUaAGAq6sr5s6dizdv3si1pCkjx38imZiYyG1mZmZo1qwZjhw5gilTpqgkKCIiIipcfH19P8ohfH19P1n28ePHWL16NSpUqIDjx49jyJAhGD58ODZt2gQAiIiIAABYWlrKnWdpaSkdi4iIgIWFhdxxLS0tmJmZyZX5VB1Zr6EKOWrZSktLQ79+/eDk5KSybI+IiIjyLw0VTUccP348vL295fZ9qlULANLT01G7dm3Mnj0bAFCjRg3cunULa9asKZArH+SoZUtTUxOtW7dGTEyMmsIhIiKi/EQmU82mq6sLY2NjuU1RsmVtbf3RwukODg549uwZAMDKygoAEBkZKVcmMjJSOmZlZYWoqCi546mpqYiOjpYr86k6sl5DFXLcjVilShU8fvxYZQEQERERZdWwYUOEhobK7bt//z5Kly4NALCzs4OVlRX8/f2l47GxsQgKCoKzszMAwNnZGTExMbh69apU5tSpU0hPT0e9evWkMmfOnEFKSopUxs/PD/b29irtwctxsjVz5kz4+Pjg0KFDCA8PR2xsrNxGREREhYeGTKaSLSdGjhyJixcvYvbs2Xj48CG2b9+OdevWYejQoQAAmUwGLy8vzJw5EwcOHMDNmzfRu3dv2NjYoFOnTgAyWsLatGmDgQMH4tKlSzh//jw8PT3h5uYGGxsbAEDPnj2ho6MDDw8P3L59Gzt37sTSpUs/6u5UVraXfpg+fTpGjRoFIyOj/07O8uYJISCTyZCWxqnqyuDSD5QVl36gD3HpB8oqN5Z++P3yM5XU079OqRyVP3ToEMaPH48HDx7Azs4O3t7e0mxEICPvmDJlCtatW4eYmBg0atQIq1atQsWKFaUy0dHR8PT0xMGDB6GhoYEuXbpg2bJlMDQ0lMqEhIRg6NChuHz5MszNzTFs2DCMHTtW+RvOItvJlqamJsLDw3H37t3PlmvatKlKAvtWMdmirJhs0YeYbFFWhTnZKkyyPRsxMydjMkVERPTtYHqvvBwt/SDLYZ8rERERFWz83a+8HCVbFStW/OKbHh0drVRARERElH8w1VJejpKtadOmwcTERF2xEBERERU6OUq23NzcPlr6noiIiAovVa0g/y3LdrLFPlsiIqJvD3/7Ky/bkwyyuUIEEREREWWR7Zat9PR0dcZBRERE+RA7tpSXozFbRERE9G3hMCLlca0yIiIiIjViyxYREREpxFYZ5THZIiIiIoXYjag8JqxEREREasSWLSIiIlKI7VrKY7JFRERECrEbUXlMtojyMR0t9vSTvGJ1h+V1CJSPvL++Qu3X4LeQ8vgeEhEREakRW7aIiIhIIXYjKo/JFhERESnEVEt57EYkIiIiUiO2bBEREZFC7EVUHpMtIiIiUkiDHYlKYzciERERkRqxZYuIiIgUYjei8phsERERkUIydiMqjd2IRERERGrEli0iIiJSiN2IymOyRURERApxNqLymGwRERGRQmzZUh7HbBERERGpEVu2iIiISCG2bCmPyRYREREpxKUflMduRCIiIiI1YssWERERKaTBhi2lMdkiIiIihdiNqDx2IxIRERGpEVu2iIiISCHORlQeky0iIiJSiN2IymM3IhEREZEaMdkiIiIihTRkqtmUMWfOHMhkMnh5eUn7EhMTMXToUBQrVgyGhobo0qULIiMj5c579uwZ2rVrhyJFisDCwgKjR49GamqqXJnTp0+jZs2a0NXVRfny5bFx40blgv0EJltERESkkExF//taly9fxtq1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0NHRgampqVxZS0tLRERESGWyJlqZxzOPfa5MbGws3r9/n513J1s4G5GIiIjUbvz48fD29pbbp6ur+8Xzhg4dilu3buHcuXPqCk3tmGwRERGRQqp6NqKurm62kqusPD09cejQIZw5cwYlS5aU9ltZWSE5ORkxMTFyrVuRkZGwsrKSyly6dEmuvszZilnLfDiDMTIyEsbGxtDX189RrJ/DbkQiIiJSSCZTzZYTQgh4enpi3759OHXqFOzs7OSO16pVC9ra2vD395f2hYaG4tmzZ3B2dgYAODs74+bNm4iKipLK+Pn5wdjYGI6OjlKZrHVklsmsQ1XYskVERET5ytChQ7F9+3b89ddfMDIyksZYmZiYQF9fHyYmJvDw8IC3tzfMzMxgbGyMYcOGwdnZGfXr1wcAtG7dGo6OjujVqxfmzZuHiIgITJw4EUOHDpVa2AYPHowVK1ZgzJgx6N+/P06dOoVdu3bh8OHDKr0fLv2Qz3DpB8qKSz/Qh7j0A2WVG0s//BOdvRmDX2Jrlv0uRJmCprANGzagb9++ADIWNR01ahT++OMPJCUlwdXVFatWrZK6CAHg6dOnGDJkCE6fPg0DAwP06dMHc+bMgZbWf21Np0+fxsiRI3Hnzh2ULFkSkyZNkq6hKky28hkmW5QVky36EJMtyio3kq3nb1STbJUsmrPxWoUJx2wRERERqRHHbBEREdFn8EnUymKyRURERArldCYhfYzdiERERERqxJYtIiIiUogNW8pjskVEREQKsRtReUy2iIiISCFVPa7nW8YxW0RERERqxJYtIiIiUowNW0pjskVEREQKMddSHrsRiYiIiNSILVtERESkEGcjKo/JFhERESnE2YjKYzciERERkRqxZYuIiIgUY8OW0phsERERkULMtZTHbkQiIiIiNWLLFhERESnE2YjKY7JFRERECnE2ovKYbBEREZFCbNlSHsdsEREREakRky0iIiIiNWI3IhERESnEbkTlsWWLiIiISI3YskVEREQKcTai8phsERERkULsRlQeuxGJiIiI1IgtW0RERKQQG7aUx2SLiIiIFGO2pTQmW0RERKQQB8grj2O2iIiIiNSILVtERESkEGcjKo/JFhERESnEXEt57EYkIiIiUiO2bBEREZFibNpSGpMtIiIiUoizEZXHbkQiIiIiNWLLFhERESnE2YjKkwkhRF4HQZRVUlISfH19MX78eOjq6uZ1OJQP8DNBWfHzQAUNky3Kd2JjY2FiYoK3b9/C2Ng4r8OhfICfCcqKnwcqaDhmi4iIiEiNmGwRERERqRGTLSIiIiI1YrJF+Y6uri6mTJnCga8k4WeCsuLngQoaDpAnIiIiUiO2bBERERGpEZMtIiIiIjViskVERESkRky2iIiIiNSIyRYR5Qucq0NEhRWTLSLKMyEhIfDz8wMAyPi0WyIqpLTyOgAi+nYNGTIEWlpaKFWqFOzt7SGEYNJFRIUOW7Yo16SmpuZ1CJRPpKWlAQAWLlyIp0+f4vjx40hOTmai9Y3jdwQVVky2KNdoaWU0pB46dAh+fn549uxZHkdEeUVTUxNCCNSvXx+tWrXC9u3bcf369bwOi/JIeno6gP++I0JCQhAVFZWXIRGpFJMtyjVnz55FhQoVMHbsWIwYMQLt27fHrl278josyiVCCKlFK/M1AMyYMQNRUVHYt28fYmJi5I7Rt0FDI+NX0fr162FjY4OffvoJTk5OWLVqFaKjowHwM0EFG5MtUovMX6qZX5CxsbGYMWMGOnXqhNu3byMkJAQtW7aEm5sbHj16lJehUi5IS0uDTCaDpqYmEhMTERMTI302rKysMGjQIOzbtw8XLlwAwMHyhZ0QQmrNyvwcbNy4EQsWLMCMGTPg7++PWbNmYc2aNZg2bRoAfiaoYGOyRWqhqakJAIiIiAAA+Pn54c6dO5g/fz7S09MxZswYbNy4Ee7u7ihatGhehkq5IPPzMHv2bFSuXBnt27eHu7s7nj9/DgAYN24cDAwMsHPnTmkfWzIKL5lMBg0NDSQlJUlJ15EjR9CtWzd4eHggKSkJJ06cwD///IPy5ctLZYgKKiZbpBZv3rxBjx49MHfuXACAkZER6tWrhyVLlsDW1haBgYHYv38/tmzZAjMzMw6MLWQ+7DJ89uwZXFxcsGPHDkydOhWTJk3CvXv3MHHiRNy9excAMH78eJw6dQqnTp0CwJaMwu7gwYPo0KED3r9/j6ioKPzzzz/o0KEDZs6cidKlSyM5ORmBgYEYNmyY1M1IVFBx6Qf6KtevX4ejoyN0dXWRmpoKLS0tuWn7RYsWxb///ouKFSsCAOLj4xEUFIRz585h1qxZGDBggFTXxo0b8f79ewwZMiRP7oVUK/NzoKmpicePH0NXVxdv3ryBg4MDtm7dCisrK8TGxiI9PR3Hjx9HxYoV4eDggG7dumHz5s3YtWsXatSoAScnp7y+FVLCv//+ixIlSkgtlJnfDZmfDxMTE5w8eRIpKSmwsLCArq4unJ2dUbduXezYsQNt27YFALx8+RKHDx9G48aNUa5cuTy7HyJl8M8FyrHAwEAMHDgQ58+fB5Axgyg6OhqxsbEA/ptZ1LJlS+zbtw8A0LlzZzg6OqJatWpo0KCBVNeZM2ewdetWvH37FikpKbl8J6QMRd18mb9U586di/Lly+Pq1auwsLDAmDFjYGlpiV9++QWlS5dGnTp14OzsjP379+Ps2bMAgGnTpuH48ePw8/OTaxmjgqVbt26YPXs2EhISIJPJIJPJ8Pr1awCQ+4Osbt260qK2Y8aMgaamJqZNmyYlWgCwbds2HDx4kN8PVLAJohyKj48XMTEx0uv379+Lhg0bisqVK4ugoCBp//bt20WDBg3ErVu3hBBCBAQEiGbNmonixYuLAQMGiB9++EHo6+sLHx8fkZaWluv3QaqTmpoq/Xvr1q1i+vTpYuzYseLkyZNy5TZs2CBq164tjh07JoQQ4sKFC0JPT0+MHDlSvHnzRgghxLZt20RsbGyuxU6qk56eLoQQ4tq1ayIpKUna/8cff4iaNWuK9evXS/siIyNF+fLlxdatW4UQQsTFxQk3NzdRsmRJ0adPH7Fx40bRokULYWlpKTZt2pS7N0KkYmzZomxLT0+HEAJFihSBiYkJTp8+jV9++QV6enrYv38/LC0t4ePjg927dwMArK2t8ejRI+jr6wMAmjRpgp07d8Lb2xvm5uYwNzdHSEgI5s+fDw0NDQ6CLWBCQkIwbdo0JCYmQlNTUxp7df/+fUyZMgXnzp1D3bp1AWR8dlJSUuDn54cSJUrAxcUFAHDhwgWYmJjgxIkTuHLlCgCgZ8+eMDIyypubIqVkjr2sUaMGdHR0sHfvXoSHh6Nx48bo0KEDhg4dit9//x2vX7+GhYUFKlSogCNHjgAADAwMsH37dgwfPhzR0dHYunUrypYti4cPH6J37955eVtESuOYLfqihw8fYvPmzVJi9eDBA1SoUAFnz57Fhg0b0KxZM7Ru3RorV67E5s2b0adPH2hoaKBdu3YwNjbG6dOnUbZsWaSnp8PCwgLjxo2Tqz8tLQ0aGhocBFvABAQEYNeuXTAwMMChQ4dw6dIlPH78GAMHDsTp06ehpaUFIyMjpKenS/99U1NTkZaWhpMnT6JYsWI4e/YsFi9ejJIlS6Jx48Z5fUv0lU6dOoXixYtL4+xiYmIQExODrl27YtasWRg5ciSmTp2KtLQ0rF+/HgEBAdi0aRMaNmyIixcv4vXr1yhWrBhkMhlGjx6N0aNH4927d1LSnZaWJs1oJSqIZEJwfjV93oULF9CoUSNs3LgRBw8exJ49e3Dv3j2kpaVh8uTJePfuHY4dOyaVHzFiBC5evIhKlSpBJpPBxsYGs2bN+uTsssxfxFQwpKenS2NwUlJSUKVKFTx48ADff/89Nm/eDGNjYwDArl274ObmhosXL6Ju3bpISUmBtrY2AgMDMXr0aDx9+hQxMTEYNGgQFi5cmMd3RTl1584dpKamomrVqnjx4gV69uyJpKQk/Pnnn+jSpQucnZ2xePFi6btg/vz5aNKkidS62bNnT3h6eiIyMhKPHz/G/v37YWho+NEgeiEEhBD8jqCCLy/7MCn/S0lJEUII4eDgILS1tUWzZs3Ew4cPpeMbN24Ujo6O4tdff5X2JSQkiL1794rixYsLmUwmBg8ezDFZhUxMTIwIDAwUzZs3FxUqVBCLFi2SOx4bGyvatm0r6tev/8lzz5w5IyIiInIrXFKhxMRE0blzZzFp0iRp3+7du4Wurq7Q1dUVgwcPFpGRkUIIIV6/fi3KlSsnRo0aJV6+fCmV9/f3F61btxbly5cXMplM3Lt3L9fvgyg3MdkiOWlpaR8lRqGhoaJ69epCU1NTLFu2TO7YixcvxMCBA0Xt2rWlQfOZg2SPHj0q3NzcRGhoaO4ET2qXkJAgRo4cKTp16iTtGzhwoGjRooUICAiQK3vhwgWhr68v/vjjDyGE/CB6KtgSEhLkXo8YMUIYGBgIW1tbaV9iYqIQQojFixeL8uXLi7/++kvunJCQEOHm5iY6d+4sEhISpO8NosKIbbMkyTp26uXLl4iNjUVKSgoqVqyI69evY+LEiZg9ezZu3LghnWNtbY2OHTtCJpNh0aJFAP5b+qFNmzb4448/ULFiRa4GXgB96r+Zvr4+ihUrhn/++Qfbt28HAAwaNAjv3r3D/v37kZCQIJWtVasW+vfvj549e3LMTSEg/r9LD8j4HDx+/BguLi5ITEyEr68v/P39oa2tjcmTJwP4b4kHLy8vmJmZYdeuXXj69KlUn5OTE7Zs2YK9e/dCX1+fi9hSocZkiySamppISUnBkCFDUKdOHbRu3Rr9+vXD27dvAUAa4Lp27VrExcVJ5zVp0gStWrXCypUrcefOnY9+qWY+F48Klsz/Zrt27ZJmGgIZswXLly+PTZs24d27d6hduzZat26NS5cu4fDhwwCAuLg4xMbGwtvbG9OmTZPG31DBlJqaKjdWD8j4fFy4cAETJ06Evr4+HBwc0K9fP6xYsQIvXryAjo6OlHxPmTIFJ06cwIEDB+Q+B1paGXO0uKYaFXp52axGeevD7sJr166J6tWrixYtWogjR46IU6dOCRsbGzFixAjx5MkTIYQQW7ZsEXp6esLf3186LyoqSoSGhoq5c+eK+Pj4XL0HUp20tLSPunLOnDkjHBwchKenp9z+rVu3irp16wpfX18hRMaaSW3atBG1atUSXl5eQiaTiTlz5uRa7JQ7Jk2aJMaNGyfCwsKEEEKsW7dOaGlpSeM4Q0JCRN26dYW7u7t0TuZ3wo8//ig2btyY6zET5QdMtr5RH/5STU1NFSdOnBBTpkyRxtbcu3dPWFpaipIlS4pNmzZJ5zRo0EDUrFlTeHt7C3Nzc9G3b99cj59UK+t4qujoaLlj48ePFw0bNhR+fn7SvlevXok+ffqIOnXqSL9oz549KyZMmCBcXFzEnj17cidwyhV79uwRlpaWolatWmLdunXi7t27QgghXr58KZydnUXbtm2FEEIkJSWJLVu2CA0NDbF8+XIxdepUUbNmTXHr1i1OkqFvGpOtb0zm7EIhMv7iHDNmjHjw4IEQQojHjx+LqKgoERsbK3r16iXMzMzEjBkzROPGjUXjxo3FzZs3hRBCPHz4UIwaNUo0bdpUbkVoIT5O4qjgiIuLE/369RM1atQQrVq1EgsXLhRCCHH//n3RqlUr4e7uLg16FkKIZcuWCX19feHt7Z1XIZOKfern99WrV8LZ2VnMnDnzk+ccOXJEyGQy6akAb9++FVOnThVVqlQRVatWlfZn1s/vCPoWcVHTb0zmGImNGzfi33//xbp165CcnIzFixfDzs4OADBz5kw8ffoU/v7+qF69OhwcHNCrVy8cP34cdnZ2KFeuHHx9faGtrS3VmzkAmmOzCqa7d+/Czc0NNjY2mDJlCl68eIG5c+ciMjISc+fOxffff4+tW7di+/bt6NevHwDgzZs3KFu2LE6ePInQ0FDY29vn8V2QMjIfKP+h4OBgvH79Gg0bNkRaWhrOnDmD1NRUxMXFoVGjRvjuu+/QrVs3jB49Gq6urjA2NsaUKVPQr18/lCpVCsB/62bx+4G+VUy2vjHnzp1Dx44d4eTkhCpVqkBPTw87d+5Ely5d0KhRI0RGRuLo0aNo2LAhqlWrJp2jo6ODTZs2oV27dqhUqZKUaGUmWZxpVjBkPnLpw/9eQUFBMDc3x9GjRwFkPIrnn3/+QVhYGN69e4euXbvixo0bmDx5MlJTU5GYmIgLFy5g6tSpaNSoEaysrPLidkiFMhOttWvXQltbG2XLlkWzZs1Qo0YN6Ovrw9vbG7GxsbC3t8ft27ehpaUFBwcHHDx4EJMmTULVqlWxZMkSeHl5AYCUaHEmKhGTrUIr8y/JD61fvx4uLi7YsWMHZDIZunbtigkTJmDOnDk4dOgQLC0tkZSUhAcPHiAgIABv3rzBo0ePcPToUejp6aFSpUpy9fFLtOAQWVbifvHiBV68eIFatWpBJpPh6NGjaNOmDRITE/Hdd9/h5s2bmDZtGkaNGgV9fX0YGRlh/PjxAIBly5YhPj4evr6+6Nq1a17eEqlQQECA9FxKY2NjXLt2Db/88gumTJmCffv24a+//kKZMmVgZmaGKlWqYPfu3Vi4cCFCQ0Ph4OCAbdu2oUGDBh/Vy+8IInA2YmGUdVxWVnFxcaJRo0Zi+PDhcvvXrFkjypUrJ37//XchhBCnTp0SVatWFba2tsLMzEwsX75cKsvxFgVbenq6GDlypDAyMhKlSpUSHTt2FA8ePBALFy4U2trawtDQUPTt21eabSZExozErK+z/psKnvT0dGmwetaf5/bt24tBgwYJITIWLf3tt99E6dKlP1rIONPEiRPlFrfNWj8RyeM6W4VQZnfA8uXLsXz5cuzduxdAxl+YGhoa0NbWRnx8vFS+bdu20NLSwrp16/Du3Ts0b94cfn5+2LVrFyIiIuDp6SmV5ZiLguvixYtYuXIlIiMjceLECSxbtgwPHz7E7NmzUaxYMdSoUQO9evXChg0bUKZMGQBAaGgoFixYgIcPH0r1ZB6jgifz2ZYaGhpy69/du3cP165dg4uLC4CMRUv79++P5s2b4/Dhw9I6awcOHMDhw4fh6uqKNWvWwN3dHYD8Arj8jiD6GLsRC6GAgAD07t0bxsbGqFy5Mo4ePYqLFy9i2rRp6NKlCxYuXIhu3bqhXr16AIBixYpBT08Pjx8/xqJFizBlyhRYWFjAwsICgOKBs1RwvHnzBj169IAQApMnT0b9+vUBAK9fv8bmzZthYWGBNm3aYMGCBahZsybKly+PsLAwTJ8+HTVr1oSjo2Me3wEpI/OB75ndyLNnz8bff/+NcuXKoV+/fqhUqRLevn0LQ0NDAEBCQgKKFCmCkSNHokGDBkhMTAQAXL58GUePHkX16tWxe/du6cHjTLCIPk8mBJd1Lsgyv0Sz6tatG0qUKIElS5YAAJYuXYpRo0Zh/fr16NevHxwdHVGlShUMGDAArVq1wvbt23Ho0CFYW1vjxo0b2LFjB4oXL54Hd0PqtH79evj4+GDFihXo1asXACApKQn9+/fHu3fv4OPjg4CAAGzatAlGRkaIjY3F6NGjMXjw4DyOnFTl33//xdKlS/HXX3+hZ8+e2Lt3LxITEzFkyBCEhYXhwoULuHz5MoCM1qqIiAhUqlQJv//+O7p06YK3b98iISEB1tbWADj4nSjb8rQTk75a1gUCsy5IGRwcLCpVqiTev38v3rx5I/r27SuMjIzE8OHDRUREhBBCiICAAPH9998LQ0ND4eTkJPT09MSpU6fEypUrhZ2dnXjx4kWu3w+pX1JSkqhXr54YMGCAeP36tbT/xIkTolGjRmLixIlCiIwxN3fu3MmrMElNpk+fLtq2bStcXFykNfNevnwppk6dKvT09MSOHTuEpaWlmDNnjnj16pUQQogVK1aImjVripcvX8rVlXXcFxF9GcdsFTCZD3nObM3y9fVF+/btMXz4cPz7778wNzdHVFQUpkyZgooVK+L58+c4ffo0li5dCktLS0RGRqJJkybYvn07du/ejVGjRiE8PBzNmzdHTEwMihUrJnUlUOGio6ODadOm4caNGzhy5Ii0v1WrVqhcuTIOHjyIa9euQSaTwcHBIQ8jJXVo164dLl++jMjISFSpUgUAYG5ujv79+6NKlSo4ceIEVq9ejTlz5qBp06Zo0aIFRo0ahX79+sHc3FyursxxX0SUPexGLKDCw8OxatUq7NmzB926dcPKlSvRqFEjeHh4YO/evdi2bRv279+Ptm3bSuf8+eefePDgAYYNGyYlVHFxcUhOTsaOHTswY8YM/PLLLxg2bFhe3RapmRACP/zwA/T09DB79mxpIdvHjx8jPj4eTk5OeRwhqZOXlxcOHTqEbdu2SWM2AWDixIkICgqCn58fLl68iJCQEISHh2PIkCHS2E0i+noc9VwAzZgxAxcvXoSenh4OHjyIcuXKoX379vDx8cGhQ4dQuXJlWFtb4927d0hOToaOjg5OnjyJ+fPnw9nZWe4v0nPnzmHkyJFITEzEokWL8OOPP+bhnZG6yWQyzJ07F127dsWWLVswefJkAEDZsmXzODLKDRMnTkRAQAD27dsnl2w9fvxY+l6oX7++NIECyBiXpaGhwUHwREpgO3AB1L59e1y+fBkREREoV64cAKBOnTpwcXHBo0ePoKWlhWHDhqFPnz6oV68eXFxc0KFDB7Rp0wZLlixBkSJFpLpat26NBQsWICwsjInWN6JixYpo0aKFNMiZvh3m5ubw8PDAtm3bMG3aNNy5cwfnzp3D1atX0axZs4/Kp6en8zFcRCrAbsQCavjw4Th//jzWr1+PmjVrAshYFXzgwIEwNjbGr7/+ilu3buHu3bt4/fo1evfuLc0w/NQMRvq28DPw7UpOTkaDBg1w7949tGzZEg8fPkTTpk2xatWqvA6NqNBislVAvXz5Em3atEGHDh0wefJk6Rfnpk2bMGfOHPTu3Vt6vEomdgcQEQCcPHkSU6ZMgZubGwYOHAg9PT0ATMKJ1IU/VQVU8eLF0adPH/z999/w9/eX9v/4449o2bIlnJ2dAfw3e1H8/8OHmWgRUcuWLWFhYYFz587h9evXAICUlBQmWkRqwpatAiwpKQmtWrWCk5MTZsyYATMzs7wOiYgKiAcPHqBLly7o2rWrNFGCiNSDf8YUYLq6uhgzZgz8/f1x+/ZtuWOZLVpERJ9SoUIFTpQgyiVs2SrghBC4e/cun11HRDnGMVpEuYPJFhEREZEa8U8aIiIiIjViskVERESkRky2iIiIiNSIyRYRERGRGjHZIiIiIlIjJltEREREasRki+gb17dvX3Tq1El63axZM3h5eeV6HKdPn4ZMJkNMTEyuX/tznjx5AplMhuDg4LwOhYgKKCZbRPlQ3759IZPJIJPJoKOjg/Lly2P69OlITU1V+7X37t2LGTNmZKtsfk2QvtaHiScA2NraIjw8HFWqVMmboLKYOnUqqlevntdhEFEOaeV1AET0aW3atMGGDRuQlJSEI0eOYOjQodDW1sb48eM/KpucnAwdHR2VXJfP2JSnqakJKyurvA6DiAowtmwR5VO6urqwsrJC6dKlMWTIELi4uODAgQMA/muBmTVrFmxsbGBvbw8A+Oeff9C9e3eYmprCzMwMHTt2xJMnT6Q609LS4O3tDVNTUxQrVgxjxozBhw+R+LAbMSkpCWPHjoWtrS10dXVRvnx5/Pbbb3jy5AmaN28OAChatChkMhn69u0LIOMxML6+vrCzs4O+vj6qVauGP//8U+46R44cQcWKFaGvr4/mzZvLxfkpQghMnToVpUqVgq6uLmxsbDB8+HC5OH18fFCiRAkYGBigXr16OH36tHR848aNMDU1xfHjx+Hg4ABDQ0O0adMG4eHhADJajTZt2oS//vpLalU8ffr0R92Ima15x48fR40aNaCvr48WLVogKioKR48ehYODA4yNjdGzZ08kJCRI1//Se5JZr7+/P2rXro0iRYqgQYMGCA0NleKfNm0abty4IcW3cePGz75nRJRPCCLKd/r06SM6duwot+/7778XNWvWlI4bGhqKXr16iVu3bolbt26J5ORk4eDgIPr37y9CQkLEnTt3RM+ePYW9vb1ISkoSQggxd+5cUbRoUbFnzx5x584d4eHhIYyMjOSu1bRpUzFixAjpdffu3YWtra3Yu3evePTokTh58qTYsWOHSE1NFXv27BEARGhoqAgPDxcxMTFCCCFmzpwpKlWqJI4dOyYePXokNmzYIHR1dcXp06eFEEI8e/ZM6OrqCm9vb3Hv3j2xdetWYWlpKQCIN2/efPI92b17tzA2NhZHjhwRT58+FUFBQWLdunXS8QEDBogGDRqIM2fOiIcPH4r58+cLXV1dcf/+fSGEEBs2bBDa2trCxcVFXL58WVy9elU4ODiInj17CiGEePfunejevbto06aNCA8PF+Hh4SIpKUmEhYUJAOL69etCCCH+/vtvAUDUr19fnDt3Tly7dk2UL19eNG3aVLRu3Vpcu3ZNnDlzRhQrVkzMmTNHiu9L70lmvfXq1ROnT58Wt2/fFo0bNxYNGjQQQgiRkJAgRo0aJSpXrizFl5CQkN2PFBHlISZbRPlQ1mQrPT1d+Pn5CV1dXeHj4yMdt7S0lJIoIYTYsmWLsLe3F+np6dK+pKQkoa+vL44fPy6EEMLa2lrMmzdPOp6SkiJKliypMNkKDQ0VAISfn98n48xMELImSImJiaJIkSLiwoULcmU9PDzEjz/+KIQQYvz48cLR0VHu+NixYz+bbC1cuFBUrFhRJCcnf3Ts6dOnQlNTU/z7779y+1u2bCnGjx8vhMhItgCIhw8fSsdXrlwpLC0tpdefSnIVJVsnT56Uyvj6+goA4tGjR9K+n376Sbi6umb7PflUvYcPHxYAxPv374UQQkyZMkVUq1btk+8PEeVfHLNFlE8dOnQIhoaGSElJQXp6Onr27ImpU6dKx52cnOTGad24cQMPHz6EkZGRXD2JiYl49OgR3r59i/DwcNSrV086pqWlhdq1a3/UlZgpODgYmpqaaNq0abbjfvjwIRISEtCqVSu5/cnJyahRowYA4O7du3JxAICzs/Nn6+3WrRuWLFmCsmXLok2bNmjbti06dOgALS0t3Lx5E2lpaahYsaLcOUlJSShWrJj0ukiRIihXrpz02traGlFRUdm+t6yqVq0q/dvS0hJFihRB2bJl5fZdunQJQPbek0/Va21tDQCIiopCqVKlvipOIsp7TLaI8qnmzZtj9erV0NHRgY2NDbS05H9cDQwM5F7HxcWhVq1a2LZt20d1FS9e/Kti0NfXz/E5cXFxAIDDhw+jRIkScsd0dXW/Kg4gY1ZgaGgoTp48CT8/P/z888+YP38+AgICEBcXB01NTVy9ehWamppy5xkaGkr/1tbWljsmk8kUJppfkrUumUz2ybrT09MB5Ow9+bBeAFI9RFQwMdkiyqcMDAxQvnz5bJevWbMmdu7cCQsLCxgbG3+yjLW1NYKCgtCkSRMAQGpqKq5evYqaNWt+sryTkxPS09MREBAAFxeXj45ntqylpaVJ+xwdHaGrq4tnz54pbBFzcHCQBvtnunjx4hfvUV9fHx06dECHDh0wdOhQVKpUCTdv3kSNGjWQlpaGqKgoNG7c+Iv1KKKjoyN3L6qSnfckO9QVHxGpF2cjEhUS7u7uMDc3R8eOHXH27FmEhYXh9OnTGD58OJ4/fw4AGDFiBObMmYP9+/fj3r17+Pnnnz+7RlaZMmXQp08f9O/fH/v375fq3LVrFwCgdOnSkMlkOHToEF6+fIm4uDgYGRnBx8cHI0eOxKZNm/Do0SNcu3YNy5cvx6ZNmwAAgwcPxoMHDzB69GiEhoZi+/btX5xZt3HjRvz222+4desWHj9+jK1bt0JfXx+lS5dGxYoV4e7ujt69e2Pv3r0ICwvDpUuX4Ovri8OHD2f7PSxTpgxCQkIQGhqKV69eISUlJdvnfk523pPsxhcWFobg4GC8evUKSUlJKomPiNSLyRZRIVGkSBGcOXMGpUqVwg8//AAHBwd4eHggMTFRaukaNWoUevXqhT59+sDZ2RlGRkbo3LnzZ+tdvXo1unbtip9//hmVKlXCwIEDER8fDwAoUaIEpk2bhnHjxsHS0hKenp4AgBkzZmDSpEnw9fWFg4MD2rRpg8OHD8POzg4AUKpUKezZswf79+9HtWrVsGbNGsyePfuzcZiammL9+vVo2LAhqlatipMnT+LgwYPSmKwNGzagd+/eGDVqFOzt7dGpUydcvnw5R2OdBg4cCHt7e9SuXRvFixfH+fPns33ul3zpPcmOLl26oE2bNmjevDmKFy+OP/74Q2XxEZH6yMTXDlggIiIioi9iyxYRERGRGjHZIiIiIlIjJltEREREasRki4iIiEiNmGwRERERqRGTLSIiIiI1YrJFREREpEZMtoiIiIjUiMkWERERkRox2SIiIiJSIyZbRERERGrEZIuIiIhIjf4PIZ0IyuboYOAAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def show_confusion_matrix(confusion_matrix):\n", " hmap = sns.heatmap(confusion_matrix, annot=True, fmt=\"d\", cmap=\"Blues\")\n", " hmap.yaxis.set_ticklabels(hmap.yaxis.get_ticklabels(), rotation=0, ha='right')\n", " hmap.xaxis.set_ticklabels(hmap.xaxis.get_ticklabels(), rotation=30, ha='right')\n", " plt.ylabel('True sentiment')\n", " plt.xlabel('Predicted sentiment')\n", "\n", "cm = confusion_matrix(y_test, y_pred)\n", "df_cm = pd.DataFrame(cm, index=class_names, columns=class_names)\n", "show_confusion_matrix(df_cm)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "review_text = \"I love completing my todos! Best app ever!!!\"" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/divya/.venv/lib/python3.8/site-packages/transformers/tokenization_utils_base.py:2393: FutureWarning: The `pad_to_max_length` argument is deprecated and will be removed in a future version, use `padding=True` or `padding='longest'` to pad to the longest sequence in the batch, or use `padding='max_length'` to pad to a max length. In this case, you can give a specific length with `max_length` (e.g. `max_length=45`) or leave max_length to None to pad to the maximal input size of the model (e.g. 512 for Bert).\n", " warnings.warn(\n" ] } ], "source": [ "encoded_review = tokenizer.encode_plus(\n", " review_text,\n", " max_length=MAX_LEN,\n", " add_special_tokens=True,\n", " return_token_type_ids=False,\n", " pad_to_max_length=True,\n", " return_attention_mask=True,\n", " return_tensors='pt',\n", ")" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Review text: I love completing my todos! Best app ever!!!\n", "Sentiment : positive\n" ] } ], "source": [ "input_ids = encoded_review['input_ids'].to(device)\n", "attention_mask = encoded_review['attention_mask'].to(device)\n", "\n", "output = model(input_ids, attention_mask)\n", "_, prediction = torch.max(output, dim=1)\n", "\n", "print(f'Review text: {review_text}')\n", "print(f'Sentiment : {class_names[prediction]}')\n", "\n" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "def softmax(array_):\n", " return np.exp(array_)/ np.sum(np.exp(array_))" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "def sentiment_analyse(review_text):\n", " encoded_review = tokenizer.encode_plus(\n", " review_text,\n", " max_length=MAX_LEN,\n", " add_special_tokens=True,\n", " return_token_type_ids=False,\n", " pad_to_max_length=True,\n", " return_attention_mask=True,\n", " return_tensors='pt',\n", " )\n", " input_ids = encoded_review['input_ids'].to(device)\n", " attention_mask = encoded_review['attention_mask'].to(device)\n", "\n", " output = model(input_ids, attention_mask)\n", " _, prediction = torch.max(output, dim=1)\n", " return \"given review is \"+str(class_names[prediction])+\"with \" +str(max(softmax(output.detach().cpu().numpy()))*100)+\"confidence\"" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running on local URL: http://127.0.0.1:7863\n", "\n", "To create a public link, set `share=True` in `launch()`.\n" ] }, { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "demo = gr.Interface(fn=sentiment_analyse, inputs=\"text\", outputs=\"text\")\n", "\n", "demo.launch()" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "# Build the Sentiment Classifier class \n", "class SentimentClassifier(nn.Module):\n", " \n", " # Constructor class \n", " def __init__(self, n_classes):\n", " super(SentimentClassifier, self).__init__()\n", " self.bert = BertModel.from_pretrained(MODEL_NAME)\n", " self.drop = nn.Dropout(p=0.3)\n", " self.out = nn.Linear(self.bert.config.hidden_size, n_classes)\n", " \n", " # Forward propagaion class\n", " def forward(self, input_ids, attention_mask):\n", " output = self.bert(\n", " input_ids=input_ids,\n", " attention_mask=attention_mask\n", " )\n", " # Add a dropout layer \n", " output = self.drop(output.pooler_output)\n", " return self.out(output)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "import pickle\n", "with open(\"/home/divya/vivek5/sentiment_analysis_finetune_bert.pkl\", \"rb\") as f:\n", " model = pickle.load(f)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "SentimentClassifier(\n", " (bert): BertModel(\n", " (embeddings): BertEmbeddings(\n", " (word_embeddings): Embedding(28996, 768, padding_idx=0)\n", " (position_embeddings): Embedding(512, 768)\n", " (token_type_embeddings): Embedding(2, 768)\n", " (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\n", " (dropout): Dropout(p=0.1, inplace=False)\n", " )\n", " (encoder): BertEncoder(\n", " (layer): ModuleList(\n", " (0-11): 12 x BertLayer(\n", " (attention): BertAttention(\n", " (self): BertSelfAttention(\n", " (query): Linear(in_features=768, out_features=768, bias=True)\n", " (key): Linear(in_features=768, out_features=768, bias=True)\n", " (value): Linear(in_features=768, out_features=768, bias=True)\n", " (dropout): Dropout(p=0.1, inplace=False)\n", " )\n", " (output): BertSelfOutput(\n", " (dense): Linear(in_features=768, out_features=768, bias=True)\n", " (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\n", " (dropout): Dropout(p=0.1, inplace=False)\n", " )\n", " )\n", " (intermediate): BertIntermediate(\n", " (dense): Linear(in_features=768, out_features=3072, bias=True)\n", " (intermediate_act_fn): GELUActivation()\n", " )\n", " (output): BertOutput(\n", " (dense): Linear(in_features=3072, out_features=768, bias=True)\n", " (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\n", " (dropout): Dropout(p=0.1, inplace=False)\n", " )\n", " )\n", " )\n", " )\n", " (pooler): BertPooler(\n", " (dense): Linear(in_features=768, out_features=768, bias=True)\n", " (activation): Tanh()\n", " )\n", " )\n", " (drop): Dropout(p=0.3, inplace=False)\n", " (out): Linear(in_features=768, out_features=3, bias=True)\n", ")" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "def sentiment_analyse(review_text):\n", " encoded_review = tokenizer.encode_plus(\n", " review_text,\n", " max_length=MAX_LEN,\n", " add_special_tokens=True,\n", " return_token_type_ids=False,\n", " pad_to_max_length=True,\n", " return_attention_mask=True,\n", " return_tensors='pt',\n", " )\n", " input_ids = encoded_review['input_ids'].to(device)\n", " attention_mask = encoded_review['attention_mask'].to(device)\n", "\n", " output = model(input_ids, attention_mask)\n", " _, prediction = torch.max(output, dim=1)\n", " return \"given review is \"+str(class_names[prediction])+\" with \" +str(round(np.max(softmax(output.detach().cpu().numpy()))*100,2))+\"% confidence\"" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'given review is positive with 96.9% confidence'" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sentiment_analyse(\"good product\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.8.10" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }