Skip to content

Instantly share code, notes, and snippets.

@lukalafaye
Created September 19, 2023 05:10
Show Gist options
  • Save lukalafaye/8ec2196aa547d03e0296d99852f5d8fe to your computer and use it in GitHub Desktop.
Save lukalafaye/8ec2196aa547d03e0296d99852f5d8fe to your computer and use it in GitHub Desktop.
inf8460_A23_TP1.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/lukalafaye/8ec2196aa547d03e0296d99852f5d8fe/inf8460_a23_tp1.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"id": "417a4c65",
"metadata": {
"id": "417a4c65"
},
"source": [
"# INF8460: Traitement automatique de la langue naturelle\n",
"\n",
"# TP1: Comparaison d'algorithmes pour classification de texte"
]
},
{
"cell_type": "markdown",
"id": "dc062396",
"metadata": {
"id": "dc062396"
},
"source": [
"## Identification de l'équipe:\n",
"\n",
"### Groupe de laboratoire:\n",
"\n",
"### Equipe numéro : 4\n",
"\n",
"### Membres:\n",
"\n",
"- Luka Lafaye de Micheaux (33% de contribution, nature de la contribution)\n",
"- Marouane Lahmadi (33% de contribution, nature de la contribution)\n",
"- Tycho Lecavelier des Etangs-Levallois (33% de contribution, nature de la contribution)\n",
"\n",
"* nature de la contribution: Décrivez brièvement ce qui a été fait par chaque membre de l’équipe. Tous les membres sont censés contribuer au développement. Bien que chaque membre puisse effectuer différentes tâches, vous devez vous efforcer d’obtenir une répartition égale du travail."
]
},
{
"cell_type": "markdown",
"id": "b3dacaae",
"metadata": {
"id": "b3dacaae"
},
"source": [
"\n",
"## Description:\n",
"\n",
"Dans ce premier TP, vous explorerez les bases du traitement automatique du langage naturel. Au cours de ce travail, vous appliquerez concrètement les concepts enseignés en classe pour résoudre une tâche de classification simple. De plus, le processus ressemblera à la manière dont vous aborderiez ce type de problème dans le monde réel. Tout au long de ce laboratoire, vous vous familiariserez avec des bibliothèques couramment utilisées en NLP ainsi qu'en science des données.\n",
"\n",
"Dans ce laboratoire, vous travaillerez avec un jeu de données comprenant des évaluations de produits provenant d'Amazon. Pour chaque évaluation, le jeu de données contient trois informations : le titre fourni par l'utilisateur, le commentaire détaillé et le nombre d'étoiles attribué par l'utilisateur au produit.\n",
"\n",
"L'objectif de cette tâche consistera à prédire le nombre d'étoiles attribué à une évaluation à partir du commentaire et du titre qui lui sont associés.\n",
"\n",
"Le travail sera divisé en 3 parties:\n",
"\n",
" - Chargement, prétraitement et visualisation des données: Dans cette première partie, vous allez charger et prétraiter les données afin qu'elles soient prêtes à être utilisées par les algorithmes lors de la deuxième partie.\n",
" - Classification: Cette partie consistera à explorer les différents algorithmes pouvant être appliqués à cette tâche. Vous ferez aussi une analyse des sorties du classificateur bayésien naïf.\n",
" - Amélioration de modèle: Cette dernière partie consistera à améliorer votre modèle de 2 façons différentes. D'abord, vous ferez une recherche d'hyper-paramètres avec de la validation croisée en utilisant un GridSearch. Ensuite, vous ferez de l'extraction d'attributs avec l'aide de ChatGPT afin de d'entrainer un nouveau modèle et de comparer ainsi une représentation de type \"Bag of words\" et une représentation avec attributs spécifiques.\n",
"\n",
"\n",
"## Plan du TP\n",
"\n",
"1. [Chargement, prétraitement et visualisation des données](#1)\n",
"- 1.1 [Charger les données](#1.1)\n",
" - 1.1.1 [Charger le jeu de données](#1.1.1)\n",
" - 1.1.2 [Fusionner les colonnes title et text en une seule colonne](#1.1.2)\n",
"- 1.2 [Prétraitement des données](#1.2)\n",
"- 1.3 [Visualisation des données](#1.3)\n",
" - 1.3.1 [Afficher dans un graphique le nombre d'exemples présents dans le jeu de données pour chaque catégorie](#1.3.1)\n",
" - 1.3.2 [Afficher dans un graphique la quantité moyenne de jetons par exemple selon la catégorie](#1.3.2)\n",
" - 1.3.3 [Afficher en texte les top 10 jetons les plus fréquents par catégorie](#1.3.3)\n",
" - 1.3.4 [Afficher en texte les top 10 adjectifs les plus fréquents selon la catégorie](#1.3.4)\n",
"- 1.4 [Diviser les données en ensembles d'entraînement et de test](#1.4)\n",
"- 1.5 [Construction du vocabulaire](#1.5)\n",
"- 1.6 [Vectorisation des données](#1.6)\n",
"2. [Classification](#2)\n",
"- 2.1 [Modèle aléatoire (Random baseline)](#2.1)\n",
"- 2.2 [Analyse et compréhension d'un classificateur bayésien naïf (NB)](#2.2)\n",
" - 2.2.1 [Construction du modèle](#2.2.1)\n",
" - 2.2.2 [Matrice de confusion](#2.2.2)\n",
" - 2.2.3 [Visualisation des probabilités de NB](#2.2.3)\n",
" - 2.2.4 [Visualisation des erreurs commises](#2.2.4)\n",
" - 2.2.5 [Analyse d'erreurs commises](#2.2.5)\n",
"- 2.3 [Régression logistique](#2.3)\n",
"- 2.4 [MLP](#2.4)\n",
"3. [Amélioration de modèle](#3)\n",
"- 3.1 [Recherche d'hyper-paramètres et validation croisée](#3.1)\n",
"- 3.2 [Extraction d'attributs (Feature extraction) avec ChatGPT](#3.2)\n",
"- 3.3 [Amélioration du modèle en 3.2](#3.3)\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "1e96c2d5",
"metadata": {
"id": "1e96c2d5"
},
"source": [
"<a name='1'></a>\n",
"## 1. Chargement, prétraitement et visualisation des données (30 points)\n",
"\n",
"Dans cette première partie, vous allez charger et prétraiter les données afin qu'elles soient prêtes à être utilisées par les algorithmes lors de la deuxième partie.\n",
"\n",
"<a name='1.1'></a>\n",
"### 1.1 Charger les données (2 points)\n",
"\n",
"Ce numéro doit être résolu en utilisant la bibliothèque **pandas**.\n",
"\n",
"<a name='1.1.1'></a>\n",
"#### 1.1.1 Charger le jeu de données (1 point)\n",
"\n",
"Chargez le jeu de données amazon_rating.csv. Affichez ensuite son contenu.\n"
]
},
{
"cell_type": "code",
"execution_count": 89,
"id": "3ccc645c",
"metadata": {
"id": "3ccc645c",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"outputId": "9c4ca954-6d92-42a6-814a-2cd76a01512b"
},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"[nltk_data] Downloading package stopwords to /root/nltk_data...\n",
"[nltk_data] Package stopwords is already up-to-date!\n",
"[nltk_data] Downloading package punkt to /root/nltk_data...\n",
"[nltk_data] Package punkt is already up-to-date!\n",
"[nltk_data] Downloading package averaged_perceptron_tagger to\n",
"[nltk_data] /root/nltk_data...\n",
"[nltk_data] Package averaged_perceptron_tagger is already up-to-\n",
"[nltk_data] date!\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"True"
]
},
"metadata": {},
"execution_count": 89
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import nltk\n",
"\n",
"nltk.download('stopwords')\n",
"nltk.download('punkt')\n",
"nltk.download('averaged_perceptron_tagger')\n"
]
},
{
"cell_type": "code",
"execution_count": 90,
"id": "88767fe4",
"metadata": {
"scrolled": true,
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "88767fe4",
"outputId": "1dccaab5-98a3-44c4-e740-418a76204b41"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" title \\\n",
"0 Five Stars \n",
"1 Did The Job \n",
"2 Great product \n",
"3 Leaking Acid EVERYEWHERE!! \n",
"4 One Star \n",
"\n",
" text rating \n",
"0 good as any name brand 5 \n",
"1 Ordered on accident when I had searched for RE... 3 \n",
"2 I was looking for something to read on and thi... 5 \n",
"3 After 2nd recharge and use all but 3 are leaki... 1 \n",
"4 They fail earlier than brand names. I assumed ... 1 "
],
"text/html": [
"\n",
" <div id=\"df-6253f37d-022d-4eb1-862b-3aba6e730e22\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>title</th>\n",
" <th>text</th>\n",
" <th>rating</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Five Stars</td>\n",
" <td>good as any name brand</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Did The Job</td>\n",
" <td>Ordered on accident when I had searched for RE...</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Great product</td>\n",
" <td>I was looking for something to read on and thi...</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Leaking Acid EVERYEWHERE!!</td>\n",
" <td>After 2nd recharge and use all but 3 are leaki...</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>One Star</td>\n",
" <td>They fail earlier than brand names. I assumed ...</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-6253f37d-022d-4eb1-862b-3aba6e730e22')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-6253f37d-022d-4eb1-862b-3aba6e730e22 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-6253f37d-022d-4eb1-862b-3aba6e730e22');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-ff94d4cf-d8f4-4b3f-9157-5859b8ef69f6\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-ff94d4cf-d8f4-4b3f-9157-5859b8ef69f6')\"\n",
" title=\"Suggest charts.\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-ff94d4cf-d8f4-4b3f-9157-5859b8ef69f6 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
" </div>\n",
" </div>\n"
]
},
"metadata": {},
"execution_count": 90
}
],
"source": [
"data = pd.read_csv(\"amazon_rating.csv\")\n",
"data.head()"
]
},
{
"cell_type": "markdown",
"id": "aadd4f88",
"metadata": {
"id": "aadd4f88"
},
"source": [
"<a name='1.1.2'></a>\n",
"#### 1.1.2 Fusionner les colonnes title et text en une seule colonne (1 point)\n",
"\n",
"Afin de faciliter la tâche pour le reste du TP, nous allons fusionner ces deux colonnes afin que nous n'ayons qu'un seul texte à considérer lors de la vectorisation.\n",
"\n",
"Afin de s'assurer de l'intégrité des textes, fusionnez-les à l'aide d'un espace. Par exemple, une évaluation ayant le titre \"Five Stars\" et le commentaire \"good as any name brand\" aura comme texte final \"Five Stars good as any name brand\".\n",
"\n",
"Stockez le résultat dans la colonne \"text\" et supprimez la colonne \"title\"."
]
},
{
"cell_type": "code",
"execution_count": 91,
"id": "b5b627c4",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 424
},
"id": "b5b627c4",
"outputId": "ad70ac56-d1d6-416e-b64a-5850c77451d0"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" text rating\n",
"0 Five Stars good as any name brand 5\n",
"1 Did The Job Ordered on accident when I had sea... 3\n",
"2 Great product I was looking for something to r... 5\n",
"3 Leaking Acid EVERYEWHERE!! After 2nd recharge ... 1\n",
"4 One Star They fail earlier than brand names. I... 1\n",
"... ... ...\n",
"2788 Three Stars Weird but some didn't last long as... 3\n",
"2789 Good for kids but SLOW A good starter tablet, ... 3\n",
"2790 good tablet to star is a God tablet but the ca... 3\n",
"2791 Just decent tablet Not many apps. The first on... 3\n",
"2792 One Star don't last long. Replace batteries in... 1\n",
"\n",
"[2793 rows x 2 columns]"
],
"text/html": [
"\n",
" <div id=\"df-637bc0dd-5020-47f9-9b7e-7d78445d5021\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>text</th>\n",
" <th>rating</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Five Stars good as any name brand</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Did The Job Ordered on accident when I had sea...</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Great product I was looking for something to r...</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Leaking Acid EVERYEWHERE!! After 2nd recharge ...</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>One Star They fail earlier than brand names. I...</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2788</th>\n",
" <td>Three Stars Weird but some didn't last long as...</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2789</th>\n",
" <td>Good for kids but SLOW A good starter tablet, ...</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2790</th>\n",
" <td>good tablet to star is a God tablet but the ca...</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2791</th>\n",
" <td>Just decent tablet Not many apps. The first on...</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2792</th>\n",
" <td>One Star don't last long. Replace batteries in...</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>2793 rows × 2 columns</p>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-637bc0dd-5020-47f9-9b7e-7d78445d5021')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-637bc0dd-5020-47f9-9b7e-7d78445d5021 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-637bc0dd-5020-47f9-9b7e-7d78445d5021');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-a2ef8b67-c6a6-49b0-8272-41e8bd41fc72\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-a2ef8b67-c6a6-49b0-8272-41e8bd41fc72')\"\n",
" title=\"Suggest charts.\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-a2ef8b67-c6a6-49b0-8272-41e8bd41fc72 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
" </div>\n",
" </div>\n"
]
},
"metadata": {},
"execution_count": 91
}
],
"source": [
"data[\"text\"] = data[\"title\"] + \" \" + data[\"text\"]\n",
"data.head()\n",
"data.drop(\"title\", axis=1)"
]
},
{
"cell_type": "markdown",
"id": "6fbcbf38",
"metadata": {
"id": "6fbcbf38"
},
"source": [
"<a name='1.2'></a>\n",
"### 1.2 Prétraitement des données (4 points)\n",
"\n",
"En utilisant la librairie nltk, implémentez la fonction suivante qui :\n",
"\n",
"- Enlève les majuscules.\n",
"- Enlève les caractères de ponctuation.\n",
"- Segmente la séquence en entrée en une liste de jetons (tokenization).\n",
"- Enlève les \"stopwords\"\n",
"- Effectue la racinisation.\n",
"- Retourne l'ensemble des jetons de la séquence\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 92,
"id": "d51e35a2",
"metadata": {
"id": "d51e35a2",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"outputId": "30263c74-f47f-40a1-ab85-7aad0e8e6c7b"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"['exampl', 'sentenc', 'text', 'preprocess']\n"
]
}
],
"source": [
"import nltk\n",
"from nltk.corpus import stopwords\n",
"from nltk.tokenize import word_tokenize\n",
"import string\n",
"import re\n",
"\n",
"stop_words = set(stopwords.words('english'))\n",
"stemmer = nltk.stem.porter.PorterStemmer()\n",
"\n",
"def preprocess(sentence):\n",
" \"\"\"\n",
" Fonction qui transforme une chaine de caractère en liste de jetons.\n",
" Les pre-traitements à implémenter sont:\n",
" 1. Enlever les majuscules\n",
" 2. Enlever les caractères de ponctuations\n",
" 3. Séparer la chaine de caractères en une liste de jetons (tokenization)\n",
" 4. Enlever les stopwords\n",
" 5. Stemming (racinisation)\n",
"\n",
" :param sentence: une chaine de caractère\n",
" :return: la liste de jetons\n",
" \"\"\"\n",
"\n",
" # 1. Enlever les majuscules\n",
" sentence = sentence.lower()\n",
"\n",
" # 2. Enlever les caractères de ponctuation\n",
" sentence = re.sub(f\"[{string.punctuation}]\", '', sentence)\n",
"\n",
" # 3. Séparer la chaine de caractères en une liste de jetons (tokenization)\n",
" tokens = word_tokenize(sentence)\n",
"\n",
" # 4. Enlever les stopwords\n",
" tokens = [token for token in tokens if token not in stop_words]\n",
"\n",
" # 5. Stemming (racinisation)\n",
" tokens = [stemmer.stem(token) for token in tokens]\n",
"\n",
" return tokens\n",
"\n",
"# Example usage:\n",
"input_sentence = \"This is an example sentence for text preprocessing.\"\n",
"preprocessed_tokens = preprocess(input_sentence)\n",
"print(preprocessed_tokens)\n"
]
},
{
"cell_type": "code",
"execution_count": 93,
"id": "ea36a64b",
"metadata": {
"id": "ea36a64b"
},
"outputs": [],
"source": [
"\"\"\"\n",
"NE PAS MODIFIER\n",
"\n",
"Le code suivant appliquera votre fonction sur tous les exemples. Il gardera aussi une version originale pour une analyse future.\n",
"\"\"\"\n",
"\n",
"data[\"text_original\"] = data[\"text\"]\n",
"data[\"text\"] = data[\"text\"].apply(preprocess)\n"
]
},
{
"cell_type": "markdown",
"id": "a1c0e19b",
"metadata": {
"id": "a1c0e19b"
},
"source": [
"<a name='1.3'></a>\n",
"### 1.3 Visualisation des données (15 points)\n",
"\n",
"**Utilisez la bibliothèque matplotlib pour les graphiques.** Vous pouvez utiliser n'importe quelle classe de base de Python, par exemple collections.Counter, qui sera utile pour l'affichage des jetons."
]
},
{
"cell_type": "markdown",
"id": "731d61c8",
"metadata": {
"id": "731d61c8"
},
"source": [
"# La colonne \"rating\" contient le nombre d'étoiles associé à l'évaluation d'un utilisateur. Le nombre d'étoiles varie entre 1 et 5.\n",
"\n",
"Afin de simplifier la tâche de classification, nous avons enlevé les commentaires ayant 2 et 4 étoiles du jeu de données. Cela signifie qu'il y a trois catégories de commentaires, c'est\n",
"\n",
"```\n",
"# Ce texte est au format code\n",
"```\n",
"\n",
"-à-dire ceux ayant 1, 3 ou 5 étoiles.\n",
"\n",
"Affichez dans un graphique :\n",
"\n",
"- Le nombre d'exemples présents dans le jeu de données par catégorie.\n",
"- La quantité moyenne de jetons par exemple selon la catégorie.\n"
]
},
{
"cell_type": "code",
"source": [
"data.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "mWKnumERjFMx",
"outputId": "b7fc89bd-f7ff-4682-bab6-d1b5253e64a6"
},
"id": "mWKnumERjFMx",
"execution_count": 94,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" title \\\n",
"0 Five Stars \n",
"1 Did The Job \n",
"2 Great product \n",
"3 Leaking Acid EVERYEWHERE!! \n",
"4 One Star \n",
"\n",
" text rating \\\n",
"0 [five, star, good, name, brand] 5 \n",
"1 [job, order, accid, search, recharg, batteri, ... 3 \n",
"2 [great, product, look, someth, read, fit, bill... 5 \n",
"3 [leak, acid, everyewher, 2nd, recharg, use, 3,... 1 \n",
"4 [one, star, fail, earlier, brand, name, assum,... 1 \n",
"\n",
" text_original \n",
"0 Five Stars good as any name brand \n",
"1 Did The Job Ordered on accident when I had sea... \n",
"2 Great product I was looking for something to r... \n",
"3 Leaking Acid EVERYEWHERE!! After 2nd recharge ... \n",
"4 One Star They fail earlier than brand names. I... "
],
"text/html": [
"\n",
" <div id=\"df-359311c0-aed8-489e-8d5c-78cf6fc9cf3e\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>title</th>\n",
" <th>text</th>\n",
" <th>rating</th>\n",
" <th>text_original</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Five Stars</td>\n",
" <td>[five, star, good, name, brand]</td>\n",
" <td>5</td>\n",
" <td>Five Stars good as any name brand</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Did The Job</td>\n",
" <td>[job, order, accid, search, recharg, batteri, ...</td>\n",
" <td>3</td>\n",
" <td>Did The Job Ordered on accident when I had sea...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Great product</td>\n",
" <td>[great, product, look, someth, read, fit, bill...</td>\n",
" <td>5</td>\n",
" <td>Great product I was looking for something to r...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Leaking Acid EVERYEWHERE!!</td>\n",
" <td>[leak, acid, everyewher, 2nd, recharg, use, 3,...</td>\n",
" <td>1</td>\n",
" <td>Leaking Acid EVERYEWHERE!! After 2nd recharge ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>One Star</td>\n",
" <td>[one, star, fail, earlier, brand, name, assum,...</td>\n",
" <td>1</td>\n",
" <td>One Star They fail earlier than brand names. I...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-359311c0-aed8-489e-8d5c-78cf6fc9cf3e')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-359311c0-aed8-489e-8d5c-78cf6fc9cf3e button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-359311c0-aed8-489e-8d5c-78cf6fc9cf3e');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-f496cfd0-5df0-46ef-82f6-7a0f9b2a66c4\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-f496cfd0-5df0-46ef-82f6-7a0f9b2a66c4')\"\n",
" title=\"Suggest charts.\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-f496cfd0-5df0-46ef-82f6-7a0f9b2a66c4 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
" </div>\n",
" </div>\n"
]
},
"metadata": {},
"execution_count": 94
}
]
},
{
"cell_type": "markdown",
"id": "6e870b33",
"metadata": {
"id": "6e870b33"
},
"source": [
"<a name='1.3.1'></a>\n",
"#### 1.3.1 Afficher dans un graphique le nombre d'exemples présents dans le jeu de données pour chaque catégorie (3 points)"
]
},
{
"cell_type": "code",
"execution_count": 95,
"id": "239b4dfa",
"metadata": {
"scrolled": true,
"id": "239b4dfa",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 715
},
"outputId": "bf4c095a-97b2-46e2-b0cd-811155643a15"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Nombre d'exemples par catégorie :\n",
"3 965\n",
"5 933\n",
"1 895\n",
"Name: rating, dtype: int64\n",
"\n",
"Quantité moyenne de jetons par exemple selon la catégorie :\n",
"rating\n",
"1 23.383240\n",
"3 18.403109\n",
"5 14.825295\n",
"Name: token_count, dtype: float64\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1000x500 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAHqCAYAAAAZLi26AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABN2UlEQVR4nO3deVhVVf/+8fsAMogCjiCFiGMO5PikOGailJY5lPpkikNahloOmZZTlpJmZs7aoGb5NKpl5ZRTqeSAYs6ZQ06gKQIOyXT27w9/nK9H0DjGFoH367rOdXXWWnufz97iyZu199oWwzAMAQAAAACAHOeU2wUAAAAAAJBfEboBAAAAADAJoRsAAAAAAJMQugEAAAAAMAmhGwAAAAAAkxC6AQAAAAAwCaEbAAAAAACTELoBAAAAADAJoRsAAAAAAJMQugEAAPKI7777ThMnTlRqampulwIAyCZCNwDgntajRw8VKVIkt8vI5Pjx47JYLFqwYEFul5Krxo4dK4vFkttlFAg7duxQly5dVLFiRRUqVCjX6liwYIEsFouOHz+eazUAQF5C6AYA2P4R7e7urtOnT2fqf/jhh1WjRo1cqCxvGTt2rMqVK5fbZSCPWbx4saZOnXrbMQkJCerUqZPefvttdezY8e4UBgDIEYRuAIBNcnKy3n777dwuAyhQshO6Y2JiNHLkSA0cOPDuFHUb3bp1099//63AwMDcLgUA8gRCNwDAplatWvrggw905syZ3C4lR6SlpSklJSW3y0AedK/97Dz88MPq1atXrtZw5coVSZKzs7Pc3d25rQAAsonQDQCwee2115Senp6t2e60tDS9+eabqlChgtzc3FSuXDm99tprSk5OthtXrlw5Pf7449qwYYPq1asnDw8PBQcHa8OGDZKkJUuWKDg4WO7u7qpbt6527dqV5ecdPXpUYWFh8vT0lL+/v8aNGyfDMGz9GfdYT548WVOnTrXVtX//fknSwYMH9dRTT6l48eJyd3dXvXr19N1332XrvCQkJKhHjx7y9vaWj4+PwsPDlZCQkK1tJenTTz9V3bp15eHhoeLFi6tLly46efKkrX/+/PmyWCz6+OOP7babMGGCLBaLfvzxR1tbdo4j43aBTZs2aeDAgSpVqpR8fHz0/PPPKyUlRQkJCerevbuKFSumYsWKadiwYbc8l++9954CAwPl4eGhZs2aae/evTlyzJJ0+PBhdezYUX5+fnJ3d9f999+vLl26KDEx8bb7zrjdITo6Wg0bNpSHh4eCgoI0Z84cu3EpKSkaPXq06tatK29vb3l6eqpJkyZav3693bh/+tm53TE+9NBDKly4sIoVK6amTZtq9erVtv5vv/1Wbdq0kb+/v9zc3FShQgW9+eabSk9PtzuWH374QX/++acsFossFovdLQrJyckaM2aMKlasKDc3NwUEBGjYsGGZ/p79/fffGjhwoEqWLKmiRYuqbdu2On36tCwWi8aOHWs3dteuXXrsscfk5eWlIkWKqEWLFvr111/txmT8DG3cuFEvvviiSpcurfvvv9+u7+Z7ulesWKEmTZrI09NTRYsWVZs2bbRv377bnkMAKAhccrsAAMC9IygoSN27d9cHH3yg4cOHy9/f/5Zjn3vuOS1cuFBPPfWUhgwZoq1btyoyMlIHDhzQ0qVL7cb+8ccfeuaZZ/T888/r2Wef1eTJk/XEE09ozpw5eu211/Tiiy9KkiIjI9WpUycdOnRITk7/93vh9PR0Pfroo2rQoIEmTZqklStXasyYMUpLS9O4cePsPmv+/Pm6du2a+vbtKzc3NxUvXlz79u1To0aNdN9992n48OHy9PTUl19+qXbt2umbb75R+/btb3mchmHoySef1KZNm/TCCy+oatWqWrp0qcLDw7N1TsePH69Ro0apU6dOeu655/TXX39p+vTpatq0qXbt2iUfHx/17NlTS5Ys0eDBg9WyZUsFBARoz549euONN9S7d2+1bt1akhw+jgEDBsjPz09vvPGGfv31V82bN08+Pj7asmWLypYtqwkTJujHH3/UO++8oxo1aqh79+5223/yySe6dOmSIiIidO3aNb3//vt65JFHtGfPHvn6+v6rY05JSVFYWJiSk5NtdZ4+fVrff/+9EhIS5O3tfdvzevHiRbVu3VqdOnXSf//7X3355Zfq16+fXF1dbTPCSUlJ+vDDD/Xf//5Xffr00aVLl/TRRx8pLCxM27ZtU61atez2mdXPzq288cYbGjt2rBo2bKhx48bJ1dVVW7du1bp169SqVStJ18NpkSJFNHjwYBUpUkTr1q3T6NGjlZSUpHfeeUeS9PrrrysxMVGnTp3Se++9J0m2hQOtVqvatm2rTZs2qW/fvqpatar27Nmj9957T7///ruWLVtmq6dHjx768ssv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Jzk8033t2jV5e3vr9ddfz9QXGxurMmXK5EhhAAAAAADkdQ7PdNepU0cxMTGZ2r/55hs9+OCDOVETAAAAAAD5gsOh++GHH1aDBg00ceJESddXM+/Ro4e6deum1157LccLBAAAAAAgr3L48vJZs2apTZs2eu655/T9998rNjZWRYoU0bZt21SjRg0zagQAAAAAIE9yOHRL0mOPPaYOHTpo9uzZcnFx0fLlywncAAAAAADcxOHLy48cOaKQkBB9//33WrVqlYYNG6a2bdtq2LBhSk1NNaNGAAAAAADyJIdDd61atRQUFKTdu3erZcuWeuutt7R+/XotWbJEDz30kBk1AgAAAACQJzkcumfNmqXPP/9cPj4+traGDRtq165dqlOnTk7WBgAAAABAnuZw6O7WrZskKSUlRYcOHVJaWpokqWjRovroo49ytjoAAAAAAPIwh0P333//rd69e6tw4cKqXr26Tpw4IUkaMGCA7TFiAAAAAADgDkL38OHDtXv3bm3YsEHu7u629tDQUH3++ec5WhwAAAAAAHmZw48MW7Zsmb744gs1aNBAFovF1l69enUdOXIkR4sDAAAAACAvc3im+6+//lLp0qUztV+5csUuhAMAAAAAUNA5HLrr1aunH374wfY+I2h/+OGHCgkJybnKAAAAAADI4xy+vHzChAl67LHHtH//fqWlpen999/X/v37tWXLFm3cuNGMGgEAAAAAyJMcnulu3LixYmJilJaWpuDgYK1evVqlS5dWVFSU6tata0aNAAAAAADkSQ7PdEtShQoV9MEHH+R0LQAAAAAA5CsOz3QDAAAAAIDsyfZMt5OTkywWiwzDkMViUXp6upl1AQAAAACQ52U7dB87dszMOgAAAAAAyHeyHboDAwPNrAMAAAAAgHwnW6H7t99+y/YOH3zwwTsuBgAAAACA/CRbobtWrVp293PfDvd6AwAAAABwXbZWLz927JiOHj2qY8eO6ZtvvlFQUJBmzZqlXbt2adeuXZo1a5YqVKigb775xux6AQAAAADIM7I1033j/dxPP/20pk2bptatW9vaHnzwQQUEBGjUqFFq165djhcJAAAAAEBe5PBzuvfs2aOgoKBM7UFBQdq/f3+OFAUAAAAAQH7gcOiuWrWqIiMjlZKSYmtLSUlRZGSkqlatmqPFAQAAAACQl2X7kWEZ5syZoyeeeEL333+/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OnWqvLy8FBsbq9jYWA0dOlSS1L9/f0VFRenzzz/Xb7/9pqefflqPPvqoDh8+LEnavHmzXnjhBb300kuKiYlRy5YtNX78eLs6li5dqpdeeklDhgzR3r179fzzz6tnz55av3693bixY8eqffv22rNnj3r16pXpeI4cOaJHH31UHTt21G+//aYvvvhCmzZtUv/+/W95jjZt2qTChQuratWqtxxjtVr1zTff6OLFi3Yz+ZcuXVJ4eLg2bdqkX3/9VZUqVVLr1q116dIlSddDuSTNnz9fsbGxtvdZWb9+vY4cOaL169dr4cKFWrBggRYsWGDr7969u86cOaMNGzbom2++0bx583Tu3LlM+3nooYf0yy+/3PJzAAC4JQMAADhk69athiRjyZIlDm/71VdfGSVKlLC9nz9/vuHt7W035s8//zScnZ2N06dP27W3aNHCGDFihGEYhtG5c2ejTZs2dv1du3a121fDhg2NPn362I15+umnjdatW9veSzJefvlluzHr1683JBkXL140DMMwevfubfTt29duzC+//GI4OTkZf//9d5bH+d577xnly5fP1B4YGGi4uroanp6ehouLiyHJKF68uHH48OEs92MYhpGenm4ULVrUWL58uV3dS5cutRs3ZswYo2bNmrb34eHhRmBgoJGWlmZ3/J07dzYMwzAOHDhgSDK2b99u6z98+LAhyXjvvffs9v3+++8b5cqVu2WNAADcCjPdAAA4yDCMbI/96aef1KJFC913330qWrSounXrpgsXLujq1au33GbPnj1KT09X5cqVVaRIEdtr48aNOnLkiCTp0KFDeuihh+y2u/n9gQMH1KhRI7u2Ro0aZXr0WL169W57DLt379aCBQvsagkLC5PVatWxY8ey3Obvv/+Wu7t7ln2vvPKKYmJitG7dOtWvX1/vvfeeKlasaOs/e/as+vTpo0qVKsnb21teXl66fPmyTpw4cds6s1K9enU5Ozvb3pcpU8Y2k33o0CG5uLioTp06tv6KFSuqWLFimfbj4eFx2z8zAABuxSW3CwAAIK+pVKmSLBaLDh48eNtxx48f1+OPP65+/fpp/PjxKl68uDZt2qTevXsrJSVFhQsXznK7y5cvy9nZWdHR0XaBUbq+WFhOy+oS+Zvref755zVw4MBMfWXLls1ym5IlS+rixYu37KtYsaIqVqyor776SsHBwapXr56qVasmSQoPD9eFCxf0/vvvKzAwUG5ubgoJCVFKSoqDRyYVKlTI7r3FYpHVanV4P/Hx8SpVqpTD2wEAwEw3AAAOKl68uMLCwjRz5swsFxPLWIAsOjpaVqtV7777rho0aKDKlSvrzJkzdmNdXV2Vnp5u11a7dm2lp6fr3LlztnCa8fLz85MkValSJdO9zDe/r1q1qjZv3mzXtnnzZlu4za46depo//79mWqpWLHiLVdVr127tuLi4m4ZvDMEBASoc+fOGjFihF2NAwcOVOvWrVW9enW5ubnp/PnzdtsVKlQo03lzVJUqVZSWlqZdu3bZ2v74448sa967d69q1679rz4PAFAwEboBALgDM2fOVHp6uh566CF98803Onz4sA4cOKBp06YpJCRE0vVLlVNTUzV9+nQdPXpUixYt0pw5c+z2U65cOV2+fFlr167V+fPndfXqVVWuXFldu3ZV9+7dtWTJEh07dkzbtm1TZGSkfvjhB0nSgAED9OOPP2rKlCk6fPiw5s6dqxUrVtg95uuVV17RggULNHv2bB0+fFhTpkzRkiVLbIu1Zderr76qLVu2qH///oqJidHhw4f17bff3nYhtdq1a6tkyZKZQn9WXnrpJS1fvlw7duyQdP1KgkWLFunAgQPaunWrunbtKg8Pj0znbe3atdkK9rfywAMPKDQ0VH379tW2bdu0a9cu9e3bVx4eHpkel/bLL7+oVatWd/Q5AICCjdANAMAdKF++vHbu3KnmzZtryJAhqlGjhlq2bKm1a9dq9uzZkqSaNWtqypQpmjhxomrUqKHPPvtMkZGRdvtp2LChXnjhBXXu3FmlSpXSpEmTJF1fmbt79+4aMmSIqlSponbt2mn79u22y7kbNWqkOXPmaMqUKapZs6ZWrlypQYMG2d1H3a5dO73//vuaPHmyqlevrrlz52r+/Pl6+OGHHTrWBx98UBs3btTvv/+uJk2aqHbt2ho9erT8/f1vuY2zs7N69uypzz777B/3X61aNbVq1UqjR4+WJH300Ue6ePGi6tSpo27dumngwIEqXbq03Tbvvvuu1qxZo4CAgH81A/3JJ5/I19dXTZs2Vfv27dWnTx8VLVrU7jxGRUUpMTFRTz311B1/DgCg4LIYjqwGAwAA7ll9+vTRwYMH75lHW8XFxal69erauXOnAgMDc7ucbDl16pQCAgJsC+BJUufOnVWzZk299tpruVwdACAvYiE1AADyqMmTJ6tly5by9PTUihUrtHDhQs2aNSu3y7Lx8/PTRx99pBMnTtyzoXvdunW6fPmygoODFRsbq2HDhqlcuXJq2rSpJCklJUXBwcEaNGhQLlcKAMirmOkGACCP6tSpkzZs2KBLly6pfPnyGjBggF544YXcLitPWbVqlYYMGaKjR4+qaNGiatiwoaZOnXrP/pIAAJD3ELoBAAAAADAJC6kBAAAAAGASQjcAAAAAACYhdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXQDAAAAAGASQjcAAAAAACYhdAMAAAAAYJL/B3C93LyxMSP1AAAAAElFTkSuQmCC\n"
},
"metadata": {}
}
],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Supposons que vous avez un DataFrame appelé 'data' avec une colonne 'rating'\n",
"# et une colonne 'text' contenant le texte de chaque exemple.\n",
"\n",
"# Compter le nombre d'exemples par catégorie (rating)\n",
"count_by_category = data['rating'].value_counts()\n",
"\n",
"# Calculer la quantité moyenne de jetons par exemple selon la catégorie\n",
"data['token_count'] = data['text'].apply(lambda x: len(x)) # Compte des jetons dans chaque exemple\n",
"average_tokens_by_category = data.groupby('rating')['token_count'].mean()\n",
"\n",
"# Afficher les résultats\n",
"print(\"Nombre d'exemples par catégorie :\")\n",
"print(count_by_category)\n",
"print(\"\\nQuantité moyenne de jetons par exemple selon la catégorie :\")\n",
"print(average_tokens_by_category)\n",
"\n",
"\n",
"plt.figure(figsize=(10, 5))\n",
"count_by_category.plot(kind='bar', color='skyblue')\n",
"plt.title('Nombre d\\'exemples par catégorie')\n",
"plt.xlabel('Catégorie (Rating)')\n",
"plt.ylabel('Nombre d\\'exemples')\n",
"plt.tight_layout()"
]
},
{
"cell_type": "markdown",
"id": "c244aa72",
"metadata": {
"id": "c244aa72"
},
"source": [
"<a name='1.3.2'></a>\n",
"#### 1.3.2 Afficher dans un graphique le nombre moyen de jetons dans les exemples de chaque catégorie (4 points)"
]
},
{
"cell_type": "code",
"execution_count": 96,
"id": "663f798a",
"metadata": {
"scrolled": true,
"id": "663f798a",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 507
},
"outputId": "952f0a64-7525-4770-efa6-9bb0df11581d"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1000x500 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAHqCAYAAAAZLi26AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABLsklEQVR4nO3dd3QU5cPF8buBNEIIhBZKTEICSAldkCYgIEVBihR/0hEsFKWIYKMoUlRAulhoiqiAKBZAIKB06aCA9CKdQOgJZJ/3D9+sLEkgCxk2id/POXuO+8zs7J3JZs1lms0YYwQAAAAAAFKdh7sDAAAAAACQUVG6AQAAAACwCKUbAAAAAACLULoBAAAAALAIpRsAAAAAAItQugEAAAAAsAilGwAAAAAAi1C6AQAAAACwCKUbAAAAAACLULoBAAD+47Zt26ZBgwbpyJEj7o4CABkOpRsA/uM6dOigrFmzujtGIgcPHpTNZtO0adPcHcWtBg0aJJvN5u4YyMBiYmLUtGlTnTt3TsHBwW7Lwe88gIyK0g0A98G0adNks9nk4+Ojv//+O9H0mjVrqmTJkm5Ilr4MGjRIoaGh7o4BpAurV6/WoEGDdP78+dvO17FjR5UtW1ajR4++P8EA4D+G0g0A91FsbKyGDx/u7hgA/gNWr16twYMH37Z0Hzx4UBUqVNDnn38uDw/3/lkYEhKiq1evqm3btm7NAQCpjdINAPdRmTJl9PHHH+vYsWPujpIqbty4obi4OHfHANINY4yuXr3q7hgOoaGheu211+Tj4+O2DAnfIwlHA2XKlMltWQDACpRuALiPXnvtNcXHx6dob/eNGzf09ttvKzw8XN7e3o4/jmNjY53mCw0N1RNPPKHly5erQoUK8vX1VWRkpJYvXy5JmjdvniIjI+Xj46Py5ctr8+bNSb7f/v37Va9ePfn5+Sl//vwaMmSIjDGO6QnnW77//vsaM2aMI9eff/4pSdq1a5eeeuopBQYGysfHRxUqVND333+fou1y/vx5dejQQQEBAcqePbvat29/x0Nib/b555+rfPny8vX1VWBgoFq3bu10QaipU6fKZrPps88+c3rdu+++K5vNpp9++skxlpL1SDhdYOXKlerZs6dy586t7Nmz67nnnlNcXJzOnz+vdu3aKUeOHMqRI4f69euX7LYcPXq0QkJC5Ovrqxo1amjHjh2pss6StGfPHjVv3lxBQUHy8fFRwYIF1bp1a8XExNx22QmnO2zbtk01atRQlixZFBERoTlz5kiSVqxYoUqVKsnX11dFixbVkiVLEi1j8+bNatCggbJly6asWbOqdu3aWrt2rWP6/v37ZbPZkjykefXq1bLZbPryyy8dY3///bc6deqkvHnzytvbWyVKlEj081y+fLlsNpu+/vprDR06VAULFpSPj49q166tvXv33nGbJpw/v2vXLrVs2VLZsmVTzpw59dJLL+natWtO806dOlWPPvqo8uTJI29vbxUvXlyTJk1KtMyE389FixY5fj8/+uij2+ZYt26dGjZsqBw5csjPz0+lSpXShx9+6Ji+bds2dejQQYUKFZKPj4+CgoLUqVMnnT171mldXnnlFUlSWFiYbDabbDabDh486JgnJZ8hSZowYYIKFSokX19fVaxYUb/99ptq1qypmjVrOs136tQpde7cWXnz5pWPj49Kly6t6dOnO81zu++R5M7pvpfvFgBIEwwAwHJTp041kszvv/9uOnXqZHx8fMzff//tmF6jRg1TokQJp9e0b9/eSDJPPfWUmTBhgmnXrp2RZJo0aeI0X0hIiClatKjJly+fGTRokBk9erQpUKCAyZo1q/n888/NAw88YIYPH26GDx9uAgICTEREhImPj3d6Hx8fH1O4cGHTtm1bM378ePPEE08YSebNN990zHfgwAEjyRQvXtwUKlTIDB8+3IwePdocOnTI7NixwwQEBJjixYubESNGmPHjx5tHHnnE2Gw2M2/evNtuG7vdbh555BHj4eFhXnzxRTNu3Djz6KOPmlKlShlJZurUqY55Bw4caEJCQpxe/8477xibzWZatWplJk6caAYPHmxy5cplQkNDzblz5xzzPfHEEyYgIMAcPnzYGGPMtm3bjJeXl+ncubNjnpSuR8LPs0yZMqZ+/fpmwoQJpm3btkaS6devn6lWrZr53//+ZyZOnOjYltOnT0+0LSMjI01oaKgZMWKEGTx4sAkMDDS5c+c2J06ccFrnW/93nZJ1jo2NNWFhYSZ//vzmnXfeMZ988okZPHiweeihh8zBgwdv+zOpUaOGyZ8/vwkODjavvPKKGTdunClevLjJlCmTmT17tgkKCjKDBg0yY8aMMQUKFDABAQHmwoULTtvRz8/P5MuXz7z99ttm+PDhJiwszHh7e5u1a9c65qta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KaJ9+/Ypc+bMWrt2rcLCwtwdFf9RlG7ARd9///1tp+/fv199+vShdANI86pUqaJHH31U77zzjmbPnq0XX3xRL7zwgoYOHSpJGjBggDZu3KjFixe7OSkAJM/Dw0MnTpxQnjx51KZNGx04cEA//fSTAgICdOnSJTVt2lS5c+fWrFmz3B0V/1GUbsBFHh4estlsut2vjs1mo3QDSPMCAgK0ceNGRUREyG63y9vbW+vXr1fZsmUlSTt27FCdOnV04sQJNycFgOTdXLrDw8M1efJk1a1b1zF99erVat26tQ4fPuzGlPgv45xuwEX58uXTvHnzZLfbk3xs2rTJ3REBIMVsNpukf/5o9fHxUUBAgGOav7+/YmJi3BUNAFIs4bvs2rVrypcvn9O0AgUK6PTp0+6IBUiidAMuK1++vDZu3Jjs9DvtBQeAtCI0NFR79uxxPF+zZo0eeOABx/PDhw8n+uMVANKi2rVrq1y5crpw4YJ2797tNO3QoUPKmTOnm5IBUmZ3BwDSm1deeUWXL19OdnpERISioqLuYyIAuDsvvPCC06kwJUuWdJr+888/cxE1AGnewIEDnZ5nzZrV6fmCBQtUvXr1+xkJcMI53QAAAAAAWITDywEAAAAAsAilGwAAAAAAi1C6AQAAAACwCKUbAAA3iouL07vvvqudO3e6OwoAALAApRsAADfq06ePtm/frgcffPC+vN/y5ctls9l0/vz5e17WI488olmzZt17qBQYNGiQypQpk6rLjIuLU2hoqDZs2JCqywUA4GaUbgAAknDixAn16NFDhQoVkre3t4KDg9WoUSMtXbo0xcuYNm2asmfPnuz0r7/+Wn/88YemT58um82WCqnvrEqVKjp+/LgCAgLuaTnff/+9Tp48qdatWzvGQkNDZbPZZLPZlCVLFkVGRuqTTz5xedk2m03z5893Guvbt69L2z4lvLy81LdvX7366qupulwAAG5G6QYA4BYHDx5U+fLltWzZMr333nvavn27Fi5cqFq1aqlbt26p9j4tW7bUsmXL5OXllWrLvJ3r16/Ly8tLQUFB91zyx44dq44dO8rDw/lPiSFDhuj48ePasWOH2rRpoy5duujnn3++p/eS/rnvbs6cOe95Obd65plntHLlSv3xxx+pvmwAACRKNwAAibz44ouy2Wxav369mjdvriJFiqhEiRLq3bu31q5d65hv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LQoVKqRNmzapVq1a6tOnj0qWLKm6detq6dKlmjRpkiSpdOnSGjVqlEaMGKGSJUvqiy++0LBhw5yWU6VKFT3//PNq1aqVcufOrZEjR0r658rc7dq1U58+fVS0aFE1adJEv//+u+Nw7qpVq2ry5MkaNWqUSpcurYULF6pXr15O51E3adJEH374od5//32VKFFCH330kaZOnaqaNWu6tK6lSpXSihUr9Ndff6l69eoqW7as3nrrLeXPnz/Z12TKlEkdO3bUF198ccflFy9eXI899pjeeustSdKnn36qc+fOqVy5cmrbtq169uypPHnyOL3mgw8+0C+//KLg4OB72gM9Y8YM5c2bV4888oiaNm2qLl26yN/f32k7rlmzRjExMXrqqafu+n0AALgdm3HlijEAAMAtunTpol27dqWZW1udOHFCJUqU0KZNmxQSEuLuOCly9OhRBQcHOy6AJ0mtWrVS6dKl9dprr7k5HQAgo+JCagAApEHvv/++6tatKz8/P/3888+aPn26Jk6c6O5YDkFBQfr00091+PDhNFu6ly1bpkuXLikyMlLHjx9Xv379FBoaqkceeUSSFBcXp8jISPXq1cvNSQEAGRl7ugEASINatmyp5cuX6+LFiypUqJB69Oih559/3t2x0pVFixapT58+2r9/v/z9/VWlShWNGTMmzf4jAQAgY6J0AwAAAABgES6kBgAAAACARSjdAAAAAABYhNINAAAAAIBFKN0AAAAAAFiE0g0AAAAAgEUo3QAAAAAAWITSDQAAAACARSjdAAAAAABYhNINAAAAAIBF/g/4sYwoF4ESJgAAAABJRU5ErkJggg==\n"
},
"metadata": {}
}
],
"source": [
"plt.figure(figsize=(10, 5))\n",
"average_tokens_by_category.plot(kind='bar', color='skyblue')\n",
"plt.title('Nombre d\\'exemples moyen par catégorie')\n",
"plt.xlabel('Catégorie (Rating)')\n",
"plt.ylabel('Nombre d\\'exemples moyen')\n",
"plt.tight_layout()"
]
},
{
"cell_type": "markdown",
"id": "e6650c0f",
"metadata": {
"id": "e6650c0f"
},
"source": [
"<a name='1.3.3'></a>\n",
"#### 1.3.3 Afficher en texte les top 10 des jetons les plus fréquents par catégorie (4 points)"
]
},
{
"cell_type": "markdown",
"id": "86ff8a3f",
"metadata": {
"id": "86ff8a3f"
},
"source": [
"\n",
"Affichez en texte les 10 jetons les plus fréquents selon la catégorie.\n"
]
},
{
"cell_type": "code",
"execution_count": 97,
"id": "0befd5a8",
"metadata": {
"id": "0befd5a8",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"outputId": "eb2cb201-e742-4703-b4da-39ec6dcf5117"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{5: ['great',\n",
" 'tablet',\n",
" 'batteri',\n",
" 'love',\n",
" 'good',\n",
" 'price',\n",
" 'use',\n",
" 'star',\n",
" 'five',\n",
" 'work'],\n",
" 3: ['batteri',\n",
" 'tablet',\n",
" 'good',\n",
" 'use',\n",
" 'last',\n",
" 'great',\n",
" 'price',\n",
" 'three',\n",
" 'star',\n",
" 'long'],\n",
" 1: ['batteri',\n",
" 'last',\n",
" 'one',\n",
" 'use',\n",
" 'amazon',\n",
" 'work',\n",
" 'buy',\n",
" 'dont',\n",
" 'star',\n",
" 'purchas']}"
]
},
"metadata": {},
"execution_count": 97
}
],
"source": [
"from collections import Counter\n",
"\n",
"def most_common(df, col):\n",
" categories = df[\"rating\"].unique()\n",
" top_tokens = {}\n",
"\n",
" for rating in categories:\n",
" # Créer un Counter pour chaque catégorie\n",
" counter = Counter()\n",
" for tokens in data[data['rating'] == rating][col]:\n",
" counter.update(tokens)\n",
"\n",
" top_tokens[rating] = [t[0] for t in counter.most_common(10)]\n",
"\n",
" return top_tokens\n",
"\n",
"most_common(data, \"text\")"
]
},
{
"cell_type": "markdown",
"id": "bafb388a",
"metadata": {
"id": "bafb388a"
},
"source": [
"print(counters[0])\n",
"<a name='1.3.4'></a>\n",
"#### 1.3.4 Afficher en texte les top 10 des adjectifs les plus fréquents selon la catégorie (4 points)\n",
"\n",
"Pour cet exercice, vous devrez utiliser la fonction [nlt.pos_tag](https://www.nltk.org/book/ch05.html) et retenir les jetons identifiés comme JJ.\n",
"\n",
"Pour obtenir de bons résultats, le tagger [nltk.pos_tag](https://www.nltk.org/book/ch05.html) doit être exécuté sur le texte original, incluant les stopwords.\n",
"Vous devrez donc partir des évaluations originales. Pour vous simplifier la tâche, utilisez\n",
"le tokenizer *word_tokenize* provenant de nltk.\n",
"\n",
"**Les adjectifs sont les jetons identifiés comme JJ.**"
]
},
{
"cell_type": "code",
"execution_count": 98,
"id": "bc15ac5f",
"metadata": {
"id": "bc15ac5f",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"outputId": "98ee38b3-b552-44b1-a706-1012e495694f"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{5: ['great',\n",
" 'good',\n",
" 'old',\n",
" 'easy',\n",
" 'Good',\n",
" 'other',\n",
" 'last',\n",
" 'Great',\n",
" 'long',\n",
" 'Excellent'],\n",
" 3: ['good',\n",
" 'last',\n",
" 'great',\n",
" 'Good',\n",
" 'other',\n",
" 'old',\n",
" 'little',\n",
" 'slow',\n",
" 'ok',\n",
" 'long'],\n",
" 1: ['last',\n",
" 'good',\n",
" 'dead',\n",
" 'other',\n",
" 'few',\n",
" 'same',\n",
" 'bad',\n",
" 'new',\n",
" 'first',\n",
" 'long']}"
]
},
"metadata": {},
"execution_count": 98
}
],
"source": [
"from nltk.tokenize import word_tokenize\n",
"from nltk import pos_tag\n",
"\n",
"def select_adj(text):\n",
" tokens = word_tokenize(text)\n",
" pos_tags = pos_tag(tokens)\n",
" return [token for token, pos in pos_tags if pos == 'JJ']\n",
"\n",
"data['adj'] = data['text_original'].apply(lambda x: select_adj(x))\n",
"\n",
"data.head()\n",
"\n",
"most_common(data, \"adj\")"
]
},
{
"cell_type": "markdown",
"id": "86de4b1e",
"metadata": {
"id": "86de4b1e"
},
"source": [
"<a name='1.4'></a>\n",
"### 1.4 Diviser les données en ensembles d'entraînement et de test (1 point)\n",
"\n",
"À l'aide de la fonction [train_test_split](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) de SKlearn, séparez les données en ensembles d'entraînement (67% des données) et de test (33% des données). Gardez les deux ensembles dans 2 variables."
]
},
{
"cell_type": "code",
"execution_count": 99,
"id": "0e5a58bc",
"metadata": {
"id": "0e5a58bc",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"outputId": "b00df23a-feff-42cf-dd88-fb3e47cfaf4a"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" title \\\n",
"374 Dead after 3 days \n",
"23 Good First Tablet \n",
"2057 It fits my need perfectly \n",
"336 LEAK ! \n",
"221 easy set up and user friendly \n",
"\n",
" text rating \\\n",
"374 [dead, 3, day, put, 3, day, ago, alreadi, dead... 1 \n",
"23 [good, first, tablet, purchas, sinc, bought, g... 3 \n",
"2057 [fit, need, perfectli, origin, kindl, fire, lo... 5 \n",
"336 [leak, heck, seriou, issu, batteri, put, amazo... 1 \n",
"221 [easi, set, user, friendli, suggest, sale, ass... 5 \n",
"\n",
" text_original token_count \\\n",
"374 Dead after 3 days Just put them in 3 days ago ... 14 \n",
"23 Good First Tablet I purchased this since I bou... 29 \n",
"2057 It fits my need perfectly My original Kindle F... 57 \n",
"336 LEAK ! WHAT THE HECK! I have a SERIOUS issue w... 54 \n",
"221 easy set up and user friendly suggested by the... 11 \n",
"\n",
" adj \n",
"374 [Dead, dead, next] \n",
"23 [Good, slow] \n",
"2057 [original, much, other, old, locked, few, Menial] \n",
"336 [few, bad, few, several, next, right] \n",
"221 [glad] "
],
"text/html": [
"\n",
" <div id=\"df-f6e0d77a-4dff-4046-b43b-ab63cba9b974\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>title</th>\n",
" <th>text</th>\n",
" <th>rating</th>\n",
" <th>text_original</th>\n",
" <th>token_count</th>\n",
" <th>adj</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>374</th>\n",
" <td>Dead after 3 days</td>\n",
" <td>[dead, 3, day, put, 3, day, ago, alreadi, dead...</td>\n",
" <td>1</td>\n",
" <td>Dead after 3 days Just put them in 3 days ago ...</td>\n",
" <td>14</td>\n",
" <td>[Dead, dead, next]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>Good First Tablet</td>\n",
" <td>[good, first, tablet, purchas, sinc, bought, g...</td>\n",
" <td>3</td>\n",
" <td>Good First Tablet I purchased this since I bou...</td>\n",
" <td>29</td>\n",
" <td>[Good, slow]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2057</th>\n",
" <td>It fits my need perfectly</td>\n",
" <td>[fit, need, perfectli, origin, kindl, fire, lo...</td>\n",
" <td>5</td>\n",
" <td>It fits my need perfectly My original Kindle F...</td>\n",
" <td>57</td>\n",
" <td>[original, much, other, old, locked, few, Menial]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>336</th>\n",
" <td>LEAK !</td>\n",
" <td>[leak, heck, seriou, issu, batteri, put, amazo...</td>\n",
" <td>1</td>\n",
" <td>LEAK ! WHAT THE HECK! I have a SERIOUS issue w...</td>\n",
" <td>54</td>\n",
" <td>[few, bad, few, several, next, right]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>221</th>\n",
" <td>easy set up and user friendly</td>\n",
" <td>[easi, set, user, friendli, suggest, sale, ass...</td>\n",
" <td>5</td>\n",
" <td>easy set up and user friendly suggested by the...</td>\n",
" <td>11</td>\n",
" <td>[glad]</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-f6e0d77a-4dff-4046-b43b-ab63cba9b974')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-f6e0d77a-4dff-4046-b43b-ab63cba9b974 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-f6e0d77a-4dff-4046-b43b-ab63cba9b974');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-0a8cc229-e7e2-4ebc-95ae-116e8f0d67df\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-0a8cc229-e7e2-4ebc-95ae-116e8f0d67df')\"\n",
" title=\"Suggest charts.\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-0a8cc229-e7e2-4ebc-95ae-116e8f0d67df button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
" </div>\n",
" </div>\n"
]
},
"metadata": {},
"execution_count": 99
}
],
"source": [
"from sklearn.model_selection import train_test_split\n",
"\n",
"train, test = train_test_split(data, test_size=0.33)\n",
"train.head()"
]
},
{
"cell_type": "markdown",
"id": "5146eabe",
"metadata": {
"id": "5146eabe"
},
"source": [
"<a name='1.5'></a>\n",
"### 1.5 Construction du vocabulaire (4 points)\n",
"\n",
"Dans un modèle Bag-of-Words (BoW), un vocabulaire est prédéterminé à partir de l'ensemble d'entraînement. Seuls les mots faisant partie de ce vocabulaire seront considérés pour la suite.\n",
"\n",
"Complétez la fonction **build_voc** qui retourne une liste de jetons qui sont présents au moins n fois (threshold passé en paramètre) dans la liste d'exemples (également passée en paramètre). Vous pouvez utiliser la classe Counter.\n",
"\n",
"Ensuite, appelez cette fonction pour construire votre vocabulaire."
]
},
{
"cell_type": "code",
"execution_count": 100,
"id": "d0e901d6",
"metadata": {
"id": "d0e901d6",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"outputId": "ac52f9ef-2212-4317-8332-f23292b230c3"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Counter({'batteri': 1330, 'great': 608, 'tablet': 594, 'use': 515, 'good': 499, 'last': 457, 'work': 406, 'amazon': 402, 'one': 388, 'star': 388, 'price': 356, 'buy': 293, 'get': 276, 'love': 253, 'bought': 252, 'dont': 252, 'like': 247, 'long': 235, 'product': 233, 'kid': 231, 'purchas': 210, 'time': 197, 'fire': 186, 'brand': 182, 'would': 175, 'app': 169, 'kindl': 168, 'year': 167, 'three': 165, 'read': 143, 'old': 143, 'charg': 142, 'go': 140, 'need': 139, 'devic': 135, 'day': 131, 'five': 131, 'qualiti': 128, 'duracel': 124, 'play': 122, 'better': 120, '2': 118, 'month': 115, 'tri': 113, 'well': 113, 'return': 113, 'week': 112, 'life': 112, 'money': 111, 'store': 109, 'easi': 109, 'game': 107, 'seem': 106, 'remot': 103, 'much': 102, 'ok': 98, 'im': 98, 'best': 98, 'realli': 97, 'first': 96, 'replac': 96, 'leak': 96, 'light': 96, 'screen': 95, 'two': 95, 'dead': 94, 'put': 94, 'got': 92, 'cant': 91, 'also': 90, 'book': 89, 'new': 89, 'back': 87, 'ive': 86, 'even': 86, 'didnt': 84, 'name': 83, '4': 82, 'ipad': 81, 'want': 81, 'thing': 80, 'lot': 80, 'never': 79, 'could': 79, 'ever': 79, 'aa': 79, 'nice': 79, 'slow': 78, 'far': 78, '8': 78, 'power': 78, 'bad': 75, 'gift': 74, 'die': 74, 'littl': 72, 'less': 72, '3': 71, 'set': 71, 'everi': 71, 'disappoint': 70, 'case': 69, 'control': 69, 'valu': 69, 'order': 69, 'make': 69, 'expect': 68, 'recommend': 67, 'mani': 66, 'differ': 66, 'pay': 65, 'doesnt': 65, 'toy': 64, 'cheap': 63, 'look': 63, 'fine': 63, 'worst': 63, 'take': 62, 'perfect': 62, 'hour': 62, 'item': 62, 'size': 60, 'christma': 59, 'still': 59, 'say': 59, 'sure': 58, 'box': 58, 'deal': 58, 'perform': 58, 'son': 58, 'download': 57, 'basic': 57, 'short': 57, 'wast': 56, 'energ': 56, 'review': 56, 'pack': 56, 'half': 55, 'run': 55, 'googl': 54, 'daughter': 53, 'know': 52, 'longer': 51, 'fast': 51, 'help': 51, 'issu': 50, 'think': 50, 'open': 50, 'aaa': 50, 'turn': 50, 'wont': 49, 'way': 49, 'hold': 49, '5': 48, 'thought': 48, 'chang': 48, 'start': 47, 'excel': 47, 'tv': 46, 'camera': 46, 'recharg': 46, 'packag': 45, 'someth': 45, 'hd': 45, 'sinc': 44, 'problem': 44, 'limit': 44, 'worth': 44, 'quickli': 43, 'movi': 43, 'low': 43, 'find': 42, 'went': 42, 'come': 41, 'terribl': 41, 'right': 40, 'children': 40, 'internet': 40, 'give': 40, 'awesom': 40, 'featur': 40, '1': 39, 'without': 39, 'android': 39, 'enough': 39, 'receiv': 39, 'though': 39, 'compar': 38, 'big': 38, 'reason': 38, 'decent': 38, 'anoth': 38, 'alreadi': 37, 'abl': 37, '6': 37, 'watch': 37, 'stop': 37, 'within': 36, 'hand': 36, 'see': 36, 'enjoy': 36, 'keep': 36, 'save': 36, 'yet': 36, 'video': 36, 'mayb': 36, 'poor': 36, 'came': 35, 'friendli': 35, 'took': 35, 'hard': 35, 'mous': 35, 'made': 35, 'parent': 34, 'test': 34, 'may': 34, 'cost': 34, 'comput': 34, 'free': 34, 'around': 34, 'found': 34, 'keyboard': 33, 'sever': 33, 'end': 33, 'prime': 33, 'happi': 33, 'second': 33, '10': 33, 'spend': 33, 'notic': 33, 'acid': 33, 'child': 32, '7': 32, 'noth': 32, 'user': 31, 'pretti': 31, 'load': 31, 'almost': 31, 'small': 31, 'that': 30, 'amaz': 30, 'everyth': 30, 'wouldnt': 30, 'stick': 30, 'show': 30, 'theyr': 29, 'coupl': 29, 'connect': 29, 'said': 29, 'anyth': 29, 'hous': 29, 'wish': 29, 'horribl': 29, 'bit': 29, 'advertis': 28, 'learn': 28, 'alkalin': 28, 'storag': 28, 'version': 28, 'extra': 28, 'feel': 27, 'minut': 27, 'away': 27, 'pictur': 27, 'other': 27, 'port': 27, 'memori': 27, 'wireless': 27, 'howev': 27, 'instal': 27, 'hope': 27, 'oper': 27, 'granddaught': 27, 'fail': 27, 'havent': 26, 'id': 26, 'ill': 26, 'usual': 25, 'offer': 25, '12': 25, 'phone': 25, 'junk': 25, 'warranti': 25, 'dollar': 25, 'high': 25, 'normal': 25, 'couldnt': 25, 'fit': 24, 'drain': 24, 'definit': 24, 'amazonbas': 24, 'wrong': 24, 'wifi': 24, 'black': 24, 'next': 23, 'charger': 23, 'experi': 23, 'protect': 23, 'card': 23, 'probabl': 23, 'top': 23, 'reader': 23, 'account': 23, 'none': 23, 'onlin': 23, 'resolut': 23, 'wasnt': 22, 'option': 22, 'arriv': 22, 'model': 22, '20': 22, 'appl': 22, 'batch': 22, 'sound': 22, 'actual': 22, 'full': 22, 'ask': 22, 'alway': 22, 'absolut': 22, 'four': 22, 'ad': 22, 'electron': 22, 'candl': 22, 'sale': 21, 'speed': 21, 'wonder': 21, 'impress': 21, 'beat': 21, 'expens': 21, 'figur': 21, 'defect': 21, 'clock': 21, 'access': 21, 'requir': 21, 'etc': 21, 'super': 21, 'includ': 20, 'flashlight': 20, 'mine': 20, 'thank': 20, 'updat': 20, 'cheaper': 20, 'highli': 20, 'side': 20, 'isnt': 20, 'laptop': 20, 'gb': 20, 'faster': 20, 'ruin': 20, 'ago': 19, 'beginn': 19, 'night': 19, 'happen': 19, 'gener': 19, 'page': 19, 'gave': 18, 'overal': 18, 'drop': 18, 'total': 18, 'wife': 18, 'send': 18, 'logic': 18, 'point': 18, 'speaker': 18, 'web': 18, 'email': 18, 'els': 18, 'kind': 18, 'home': 17, 'okay': 17, 'aw': 17, 'upgrad': 17, 'told': 17, 'insid': 17, 'function': 17, 'complet': 17, 'care': 17, 'custom': 17, 'xbox': 17, 'ye': 17, 'suck': 17, 'color': 17, 'easili': 17, 'durabl': 17, 'friday': 17, 'regular': 17, 'yr': 17, 'burn': 17, 'os': 17, 'voyag': 17, 'grandson': 16, 'origin': 16, 'lock': 16, 'later': 16, 'throw': 16, 'famili': 16, 'switch': 16, 'tell': 16, 'ran': 16, '15': 16, 'check': 16, 'mode': 16, 'cover': 16, 'content': 16, 'opinion': 16, 'pleas': 16, 'matter': 16, 'tab': 16, 'least': 16, 'multipl': 16, 'servic': 16, 'own': 16, 'either': 16, 'costco': 16, '30': 16, 'quit': 15, 'avail': 15, 'decid': 15, 'simpli': 15, 'allow': 15, 'freez': 15, 'us': 15, 'inexpens': 15, 'mom': 15, 'pop': 15, 'bare': 15, 'averag': 15, 'samsung': 15, 'expand': 15, 'final': 15, 'fun': 15, 'mini': 15, 'led': 15, 'hd8': 14, 'photo': 14, 'previou': 14, 'instead': 14, 'higher': 14, 'sell': 14, 'annoy': 14, 'regist': 14, 'special': 14, 'constantli': 14, 'rather': 14, 'school': 14, 'sometim': 14, 'navig': 14, 'add': 14, 'sd': 14, 'quick': 14, 'fact': 14, 'ebook': 14, 'white': 14, 'larger': 14, 'miss': 14, 'person': 13, 'anyon': 13, 'might': 13, 'must': 13, 'place': 13, 'job': 13, 'fulli': 13, 'pair': 13, 'older': 13, 'trip': 13, 'cell': 13, 'sorri': 13, 'troubl': 13, 'major': 13, 'touch': 13, 'shut': 13, 'music': 13, 'tabl': 13, 'youtub': 13, 'left': 13, 'paper': 13, 'similar': 13, 'useless': 13, 'flash': 13, 'unit': 13, 'satisfi': 13, 'car': 13, 'past': 13, 'perfectli': 12, 'kept': 12, 'stuff': 12, 'rate': 12, 'softwar': 12, 'select': 12, 'system': 12, 'librari': 12, 'soon': 12, 'immedi': 12, 'let': 12, 'caus': 12, 'ton': 12, 'difficult': 12, 'believ': 12, 'setup': 12, 'birthday': 12, 'button': 12, 'complaint': 12, 'except': 12, 'buck': 12, 'huge': 12, 'garbag': 12, '50': 12, 'netflix': 12, 'guess': 12, 'rayovac': 12, 'fix': 12, 'continu': 12, 'quantiti': 12, 'result': 12, 'consid': 11, 'prefer': 11, 'extrem': 11, '34': 11, 'there': 11, 'contact': 11, 'shelf': 11, 'applic': 11, 'shop': 11, 'whether': 11, 'leav': 11, 'luck': 11, 'husband': 11, 'stay': 11, 'addit': 11, 'handi': 11, 'purpos': 11, 'green': 11, 'weak': 11, 'ship': 11, 'alexa': 11, 'surpris': 11, 'instruct': 11, 'brows': 11, 'program': 11, 'travel': 11, 'display': 11, '16': 11, 'facebook': 11, 'crap': 11, 'young': 11, 'done': 11, 'previous': 11, 'liter': 11, 'dim': 11, 'anywher': 11, 'nearli': 11, 'idea': 11, 'broke': 11, 'space': 11, 'amount': 11, 'line': 11, 'realiz': 10, 'clear': 10, 'frustrat': 10, 'singl': 10, 'support': 10, 'toddler': 10, 'mostli': 10, 'solid': 10, 'stand': 10, 'outsid': 10, 'digit': 10, 'age': 10, '9': 10, 'design': 10, 'paid': 10, 'wors': 10, 'wrap': 10, 'plastic': 10, 'fan': 10, 'tap': 10, 'portabl': 10, 'afford': 10, 'mirror': 10, 'surf': 10, 'near': 10, 'member': 10, 'capabl': 10, 'eread': 10, 'larg': 10, '24': 10, 'stream': 10, 'manufactur': 10, 'level': 10, 'lack': 10, 'hate': 10, 'futur': 10, 'plug': 9, 'saw': 9, 'type': 9, 'hit': 9, 'glad': 9, 'niec': 9, 'arent': 9, 'describ': 9, 'remov': 9, 'oversea': 9, 'weve': 9, 'often': 9, 'bottom': 9, 'effect': 9, 'question': 9, 'easier': 9, 'alot': 9, 'sleev': 9, 'stock': 9, 'warn': 9, 'part': 9, 'simpl': 9, '25': 9, '2nd': 9, 'cool': 9, 'begin': 9, 'exactli': 9, 'live': 9, 'third': 9, 'sister': 9, 'especi': 9, 'per': 9, 'eye': 9, '100': 9, 'decor': 9, 'compani': 9, 'break': 9, 'step': 9, 'station': 9, 'date': 9, 'sent': 9, 'appear': 9, 'piec': 9, 'edit': 9, 'safe': 9, 'starter': 9, 'unless': 9, 'water': 9, 'properli': 9, 'micro': 9, 'weight': 9, 'interfac': 9, 'capac': 9, 'adult': 9, 'bumper': 9, 'standard': 9, 'usag': 9, 'call': 9, 'worri': 9, 'readi': 9, 'improv': 8, 'plu': 8, 'sit': 8, 'whatev': 8, 'suggest': 8, 'lower': 8, 'detector': 8, 'bigger': 8, 'close': 8, 'your': 8, 'specif': 8, 'everywher': 8, 'overpr': 8, 'someon': 8, 'pro': 8, 'indonesia': 8, 'fair': 8, 'galaxi': 8, 'bulki': 8, 'echo': 8, 'window': 8, 'extern': 8, 'peopl': 8, '11': 8, 'slide': 8, 'backpack': 8, 'note': 8, 'gun': 8, 'busi': 8, 'fantast': 8, 'pick': 8, '36': 8, 'main': 8, 'cabl': 8, 'mother': 8, 'shot': 8, 'base': 8, 'activ': 8, 'reliabl': 8, 'serv': 8, 'neg': 8, 'tech': 8, 'pass': 8, 'respons': 8, 'dad': 8, '2015': 8, 'thermostat': 8, 'interest': 8, 'string': 8, '48': 8, 'due': 8, 'recent': 8, 'understand': 8, 'bluetooth': 8, 'bulk': 8, 'real': 8, 'gone': 8, '2016': 8, 'along': 8, '2012': 8, 'ram': 8, 'paperwhit': 8, 'everyon': 8, 'promis': 8, 'respond': 7, 'heard': 7, 'trust': 7, 'bewar': 7, 'click': 7, 'cord': 7, 'fall': 7, 'smoke': 7, 'period': 7, 'certain': 7, 'market': 7, 'he': 7, 'entir': 7, 'group': 7, 'upon': 7, 'deliveri': 7, 'non': 7, 'although': 7, '3rd': 7, 'search': 7, 'today': 7, 'handl': 7, 'confus': 7, 'mess': 7, 'damag': 7, 'clean': 7, 'browser': 7, 'law': 7, 'carri': 7, 'avoid': 7, 'present': 7, 'unfortun': 7, 'tie': 7, 'indic': 7, 'goe': 7, 'explod': 7, 'view': 7, 'bc': 7, 'current': 7, 'kirkland': 7, 'wall': 7, 'lag': 7, '16gb': 7, 'fill': 7, 'zero': 7, 'nephew': 7, 'count': 7, 'shoot': 7, 'trash': 7, '2017': 7, 'depart': 7, 'invest': 7, '80': 7, 'credit': 7, 'bother': 7, 'fee': 7, 'comparison': 7, 'felt': 6, 'link': 6, 'freetim': 6, 'emerg': 6, 'frequent': 6, 'strong': 6, 'twice': 6, 'refund': 6, 'volt': 6, 'buyer': 6, 'insert': 6, 'baught': 6, 'gotten': 6, 'alarm': 6, 'smart': 6, 'term': 6, 'longev': 6, 'write': 6, 'stuck': 6, 'prior': 6, 'number': 6, 'compat': 6, '90': 6, 'juic': 6, 'anymor': 6, 'complic': 6, 'els111': 6, 'neopren': 6, 'dud': 6, 'newer': 6, 'luckili': 6, 'rest': 6, 'doa': 6, 'forev': 6, 'meh': 6, 'initi': 6, 'sturdi': 6, 'biggest': 6, 'talk': 6, 'task': 6, 'inch': 6, 'pad': 6, 'info': 6, 'depend': 6, 'wore': 6, 'strength': 6, 'fresh': 6, 'corrod': 6, 'deliv': 6, 'youngest': 6, 'she': 6, 'auto': 6, 'slot': 6, 'discount': 6, 'mention': 6, 'separ': 6, 'condit': 6, 'babi': 6, 'mic': 6, 'conveni': 6, 'smaller': 6, 'bag': 6, 'equip': 6, 'energi': 6, 'hdx': 6, 'finger': 6, 'plenti': 6, 'format': 6, 'network': 6, 'chanc': 6, 'lighter': 6, 'channel': 6, 'refurbish': 6, 'move': 5, 'unlock': 5, 'associ': 5, 'research': 5, 'friend': 5, 'loos': 5, 'lifespan': 5, 'toothbrush': 5, 'serious': 5, 'grandkid': 5, 'rid': 5, 'crack': 5, 'father': 5, 'gadget': 5, 'household': 5, 'bundl': 5, 'cours': 5, 'ahead': 5, 'split': 5, 'u': 5, 'mind': 5, 'import': 5, 'boy': 5, 'univers': 5, 'given': 5, 'oasi': 5, '13': 5, 'unabl': 5, 'neither': 5, 'mistak': 5, 'sourc': 5, 'compart': 5, 'nope': 5, 'tester': 5, 'inform': 5, 'decis': 5, 'familiar': 5, 'via': 5, '14': 5, 'true': 5, 'moment': 5, 'listen': 5, 'werent': 5, 'bug': 5, 'random': 5, 'build': 5, 'exampl': 5, 'everyday': 5, 'held': 5, 'magazin': 5, 'spent': 5, 'fault': 5, 'faulti': 5, 'onto': 5, 'sharp': 5, 'usb': 5, 'elsewher': 5, 'abil': 5, 'quicker': 5, 'wait': 5, 'octob': 5, 'thru': 5, 'knew': 5, 'appar': 5, 'guid': 5, 'adjust': 5, 'weird': 5, 'tool': 5, 'increas': 5, 'backlight': 5, 'ten': 5, 'straight': 5, 'headphon': 5, 'seen': 5, 'cancel': 5, 'eas': 5, 'excit': 5, 'inconsist': 5, 'geek': 5, 'squad': 5, 'april': 5, 'budget': 5, 'entri': 5, 'dark': 5, 'xma': 5, 'unlik': 5, 'silver': 5, 'offic': 5, 'colleg': 5, 'exchang': 5, '60': 5, 'anyway': 5, 'reorder': 5, 'six': 5, 'chrome': 5, 'ie': 5, 'deadbolt': 5, '23': 5, 'threw': 5, 'pre': 5, 'electr': 5, 'log': 5, 'discov': 5, 'possibl': 5, 'lightweight': 5, 'answer': 5, 'r': 5, 'lost': 5, 'otherwis': 5, 'gig': 5, 'logo': 5, 'pdf': 5, 'clariti': 4, 'choos': 4, 'heck': 4, 'air': 4, 'wii': 4, 'subscript': 4, 'owner': 4, 'thrill': 4, 'suppos': 4, 'sleep': 4, 'carrier': 4, 'frother': 4, 'sens': 4, 'late': 4, 'copper': 4, 'reli': 4, 'pc': 4, 'adequ': 4, '2a': 4, 'lucki': 4, 'dispos': 4, 'length': 4, 'becom': 4, 'posit': 4, 'hardli': 4, 'cheapest': 4, 'soft': 4, 'instanc': 4, 'flawlessli': 4, 'contain': 4, 'typic': 4, 'rotat': 4, 'variou': 4, 'mean': 4, 'subscrib': 4, 'preload': 4, 'outstand': 4, 'regularli': 4, 'sleek': 4, 'print': 4, 'unus': 4, 'environ': 4, 'latest': 4, 'profil': 4, 'reach': 4, 'vari': 4, 'intuit': 4, 'fraction': 4, 'ripoff': 4, 'competitor': 4, 'mainli': 4, 'icon': 4, 'avid': 4, 'nook': 4, 'direct': 4, 'audibl': 4, 'despit': 4, 'list': 4, 'lol': 4, 'dot': 4, 'teen': 4, 'face': 4, 'assum': 4, 'recogn': 4, 'zipper': 4, 'slightli': 4, 'technolog': 4, 'confirm': 4, 'fight': 4, 'loud': 4, 'needless': 4, 'graphic': 4, 'reset': 4, 'upset': 4, 'document': 4, 'manual': 4, 'educ': 4, 'mo': 4, 'maneuv': 4, 'failur': 4, 'spec': 4, 'waist': 4, 'shame': 4, 'shortli': 4, 'leakag': 4, 'forward': 4, 'remain': 4, 'shoulder': 4, 'appropri': 4, 'till': 4, 'grandma': 4, 'cent': 4, 'holiday': 4, 'novemb': 4, 'itll': 4, 'local': 4, 'usa': 4, 'grand': 4, 'refus': 4, 'walmart': 4, 'approxim': 4, 'youd': 4, 'middl': 4, 'destroy': 4, 'lose': 4, 'regret': 4, 'corros': 4, 'repair': 4, 'perhap': 4, 'process': 4, 'complain': 4, 'constant': 4, 'e': 4, 'toast': 4, 'built': 4, 'namebrand': 4, 'cartridg': 4, 'chronic': 4, 'wear': 4, 'mount': 4, 'font': 4, 'jump': 4, 'cat': 4, '32': 4, 'god': 4, 'password': 4, 'becam': 4, 'fluke': 4, 'reciev': 4, 'ridicul': 4, 'choic': 4, 'honestli': 4, 'data': 4, 'coppertop': 4, 'spen': 4, 'steal': 4, 'processor': 4, 'mac': 4, 'nexu': 4, 'media': 4, 'nest': 4, 'c': 4, '9v': 4, 'can⊙t': 4, 'brandnam': 4, 'obvious': 4, 'concern': 4, 'whole': 4, 'brother': 4, 'suitabl': 4, '7yr': 4, 'follow': 4, 'nabi': 4, 'certifi': 4, 'tip': 4, 'intern': 4, 'audio': 4, 'tho': 4, 'hidden': 4, 'fals': 4, 'boat': 4, 'awar': 4, 'thrown': 4, 'refer': 4, 'asu': 4, 'i⊙v': 4, '247': 4, 'background': 4, 'bb': 3, 'seriou': 3, 'con': 3, 'fairli': 3, 'radio': 3, 'gen': 3, 'assur': 3, 'bar': 3, 'boyfriend': 3, 'detail': 3, 'form': 3, 'suffici': 3, 'secondari': 3, 'togeth': 3, 'match': 3, '4yr': 3, 'accident': 3, 'equival': 3, 'scale': 3, '68': 3, 'puzzl': 3, 'consist': 3, 'chromebooksurfac': 3, 'macair': 3, '116': 3, 'snag': 3, 'friction': 3, 'inout': 3, 'beer': 3, 'cozi': 3, 'koozi': 3, 'densiti': 3, 'foam': 3, 'encas': 3, 'canva': 3, 'slit': 3, 'amazoni': 3, '834': 3, 'unbeliev': 3, 'comfort': 3, 'bang': 3, 'plan': 3, 'roku': 3, 'convinc': 3, 'wrapper': 3, 'cri': 3, 'mix': 3, 'hot': 3, 'burnt': 3, 'voic': 3, 'assist': 3, 'greatest': 3, 'transfer': 3, 'girl': 3, 'unaccept': 3, 'instagram': 3, 'entertain': 3, 'expir': 3, 'cold': 3, 'imagin': 3, 'sad': 3, 'known': 3, 'asid': 3, 'downfal': 3, 'news': 3, 'cute': 3, 'curriculum': 3, 'imposs': 3, 'beyond': 3, 'par': 3, 'fli': 3, 'econom': 3, 'headlamp': 3, 'boot': 3, 'shotti': 3, 'unhappi': 3, 'savvi': 3, 'altern': 3, 'printer': 3, 'hook': 3, 'weather': 3, 'pathet': 3, 'significantli': 3, 'numer': 3, 'temperatur': 3, 'seller': 3, 'lie': 3, 'peoplei': 3, 'creat': 3, 'class': 3, 'met': 3, 'languag': 3, 'individu': 3, 'downsid': 3, 'upload': 3, 'ac': 3, 'fourth': 3, 'exact': 3, 'taken': 3, 'hurt': 3, 'desk': 3, 'train': 3, 'apart': 3, 'dog': 3, 'appal': 3, 'guarante': 3, 'provid': 3, 'applianc': 3, 'rang': 3, 'grrrrrrreeeeeeeeaaaaaattttttt': 3, 'compact': 3, 'track': 3, 'shipment': 3, 'meant': 3, 'hadnt': 3, '65': 3, 'protector': 3, 'hr': 3, 'favorit': 3, 'estim': 3, 'particularli': 3, 'site': 3, 'winner': 3, 'drive': 3, 'brought': 3, 'saver': 3, 'mark': 3, 'transmitt': 3, 'breaker': 3, 'adapt': 3, 'clunki': 3, 'flight': 3, 'blank': 3, 'wed': 3, '40': 3, 'heat': 3, 'finish': 3, 'what': 3, 'nois': 3, 'equal': 3, 'semest': 3, 'repres': 3, 'primetim': 3, 'trick': 3, 'stereo': 3, 'shade': 3, 'ultim': 3, 'bestbuy': 3, 'messag': 3, 'procel': 3, 'target': 3, 'road': 3, 'w': 3, 'ghz': 3, 'locat': 3, 'blue': 3, 'teenag': 3, 'shortest': 3, 'august': 3, 'tilt': 3, 'rememb': 3, 'tend': 3, 'honest': 3, 'happier': 3, 'guard': 3, 'youll': 3, 'sooner': 3, 'post': 3, 'fluid': 3, 'longlast': 3, 'varieti': 3, 'rug': 3, 'wet': 3, 'crisp': 3, 'advantag': 3, 'hassl': 3, 'across': 3, 'besid': 3, 'sort': 3, 'homework': 3, 'pic': 3, 'self': 3, 'correctli': 3, 'cumbersom': 3, 'awhil': 3, 'mobil': 3, 'distract': 3, 'lit': 3, 'curiou': 3, 'dish': 3, 'lover': 3, 'it⊙': 3, 'restart': 3, 'dictionari': 3, 'caveat': 3, '4s': 3, 'letter': 3, 'bargain': 3, 'state': 3, 'regard': 3, 'flameless': 3, 'grandchildren': 3, 'batteriesi': 3, 'guy': 3, 'harbor': 3, 'freight': 3, 'earli': 3, 'altra': 3, 'superior': 3, '85': 3, 'reboot': 3, 'produc': 3, 'aloud': 3, 'pool': 3, 'relax': 3, 'attempt': 3, 'glare': 3, 'china': 3, 'skip': 3, 'yesterday': 3, 'overnight': 3, 'skin': 3, 'crazi': 3, 'eink': 3, 'lantern': 3, 'accept': 2, 'kiosk': 2, 'menial': 2, 'perspect': 2, 'firetv': 2, 'compartmentjust': 2, 'hiss': 2, 'jet': 2, 'cough': 2, 'choke': 2, 'batteryim': 2, 'particular': 2, 'advanc': 2, 'soso': 2, 'situat': 2, 'didn⊙t': 2, 'handheld': 2, 'duracellenerg': 2, 'mare': 2, 'compet': 2, 'mainstream': 2, 'paus': 2, 'photographi': 2, 'popular': 2, 'jealou': 2, 'request': 2, '6th': 2, 'hear': 2, 'unreal': 2, 'milk': 2, 'medium': 2, 'restock': 2, 'hundr': 2, 'earn': 2, 'notch': 2, 'parti': 2, 'dissapoint': 2, 'competit': 2, 'primari': 2, 'weaker': 2, 'blackjack': 2, 'forget': 2, 'behind': 2, 'garag': 2, 'door': 2, 'liketoo': 2, 'didont': 2, 'magic': 2, 'maxel': 2, 'robust': 2, 'factor': 2, 'fitbit': 2, 'playtim': 2, 'bore': 2, 'fork': 2, 'proof': 2, 'oili': 2, 'liquid': 2, 'defeat': 2, 'red': 2, 'depot': 2, 'frozen': 2, 'cellophan': 2, 'volum': 2, 'sampl': 2, 'file': 2, 'accid': 2, 'homesceeen': 2, 'obtrus': 2, 'stink': 2, 'unbox': 2, 'physic': 2, 'noteven': 2, 'atani': 2, 'playimg': 2, 'neat': 2, 'batt': 2, 'exceed': 2, 'ignor': 2, 'promo': 2, 'microsd': 2, 'room': 2, 'undon': 2, 'occupi': 2, 'lite': 2, 'gotcha': 2, 'girlfriend': 2, 'sub': 2, 'enabl': 2, 'overload': 2, 'backup': 2, 'bog': 2, 'craig': 2, 'natur': 2, 'membership': 2, 'grey': 2, 'pull': 2, 'bank': 2, 'kitten': 2, 'heavi': 2, 'calib': 2, 'vivid': 2, 'attach': 2, '13v': 2, 'caught': 2, 'stander': 2, 'em': 2, 'visit': 2, 'meter': 2, 'guideinstruct': 2, 'spreadsheet': 2, 'intuitiveveri': 2, 'appsgood': 2, 'moviesveri': 2, 'english': 2, 'languagesapp': 2, 'rel': 2, 'share': 2, 'cmon': 2, 'dealdisappoint': 2, 'thoma': 2, 'somewhat': 2, 'worthless': 2, 'encount': 2, 'batterypow': 2, 'respect': 2, 'swipe': 2, 'smooth': 2, 'firenot': 2, '6070': 2, 'introduc': 2, 'word': 2, 'hey': 2, 'mediocr': 2, 'grandchild': 2, '72': 2, 'unusu': 2, 'ensur': 2, 'gamesapp': 2, 'morn': 2, 'al': 2, 'vacat': 2, 'coher': 2, 'penni': 2, 'sold': 2, '8pack': 2, 'cabinet': 2, 'shock': 2, 'eat': 2, 'basi': 2, 'screw': 2, 'kiddo': 2, 'sensor': 2, 'l': 2, 'l2': 2, 'bed': 2, 'wake': 2, 'pink': 2, 'breez': 2, 'necessari': 2, 'tangerin': 2, 'redbox': 2, 'alon': 2, 'block': 2, 'remaind': 2, 'skeptic': 2, 'qti': 2, 'weekli': 2, 'shouldv': 2, 'tire': 2, 'chair': 2, 'tick': 2, 'cloud': 2, 'thousand': 2, 'delet': 2, 'plane': 2, 'paperweight': 2, 'doubt': 2, 'swap': 2, '10and': 2, 'roughli': 2, 'aawith': 2, '67': 2, 'aspect': 2, 'vital': 2, 'primarili': 2, '46': 2, 'hoop': 2, 'zinio': 2, 'loosen': 2, 'grip': 2, 'club': 2, 'effici': 2, 'extend': 2, 'juri': 2, 'itun': 2, '120': 2, 'backupand': 2, 'occasion': 2, 'tot': 2, 'februari': 2, 'dayssturdi': 2, 'recycl': 2, 'edg': 2, 'culprit': 2, 'droid': 2, 'food': 2, 'truth': 2, 'enter': 2, 'earlier': 2, 'ta': 2, 'multitask': 2, 'toilet': 2, 'investig': 2, '2yr': 2, 'sticki': 2, 'cardboard': 2, 'pain': 2, 'uselif': 2, 'blotch': 2, 'deter': 2, 'walk': 2, 'counterwould': 2, 'solar': 2, '59': 2, 'x': 2, 'autofocu': 2, 'hdtv': 2, 'portrait': 2, 'shoddi': 2, '1080': 2, 'statisfi': 2, 'author': 2, 'donenot': 2, 'imag': 2, 'outmuch': 2, 'ultra': 2, 'baldwin': 2, 'keyless': 2, 'httpswwwamazoncombaldwin8252ac1cylinderelectronicdeadboltdpb00441ucy0': 2, 'san': 2, 'francisco': 2, 'httpswwwamazoncomdpb005g7sby4': 2, 'deadboltwhen': 2, 'weaken': 2, 'httpswwwamazoncomfenixhl23headlampxpg2fenixhl23xpg2golddpb00sh08uxi': 2, 'layout': 2, 'glow': 2, 'startl': 2, 'yeah': 2, 'gon': 2, 'na': 2, 'head': 2, 'eg': 2, 'raovac': 2, 'drastic': 2, 'ergonom': 2, 'magnet': 2, 'cbatteri': 2, 'proprietari': 2, 'prepar': 2, 'k': 2, 'autist': 2, 'draw': 2, 'beauti': 2, 'appstor': 2, 'steadi': 2, 'ninja': 2, 'mwh': 2, 'will': 2, 'consum': 2, 'fat32': 2, 'ntf': 2, 'fat': 2, 'xfat': 2, 'common': 2, 'clash': 2, 'clan': 2, 'aftermarket': 2, 'coc': 2, 'launch': 2, '250': 2, '101': 2, 'wayyyyy': 2, 'hint': 2, 'pen': 2, 'press': 2, 'bah': 2, 'lay': 2, 'seek': 2, 'wow': 2, 'warm': 2, 'bring': 2, 'everreadi': 2, 'spoil': 2, 'discontinu': 2, 'alright': 2, 'unlimit': 2, 'younger': 2, 'flat': 2, 'kinda': 2, 'pointless': 2, 'began': 2, 'f': 2, 'chose': 2, 'stole': 2, 'shelflif': 2, 'blew': 2, 'employe': 2, 'hasnt': 2, 'rc': 2, 'headach': 2, 'utter': 2, 'playstor': 2, 'experienc': 2, 'angri': 2, 'broken': 2, 'thermomet': 2, '17': 2, 'crash': 2, 'newest': 2, 'phooey': 2, 'diapoint': 2, 'choo': 2, 'allway': 2, 'yeari': 2, 'voltmet': 2, 'meticul': 2, '1st': 2, 'grown': 2, 'durecel': 2, 'customiz': 2, '5th': 2, 'workus': 2, '0f': 2, 'cd': 2, 'delay': 2, 'modifi': 2, 'don⊙t': 2, 'menu': 2, 'evereadi': 2, 'prompt': 2, 'rough': 2, 'peripher': 2, '4th': 2, 'randomli': 2, 'dozen': 2, 'bezel': 2, 'measur': 2, 'worm': 2, 'experiment': 2, 'walkabout': 2, 'tripl': 2, 'area': 2, 'explain': 2, 'clearli': 2, 'decemb': 2, '2month': 2, 'baffl': 2, 'polici': 2, 'toss': 2, 'evalu': 2, 'premium': 2, 'critic': 2, 'shoe': 2, 'shorter': 2, 'prosinstal': 2, 'hassleveri': 2, 'player': 2, 'correct': 2, 'inabl': 2, 'band': 2, 'runout': 2, 'fanci': 2, 'underground': 2, 'deterior': 2, 'sign': 2, 'span': 2, 'poorer': 2, 'eneloop': 2, 'inspect': 2, 'structur': 2, 'leaki': 2, 'comixolog': 2, 'op': 2, 'asia': 2, 'knowledg': 2, 'peac': 2, 'longest': 2, 'fori': 2, 'omg': 2, 'kill': 2, 'truli': 2, 'stapl': 2, 'tree': 2, 'strap': 2, 'dnt': 2, 'independ': 2, 'docket': 2, 'upat': 2, 'grandniec': 2, 'manag': 2, 'milag': 2, 'hesit': 2, 'shortliv': 2, 'medic': 2, 'staff': 2, 'pump': 2, 'procedurethat': 2, 'yeartim': 2, 'anti': 2, 'ei': 2, 'consequ': 2, 'simultan': 2, 'text': 2, 'coat': 2, 'nearest': 2, 'webroot': 2, 'disbelief': 2, 'tall': 2, 'pricey': 2, 'plant': 2, '35': 2, 'peter': 2, 'tooth': 2, 'brush': 2, 'motion': 2, 'productjmac': 2, 'aaai': 2, 'shall': 2, 'resort': 2, 'glitch': 2, 'polit': 2, 'workingwtf': 2, 'fed': 2, 'reput': 2, '1000': 2, 'aggrav': 2, 'vibrat': 2, 'camp': 2, 'rare': 2, 'puddl': 2, 'peel': 2, 'overexposur': 2, 'surfac': 2, 'ineffect': 2, 'unsaf': 2, 'timer': 2, 'inconveni': 2, 'alittl': 2, 'dispens': 2, 'sept': 2, 'pace': 2, 'allot': 2, 'bon': 2, '1992': 2, 'certainli': 2, 'dewdrop': 2, 'insist': 2, 'replenish': 2, 'restrict': 2, 'twicemi': 2, 'tremend': 2, 'nation': 2, '18': 2, 'tarnish': 2, 'rusti': 2, 'flaw': 2, 'soapdispens': 2, 'june': 2, 'insta': 2, 'bulb': 2, 'monitor': 2, 'patient': 2, 'integr': 2, 'proud': 2, 'quarter': 2, 'spring': 2, 'everybit': 2, 'oki': 1, 'chargefor': 1, 'depth': 1, 'reloc': 1, 'pricebut': 1, 'shove': 1, 'hroat': 1, 'tvand': 1, 'haveit': 1, '6yrold': 1, '3yrold': 1, '1yr': 1, 'awsom': 1, 'helpfulth': 1, 'moneyshort': 1, 'elderli': 1, 'microsoft': 1, 'rebrand': 1, 'domin': 1, 'rule': 1, 'charm': 1, 'speedlit': 1, 'firstupd': 1, 'problemsi': 1, '125': 1, 'returnabledont': 1, 'preorder': 1, 'batterieswil': 1, 'goodworthless': 1, 'sizzl': 1, 'proper': 1, 'polar': 1, 'fizzl': 1, 'femal': 1, 'weeeak': 1, 'blast': 1, 'ut': 1, 'trackbal': 1, 'signific': 1, 'cordless': 1, 'pricecon': 1, 'alli': 1, 'daili': 1, 'thata': 1, 'contempl': 1, 'honesti': 1, 'unbias': 1, 'vote': 1, 'monthveri': 1, '61617': 1, 'fresher': 1, 'circumferenceetc': 1, 'groupon': 1, 'paddleamazon': 1, 'prosgreat': 1, 'moneyenough': 1, 'gamesdec': 1, 'lifeconsfeel': 1, 'weekslowresolut': 1, 'determin': 1, 'quailiti': 1, 'bedroom': 1, 'afternoon': 1, 'boughtth': 1, 'folder': 1, 'deadsuck': 1, 'ray333ray2001yahoocom': 1, '27': 1, '43016ive': 1, 'devicesorigin': 1, 'reviewbought': 1, 'laser': 1, 'tag': 1, 'outsidei': 1, 'expensiveand': 1, 'picsi': 1, 'rablet': 1, 'boggl': 1, 'modest': 1, '240gb': 1, 'awwsom': 1, 'needsplit': 1, 'roommat': 1, 'testernot': 1, 'testeroh': 1, 'joke': 1, 'buyi': 1, 'nobrain': 1, 'yuck': 1, 'prewrap': 1, 'substanc': 1, 'appliancestoy': 1, 'expedit': 1, 'responsiveth': 1, 'announcedherself': 1, 'convers': 1, 'computersmi': 1, 'wordless': 1, 'pictorialstart': 1, 'primit': 1, 'vagu': 1, 'thisdevic': 1, 'thatfil': 1, 'thorough': 1, 'protocol': 1, 'encrypt': 1, 'toattach': 1, 'hi': 1, 'sadli': 1, 'florida': 1, 'glossi': 1, 'whatsoev': 1, 'lowpow': 1, 'topsspend': 1, 'thursday': 1, 'zone': 1, 'immort': 1, 'soul': 1, 'la': 1, 'notif': 1, 'dismiss': 1, 'foliostyl': 1, 'higherend': 1, 'leisur': 1, 'roof': 1, '2024': 1, 'endedup': 1, 'shack': 1, 'insteadi': 1, '5star': 1, 'shortterm': 1, 'butmajor': 1, 'beforebumm': 1, 'youbut': 1, 'camenor': 1, 'schedul': 1, 'alertan': 1, 'kidproof': 1, 'basement': 1, 'upstair': 1, 'soundopt': 1, 'bose': 1, 'soundlink': 1, 'primealexa': 1, 'featuresjust': 1, 'fireit': 1, 'brainer': 1, 'viabl': 1, 'substitut': 1, 'simpler': 1, 'contorl': 1, 'companion': 1, 'aciv': 1, 'tactic': 1, 'horrend': 1, 'chines': 1, 'firstlast': 1, 'disastr': 1, 'piti': 1, 'gullibl': 1, 'convert': 1, 'foldov': 1, 'phablet': 1, '500ish': 1, 'zippi': 1, 'clarityqu': 1, '64': 1, '96': 1, '200': 1, 'record': 1, 'slight': 1, 'bleed': 1, 'colorbright': 1, 'uniform': 1, 'compon': 1, 'coincid': 1, 'spazz': 1, 'moistur': 1, 'themmayb': 1, 'enrol': 1, 'unfortunetli': 1, 'arm': 1, 'leg': 1, 'okayther': 1, 'tabletsom': 1, 'elabor': 1, 'concret': 1, 'intact': 1, 'greenwork': 1, 'tight': 1, 'forth': 1, 'computersetup': 1, 'sincefin': 1, 'flexibl': 1, '15v': 1, '20pack': 1, 'imo': 1, 'sucker': 1, 'seep': 1, 'booksmagazin': 1, '2026': 1, 'programm': 1, 'histori': 1, 'uniqu': 1, 'japanes': 1, 'overdischarg': 1, 'frankli': 1, 'placement': 1, 'shouldnt': 1, 'sweet': 1, 'untrustworthi': 1, 'untrustworthydi': 1, 'blood': 1, 'pressur': 1, 'cuff': 1, 'machin': 1, 'highful': 1, 'scare': 1, 'death': 1, 'vibrantfor': 1, 'unbeat': 1, 'amazonfound': 1, 'webpag': 1, 'froze': 1, 'batteriesdont': 1, 'longdont': 1, 'theseyour': 1, 'ene': 1, 'knowledgeus': 1, 'returnedno': 1, '1weeki': 1, 'min': 1, 'boomshackalackalacka': 1, 'th': 1, 'squarish': 1, 'rectangular': 1, 'flimsi': 1, 'afraid': 1, 'aunt': 1, 'deliverycon': 1, 'dropout': 1, 'nikon': 1, 'uncommon': 1, '148v': 1, 'to12v': 1, 'hundredth': 1, 'electrochemistri': 1, 'variabl': 1, 'multiwindow': 1, 'awkward': 1, 'unfair': 1, 'perfectlyand': 1, '14cant': 1, 'wreath': 1, 'lightsguess': 1, 'strongamazon': 1, 'blink': 1, 'gret': 1, '46year': 1, 'amazonnon': 1, 'feet': 1, 'minutesobvi': 1, 'heart': 1, 'attack': 1, 'grate': 1, 'cardiac': 1, 'surgeon': 1, 'twenti': 1, 'leakagethat': 1, 'promot': 1, 'slowth': 1, 'chargingdata': 1, 'adapterth': 1, 'login': 1, 'fireo': 1, 'setbackth': 1, 'jack': 1, 'powervolum': 1, 'chargingheadphon': 1, '1112gb': 1, 'wegman': 1, 'reward': 1, 'batteryhungri': 1, 'race': 1, 'adveris': 1, 'borrow': 1, 'publish': 1, 'benefit': 1, 'fromsal': 1, 'foul': 1, 'decad': 1, 'decept': 1, 'kink': 1, '128gb': 1, '32gbjust': 1, 'anim': 1, 'watcher': 1, 'dauther': 1, 'reccomend': 1, 'firend': 1, '034': 1, '043': 1, '025050': 1, 'heavyweight': 1, 'tightli': 1, 'resist': 1, 'graini': 1, 'buffer': 1, '9th': 1, 'hallmark': 1, 'figurin': 1, 'fyi': 1, 'cartoon': 1, 'duracellwouldnt': 1, 'win': 1, 'complement': 1, 'userfriendli': 1, 'outcom': 1, 'bimonthli': 1, 'dayyou': 1, 'hourshould': 1, 'bold': 1, 'husbandso': 1, 'itit': 1, 'prostheir': 1, 'speedcon': 1, 'insan': 1, 'uncomfort': 1, 'photosoveral': 1, 's2': 1, 'hmm': 1, 'label': 1, 'importantli': 1, 'discharg': 1, 'obviou': 1, '3995': 1, 'favor': 1, '2040': 1, 'gizmo': 1, 'batteriesthes': 1, 'joul': 1, 'thief': 1, 'othersthi': 1, 'dorki': 1, 'fish': 1, 'tank': 1, 'sennheis': 1, 'twelv': 1, 'alt': 1, 'bummer': 1, 'popularknown': 1, 'dinner': 1, 'concentr': 1, 'loyal': 1, 'camper': 1, 'invent': 1, 'chip': 1, 'shini': 1, 'mountain': 1, 'nowher': 1, 'coverag': 1, '5000': 1, 'stroke': 1, 'forc': 1, 'whenev': 1, 'dosent': 1, 'stupid': 1, 'materi': 1, 'stiff': 1, 'timberlin': 1, 'theyd': 1, 'dump': 1, 'shirt': 1, 'youtyp': 1, 'batter': 1, 'nightveri': 1, 'displeas': 1, 'blow': 1, 'nose': 1, 'ceri': 1, 'itwel': 1, 'march': 1, 'feb': 1, 'lightsab': 1, 'expensivewith': 1, 'thisth': 1, 'changedleak': 1, '146146125v': 1, 'introductori': 1, 'youngelr': 1, 'sam': 1, '5i': 1, '38': 1, 'cashi': 1, 'defiantli': 1, 'cello': 1, 'motor': 1, 'lap': 1, 'asesom': 1, 'autism': 1, 'stash': 1, 'code': 1, 'beep': 1, 'suspect': 1, 'eventu': 1, 'relief': 1, '33': 1, 'yahoo': 1, 'map': 1, 'struggl': 1, 'gamecircl': 1, 'goodread': 1, 'pricelow': 1, 'tier': 1, '48pack': 1, 'approv': 1, 'bunch': 1, 'hardship': 1, 'loath': 1, 'sprain': 1, 'wrist': 1, 'metal': 1, 'scratch': 1, 'hardwark': 1, 'refresh': 1, 'outdoor': 1, 'hohum': 1, 'unitsfir': 1, 'wider': 1, '256': 1, 'hdtvfire': 1, '1208': 1, '800': 1, '720p': 1, 'crummi': 1, 'frontrear': 1, 'rear': 1, 'retain': 1, 'panel': 1, 'microhdmi': 1, 'horizont': 1, 'wire': 1, 'awkwardli': 1, 'viewwher': 1, 'snapon': 1, 'fold': 1, 'onoff': 1, 'fantasticnot': 1, '1920': 1, '1200': 1, '150': 1, '249': 1, 'itbottom': 1, 'worthwhil': 1, 'ideal': 1, 'appreci': 1, 'sluggish': 1, 'viru': 1, 'solv': 1, 'robot': 1, 'armi': 1, 'muahahahahaha': 1, '26': 1, 'ham': 1, 'egger': 1, 'board': 1, 'clumsi': 1, 'muy': 1, 'bueno': 1, 'perk': 1, 'playback': 1, 'uhoh': 1, 'finepix': 1, 'len': 1, 'towel': 1, 'bat': 1, 'conserv': 1, '300': 1, 'einstein': 1, 'math': 1, 'lousi': 1, 'royallynow': 1, 'useag': 1, 'boxi': 1, 'duralast': 1, 'cage': 1, 'crate': 1, 'gate': 1, 'stockpil': 1, 'duracellslast': 1, 'dormant': 1, 'fixtur': 1, '7inch': 1, '8inch': 1, 'industri': 1, '16g': 1, '6499': 1, 'goof': 1, 'monthsthes': 1, 'manner': 1, 'againi': 1, 'lesson': 1, 'thin': 1, 'explor': 1, 'promptli': 1, 'outer': 1, 'tape': 1, 'betterher': 1, 'oftenthos': 1, 'cheaperbatteri': 1, 'calcul': 1, 'vs': 1, 'extrapol': 1, 'coppertopsso': 1, 'powerboth': 1, 'bunnyduracel': 1, 'tini': 1, 'gofin': 1, 'signatur': 1, 'report': 1, 'thunder': 1, 'disney': 1, 'suster': 1, 'everyewher': 1, 'bill': 1, 'pricegreat': 1, 'mixedbag': 1, '1year': 1, 'discuss': 1, 'town': 1, 'distinguish': 1, 'etcbetween': 1, 'lamazon': 1, 'contac': 1, 'conclud': 1, 'visual': 1, 'iphon': 1, 'gameplay': 1, '115f': 1, 'grab': 1, 'spot': 1, '127im': 1, 'andor': 1, 'plusfor': 1, 'ms': 1, 'docx': 1, 'xlsx': 1, 'pptxall': 1, 'headset': 1, 'cut': 1, 'slower': 1, '2013': 1, 'arguabl': 1, 'hum': 1, 'smoothli': 1, 'expans': 1, 'subpar': 1, 'wash': 1, 'conneseiur': 1, 'conecct': 1, 'economi': 1, 'mah': 1, 'firestick': 1, 'poorest': 1, 'conferenc': 1, 'brutal': 1, 'misinform': 1, 'cast': 1, '20000': 1, 'modem': 1, 'hole': 1, 'unrespons': 1, 'inaccuratewhich': 1, 'push': 1, 'curv': 1, 'overcom': 1, 'greati': 1, 'properti': 1, 'forevergreat': 1, 'unlucki': 1, 'dip': 1, 'spill': 1, 'quad': 1, 'core': 1, 'cpu': 1, '1132017': 1, 'furnac': 1, 'nonstop': 1, 'holder': 1, 'tablett': 1, 'punch': 1, 'nobraineri': 1, 'smartphon': 1, 'septemb': 1, 'retail': 1, 'world': 1, 'bob': 1, 'today20': 1, 'picsw': 1, 'vendor': 1, 'losewrong': 1, 'yearnot': 1, 'weeki': 1, 'earlierthi': 1, 'saleman': 1, 'hilari': 1, 'warrenti': 1, '500': 1, 'burst': 1, '8year': 1, 'pin': 1, 'movement': 1, 'foor': 1, 'substanti': 1, 'websurf': 1, 'toyedit': 1, 'airplan': 1, 'mousea': 1, 'mousethat': 1, 'stuf': 1, 'compartmentscon': 1, 'ouch': 1, 'techi': 1, 'monthli': 1, 'stillnow': 1, 'clone': 1, 'commercialsso': 1, 'ping': 1, 'checkjust': 1, 'themth': 1, 'belight': 1, 'turner': 1, 'bell': 1, 'whistl': 1, 'splurg': 1, 'coffe': 1, 'wand': 1, 'surprisingli': 1, '70he': 1, '2year': 1, 'satisfactorili': 1, 'batteryimho': 1, 'asham': 1, 'saleit': 1, 'choppi': 1, 'consumpt': 1, 'ina': 1, 'unsatisfactori': 1, 'swissphon': 1, 'pager': 1, 'leakedupdateok': 1, 'receivedamazon': 1, 'jk150601': 1, 'tolov': 1, 'homepag': 1, 'tax': 1, 'aren⊙t': 1, 'he⊙': 1, 'batteriesthank': 1, 'vers': 1, 'net': 1, 'attest': 1, 'desir': 1, 'savi': 1, 'bame': 1, 'theamazon': 1, 'interact': 1, 'allaround': 1, '79': 1, 'paperwit': 1, 'kindler': 1, 'presum': 1, 'microphon': 1, 'kerplot': 1, 'gona': 1, 'wrote': 1, 'insur': 1, 'whop': 1, 'quantitys': 1, 'automat': 1, 'snuck': 1, 'forlucki': 1, 'minimum': 1, 'mu': 1, 'himsinc': 1, 'virtual': 1, 'theyll': 1, '3year': 1, 'floor': 1, 'panick': 1, 'hog': 1, 'cookbook': 1, 'slowest': 1, '710': 1, 'recip': 1, 'cook': 1, 'killer': 1, 'flush': 1, 'spendi': 1, 'rival': 1, 'fiancé': 1, 'goodth': 1, 'motorola': 1, 'radioson': 1, 'childsafeti': 1, 'itnoqw': 1, 'unimport': 1, 'defin': 1, 'mailth': 1, 'usei': 1, 'ear': 1, 'kidfriendli': 1, 'bend': 1, '2500': 1, 'merefurbish': 1, 'social': 1, '7year': 1, '8gb': 1, 'tough': 1, 'gameseasi': 1, 'freedom': 1, '3gb': 1, 'mad': 1, '32gb': 1, 'upcom': 1, 'recently': 1, 'storebrand': 1, 'among': 1, 'powerful': 1, 'seven': 1, 'danger': 1, 'grandmoth': 1, 'who': 1, 'crappi': 1, 'slipperi': 1, 'doorbel': 1, 'ringseal': 1, 'blown': 1, 'hack': 1, 'usabl': 1, 'wasd': 1, 'costcokirkland': 1, 'linki': 1, 'comcast': 1, 'weel': 1, 'craziest': 1, 'highest': 1, 'utub': 1, 'grade': 1, 'couch': 1, 'goofi': 1, 'modern': 1, 'beg': 1, 'bonu': 1, 'project': 1, 'forgotten': 1, 'attent': 1, '758': 1, 'enoughi': 1, 'visibl': 1, 'controli': 1, '9s': 1, 'warrant': 1, 'morememori': 1, 'hoursday': 1, 'amazoncom': 1, 'pleasur': 1, 'suppli': 1, 'geat': 1, 'tutori': 1, 'fab': 1, 'pocket': 1, 'bucksth': 1, 'wieght': 1, 'shabbi': 1, 'competitionbatteri': 1, 'daysspam': 1, 'spam': 1, 'stopspoofingamazoncom': 1, 'album': 1, 'junksav': 1, 'musician': 1, 'teacher': 1, 'sing': 1, 'shure': 1, 'beta': 1, '58': 1, '78': 1, 'mici': 1, '1520': 1, 'mid': 1, 'batterei': 1, 'after2': 1, 'rental': 1, 'outdat': 1, 'costbenefit': 1, 'eight': 1, 'bent': 1, 'pit': 1, 'leader': 1, 'versatil': 1, 'hindsight': 1, 'nerf': 1, 'dung': 1, 'migrat': 1, 'doodad': 1, 'eneg': 1, 'mousethi': 1, 'officei': 1, 'remotecontrol': 1, 'discard': 1, 'storagei': 1, 'pixil': 1, 'textstil': 1, 'asian': 1, 'infam': 1, 'harm': 1, 'realiti': 1, 'vacuum': 1, 'earth': 1, 'tappi': 1, '1999': 1, 'outrag': 1, '5v': 1, 'lowpressur': 1, 'salesperson': 1, 'satisfactori': 1, 'energizerveri': 1, '9year': 1, 'ride': 1, 'computertablet': 1, 'directli': 1, 'powerpoint': 1, 'stretch': 1, 'noisemak': 1, 'higherdrain': 1, 'moneyy': 1, 'tube': 1, 'tabletsso': 1, 'onesso': 1, 'knob': 1, 'fadedwor': 1, 'cheapi': 1, 'cheapli': 1, 'competitioni': 1, 'voltag': 1, 'capacitancethey': 1, 'rightqual': 1, 'manni': 1, 'comeon': 1, 'aid': 1, 'el': 1, 'cheapo': 1, 'explot': 1, 'scan': 1, 'woo': 1, 'staral': 1, 'reviewsth': 1, 'anythinh': 1, 'hair': 1, 'clipper': 1, 'habe': 1, 'n': 1, 'overli': 1, 'fave': 1, 'tune': 1, 'schlage': 1, 'keypad': 1, 'acess': 1, 'ehhh': 1, '5050': 1, 'puck': 1, 'bateri': 1, 'cycl': 1, 'rapidli': 1, 'empti': 1, 'themmi': 1, 'garbagei': 1, 'fri': 1, 'hang': 1, 'sideload': 1, 'gold': 1, 'goto': 1, 'doctor': 1, 'expert': 1, 'especial': 1, 'noe': 1, 'littlebit': 1, 'finesam': 1, '8thi': 1, 'christmasw': 1, 'bestlov': 1, 'itthat': 1, 'booksgamesmus': 1, 'viedosthank': 1, 'sudden': 1, 'stope': 1, 'hp': 1, 'flavor': 1, 'probobl': 1, 'laggi': 1, 'ipad2': 1, 'therapi': 1, 'session': 1, 'inconvi': 1, 'warrantyon': 1, 'woeful': 1, 'groceri': 1, 'pandora': 1, 'downstair': 1, 'weekend': 1, 'weekday': 1, 'slim': 1, 'idk': 1, 'orderd': 1, 'oh': 1, 'productthey': 1, 'tryafter': 1, 'malfunctionupon': 1, 'residu': 1, 'chicken': 1, 'coop': 1, 'fiddl': 1, 'multimet': 1, 'bias': 1, 'inventori': 1, 'regardless': 1, 'bookspap': 1, 'kindlew': 1, 'basket': 1, 'exist': 1, 'pend': 1, 'propos': 1, 'have': 1, 'durcel': 1, 'doubl': 1, 'breast': 1, 'fifth': 1, 'okit': 1, 'dose': 1, 'debat': 1, 'releas': 1, 'itemjunk': 1, 'precharg': 1, 'mile': 1, 'websit': 1, 'gmail': 1, 'smarter': 1, 'couldn⊙t': 1, 'withrug': 1, 'sophist': 1, '1one': 1, 'deserv': 1, 'disabl': 1, 'differencewhen': 1, 'retir': 1, 'chain': 1, 'dollor': 1, 'drawer': 1, 'emptor': 1, 'outperform': 1, 'oasisbatteri': 1, 'lowest': 1, 'connector': 1, 'poorli': 1, 'grow': 1, 'unsnap': 1, 'resolv': 1, 'accessori': 1, 'dif': 1, 'worki': 1, 'productit': 1, 'grandpa': 1, 'hitch': 1, 'shi': 1, 'gre': 1, 'moder': 1, 'engag': 1, 'charact': 1, 'b': 1, 'mice': 1, '3x': 1, 'infrequ': 1, 'slip': 1, 'thea': 1, 'clue': 1, 'nymph': 1, 'lifetim': 1, 'moneykeep': 1, 'moneywhen': 1, 'sunlight': 1, 'bay': 1, 'springsummerfal': 1, 'themexpect': 1, 'wrestl': 1, 'shekel': 1, 'hurri': 1, '99': 1, 'trail': 1, 'frame': 1, 'okk': 1, 'mtv': 1, 'batterieswhat': 1, 'ador': 1, 'valid': 1, 'mi': 1, '3yr': 1, 'soap': 1, 'underway': 1, 'optic': 1, 'meet': 1, 'offerdownsid': 1, 'hike': 1, 'rockclimb': 1, 'freak': 1, 'secur': 1, 'costoco': 1, 'rapid': 1, 'geeat': 1, '10th': 1, 'everthey': 1, 'outyou': 1, 'wellknown': 1, 'instantli': 1, 'output': 1, 'gradual': 1, 'loss': 1, 'margin': 1, 'suffic': 1, '7in': 1, 'ined': 1, 'alight': 1, 'tore': 1, 'shear': 1, 'hmmmmpaid': 1, 'quartermi': 1, 'financi': 1, 'advisor': 1, 'wag': 1, 'chew': 1, 'yellow': 1, 'comment': 1, 'youngster': 1, 'santa': 1, 'grader': 1, 'minecraft': 1, '☺': 1, 'hve': 1, 'snap': 1, 'circuit': 1, 'kit': 1, 'applicationdevic': 1, 'claim': 1, 'goodnight': 1, 'horriblejust': 1, 'unfriendli': 1, 'sub100': 1, 'abus': 1, 'gray': 1, 'insideim': 1, 'forgiv': 1, 'feroci': 1, 'wise': 1, 'explanatori': 1, 'contrast': 1, 'alreadygood': 1, 'scope': 1, '24hr': 1, 'twin': 1, 'costli': 1, 'rip': 1, 'tear': 1, 'heavier': 1, 'touchscreen': 1, '3g': 1, 'written': 1, 'amazonbasicsaaa': 1, 'thatll': 1, 'theyv': 1, 'util': 1, 'event': 1, 'batteryoper': 1, 'closethallway': 1, 'ident': 1, 'runningunfortun': 1, 'daylightit': 1, 'doesnot': 1, 'strain': 1, 'expland': 1, '200gb': 1, 'retina': 1, 'greenishyellowish': 1, 'tint': 1, 'photograph': 1, 'unacept': 1, 'tone': 1, 'greenish': 1, 'vulcan': 1, 'art': 1, 'acrobat': 1, 'titl': 1, 'accur': 1, 'overallstil': 1, 'amyou': 1, 'rubber': 1, 'popup': 1, 'sprout': 1, 'chubbi': 1, 'dough': 1, 'bathroom': 1, 'nightbut': 1, 'runtim': 1, '57': 1, 'yo': 1, 'teach': 1, 'gamemovi': 1, 'logitech': 1, 'wound': 1, 'won⊙t': 1, 'enhanc': 1, 'reduc': 1, 'confid': 1, 'row': 1, 'bout': 1, 'addag': 1, 'rescu': 1, 'holter': 1, 'embarrass': 1, 'reschedul': 1, 'methey': 1, '0': 1, 'matt': 1, 'superb': 1, 'yellowish': 1, 'hue': 1, 'builtin': 1, 'amazinglik': 1, 'foreign': 1, 'consult': 1, 'insitu': 1, 'phrasether': 1, 'consider1': 1, 'trade': 1, 'urg': 1, 'handson': 1, 'needwant': 1, 'with2': 1, 'minor': 1, 'evolut': 1, 'implement': 1, 'warmer': 1, 'studi': 1, 'advers': 1, 'brightwhit': 1, 'bluish': 1, 'disrupt': 1, 'melatonin': 1, 'bodi': 1, 'availablei': 1, 'king': 1, 'cross': 1, 'countri': 1, 'specialist': 1, 'minu': 1, 'useplu': 1, 'key': 1, 'spectacular': 1, 'majorli': 1, 'gear': 1, 'recarg': 1, 'catch': 1, 'seam': 1, 'tendenc': 1, 'render': 1, 'sligtli': 1, 'overs': 1, '9400': 1, 'nobodi': 1, '10pk': 1, '20pk': 1, '16993299': 1, 'fascin': 1, 'iam': 1, 'shakey': 1, 'sensit': 1, 'heavili': 1, 'ecosystem': 1, 'intend': 1, 'quirk': 1, 'amazn': 1, 'occas': 1, 'pocketbook': 1, 'error': 1, 'duh': 1, 'partnow': 1, 'sth': 1, 'york': 1, 'crossword': 1, 'dubiou': 1, 'measli': 1, 'fifti': 1, 'bunni': 1, 'drum': 1, 'monday': 1, 'sunday': 1, 'spray': 1, 'sf': 1, 'maui': 1, 'suit': 1, '253': 1, 'corrupt': 1, 'infinit': 1, 'loop': 1, 'againif': 1, 'revisit': 1, 'handsupd': 1, '112816': 1, 'bf': 1, '8yr': 1, 'repurchas': 1, 'byod': 1, 'goodi': 1, 'howto': 1, 'articl': 1, '37': 1, 'workand': 1, 'yay': 1, 'uhhhhh': 1, 'defectlv': 1, 'roll': 1, 'straighten': 1, 'deivc': 1, 'kodak': 1, 'risk': 1, 'portion': 1, 'rock': 1, 'withstand': 1, 'nnbi': 1, 'thu': 1, 'badli': 1, 'wreck': 1, 'altogeth': 1, 'perman': 1, 'oxid': 1, 'inelig': 1, 'firefox': 1, 'sw': 1, 'deem': 1, 'competitiontoo': 1, 'observ': 1, 'secret': 1, 'prop': 1, 'everybodi': 1, 'profession': 1, 'bookshelv': 1, '4gig': 1, '1gig': 1, 'lame': 1, 'revers': 1, 'bright': 1, 'peer': 1, 'electrician': 1, 'agreei': 1, 'purs': 1, 'productexcel': 1, 'moneythank': 1, 'muchmark': 1, 'kosloski': 1, 'equat': 1, 'clicker': 1, 'profrssion': 1, 'casual': 1, 'semi': 1, 'raw': 1, 'wi': 1, 'fi': 1, 'amazingli': 1, 'themi': 1, 'whatthey': 1, 'whoop': 1, 'desktop': 1, 'prove': 1, 'candi': 1})\n",
"['dead', '3', 'day', 'put', 'ago', 'alreadi', 'go', 'name', 'brand', 'next', 'time', 'good', 'first', 'tablet', 'purchas', 'sinc', 'bought', 'grandson', 'christma', 'slow', 'consid', 'price', 'that', 'problem', 'charger', 'wont', 'charg', 'use', 'need', 'plug', 'ok', 'fit', 'perfectli', 'origin', 'kindl', 'fire', 'longer', 'wasnt', 'replac', 'ipad', 'saw', 'hd8', 'store', 'realiz', 'much', 'better', 'like', 'size', 'feel', 'read', 'book', 'prefer', 'thing', 'improv', 'old', 'one', 'plu', 'respond', 'dont', 'cant', 'photo', 'lock', 'screen', 'advertis', 'also', 'usual', 'take', 'tri', 'issu', 'leak', 'batteri', 'amazon', 'remot', 'kept', 'drain', 'within', 'minut', 'quit', 'work', 'gave', 'think', 'bad', 'later', 'open', 'case', 'type', 'keyboard', 'sever', 'sit', 'heard', 'felt', 'hit', 'right', 'hand', 'start', 'whatev', 'came', 'throw', 'away', 'never', 'trust', 'easi', 'set', 'user', 'friendli', 'suggest', 'sale', 'im', 'glad', 'took', 'great', 'speed', 'didnt', 'want', 'abl', 'clear', 'home', 'app', 'see', 'person', 'pictur', 'okay', 'option', 'avail', 'three', 'star', 'theyr', 'bewar', '2', 'week', 'amaz', 'product', 'child', 'love', 'parent', 'control', 'way', 'hold', 'definit', 'recommend', 'stuff', 'link', '1', 'click', 'buy', 'kid', 'would', 'famili', 'littl', 'learn', 'beginn', 'other', '5', 'niec', 'enjoy', 'play', 'includ', 'freetim', 'lower', 'rate', 'port', 'extrem', 'cord', 'fall', 'frustrat', 'lot', 'last', 'long', 'wast', 'aw', 'far', 'ive', '6', 'month', 'smoke', 'detector', 'period', 'well', 'year', 'without', 'money', 'perfect', 'even', '8', 'bigger', 'memori', '7', 'arriv', 'seem', 'thought', 'packag', '34', 'devic', 'disappoint', 'five', 'valu', 'certain', 'get', 'pay', 'overal', 'wonder', 'end', 'return', 'android', 'softwar', 'children', 'previou', 'decid', 'instead', 'compar', 'duracel', 'cheap', 'emerg', 'wireless', 'game', 'select', 'higher', 'qualiti', 'sell', 'prime', 'could', 'market', 'simpli', 'close', 'flashlight', 'switch', 'frequent', 'life', 'energ', 'arent', 'strong', 'enough', '4', 'daughter', 'drop', 'limit', 'mani', 'doesnt', 'allow', 'googl', 'pretti', 'annoy', 'mine', 'tv', 'realli', 'tell', 'test', 'everi', 'singl', 'model', 'upgrad', 'he', 'happi', 'system', 'download', 'librari', 'look', 'describ', 'keep', 'freez', 'anyon', 'told', 'receiv', '20', 'howev', 'offer', 'regist', 'may', 'us', 'basic', 'experi', 'less', 'coupl', 'cost', 'save', 'worth', 'your', 'ran', 'entir', 'quickli', 'inexpens', 'fast', 'sure', 'group', 'insid', 'box', 'order', 'remov', 'two', 'mom', 'comput', 'twice', 'got', 'new', 'second', 'still', 'yet', 'refund', '15', 'volt', 'soon', 'check', 'upon', 'deliveri', 'non', 'impress', 'hard', 'connect', 'internet', 'load', 'free', 'appl', 'protect', 'best', 'ever', 'function', 'mode', 'make', 'complet', 'might', 'batch', 'support', 'buyer', 'fine', 'there', 'beat', 'expens', 'care', 'almost', 'immedi', 'pop', 'sound', 'insert', 'actual', 'bare', 'power', 'specif', 'small', 'full', '12', 'oversea', 'baught', 'figur', 'cover', 'video', 'gift', 'content', 'contact', 'said', 'although', 'ask', 'everywher', 'total', 'overpr', 'anyth', 'know', 'let', 'custom', 'special', 'defect', 'must', 'gotten', 'caus', 'alarm', 'hous', 'instal', '10', 'shelf', 'place', 'card', 'say', 'deal', 'weve', 'someon', 'smart', 'phone', 'someth', 'probabl', 'noth', 'job', 'excel', 'applic', 'top', 'come', 'term', 'longev', 'mous', 'pro', 'chang', 'constantli', 'back', 'xbox', 'hour', 'averag', 'toddler', 'toy', 'mostli', 'wife', 'spend', 'shop', 'often', 'review', 'opinion', 'havent', 'whether', '3rd', 'alway', 'leav', 'help', 'item', 'fulli', 'solid', 'write', 'pleas', 'give', 'ye', 'thank', 'expect', 'perform', 'big', 'ton', 'search', 'luck', 'pair', 'clock', 'today', 'stuck', 'difficult', 'notic', 'made', 'indonesia', 'matter', 'older', 'mayb', 'alkalin', 'aa', 'fair', 'worst', 'everyth', 'aaa', 'hope', 'find', 'updat', 'prior', 'believ', 'number', 'reason', 'amazonbas', 'differ', 'compat', 'junk', 'half', 'absolut', 'run', 'stand', 'send', 'terribl', 'rather', 'samsung', 'galaxi', 'tab', 'handl', 'camera', 'reader', 'wouldnt', 'decent', 'stick', 'night', 'outsid', 'confus', 'warranti', 'bulki', 'wish', 'access', 'watch', 'movi', 'account', 'cheaper', 'echo', 'low', 'die', 'setup', 'oper', 'bottom', 'expand', 'requir', 'final', 'digit', 'effect', 'recharg', '90', 'none', 'suck', 'juic', 'anymor', 'school', 'age', 'granddaught', 'color', 'birthday', 'window', 'fail', 'question', 'sometim', 'went', 'trip', 'son', 'extern', 'husband', 'button', 'complic', 'navig', 'around', 'easier', '9', 'least', 'alot', 'short', 'peopl', 'found', 'logic', 'els111', '11', 'sleev', 'neopren', 'easili', 'slide', 'backpack', 'highli', 'light', 'durabl', 'side', 'note', 'stay', 'acid', 'multipl', 'cell', 'point', 'isnt', 'mess', 'damag', 'pack', 'gun', 'happen', 'sorri', 'busi', 'clean', 'design', 'complaint', 'except', 'hd', 'awesom', 'fun', 'stop', 'paid', 'fantast', 'nice', 'storag', 'addit', 'handi', 'buck', 'stock', 'dud', 'troubl', 'purpos', 'poor', 'pick', 'green', 'weak', 'add', 'wors', 'newer', 'ship', 'horribl', 'dollar', 'luckili', 'warn', 'show', 'major', 'wrap', 'four', 'rest', '36', 'doa', 'plastic', 'high', 'servic', 'touch', 'wrong', 'part', 'alexa', 'surpris', 'speaker', 'shut', 'fan', 'main', 'cabl', 'instruct', 'wifi', 'simpl', 'web', 'browser', 'music', 'etc', 'version', '25', 'ad', 'extra', 'tabl', '2nd', 'mother', 'youtub', 'huge', 'id', 'shot', 'black', 'friday', 'cool', 'begin', 'sd', 'garbag', 'regular', 'quick', 'onlin', 'forev', 'meh', 'mini', 'brows', '50', 'exactli', 'left', 'live', 'base', 'initi', 'third', 'paper', 'sturdi', 'fact', 'biggest', 'own', 'sister', 'law', 'program', 'tap', 'portabl', 'carri', 'activ', 'talk', 'netflix', 'task', 'reliabl', 'afford', 'avoid', 'similar', 'present', 'inch', 'yr', 'laptop', 'ill', 'pad', 'especi', 'email', 'ebook', 'useless', 'unfortun', 'info', 'either', 'serv', 'travel', 'featur', 'mirror', 'display', 'costco', 'guess', '16', 'normal', 'per', 'gb', 'tie', 'surf', 'facebook', 'neg', 'eye', '100', 'electron', 'crap', 'decor', 'compani', 'young', 'break', 'step', 'done', 'tech', 'near', 'depend', 'wore', 'station', 'els', 'kind', 'burn', 'strength', 'flash', 'fresh', 'corrod', 'pass', 'member', 'super', 'date', 'previous', 'gener', 'resolut', 'respons', 'deliv', 'sent', 'youngest', 'unit', 'she', 'appear', 'os', 'piec', 'dad', '2015', 'indic', 'anoth', 'goe', 'explod', 'liter', 'edit', 'turn', 'safe', 'capabl', 'view', '30', 'starter', 'auto', 'bc', 'unless', 'thermostat', 'current', 'interest', 'string', 'eread', '48', 'led', 'kirkland', 'though', 'water', 'satisfi', 'dim', 'anywher', 'couldnt', 'properli', 'candl', 'due', 'recent', 'micro', 'wall', 'weight', 'interfac', 'lag', 'bit', 'slot', '16gb', 'faster', 'capac', 'fill', 'car', 'discount', 'mention', 'rayovac', 'zero', 'ruin', 'larg', '24', 'adult', 'stream', 'fix', 'manufactur', 'separ', 'understand', 'nearli', 'bluetooth', 'continu', 'page', 'voyag', 'condit', 'level', 'nephew', 'bumper', 'count', 'bulk', 'standard', 'babi', 'mic', 'shoot', 'trash', 'real', 'idea', 'conveni', 'white', 'broke', 'space', 'smaller', 'bag', 'equip', '2017', 'quantiti', 'lack', 'usag', 'call', 'depart', 'energi', 'larger', 'gone', '2016', 'amount', 'hate', 'along', 'past', 'hdx', 'invest', 'finger', 'result', 'futur', '2012', 'ram', 'paperwhit', '80', 'line', 'miss', 'plenti', 'worri', 'credit', 'bother', 'format', 'everyon', 'network', 'fee', 'readi', 'chanc', 'comparison', 'lighter', 'promis', 'channel', 'refurbish']\n",
"845\n"
]
}
],
"source": [
"def build_voc(documents, threshold):\n",
" counter = Counter()\n",
" for text in documents:\n",
" counter.update(text)\n",
" print(counter)\n",
" return [token for token,count in counter.items() if count > threshold]\n",
"\n",
"voc = build_voc(train[\"text\"], 5)\n",
"print(voc)\n",
"print(len(voc))"
]
},
{
"cell_type": "markdown",
"id": "e006f572",
"metadata": {
"id": "e006f572"
},
"source": [
"<a name='1.6'></a>\n",
"### 1.6 Vectorisation des données (4 points)\n",
"\n",
"À l'aide de la classe [TfidfVectorizer](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html) de Sklearn, transformez l'ensemble de jetons en matrice de co-occurence utilisant TF-IDF.\n",
"\n",
"Utilisez le vocabulaire construit au numéro précédent dans votre matrice de co-occurrence (voir le paramètre vocabulary de TfidfVectorizer).\n",
"\n",
"**Faites attention:** Il ne faut pas entrainer (fit) la vectorisation sur l'ensemble de test"
]
},
{
"cell_type": "code",
"execution_count": 101,
"id": "54bdc303",
"metadata": {
"id": "54bdc303",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"outputId": "d0d08e0a-e335-45f6-8134-0c5c9b0996ec"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"(1871, 845)\n"
]
}
],
"source": [
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"\n",
"TfidfVectorizer = TfidfVectorizer(vocabulary=voc)\n",
"X_train = TfidfVectorizer.fit_transform(train[\"text_original\"])\n",
"\n",
"print(X_train.shape)"
]
},
{
"cell_type": "markdown",
"id": "f00781ca",
"metadata": {
"id": "f00781ca"
},
"source": [
"<a name='2'></a>\n",
"## 2. Classification (35 points)\n",
"\n",
"Maintenant que les données sont prêtes à être utilisées par nos modèles, nous allons entrainer et tester différent types de modèles sur le jeu de données afin d'en faire la comparaison.\n",
"\n",
"Cette section sera divisé en cinq modèle:\n",
" - Modèle aléatoire (Random baseline)\n",
" - Classificateur bayésien naïf\n",
" - Régression Logistique\n",
" - Multi-Layer Perceptron (MLP)\n",
"\n",
"<a name='2.1'></a>\n",
"### 2.1 Modèle aléatoire (Random baseline) (5 points)\n",
"\n",
"Un seuil (baseline) est un modèle servant de référence et dont les performances représentent un seuil à dépasser.\n",
"\n",
"#### a) Générez ce seuil en effectuant des prédictions aléatoires parmi les valeurs 1, 3 et 5. Ensuite, affichez les mesures de performance : précision, rappel (recall) et F1. Utilisez la classe classification_report de SKlearn et affichez 4 chiffres après la virgule. (3.5 points)"
]
},
{
"cell_type": "code",
"execution_count": 101,
"id": "bc582223",
"metadata": {
"id": "bc582223"
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 102,
"id": "f79530a0",
"metadata": {
"scrolled": false,
"id": "f79530a0",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"outputId": "64e6fd9c-d98f-497d-fbbc-1a3327ffc794"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" precision recall f1-score support\n",
"\n",
" 1 0.3238 0.3064 0.3149 297\n",
" 3 0.3585 0.3596 0.3591 317\n",
" 5 0.3529 0.3701 0.3613 308\n",
"\n",
" accuracy 0.3460 922\n",
" macro avg 0.3451 0.3454 0.3451 922\n",
"weighted avg 0.3455 0.3460 0.3456 922\n",
"\n"
]
}
],
"source": [
"from sklearn.metrics import classification_report\n",
"\n",
"num_preds = len(test)\n",
"y_true = test[\"rating\"]\n",
"\n",
"def generate_pred():\n",
" p = np.random.uniform(0,1)\n",
" if p < 1/3:\n",
" n=1\n",
" elif p < 2/3:\n",
" n=3\n",
" else:\n",
" n=5\n",
" return n\n",
"\n",
"y_pred = [generate_pred() for i in range(num_preds)]\n",
"\n",
"print(classification_report(y_true, y_pred, digits=4))"
]
},
{
"cell_type": "markdown",
"id": "b7070590",
"metadata": {
"id": "b7070590"
},
"source": [
"#### b) Comment pouvez-vous expliquer le F1-score obtenu? (1.5 points)"
]
},
{
"cell_type": "markdown",
"id": "4b86cab6",
"metadata": {
"id": "4b86cab6"
},
"source": [
"> Le F1-score correspond à 2 * (Precision * Recall) / (Precision + Recall).\n",
"Un F1-score proche de 1/3 environ s'explique par le fait qu'une prédiction a une proba de 1/3 d'être correcte (idem pour recall."
]
},
{
"cell_type": "markdown",
"id": "8eadb0d3",
"metadata": {
"id": "8eadb0d3"
},
"source": [
"<a name='2.2'></a>\n",
"### 2.2 Analyse et compréhension d'un classificateur bayésien naïf (NB) (22 points)\n",
"\n",
"Naive Bayes (NB) est un algorithme très simple pouvant servir de bon point de départ (baseline) pour les tâches de classification. Ce numéro portera sur l'analyse de ce modèle afin de bien comprendre son comportement."
]
},
{
"cell_type": "markdown",
"id": "0c04861f",
"metadata": {
"id": "0c04861f"
},
"source": [
"<a name='2.2.1'></a>\n",
"#### 2.2.1 Construction du modèle (4 points)\n",
"\n",
"Commencez d'abord par construire le modèle à l'aide de la classe MultinomialNB de SKlearn. Utilisez les données vectorisées produites en 1.6.\n",
"\n",
"Affichez les performances de votre classificateur (précision, recall, F1-score)."
]
},
{
"cell_type": "code",
"execution_count": 103,
"id": "c90814a4",
"metadata": {
"id": "c90814a4",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"outputId": "4fc17486-9397-4459-bca3-a9bc45f628b3"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" title \\\n",
"214 Great Speaker, no need for the tech \n",
"2106 Really like the form factor. \n",
"312 Horrible \n",
"2410 One Star \n",
"890 Good product, just not very convenient \n",
"\n",
" text rating \\\n",
"214 [great, speaker, need, tech, great, speaker, r... 3 \n",
"2106 [realli, like, form, factor, come, nook, reade... 5 \n",
"312 [horribl, bought, daughter3, cant, even, use, ... 1 \n",
"2410 [one, star, die, almost, immedi, ruin, purpos,... 1 \n",
"890 [good, product, conveni, good, price, batteri,... 3 \n",
"\n",
" text_original token_count \\\n",
"214 Great Speaker, no need for the tech Great Spea... 18 \n",
"2106 Really like the form factor. Coming from a noo... 11 \n",
"312 Horrible Bought this for my daughter(3) and sh... 46 \n",
"2410 One Star Died almost immediately. Ruined their... 9 \n",
"890 Good product, just not very convenient Very go... 28 \n",
"\n",
" adj \n",
"214 [good] \n",
"2106 [] \n",
"312 [Horrible, slow, free, free, initial, foreign] \n",
"2410 [] \n",
"890 [Good, convenient, good, own, small, loose] "
],
"text/html": [
"\n",
" <div id=\"df-1f3966c1-27a2-4c56-9c30-6967a90f6e4a\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>title</th>\n",
" <th>text</th>\n",
" <th>rating</th>\n",
" <th>text_original</th>\n",
" <th>token_count</th>\n",
" <th>adj</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>214</th>\n",
" <td>Great Speaker, no need for the tech</td>\n",
" <td>[great, speaker, need, tech, great, speaker, r...</td>\n",
" <td>3</td>\n",
" <td>Great Speaker, no need for the tech Great Spea...</td>\n",
" <td>18</td>\n",
" <td>[good]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2106</th>\n",
" <td>Really like the form factor.</td>\n",
" <td>[realli, like, form, factor, come, nook, reade...</td>\n",
" <td>5</td>\n",
" <td>Really like the form factor. Coming from a noo...</td>\n",
" <td>11</td>\n",
" <td>[]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>312</th>\n",
" <td>Horrible</td>\n",
" <td>[horribl, bought, daughter3, cant, even, use, ...</td>\n",
" <td>1</td>\n",
" <td>Horrible Bought this for my daughter(3) and sh...</td>\n",
" <td>46</td>\n",
" <td>[Horrible, slow, free, free, initial, foreign]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2410</th>\n",
" <td>One Star</td>\n",
" <td>[one, star, die, almost, immedi, ruin, purpos,...</td>\n",
" <td>1</td>\n",
" <td>One Star Died almost immediately. Ruined their...</td>\n",
" <td>9</td>\n",
" <td>[]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>890</th>\n",
" <td>Good product, just not very convenient</td>\n",
" <td>[good, product, conveni, good, price, batteri,...</td>\n",
" <td>3</td>\n",
" <td>Good product, just not very convenient Very go...</td>\n",
" <td>28</td>\n",
" <td>[Good, convenient, good, own, small, loose]</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-1f3966c1-27a2-4c56-9c30-6967a90f6e4a')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-1f3966c1-27a2-4c56-9c30-6967a90f6e4a button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-1f3966c1-27a2-4c56-9c30-6967a90f6e4a');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-d3902529-719f-440c-96f7-c7cb5e3d0f13\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-d3902529-719f-440c-96f7-c7cb5e3d0f13')\"\n",
" title=\"Suggest charts.\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-d3902529-719f-440c-96f7-c7cb5e3d0f13 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
" </div>\n",
" </div>\n"
]
},
"metadata": {},
"execution_count": 103
}
],
"source": [
"from sklearn.naive_bayes import MultinomialNB\n",
"test.head()"
]
},
{
"cell_type": "code",
"execution_count": 104,
"id": "6e4fecb0",
"metadata": {
"scrolled": true,
"id": "6e4fecb0",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"outputId": "318f269f-a249-4bd4-ca6e-0f827a538866"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" precision recall f1-score support\n",
"\n",
" 1 0.8085 0.7677 0.7876 297\n",
" 3 0.6877 0.6877 0.6877 317\n",
" 5 0.7585 0.7955 0.7765 308\n",
"\n",
" accuracy 0.7495 922\n",
" macro avg 0.7516 0.7503 0.7506 922\n",
"weighted avg 0.7503 0.7495 0.7495 922\n",
"\n"
]
}
],
"source": [
"y_train = train[\"rating\"]\n",
"clf = MultinomialNB(force_alpha=True)\n",
"clf.fit(X_train, y_train)\n",
"MultinomialNB(force_alpha=True)\n",
"\n",
"\n",
"X_test = TfidfVectorizer.transform(test[\"text_original\"])\n",
"y_pred = clf.predict(X_test)\n",
"y_true = test[\"rating\"]\n",
"\n",
"print(classification_report(y_true, y_pred, digits=4))"
]
},
{
"cell_type": "markdown",
"id": "34a784a1",
"metadata": {
"id": "34a784a1"
},
"source": [
"<a name='2.2.2'></a>\n",
"#### 2.2.2 Matrice de confusion (3 points)\n",
"\n",
"Visualisez la matrice de confusion de votre modèle en utilisant la fonction [heatmap](https://seaborn.pydata.org/generated/seaborn.heatmap.html) de seaborn. Celle-ci peut prendre en entrée une matrice de confusion comme celle fournie par la fonction [confusion_matrix](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html) dans SKLearn."
]
},
{
"cell_type": "code",
"execution_count": 105,
"id": "a115ac85",
"metadata": {
"scrolled": true,
"id": "a115ac85",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 472
},
"outputId": "a669fe1e-12c6-4052-cf4e-2b2521eff828"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAhsAAAHHCAYAAAAWM5p0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABGK0lEQVR4nO3dd1yV9fvH8fdhI1NUBBy4EmfOUnLn3jNzlGimWVrmqmioOMKsnJW2TLNsmqZmw/LrypEjc5ui5gI3KCAocP/+8OepE6hg3B7kvJ49zuMRn/tz3/d1SOPiuj6f+1gMwzAEAABgEid7BwAAAPI3kg0AAGAqkg0AAGAqkg0AAGAqkg0AAGAqkg0AAGAqkg0AAGAqkg0AAGAqkg0AAGAqkg3ARAcOHFCLFi3k5+cni8WixYsX5+r1jxw5IovForlz5+bqde9mjRs3VuPGje0dBoB/INlAvhcTE6MnnnhCZcqUkYeHh3x9fVWvXj1Nnz5dly9fNvXeERER2rlzpyZOnKj58+erdu3apt7vTurbt68sFot8fX2z/D4eOHBAFotFFotFb7zxRo6vf/LkSY0dO1bbt2/PhWgB2JOLvQMAzPTdd9/poYcekru7u/r06aMqVaroypUrWrdunUaNGqXdu3frvffeM+Xely9f1oYNG/TSSy9pyJAhptwjNDRUly9flqurqynXvxUXFxclJydr6dKl6t69u82xTz/9VB4eHkpJSbmta588eVJRUVEqVaqUqlevnu3zfvrpp9u6HwDzkGwg3zp8+LB69Oih0NBQrVy5UsHBwdZjgwcP1sGDB/Xdd9+Zdv8zZ85Ikvz9/U27h8VikYeHh2nXvxV3d3fVq1dPn332WaZkY8GCBWrbtq0WLlx4R2JJTk5WgQIF5ObmdkfuByD7aKMg35o8ebISExP14Ycf2iQa15UrV05Dhw61fp2Wlqbx48erbNmycnd3V6lSpfTiiy8qNTXV5rxSpUqpXbt2Wrdune6//355eHioTJky+vjjj61zxo4dq9DQUEnSqFGjZLFYVKpUKUnX2g/X//2fxo4dK4vFYjO2YsUK1a9fX/7+/vL29lZYWJhefPFF6/EbrdlYuXKlGjRoIC8vL/n7+6tjx47au3dvlvc7ePCg+vbtK39/f/n5+alfv35KTk6+8Tf2X3r16qXvv/9e8fHx1rHNmzfrwIED6tWrV6b558+f18iRI1W1alV5e3vL19dXrVu31h9//GGds2rVKt13332SpH79+lnbMdffZ+PGjVWlShVt3bpVDRs2VIECBazfl3+v2YiIiJCHh0em99+yZUsVLFhQJ0+ezPZ7BXB7SDaQby1dulRlypTRAw88kK35jz/+uEaPHq2aNWtq6tSpatSokaKjo9WjR49Mcw8ePKhu3bqpefPmevPNN1WwYEH17dtXu3fvliR16dJFU6dOlST17NlT8+fP17Rp03IU/+7du9WuXTulpqZq3LhxevPNN9WhQwf9+uuvNz3v559/VsuWLXX69GmNHTtWw4cP1/r161WvXj0dOXIk0/zu3bvr0qVLio6OVvfu3TV37lxFRUVlO84uXbrIYrHom2++sY4tWLBAFSpUUM2aNTPNP3TokBYvXqx27dppypQpGjVqlHbu3KlGjRpZf/BXrFhR48aNkyQNHDhQ8+fP1/z589WwYUPrdc6dO6fWrVurevXqmjZtmpo0aZJlfNOnT1eRIkUUERGh9PR0SdK7776rn376STNnzlRISEi23yuA22QA+VBCQoIhyejYsWO25m/fvt2QZDz++OM24yNHjjQkGStXrrSOhYaGGpKMNWvWWMdOnz5tuLu7GyNGjLCOHT582JBkvP766zbXjIiIMEJDQzPFMGbMGOOffyWnTp1qSDLOnDlzw7iv3+Ojjz6yjlWvXt0IDAw0zp07Zx37448/DCcnJ6NPnz6Z7vfYY4/ZXLNz585GoUKFbnjPf74PLy8vwzAMo1u3bkbTpk0NwzCM9PR0IygoyIiKisrye5CSkmKkp6dneh/u7u7GuHHjrGObN2/O9N6ua9SokSHJmD17dpbHGjVqZDP2448/GpKMCRMmGIcOHTK8vb2NTp063fI9AsgdVDaQL128eFGS5OPjk635y5cvlyQNHz7cZnzEiBGSlGltR6VKldSgQQPr10WKFFFYWJgOHTp02zH/2/W1Ht9++60yMjKydU5sbKy2b9+uvn37KiAgwDp+7733qnnz5tb3+U+DBg2y+bpBgwY6d+6c9XuYHb169dKqVasUFxenlStXKi4uLssWinRtnYeT07X/9aSnp+vcuXPWFtG2bduyfU93d3f169cvW3NbtGihJ554QuPGjVOXLl3k4eGhd999N9v3AvDfkGwgX/L19ZUkXbp0KVvz//rrLzk5Oalc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dqNkN7HIir+/v8qXL6+DBw+qefPmunLliuLj422qG6dOncpyjcd/xePKAQAwWV54XHliYqJiYmIUHBysWrVqydXVVb/88ov1+P79+3X06FGFh4f/x3ebGZUNAADyoZEjR6p9+/YKDQ3VyZMnNWbMGDk7O6tnz57y8/NT//79NXz4cAUEBMjX11dPP/20wsPDc30nikSyAQCA6eyx8/X48ePq2bOnzp07pyJFiqh+/frauHGjihS59gC/qVOnysnJSV27drV5qJcZWCAKh8ACUfwTC0TxT3digWjMmdz5ZOWyRTxz5Tp3Gms2AACAqWijAABgMnt8NkpeQrIBAIDJ7PW48ryCNgoAADAVlQ0AAEzm4IUNkg0AAEzn4NkGyQYAACZz9AWirNkAAACmorIBAIDJHH03CskGAAAmc/BcgzYKAAAwF5UNAABMRhsFAACYzLGzDdooAADAVFQ2AAAwGW0UAABgKgfPNWijAAAAc1HZAADAZLRRAACAqRz9s1FINgAAMJtj5xqs2QAAAOaisgEAgMkcvLBBsgEAgNkcfYEobRQAAGAqKhsAAJiM3SgAAMBcjp1r0EYBAADmorIBAIDJHLywQbIBAIDZ2I0CAABgIiobAACYjN0oAADAVLRRAAAATESyAQAATEUbBQAAkzl6G4VkAwAAkzn6AlHaKAAAwFRUNgAAMBltFAAAYCoHzzVoowAAAHNR2QAAwGwOXtog2QAAwGTsRgEAADARlQ0AAEzGbhQAAGAqB881SDYAADCdg2cbrNkAAACmorIBAIDJHH03CskGAAAmc/QForRRAACAqSyGYRj2DgK5LzU1VdHR0YqMjJS7u7u9w0EewJ8J/BN/HnAnkWzkUxcvXpSfn58SEhLk6+tr73CQB/BnAv/EnwfcSbRRAACAqUg2AACAqUg2AACAqUg28il3d3eNGTOGhV+w4s8E/ok/D7iTWCAKAABMRWUDAACYimQDAACYimQDAACYimQDAACYimQjH1qzZo3at2+vkJAQWSwWLV682N4hwU5mzZqle++9V76+vvL19VV4eLi+//57e4cFOxo7dqwsFovNq0KFCvYOC/kcyUY+lJSUpGrVquntt9+2dyiws+LFi2vSpEnaunWrtmzZogcffFAdO3bU7t277R0a7Khy5cqKjY21vtatW2fvkJDP8RHz+VDr1q3VunVre4eB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\n"
},
"metadata": {}
}
],
"source": [
"from sklearn.metrics import confusion_matrix\n",
"from seaborn import heatmap\n",
"\n",
"labels = [1,3,5]\n",
"cm = confusion_matrix(y_true, y_pred, labels=labels)\n",
"\n",
"heatmap(cm, annot=True, cmap='Blues', cbar=True, xticklabels=labels, yticklabels=labels)\n",
"\n",
"plt.xlabel('Predicted')\n",
"plt.ylabel('True')\n",
"plt.title('Confusion Matrix')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "223d6c84",
"metadata": {
"id": "223d6c84"
},
"source": [
"<a name='2.2.3'></a>\n",
"#### 2.2.3 Visualisation des probabilités de NB (5 points)\n",
"\n",
"Naive Bayes est un classificateur suivant une approche générative. Durant son entraînement, il apprend les probabilités P(x_i|y). En utilisant le théorème de Bayes, on peut exprimer la probabilité d'une classe donnée y étant donné un ensemble de caractéristiques x_1, x_2, ..., x_n comme suit :\n",
"\n",
"$$ P(y|x_1, x_2, ..., x_n) = P(y) * P(x_1|y) * P(x_2|y) * ... * P(x_n|y) $$\n",
"\n",
"Ainsi, étant donné un exemple ayant le jeton x_i, plus la probabilité P(x_i|y) est élevée pour une classe, plus la probabilité que l'exemple provienne de cette classe augmente.\n",
"\n",
"Écrivez du code permettant de visualiser les jetons ayant les plus grandes probabilités selon la classe dans un graphique de type [barh](https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.barh.html). Consultez la documentation de [MultiNomialNB](https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html) afin de trouver les probabilités P(x_i|y). Le graphique produit devrait montrer, sur l'axe des Y, les 10 jetons associés au P(x_i|y) le plus grand selon y. L'axe des X devrait représenter la valeur des probabilités.\n",
"\n",
"Ce code devra être sous forme d'une fonction où on passe la classe y en paramètre.\n"
]
},
{
"cell_type": "code",
"execution_count": 106,
"id": "eb219a46",
"metadata": {
"scrolled": false,
"id": "eb219a46",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 581
},
"outputId": "9c9b6659-34eb-45e6-fa3c-5c38ef00c439"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"845\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
],
"image/png": "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fdpo2LChUbt2bSMzM9PR5s033zTc3NyMLVu2OF3zH//4hyHJSElJceyTZHh6ejr9PNPS0gxJxsKFCx377Ha7MWzYsNse3zUbN240JBnvvPOO0/6mTZsalStXNs6dO+d0XTc3N6N///6OfZMmTTIkGX379r2t61WsWNGIioq67fpiY2ON2NhYx+erV68aubm5Tm3Onz9vVKlSxenf/fPPP2/YbDbj6tWrN+w7KirKePjhh2+7lmuOHz9uPPjgg8arr75qrFmzxpg/f74RFhZmuLm5GR9++GGR+wOA4saMFgCUIWvXrpW7u7tGjBjhtH/06NEyDEMff/yx0/6YmBjHogeSFBYWpu7du+vTTz9Vfn6+KTVdvnxZVqv1uv1eXl6O43ciPz9fn332mXr06OH0Lle1atX0xBNPaOvWrcrOznY655tvvlFsbKyuXLmizZs3O63k98477ygyMlL169fX2bNnHVv79u0l6brH4Dp27Kh77rnH8blJkyay2Ww6evSoY19AQIB27Nihb7/99o7G+GunT5/W3r17lZCQoEqVKjld9w9/+IPWrl173TlDhgy5rb6zs7Pl7+9/x7W5u7vL09NT0i+Ln/z444+6evWqWrRo4TQTFRAQoEuXLt30McCAgAAdOHBAR44cKVINYWFh+vTTTzVkyBDFx8fr+eef1549exQcHKzRo0ff2cAAoBgRtACgDDl+/LhCQkKu+6X52iqEx48fd9pf2Ip/9erV008//aQffvjBlJq8vb0LfQ/r559/dhy/Ez/88IN++uknRUREXHcsMjJSBQUFOnnypNP+p556SmfOnNGmTZtUvXp1p2NHjhzRgQMHFBwc7LTVq1dP0v8tUHFNWFjYddetWLGizp8/7/j88ssv66uvvlJoaKhatmypxMREpyBWFNf+3d1ovGfPntWlS5ec9teqVeu2+rbZbLp48eId1XXNsmXL1KRJE8d7VcHBwfroo4+UlZXlaDN06FDVq1dPDz30kGrUqKFnn332uvfapkyZogsXLqhevXpq3Lixxo4dq3379t1RTZUqVdIzzzyj9PR0ffPNN79rfABgNoIWAOB3qVatWqHLv1/bFxISUmK19OzZUxcuXHBafOGagoICNW7cWOvWrSt0Gzp0qFN7d3f3Qq9h/GrRkd69e+vo0aNauHChQkJCNGvWLDVs2PC6mcXicrshtn79+jp8+PAdLyDxr3/9SwkJCbrnnnv0xhtv6JNPPtG6devUvn17FRQUONpVrlxZe/fu1Zo1a9StWzdt3LhRDz30kJ5++mlHm3bt2ikjI0NLlixRo0aNtHjxYjVv3lyLFy++o9pCQ0MlST/++OMdnQ8AxYXl3QGgDKlZs6bWr1+vixcvOs1qff31147jv1bY41mHDx+Wj4+PgoODTampadOm2rJliwoKCpwWxNixY4d8fHwcM0ZFFRwcLB8fH8eKgb/29ddfy83NzfFL9jV//OMfVadOHU2cOFF2u13jxo1zHLvnnnuUlpamDh063NZqirerWrVqGjp0qIYOHaozZ86oefPmmj59uh566KEi9XPt392NxhsUFHTD5dtvJT4+Xtu3b9d7772nvn37Fvn8d999V7Vr19aqVaucfnaTJk26rq2np6fi4+MVHx+vgoICDR06VK+99pomTJigOnXqSPq/mahnnnlGOTk5ateunRITE+/oO8WuzSCadT8DgFmY0QKAMqRLly7Kz8/XK6+84rR/3rx5slgs1/1yv337dqd3aE6ePKnVq1frwQcfvOGMTVH16tVL33//vVatWuXYd/bsWb3zzjuKj48v9P2t2+Hu7q4HH3xQq1evdlpx7/vvv9eKFSt0//33y2azXXfehAkTNGbMGI0fP16vvvqqY3/v3r116tSpQr8v6vLly9c9lncr+fn5To/NSb/M6ISEhNzRkvbVqlVT06ZNtWzZMl24cMGx/6uvvtJnn3123Zf0FsWQIUNUrVo1jR49utBVIM+cOaNp06bd8Pxr98qvZ/N27Nih7du3O7X79YqMkuTm5qYmTZpIkuNn8ts2fn5+qlOnzi1/ZoU96nrq1CktWbJETZo0UbVq1W56PgCUNGa0AKAMiY+P1wMPPKC//vWvyszMVFRUlD777DOtXr1aI0eOdFq8QZIaNWqkTp06acSIEbJarVq0aJGkX5bIvpX//d//VVpamqRfvvto3759jl/Gu3Xr5vgFulevXrrvvvv0zDPP6ODBgwoKCtKiRYuUn59/W9e5mWnTpmndunW6//77NXToUHl4eOi1115Tbm6uXn755RueN2vWLGVlZWnYsGHy9/fXk08+qaeeekpvv/22hgwZoo0bN6pNmzbKz8/X119/rbfffluffvqpWrRocdu1Xbx4UTVq1FCvXr0UFRUlPz8/rV+/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3YLVatWkSZNktVpdXQpwS9yvKCu4V1GWcL+irOBeLV0sxu2sTQgAAAAAuG3MaAEAAACAyQhaAAAAAGAyghYAAAAAmIygBQAAAAAmK5dB6+9//7vCw8Pl5eWlVq1aaefOnTdt/84776h+/fry8vJS48aNtXbtWqfjhmFo4sSJqlatmry9vdWxY0cdOXKkOIeAcsLse3XVqlV68MEHFRgYKIvFor179xZj9ShvzLxfr1y5oj//+c9q3LixfH19FRISov79++vbb78t7mGgHDD779bExETVr19fvr6+qlixojp27KgdO3YU5xBQjph9v/7akCFDZLFYNH/+fJOrhiTJKGdWrlxpeHp6GkuWLDEOHDhgDBo0yAgICDC+//77QtunpKQY7u7uxssvv2wcPHjQ+Nvf/mZUqFDB2L9/v6PNzJkzDbvdbnzwwQdGWlqa0a1bN6NWrVrG5cuXS2pYuAsVx736z3/+05g8ebLx+uuvG5KMPXv2lNBocLcz+369cOGC0bFjR+Pf//638fXXXxvbt283WrZsaURHR5fksHAXKo6/W5cvX26sW7fOyMjIML766itjwIABhs1mM86cOVNSw8Jdqjju12tWrVplREVFGSEhIca8efOKeSTlU7kLWi1btjSGDRvm+Jyfn2+EhIQYM2bMKLR97969jYcffthpX6tWrYznnnvOMAzDKCgoMKpWrWrMmjXLcfzChQuG1Wo13nrrrWIYAcoLs+/VXzt27BhBC6Yqzvv1mp07dxqSjOPHj5tTNMqlkrhXs7KyDEnG+vXrzSka5VZx3a/ffPONUb16deOrr74yatasSdAqJuXq0cG8vDylpqaqY8eOjn1ubm7q2LGjtm/fXug527dvd2ovSZ06dXK0P3bsmL777junNna7Xa1atbphn8CtFMe9ChSXkrpfs7KyZLFYFBAQYErdKH9K4l7Ny8vT//zP/8hutysqKsq84lHuFNf9WlBQoKeeekpjx45Vw4YNi6d4SCpn72idPXtW+fn5qlKlitP+KlWq6Lvvviv0nO++++6m7a/9syh9ArdSHPcqUFxK4n79+eef9ec//1l9+/aVzWYzp3CUO8V5r3744Yfy8/OTl5eX5s2bp3Xr1ikoKMjcAaBcKa779aWXXpKHh4dGjBhhftFwUq6CFgCg7Lly5Yp69+4twzD06quvurocoFAPPPCA9u7d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\n"
},
"metadata": {}
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"def visualize_top_tokens_for_class(y):\n",
" \"\"\"\n",
" Visualize the top tokens with the highest probabilities for a given class in a barh graph.\n",
"\n",
" Parameters:\n",
" - class_index: Index of the target class for which to visualize top tokens.\n",
" \"\"\"\n",
" # Get the feature log probabilities for the specified class\n",
" feature_log_probs = clf.feature_log_prob_[y//2]\n",
"\n",
" # Get the feature names (tokens) from the vectorizer\n",
" feature_names = TfidfVectorizer.get_feature_names_out()\n",
" print(len(feature_names))\n",
"\n",
" # Sort feature names by their log probabilities in descending order\n",
" sorted_indices = np.argsort(feature_log_probs)[::-1]\n",
"\n",
" top_feature_indices = sorted_indices[:10]\n",
"\n",
" # Get the top tokens and their corresponding log probabilities\n",
" top_tokens = [feature_names[i] for i in top_feature_indices]\n",
" top_probabilities = [np.exp(feature_log_probs[i]) for i in top_feature_indices]\n",
"\n",
" # Create a horizontal bar graph to visualize the top tokens and probabilities\n",
" plt.figure(figsize=(10, 6))\n",
" plt.barh(top_tokens, top_probabilities, color='skyblue')\n",
" plt.xlabel('Probability')\n",
" plt.title(f'Top 10 Tokens for Class {y}')\n",
" plt.gca().invert_yaxis() # Invert the y-axis to display the highest probability at the top\n",
" plt.show()\n",
"\n",
"visualize_top_tokens_for_class(5)\n"
]
},
{
"cell_type": "markdown",
"id": "4600bf66",
"metadata": {
"id": "4600bf66"
},
"source": [
"Que pouvez-vous remanquer à propos des jetons affichés dans le graphique?"
]
},
{
"cell_type": "markdown",
"id": "fa61bab3",
"metadata": {
"id": "fa61bab3"
},
"source": [
"Certains sont communs aux trois classes et la plupart des top10 jetons adjectifs les plus fréquents dans la classe 5 se retrouvent ici également.\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "00579fba",
"metadata": {
"id": "00579fba"
},
"source": [
"<a name='2.2.4'></a>\n",
"#### 2.2.4 Visualisation des erreurs commises (3 points)\n",
"\n",
"Trouvez toutes les phrases dont la vraie valeur est 5 mais la valeur prédite est de 1.\n",
"\n",
"Affichez ces exemples d'une manière lisible.\n"
]
},
{
"cell_type": "code",
"execution_count": 107,
"id": "c4fef76a",
"metadata": {
"id": "c4fef76a",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"outputId": "8bfbe6b5-bf04-4f56-99a3-3db1c346a6b0"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Text: \n",
"['reliabl', 'long', 'last', 'heard', 'one', 'consum', 'guru', 'radio', 'year', 'ago', 'say', 'gener', 'lesser', 'known', 'brand', 'batteri', 'often', 'good', 'name', 'brand', 'tri', 'pack', 'amazonbas', 'aa', 'alkalin', 'batteri', 'instead', 'usual', 'name', 'brand', 'ive', 'bought', 'sever', 'pack', 'sinc', 'although', 'havent', 'done', 'object', 'test', 'appear', 'longlast', 'reliabl', 'brand', 'ive', 'tri', 'batteri', 'instal', 'coupl', 'year', 'ago', 'still', 'charg', 'there', 'leakag', 'corros', 'ive', 'pleas', 'amazonbas', 'alkalin', 'batteri']\n",
"\n",
"Text: \n",
"['come', 'shrinkwrap', 'littl', '4pack', 'obviou', 'matter', 'one', 'brand', 'new', 'scatter', 'abou', 'least', 'expens', 'aa', 'batteri', 'could', 'find', 'come', 'shrinkwrap', 'littl', '4pack', 'obviou', 'matter', 'one', 'brand', 'new', 'scatter', 'hous', 'like', 'batteri', 'fairi', 'there', 'alway', 'fresh', 'pack', 'nearbi']\n",
"\n",
"Text: \n",
"['amazon', 'tripplea', 'topnotch', 'product', 'perfectli', 'sent', 'perfectli', 'usabl']\n",
"\n",
"Text: \n",
"['amazonbas', 'aaa', 'perform', 'alkalin', 'batteri', 'aaa', 'perform', 'alkalin', 'batteri', 'wow', 'amazonbas', 'aaa', 'perform', 'alkalin', 'batteri', 'actual', 'amazonbas', 'aaa', 'perform', 'alkalin', 'batteri', 'work', 'unbeliev']\n",
"\n",
"Text: \n",
"['good', 'everyth', 'expect', 'order', 'onlin', 'pick', 'next', 'day', 'easi']\n",
"\n",
"Text: \n",
"['great', 'packag', 'test', 'show', 'good', 'valu', 'love', 'fact', 'come', 'packag', '4', 'batteri', 'pack', 'put', 'box', 'open', 'close', 'fumbl', 'batteri']\n",
"\n",
"Text: \n",
"['aaaaa', 'fast', 'deliveri', 'aaaaa', 'fast', 'deliveri', 'describ']\n",
"\n",
"Text: \n",
"['save', 'bear', 'attack', 'one', 'day', 'camp', 'wild', 'west', 'rocki', 'mountain', 'colorado', 'carri', 'trusti', 'power', 'ranger', 'limit', 'edit', 'collector', 'sword', 'nowher', 'bear', 'attack', 'grab', 'trusti', 'sword', 'batteri', 'make', 'swoosh', 'sound', 'add', 'effect', 'swing', 'hurriedli', 'went', 'trusti', 'amazonbas', 'aa', 'batteri', 'switch', 'one', 'power', 'ranger', 'sword', 'swoosh', 'sound', 'amaz', 'escap', 'life', 'leg', 'that', 'okay', 'thank', 'amazonbas', 'aa', 'batteri', 'save', 'life']\n",
"\n",
"Text: \n",
"['grandkid', 'first', 'tablet', 'kid', 'never', 'put', 'plenti', 'app', 'keep', 'interest', 'parent', 'lock', 'keep', 'safe']\n",
"\n",
"Text: \n",
"['doesnt', 'need', '2a', 'take', '3a', 'everi', 'year', 'never', 'run']\n",
"\n",
"Text: \n",
"['longest', 'last', 'batteri', 'ever', 'longest', 'last', 'batteri', 'ive', 'ever', 'use', 'bought', 'xbox', 'one', 'control', 'use', 'hour', 'time', 'everi', 'day', 'replac', 'batteri', 'mayb', 'everi', 'coupl', 'week']\n",
"\n",
"Text: \n",
"['yay', 'amazon', 'super', 'excit', 'tri', 'amazon', 'brand', 'item', 'im', 'sure', 'glad', 'branch', 'realli', 'dislik', 'walmart', 'terribl', 'custom', 'servic', 'typic', 'purchas', 'batteri', 'bj', 'two', 'kid', 'ton', 'toy', 'amazon', 'price', 'batteri', 'beat', 'bj', '5', '6', 'depend', 'size', 'plu', 'even', 'bj', 'cant', 'get', '48', 'pack', 'aa', 'packag', 'simpl', 'fine', 'noth', 'must', 'say', 'like', 'open', 'packag', 'better', 'amazon', 'normal', 'batteri', 'hate', 'thick', 'plastic', 'hard', 'cut', 'sometim', 'sharp', 'plu', 'amazon', 'packag', 'better', 'environ', 'instal', 'batteri', 'yesterday', 'ill', 'updat', 'long', 'last']\n",
"\n",
"Text: \n",
"['work', 'well', 'cost', 'less', 'bulk', 'batteri', 'must', 'three', 'kid', 'two', 'twin', 'toddler', 'batteri', 'oper', 'toy', 'save', 'saniti', 'wish', 'toy', 'recharg', 'though', 'toy', 'compani', 'catch', 'us', 'reli', 'amazon', 'basic', 'provid', 'us', 'need', 'effici', 'cost', 'batteri', 'last', 'long', 'time', 'energen', 'batteri', 'bit', 'longer', 'last', 'suit', 'fine', 'get', 'subscript']\n",
"\n",
"Text: \n",
"['aa', 'batteri', 'batteri', 'lot', 'better', 'thought', 'go', 'actual', 'last', 'longer', 'name', 'brand', 'batteri', 'duracel', 'energ', 'definit', 'order', 'futur', 'first', 'time', 'buy', 'mani', 'batteri', 'never', 'let', 'arriv', 'time', 'problem']\n",
"\n",
"Text: \n",
"['batteri', 'appear', 'work', 'great', 'ive', 'use', 'two', 'aa', 'xbox', 'batteri', 'appear', 'work', 'great', 'ive', 'use', 'two', 'aa', 'xbox', 'one', 'control', 'month', 'get', 'sale', 'like', 'buy', 'buy', 'buy']\n",
"\n",
"Text: \n",
"['fast', 'charger', 'bought', 'charger', 'kindl', 'voyag', 'great']\n",
"\n",
"Text: \n",
"['awesom', 'still', 'run', 'strong', 'string', 'batteryoper', 'light', 'whole', 'week', '8hour', 'shift', 'dark']\n",
"\n",
"Text: \n",
"['great', 'product', 'second', 'one', 'must', 'one', 'time']\n",
"\n"
]
}
],
"source": [
"misclassified_examples = [] # List to store misclassified examples\n",
"\n",
"y_true = test[\"rating\"]\n",
"y_true = y_true.to_numpy()\n",
"\n",
"for i in range(len(y_true)):\n",
" true_rating = y_true[i]\n",
" predicted_rating = y_pred[i]\n",
" if true_rating == 5 and predicted_rating == 1:\n",
" misclassified_examples.append(test[\"text\"].iloc[i])\n",
"# Print the misclassified examples\n",
"\n",
"for example in misclassified_examples:\n",
" print(\"Text: \")\n",
" print(example)\n",
" print(\"\")"
]
},
{
"cell_type": "markdown",
"id": "cffb9d00",
"metadata": {
"id": "cffb9d00"
},
"source": [
"<a name='2.2.5'></a>\n",
"#### 2.2.5 Analyse d'erreurs commises (7 points)"
]
},
{
"cell_type": "markdown",
"id": "204c7fff",
"metadata": {
"id": "204c7fff"
},
"source": [
"Complétez la fonction plot_example qui:\n",
" - Prend en entrée une liste de jetons provenant d'un exemple.\n",
" - Produit un graphique qui pour chaque jeton, affiche la valeur P(x_i|y=5) et P(x_i|y=1)\n",
" \n",
"**Pour vous faciliter le travail, utiliser barh de pandas et non de matplotlib**: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.barh.html\n",
"\n",
"\n",
"#### a) Exécutez votre fonction avec une phrase au choix dont la vraie valeur est 5 mais la valeur prédite est de 1. (4 points)"
]
},
{
"cell_type": "code",
"execution_count": 108,
"id": "0795de9d",
"metadata": {
"id": "0795de9d"
},
"outputs": [],
"source": [
"def plot_example(tokens):\n",
" feature_names = TfidfVectorizer.get_feature_names_out()\n",
" feature_log_probs_1 = clf.feature_log_prob_[1//2]\n",
" feature_log_probs_5 = clf.feature_log_prob_[5//2]\n",
"\n",
" indices = []\n",
" for i in range(len(feature_names)):\n",
" token = feature_names[i]\n",
" if token in tokens: # ///////////////\n",
" indices += [i]\n",
" probs_1 = [np.exp(feature_log_probs_1[i]) for i in indices]\n",
" probs_5 = [np.exp(feature_log_probs_5[i]) for i in indices]\n",
"\n",
" df = pd.DataFrame({'Token': [feature_names[i] for i in indices], 'P(x_i|y=1)': probs_1, 'P(x_i|y=5)': probs_5})\n",
"\n",
" df.set_index('Token').plot.barh(figsize=(20, 16))\n",
"\n",
" # Customize the plot\n",
" plt.xlabel('Probability')\n",
" plt.title('Token Probabilities for Classes 1 and 5')\n",
" plt.gca().invert_yaxis() # Invert the y-axis to display the highest probability at the top\n",
" plt.show()\n",
"\n",
"tokens1 = ['power', 'craziest', 'thing', 'put', 'stuff', 'need', 'batteri', 'thing', 'work', 'great', 'price', 'quantiti']\n",
"tokens2 = ['batteri', 'day', 'price', 'buy', 'buy', '8pack', 'store', 'pay', 'similar', 'lifespan', 'havent', 'notic', 'differencewhen', 'retir', '30', 'year', 'ill', 'probabl', 'buy', 'case', 'get', 'last', 'year', 'last']\n",
"tokens3 = ['batteri', 'appear', 'work', 'great', 'ive', 'use', 'two', 'aa', 'xbox', 'batteri', 'appear', 'work', 'great', 'ive', 'use', 'two', 'aa', 'xbox', 'one', 'control', 'month', 'get', 'sale', 'like', 'buy', 'buy', 'buy']\n"
]
},
{
"cell_type": "code",
"source": [
"plot_example(tokens1)\n",
"plot_example(tokens2)\n",
"plot_example(tokens3)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 3951
},
"id": "B7_JglhL9zlL",
"outputId": "786d6cce-5d75-46ac-d755-1db34f7ae81e"
},
"id": "B7_JglhL9zlL",
"execution_count": 109,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 2000x1600 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAABnUAAAUlCAYAAADGB0OvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACII0lEQVR4nOzde9zXg/3/8eenrq6r43XFKmQpckjGtwg5lpgQxr7WmKGRc6Nh5jBT2JyZw5jDl+SwDZvjclZG+2JGZjk15Jg5zZWUoj6/P/xcX5cOuurK5V33++32ud36vI+v9/W52m3rsff7UyqXy+UAAAAAAADwtdasqQcAAAAAAADgy4k6AAAAAAAABSDqAAAAAAAAFICoAwAAAAAAUACiDgAAAAAAQAGIOgAAAAAAAAUg6gAAAAAAABSAqAMAAAAAAFAAog4AAAAAAEABiDoAANCISqVShg0b1tRjfKVGjRqVUqmUxx57rNGO2b9//3zrW9/60u0mT56cUqmUUaNG1S0bMWJESqVSve26deuWIUOGLPS5+/fv34BpF98nn3ySo48+Ol26dEmzZs2yyy67fKXnX5Bx48alVCpl3LhxTT3KMu+zv2uTJ09u6lEAAGgiog4AAMu8Uqm0UK+i/aN2//79682//PLLZ8MNN8wVV1yROXPmNPV4Terpp5/OiBEjvjb/OH7FFVfkzDPPzG677ZarrroqP/nJT76S8950003Zfvvt06FDh1RWVqZz584ZPHhw7r///q/k/F8Xjz76aA455JBssMEGadGixVxRsGg+iz/zer355ptNPR4AAIuhoqkHAACApnb11VfXez969Ojcc889cy1fe+21v8qxGsU3v/nNnHrqqUmSt99+O6NHj85+++2X559/PqeddloTT7f4unbtmhkzZqRFixYL3O65555Ls2b/9/9pe/rppzNy5Mj0798/3bp1q7ft3XffvSRGXaD7778/K6+8cs4999yv5Hzlcjn77rtvRo0ald69e+eII47IiiuumClTpuSmm27K1ltvnfHjx2fTTTf9SuZpamPGjMnll1+e9dZbL6uttlqef/75ph6pUZx00klZddVV6y1r37590wwDAECjEHUAAFjm/fCHP6z3/uGHH84999wz1/IiqqmpqXcdBx54YNZaa61ceOGFOfnkk+cZQ+bMmZNZs2alZcuWX+Woi6RUKi3UnFVVVQt9zMrKysUZaZG89dZbjfqP7V/2GZ599tkZNWpUhg8fnnPOOafenSnHH398rr766lRULDv/c/Hggw/Oz372s7Rq1SrDhg1baqLO9ttvnz59+jT1GAAANCKPXwMAgIXw4Ycf5sgjj0yXLl1SVVWVtdZaK2eddVbK5fKX7nvKKaekWbNmueCCC+qW3XHHHdliiy3Spk2btGvXLoMGDcrEiRPr7TdkyJC0bds2r7/+enbZZZe0bds2HTt2zFFHHZXZs2cv0nW0bt06ffv2zYcffpi33347yf99D9C1116bddZZJ1VVVbnzzjuTJE888US23377VFdXp23bttl6663z8MMPz/PY06dPz4EHHphvfOMbqa6uzt57753//Oc/9ba55ZZbMmjQoHTu3DlVVVXp3r17Tj755Plez9///vdsuummadWqVVZdddX89re/rbd+Xt+pMy+f/06dUaNG5Xvf+16SZKuttprr8Xrz+k6dmTNn5sQTT8zqq6+eqqqqdOnSJUcffXRmzpxZb7t77rknm2++edq3b5+2bdtmrbXWynHHHTffuT6bf+zYsZk4ceJcsyzs792CPsMvmjFjRk499dT06NEjZ5111jwfNbbXXntlo402mu/cDz74YL73ve9llVVWqft5/OQnP8mMGTPqbffmm2/mRz/6Ub75zW+mqqoqK620Ur7zne/Ue+zdY489loEDB6ZDhw51n/O+++5b7zhz5szJr3/966yzzjpp2bJlVlhhhRx44IFz/X4tzLHmZYUVVkirVq2+dLv5ufLKKzNgwIB06tQpVVVV6dmzZy6++OK5tuvWrVt23HHHPPTQQ9loo43SsmXLrLbaahk9evRc206cODEDBgxIq1at8s1vfjOnnHLKIj028YMPPljk/7wAAODrZ9n5v14BAMAiKpfL2XnnnTN27Njst99+6dWrV+6666789Kc/zeuvv77AR2b9/Oc/z69+9atccskl2X///ZN8+ri3ffbZJwMHDszpp5+e6dOn5+KLL87mm2+eJ554ot7jwGbPnp2BAwdm4403zllnnZV77703Z599drp3756DDz54ka7nxRdfTPPmzevdGXL//ffn+uuvz7Bhw9KhQ4d069YtEydOzBZbbJHq6uocffTRadGiRS655JL0798/DzzwQDbeeON6xx02bFjat2+fESNG5LnnnsvFF1+cl19+OePGjasLB6NGjUrbtm1zxBFHpG3btrn//vvzi1/8IlOnTs2ZZ55Z73j/+c9/ssMOO2Tw4MHZY489cv311+fggw9OZWXlQv1D/fxsueWWOeyww3L++efnuOOOq3us3vwerzdnzpzsvPPOeeihh3LAAQdk7bXXzlNPPZVzzz03zz//fG6++eYkn/4j/I477pj11lsvJ510UqqqqvKvf/0r48ePn+8sHTt2zNVXX51f/vKXmTZtWt2j8tZee+0G/97N6zOcl4ceeijvvfdehg8fnubNmzfwp/epG264IdOnT8/BBx+cb3zjG3n00UdzwQUX5LXXXssNN9xQt91///d/Z+LEifnxj3+cbt265a233so999yTV155pe79tttum44dO+aYY45J+/btM3ny5PzpT3+qd74DDzwwo0aNyo9+9KMcdthheemll3LhhRfmiSeeyPjx49OiRYuFPtaScPHFF2edddbJzjvvnIqKitx222055JBDMmfOnBx66KH1tv3Xv/6V3XbbLfvtt1/22WefXHHFFRkyZEg22GCDrLPOOkk+jWFbbbVVPvnkkxxzzDFp06ZNLr300gaHp6222irTpk1LZWVlBg4cmLPPPjtrrLFGo103AABNoAwAANRz6KGHlj//X5VvvvnmcpLyKaecUm+73XbbrVwqlcr/+te/6pYlKR966KHlcrlcPvLII8vNmjUrjxo1qm79Bx98UG7fvn15//33r3esN998s1xTU1Nv+T777FNOUj7ppJPqbdu7d+/yBhts8KXX0a9fv3KPHj3Kb7/9dvntt98uP/PMM+XDDjusnKS800471Zu5WbNm5YkTJ9bbf5dddilXVlaWX3jhhbplb7zxRrldu3blLbfcsm7ZlVdeWU5S3mCDDcqzZs2qW37GGWeUk5RvueWWumXTp0+fa84DDzyw3Lp16/JHH31Ub/Yk5bPPPrtu2cyZM8u9evUqd+rUqe48L730UjlJ+corr6zb7sQTTyx/8X/qdO3atbzPPvvUvb/hhhvKScpjx46d58+tX79+de+vvvrqcrNmzcoPPvhgve1++9vflpOUx48fXy6Xy+Vzzz23nKT89ttvz3XML9OvX7/yOuusU29ZQ3/v5vUZzst5551XTlK+6aabFmq2sWPHzvWzmtfneOqpp5ZLpVL55ZdfLpfL5fJ//vOfcpLymWeeOd9j33TTTeUk5b/97W/z3ebBBx8sJylfe+219Zbfeeed9ZYvzLEWxhf//i+Mef08Bg4cWF5ttdXqLevatWs5Sfkvf/lL3bK33nqrXFVVVT7yyCPrlg0fPrycpPzII4/U266mpqacpPzSSy8tcJ4//OEP5SFDhpSvuuqq8k033VT++c9/Xm7dunW5Q4cO5VdeeaVB1wYAwNeLx68BAMCXGDNmTJo3b57DDjus3vIjjzwy5XI5d9xxR73l5XI5w4YNy3nnnZdrrrkm++yzT926e+65J++//3722GOPvPPOO3Wv5s2bZ+ONN87YsWPnOv9BBx1U7/0WW2yRF198caFmf/bZZ9OxY8d07Ngxa6+9di644IIMGjQoV1xxRb3t+vXrl549e9a9nz17du6+++7ssssuWW211eqWr7TSSvnBD36Qhx56KFOnTq13jAMOOKDed/QcfPDBqaioyJgxY+qWff5Ogw8++CDvvPNOtthii0yfPj3PPvtsveNVVFTkwAMPrHtfWVmZAw88MG+99Vb+/ve/L9T1N4Ybbrgha6+9dnr06FHvMxswYECS1H1mn935dMsttyzSY7K+qKG/d1/8DOfns8+tXbt2izzb5z/HDz/8MO+880423XTTlMvlPPHEE3XbVFZWZty4cXM9Ju0zn/3Mbr/99nz88cfz3OaGG25ITU1Nvv3tb9f7+W+wwQZp27btXD//BR1rSfn8z6O2tjbvvPNO+vXrlxdffDG1tbX1tu3Zs2e22GKLuvcdO3bMWmutVe/v9JgxY9K3b996j8Dr2LFj9txzz4WaZ/Dgwbnyyiuz9957Z5dddsnJJ5+cu+66K++++25++ctfLuplAgDwNSDqAADAl3j55ZfTuXPnuf4R/LPHdb388sv1lo8ePTq/+c1vcsEFF2SPPfaot27SpElJkgEDBtTFls9ed999d956661627ds2TIdO3ast2y55Zab7z+Sf1G3bt1yzz335N57781DDz2UN998M7fffns6dOhQb7tVV1213vu3334706dPz1prrTXXMddee+3MmTMnr776ar3lX3ysU9u2bbPSSivV+/6UiRMnZtddd01NTU2qq6vTsWPH/PCHP0ySuf7xu3PnzmnTpk29ZWuuuWaS1DvmkjZp0qRMnDhxrs/rs1k++8y+//3vZ7PNNsvQoUOzwgorZPfdd8/111+/yIGnob93X/wM56e6ujrJp1FtUb3yyisZMmRIll9++brveurXr1+S//scq6qqcvrpp+eOO+7ICiuskC233DJnnHFG3nzzzbrj9OvXL//93/+dkSNHpkOHDvnOd76TK6+8st53FU2aNCm1tbXp1KnTXJ/BtGnT6n7+C3OsJWX8+PHZZptt0qZNm7Rv3z4dO3as+y6lL/5er7LKKnPt/8W/0y+//PI8H5M2r7+PC2vzzTfPxhtvnHvvvXeRjwEAQNPznToAANDINttss0yYMCEXXnhhBg8enOWXX75u3Wf/wH/11VdnxRVXnGvfior6/xV9Ub/z5DNt2rTJNtts86XbLc6XxC+s999/P/369Ut1dXVOOumkdO/ePS1btszjjz+en/3sZ41yd8uSMGfOnKy77ro555xz5rm+S5cuST79Gf7lL3/J2LFj8+c//zl33nln/vCHP2TAgAG5++67F/uz/DIL+xn26NEjSfLUU09ll112afB5Zs+enW9/+9t577338rOf/Sw9evRImzZt8vrrr2fIkCH1Psfhw4dnp512ys0335y77rorJ5xwQk499dTcf//96d27d0qlUm688cY8/PDDue2223LXXXdl3333zdlnn52HH344bdu2zZw5c9KpU6dce+2185zns+i5MMdaEl544YVsvfXW6dGjR84555x06dIllZWVGTNmTM4999y5fq/n93tQLpeXyHyf16VLlzz33HNL/DwAACw5og4AAHyJrl275t57780HH3xQ766Jzx4X1rVr13rbr7766jnjjDPSv3//bLfddrnvvvvq9uvevXuSpFOnTgsVW5pKx44d07p163n+A/Czzz6bZs2a1cWMz0yaNClbbbVV3ftp06ZlypQp2WGHHZIk48aNy7vvvps//elP2XLLLeu2e+mll+Y5wxtvvJEPP/yw3t06zz//fJJP70BaHKVSaaG37d69e5588slsvfXWX7pfs2bNsvXWW2frrbfOOeeck1/96lc5/vjjM3bs2AZ/3g39vVtYm2++eZZbbrn87ne/y3HHHdfg2PTUU0/l+eefz1VXXZW99967bvk999wzz+27d++eI488MkceeWQmTZqUXr165eyzz84111xTt03fvn3Tt2/f/PKXv8x1112XPffcM7///e8zdOjQdO/ePffee28222yzhQpXCzrWknDbbbdl5syZufXWW+vdhTOvRykurK5du9bd1fd5ixtkXnzxxbnu/AMAoFg8fg0AAL7EDjvskNmzZ+fCCy+st/zcc89NqVTK9ttvP9c+6623XsaMGZNnnnkmO+20U2bMmJEkGThwYKqrq/OrX/1qnt/78fbbby+Zi2ig5s2bZ9ttt80tt9xS71Fn//73v3Pddddl8803r3uM12cuvfTSetd08cUX55NPPqn7+XwWDz5/R8KsWbNy0UUXzXOGTz75JJdcckm9bS+55JJ07NgxG2ywwWJd32eh6P333//SbQcPHpzXX389l1122VzrZsyYkQ8//DBJ8t577821vlevXkmySI8AW5Tfu4XRunXr/OxnP8szzzyTn/3sZ/O8Q+Saa67Jo48+Os/95/U5lsvlnHfeefW2mz59ej766KN6y7p375527drV/Tz+85//zHX+L/7MBg8enNmzZ+fkk0+ea5ZPPvmk7jNcmGMtCfP6edTW1ubKK69c5GPusMMOefjhh+t9Bm+//fZ871b6onn958iYMWPy97//Pdttt90izwUAQNNzpw4AAHyJnXbaKVtttVWOP/74TJ48Of/1X/+Vu+++O7fcckuGDx9ed/fNF/Xt2ze33HJLdthhh+y22265+eabU11dnYsvvjh77bVX1l9//ey+++7p2LFjXnnllfz5z3/OZpttNtc/4jeVU045Jffcc08233zzHHLIIamoqMgll1ySmTNn5owzzphr+1mzZmXrrbfO4MGD89xzz+Wiiy7K5ptvnp133jlJsummm2a55ZbLPvvsk8MOOyylUilXX331fB871blz55x++umZPHly1lxzzfzhD3/IhAkTcumll6ZFixaLdW29evVK8+bNc/rpp6e2tjZVVVUZMGBAOnXqNNe2e+21V66//vocdNBBGTt2bDbbbLPMnj07zz77bK6//vrcdddd6dOnT0466aT85S9/yaBBg9K1a9e89dZbueiii/LNb34zm2++eYNnXNTfu4Xx05/+NBMnTszZZ5+dsWPHZrfddsuKK66YN998MzfffHMeffTR/PWvf53nvj169Ej37t1z1FFH5fXXX091dXX++Mc/zvU9T88//3zd70PPnj1TUVGRm266Kf/+97+z++67J0muuuqqXHTRRdl1113TvXv3fPDBB7nssstSXV1dd4dXv379cuCBB+bUU0/NhAkTsu2226ZFixaZNGlSbrjhhpx33nnZbbfdFupY8/Pyyy/n6quvTpI89thjST79/U8+vWtmr732mu++2267bSorK7PTTjvlwAMPzLRp03LZZZelU6dOmTJlykJ8GnM7+uijc/XVV2e77bbL4YcfnjZt2uTSSy9N165d849//ONL9990003Tu3fv9OnTJzU1NXn88cdzxRVXpEuXLnXf9QMAQEGVAQCAeg499NDyF/+r8gcffFD+yU9+Uu7cuXO5RYsW5TXWWKN85plnlufMmVNvuyTlQw89tN6yW265pVxRUVH+/ve/X549e3a5XC6Xx44dWx44cGC5pqam3LJly3L37t3LQ4YMKT/22GN1++2zzz7lNm3azDXfiSeeONd889KvX7/yOuus86XbzWvmzzz++OPlgQMHltu2bVtu3bp1eauttir/9a9/rbfNlVdeWU5SfuCBB8oHHHBAebnlliu3bdu2vOeee5bffffdetuOHz++3Ldv33KrVq3KnTt3Lh999NHlu+66q5ykPHbs2Llmf+yxx8qbbLJJuWXLluWuXbuWL7zwwnrHe+mll8pJyldeeWXdsnn9fLp27VreZ5996i277LLLyquttlq5efPm9c7fr1+/cr9+/eptO2vWrPLpp59eXmeddcpVVVXl5ZZbrrzBBhuUR44cWa6trS2Xy+XyfffdV/7Od75T7ty5c7mysrLcuXPn8h577FF+/vnn5/mz/bz5fVaL83u3MG688cbytttuW15++eXLFRUV5ZVWWqn8/e9/vzxu3Li6bcaOHTvX5/P000+Xt9lmm3Lbtm3LHTp0KO+///7lJ598st5n8c4775QPPfTQco8ePcpt2rQp19TUlDfeeOPy9ddfX3ecxx9/vLzHHnuUV1lllXJVVVW5U6dO5R133LHe34PPXHrppeUNNtig3KpVq3K7du3K6667bvnoo48uv/HGGw0+1hd9do3zen3xd2Febr311vJ6661XbtmyZblbt27l008/vXzFFVeUk5Rfeumluu26du1aHjRo0Fz7z+t37h//+Ee5X79+5ZYtW5ZXXnnl8sknn1z+n//5n7mOOS/HH398uVevXuWamppyixYtyqusskr54IMPLr/55ptfei0AAHy9lcrlr+DbGAEAAAAAAFgsvlMHAAAAAACgAEQdAAAAAACAAhB1AAAAAAAACkDUAQAAAAAAKABRBwAAAAAAoABEHQAAAAAAgAKoaOoBljVz5szJG2+8kXbt2qVUKjX1OAAAAAAAQBMql8v54IMP0rlz5zRrtuB7cUSdr9gbb7yRLl26NPUYAAAAAADA18irr76ab37zmwvcRtT5irVr1y7Jpx9OdXV1E08DAAAAAAA0palTp6ZLly51/WBBRJ2v2GePXKuurhZ1AAAAAACAJFmor2xZ8MPZAAAAAAAA+FoQdQAAAAAAAApA1AEAAAAAACgA36kDAAAAAABNrFwu55NPPsns2bObehQaWfPmzVNRUbFQ35nzZUQdAAAAAABoQrNmzcqUKVMyffr0ph6FJaR169ZZaaWVUllZuVjHEXUAAAAAAKCJzJkzJy+99FKaN2+ezp07p7KyslHu6ODroVwuZ9asWXn77bfz0ksvZY011kizZov+zTiiDgAAAAAANJFZs2Zlzpw56dKlS1q3bt3U47AEtGrVKi1atMjLL7+cWbNmpWXLlot8rEXPQQAAAAAAQKNYnLs3+PprrM/XbwkAAAAAAEABiDoAAAAAAAAF4Dt1AAAAAADga6jbMX/+Ss83+bRBjX7MvfbaK2uvvXaOO+64xT7WkCFD8v777+fmm29OkowbNy5DhgzJ5MmTF/vYi+rOO+/MMccck8cff/wreYSeO3UAAAAAAIAGGzJkSEqlUkqlUiorK7P66qvnpJNOyieffJIkefLJJzNmzJgcdthhjXK+8847L6NGjWqUYy2sww47LBtssEGqqqrSq1evudZvt912adGiRa699tqvZB5RBwAAAAAAWCTbbbddpkyZkkmTJuXII4/MiBEjcuaZZyZJLrjggnzve99L27ZtG+VcNTU1ad++faMcqyH23XfffP/735/v+iFDhuT888//SmYRdQAAAAAAgEVSVVWVFVdcMV27ds3BBx+cbbbZJrfeemtmz56dG2+8MTvttFPdts8++2xat26d6667rm7Z9ddfn1atWuXpp5/+0nMNGTIku+yyy3zXDxgwIMOGDau37O23305lZWXuu+++hl9ckvPPPz+HHnpoVltttflus9NOO+Wxxx7LCy+8sEjnaAhRBwAAAAAAaBStWrXKrFmz8o9//CO1tbXp06dP3boePXrkrLPOyiGHHJJXXnklr732Wg466KCcfvrp6dmz52Kfe+jQobnuuusyc+bMumXXXHNNVl555QwYMCBJctBBB6Vt27YLfDXUKquskhVWWCEPPvjgYl/Dl6lY4mcAAAAAAACWauVyOffdd1/uuuuu/PjHP87LL7+c5s2bp1OnTvW2O+SQQzJmzJj88Ic/TGVlZTbccMP8+Mc/bpQZvvvd72bYsGG55ZZbMnjw4CTJqFGj6r77J0lOOumkHHXUUY1yvs/r3LlzXn755UY/7heJOgAAAAAAwCK5/fbb07Zt23z88ceZM2dOfvCDH2TEiBG59dZbU1VVVRdTPu+KK67ImmuumWbNmmXixInz3GZRtGzZMnvttVeuuOKKDB48OI8//nj++c9/5tZbb63bplOnTnOFpsbQqlWrTJ8+vdGP+0WiDgAAAAAAsEi22mqrXHzxxamsrEznzp1TUfFpdujQoUOmT5+eWbNmpbKyst4+Tz75ZD788MM0a9YsU6ZMyUorrdRo8wwdOjS9evXKa6+9liuvvDIDBgxI165d69YfdNBBueaaaxZ4jGnTpjX4vO+99146duzY4P0aStQBAAAAAAAWSZs2bbL66qvPtbxXr15Jkqeffrruz8mn8WPIkCE5/vjjM2XKlOy55555/PHH06pVq0aZZ911102fPn1y2WWX5brrrsuFF15Yb/2SePzaRx99lBdeeCG9e/du1OPOi6gDAAAAAAA0qo4dO2b99dfPQw89VC/qHHTQQenSpUt+/vOfZ+bMmendu3eOOuqo/OY3v2m0cw8dOjTDhg1LmzZtsuuuu9Zb19DHr/3rX//KtGnT8uabb2bGjBmZMGFCkqRnz551dyA9/PDDqaqqyiabbNJo1zA/og4AAAAAAHwNTT5tUFOPsFiGDh2a0aNHZ9iwYUmS0aNHZ8yYMXniiSdSUVGRioqKXHPNNdl8882z4447Zvvtt2+U8+6xxx4ZPnx49thjj7Rs2XKxjjV06NA88MADde8/uxvnpZdeSrdu3ZIkv/vd77LnnnumdevWi3WuhVEql8vlJX4W6kydOjU1NTWpra1NdXV1U48DAAAAAEAT+uijj/LSSy9l1VVXXewA8XUzY8aMrLXWWvnDH/6wRO5iGTduXIYMGZLJkyfXWz558uR07949f/vb37L++us3+nk/75133slaa62Vxx57LKuuuup8t1vQ59yQbuBOHQAAAAAAoNG1atUqo0ePzjvvvPOVnO/jjz/Ou+++m5///Ofp27fvEg86yacB6aKLLlpg0GlMog4AAAAAALBE9O/ff6G3bdu27XzX3XHHHdliiy0WuP/48eOz1VZbZc0118yNN9640OddHH369EmfPn2+knMlog4AAAAAAPA1MGHChPmuW3nlleda1q1btwwfPrzuff/+/bO0f+OMqAMAAAAAADS51VdfvUHbfzHqLAuaNfUAAAAAAAAAfDlRBwAAAAAAoAA8fq2JfOvEu9KsqnVTjwGLZfJpg5p6BAAAAACAZYY7dQAAAAAAAApA1AEAAAAAACgAUQcAAAAAAKAAfKcOAAAAAAB8HY2o+YrPV9voh9xrr72y9tpr57jjjlvsYw0ZMiTvv/9+br755iTJuHHjMmTIkEyePHmxj72ofvvb3+bPf/5zbrvttq/kfO7UAQAAAAAAGmzIkCEplUoplUqprKzM6quvnpNOOimffPJJkuTJJ5/MmDFjcthhhzXK+c4777yMGjWqUY61sD67vs+/fv/739et33ffffP444/nwQcf/ErmcacOAAAAAACwSLbbbrtceeWVmTlzZsaMGZNDDz00LVq0yLHHHpsLLrgg3/ve99K2bdtGOVdNzVd859L/d+WVV2a77bare9++ffu6P1dWVuYHP/hBzj///GyxxRZLfBZ36gAAAAAAAIukqqoqK664Yrp27ZqDDz4422yzTW699dbMnj07N954Y3baaae6bZ999tm0bt061113Xd2y66+/Pq1atcrTTz/9pecaMmRIdtlll/muHzBgQIYNG1Zv2dtvv53Kysrcd999Db+4/699+/ZZccUV614tW7ast36nnXbKrbfemhkzZizyORaWqAMAAAAAADSKVq1aZdasWfnHP/6R2tra9OnTp25djx49ctZZZ+WQQw7JK6+8ktdeey0HHXRQTj/99PTs2XOxzz106NBcd911mTlzZt2ya665JiuvvHIGDBiQJDnooIPStm3bBb6+6NBDD02HDh2y0UYb5Yorrki5XK63vk+fPvnkk0/yyCOPLPY1fBmPXwMAAAAAABZLuVzOfffdl7vuuis//vGP8/LLL6d58+bp1KlTve0OOeSQjBkzJj/84Q9TWVmZDTfcMD/+8Y8bZYbvfve7GTZsWG655ZYMHjw4STJq1Ki67/5JkpNOOilHHXXUQh/zpJNOyoABA9K6devcfffdOeSQQzJt2rR63xPUunXr1NTU5OWXX26U61gQUQcAAAAAAFgkt99+e9q2bZuPP/44c+bMyQ9+8IOMGDEit956a6qqqupiyuddccUVWXPNNdOsWbNMnDhxntssipYtW2avvfbKFVdckcGDB+fxxx/PP//5z9x6661123Tq1Gmu0LQgJ5xwQt2fe/funQ8//DBnnnlmvaiTfHqH0vTp0xf/Ir6Ex68BAAAAAACLZKuttsqECRMyadKkzJgxI1dddVXatGmTDh06ZPr06Zk1a9Zc+zz55JP58MMP8+GHH2bKlCmNOs/QoUNzzz335LXXXsuVV16ZAQMGpGvXrnXrF+Xxa5+38cYb57XXXqv3iLckee+999KxY8dGvZZ5cacOAAAAAACwSNq0aZPVV199ruW9evVKkjz99NN1f04+jR9DhgzJ8ccfnylTpmTPPffM448/nlatWjXKPOuuu2769OmTyy67LNddd10uvPDCeusb+vi1L5owYUKWW265VFVV1S174YUX8tFHH6V3796LfNyFJeoAAAAAAACNqmPHjll//fXz0EMP1Ys6Bx10ULp06ZKf//znmTlzZnr37p2jjjoqv/nNbxrt3EOHDs2wYcPSpk2b7LrrrvXWNeTxa7fddlv+/e9/p2/fvmnZsmXuueee/OpXv5orCj344INZbbXV0r1790a7hvkRdQAAAAAA4OtoRG1TT7BYhg4dmtGjR2fYsGFJktGjR2fMmDF54oknUlFRkYqKilxzzTXZfPPNs+OOO2b77bdvlPPuscceGT58ePbYY4+0bNlykY/TokWL/OY3v8lPfvKTlMvlrL766jnnnHOy//7719vud7/73VzLlpRSuVwufyVnIkkyderU1NTUpMvw69OsqnVTjwOLZfJpg5p6BAAAAAAotI8++igvvfRSVl111cUKEF9HM2bMyFprrZU//OEP2WSTTRr9+OPGjcuQIUMyefLkessnT56c7t27529/+1vWX3/9Rj/v502cODEDBgzI888/n5qamvlut6DP+bNuUFtbm+rq6gWez506AAAAAABAo2vVqlVGjx6dd9555ys538cff5x33303P//5z9O3b98lHnSSZMqUKRk9evQCg05jEnUAAAAAAIAlon///gu9bdu2bee77o477sgWW2yxwP3Hjx+frbbaKmuuuWZuvPHGhT7v4thmm22+kvN8RtQBAAAAAACa3IQJE+a7buWVV55rWbdu3TJ8+PC69/3798/S/o0zog4A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AAAACkDUAQAAAAAAKABRBwAAAAAAoABEHQAAAAAAgAIQdQAAAAAAAApA1AEAAAAAACgAUQcAAAAAAKAARB0AAAAAAIACEHUAAAAAAAAKQNQBAAAAAAAoAFEHAAAAAACgAEQdAAAAAACAAhB1AAAAAAAACkDUAQAAAAAAKIBlOupMnjw5pVIpEyZMaOpRAAAAAAAAFqiiqQdoSl26dMmUKVPSoUOHph4FAAAAAABggZbZqDNr1qxUVlZmxRVXbOpRAAAAAAAAvtRS8/i1/v37Z9iwYRk2bFhqamrSoUOHnHDCCSmXy0mSbt265eSTT87ee++d6urqHHDAAfN8/NrEiROz4447prq6Ou3atcsWW2yRF154oW795ZdfnrXXXjstW7ZMjx49ctFFF33VlwoAAAAAACyDlqo7da666qrst99+efTRR/PYY4/lgAMOyCqrrJL9998/SXLWWWflF7/4RU488cR57v/6669nyy23TP/+/XP//fenuro648ePzyeffJIkufbaa/OLX/wiF154YXr37p0nnngi+++/f9q0aZN99tlnnsecOXNmZs6cWfd+6tSpjXzVAAAAAADAsqBU/uxWloLr379/3nrrrUycODGlUilJcswxx+TWW2/N008/nW7duqV379656aab6vaZPHlyVl111TzxxBPp1atXjjvuuPz+97/Pc889lxYtWsx1jtVXXz0nn3xy9thjj7plp5xySsaMGZO//vWv85xrxIgRGTly5FzLa49pl+qq0uJeNgAAy4IRtU09AQAAAEvI1KlTU1NTk9ra2lRXVy9w26Xm8WtJ0rdv37qgkySbbLJJJk2alNmzZydJ+vTps8D9J0yYkC222GKeQefDDz/MCy+8kP322y9t27ate51yyin1Hs/2Rccee2xqa2vrXq+++uoiXh0AAAAAALAsW6oev/Zl2rRps8D1rVq1mu+6adOmJUkuu+yybLzxxvXWNW/efL77VVVVpaqqqgFTAgAAAAAAzG2pijqPPPJIvfcPP/xw1lhjjQVGl89bb731ctVVV+Xjjz+e626dFVZYIZ07d86LL76YPffcs9FmBgAAAAAAWBhL1ePXXnnllRxxxBF57rnn8rvf/S4XXHBBDj/88IXef9iwYZk6dWp23333PPbYY5k0aVKuvvrqPPfcc0mSkSNH5tRTT83555+f559/Pk899VSuvPLKnHPOOUvqkgAAAAAAAJIsZXfq7L333pkxY0Y22mijNG/ePIcffngOOOCAhd7/G9/4Ru6///789Kc/Tb9+/dK8efP06tUrm222WZJk6NChad26dc4888z89Kc/TZs2bbLuuutm+PDhS+iKAAAAAAAAPlUql8vlph6iMfTv3z+9evXKr3/966YeZYGmTp2ampqa1B7TLtVVpaYeBwCAIhhR29QTAAAAsITUdYPa2lRXVy9w26Xq8WsAAAAAAABLK1EHAAAAAACgAJaa79QZN25cU48AAAAAAACwxLhTBwAAAAAAoABEHQAAAAAAgAIQdQAAAAAAAApA1AEAAAAAACgAUQcAAAAAAKAARB0AAAAAAIACEHUAAAAAAAAKQNQBAAAAAAAoAFEHAAAAAACgAEQdAAAAAACAAhB1AAAAAAAACkDUAQAAAAAAKABRBwAAAAAAoABEHQAAAAAAgAIQdQAAAAAAAApA1AEAAAAAACgAUQcAAAAAAKAARB0AAAAAAIACEHUAAAAAAAAKQNQBAAAAAAAogIqmHmCZdexrSXV1U08BAAAAAAAUhDt1AAAAAAAACkDUAQAAAAAAKABRBwAAAAAAoABEHQAAAAAAgAIQdQAAAAAAAApA1AEAAAAAACgAUQcAAAAAAKAARB0AAAAAAIACEHUAAAAAAAAKQNQBAAAAAAAoAFEHAAAAAACgAEQdAAAAAACAAhB1AAAAAAAACkDUAQAAAAAAKABRBwAAAAAAoABEHQAAAAAAgAIQdQAAAAAAAApA1AEAAAAAACgAUQcAAAAAAKAARB0AAAAAAIACEHUAAAAAAAAKQNQBAAAAAAAoAFEHAAAAAACgAEQdAAAAAACAAhB1AAAAAAAACkDUAQAAAAAAKABRBwAAAAAAoABEHQAAAAAAgAIQdQAAAAAAAApA1AEAAAAAACgAUQcAAAAAAKAARB0AAAAAAIACEHUAAAAAAAAKQNQBAAAAAAAoAFEHAAAAAACgAEQdAAAAAACAAhB1AAAAAAAACkDUAQAAAAAAKABRBwAAAAAAoABEHQAAAAAAgAIQdQAAAAAAAApA1AEAAAAAACgAUQcAAAAAAKAARB0AAAAAAIACEHUAAAAAAAAKQNQBAAAAAAAoAFEHAAAAAACgAEQdAAAAAACAAhB1AAAAAAAACkDUAQAAAAAAKABRBwAAAAAAoABEHQAAAAAAgAIQdQAAAAAAAApA1AEAAAAAACgAUQcAAAAAAKAARB0AAAAAAIACEHUAAAAAAAAKQNQBAAAAAAAoAFEHAAAAAACgAEQdAAAAAACAAhB1AAAAAAAACqCiqQdYVn3rxLvSrKp1U4+xVJt82qCmHgEAAAAAABqNO3UAAAAAAAAKQNQBAAAAAAAoAFEHAAAAAACgAEQdAAAAAACAAhB1AAAAAAAACkDUAQAAAAAAKABRBwAAAAAAoABEHQAAAAAAgAIQdQAAAAAAAApA1AEAAAAAACgAUQcAAAAAAKAARB0AAAAAAIACEHUAAAAAAAAKQNQBAAAAAAAoAFEHAAAAAACgAEQdAAAAAACAAhB1AAAAAAAACkDUAQAAAAAAKABRBwAAAAAAoABEHQAAAAAAgAIQdQAAAAAAAApA1AEAAAAAACgAUQcAAAAAAKAARB0AAAAAAIACEHUAAAAAAAAKQNRZTKVSKTfffHNTjwEAAAAAACzlRB0AAAAAAIACEHUAAAAAAAAKYKmJOv37989hhx2Wo48+Ossvv3xWXHHFjBgxom79+++/n6FDh6Zjx46prq7OgAED8uSTT9Y7xi233JL1118/LVu2zGqrrZaRI0fmk08+qVs/adKkbLnllmnZsmV69uyZe+6556u6PAAAAAAAYBlX0dQDNKarrroqRxxxRB555JH87//+b4YMGZLNNtss3/72t/O9730vrVq1yh133JGamppccskl2XrrrfP8889n+eWXz4MPPpi99947559/frbYYou88MILOeCAA5IkJ554YubMmZPvfve7WWGFFfLII4+ktrY2w4cP/9KZZs6cmZkzZ9a9nzp16pK6fAAAAAAAYClWKpfL5aYeojH0798/s2fPzoMPPli3bKONNsqAAQOy4447ZtCgQXnrrbdSVVVVt3711VfP0UcfnQMOOCDbbLNNtt566xx77LF166+55pocffTReeONN3L33Xdn0KBBefnll9O5c+ckyZ133pntt98+N910U3bZZZd5zjVixIiMHDlyruW1x7RLdVWpka6eRTKitqknAAAAAABgGTd16tTU1NSktrY21dXVC9x2qbpTZ7311qv3fqWVVspbb72VJ598MtOmTcs3vvGNeutnzJiRF154IUny5JNPZvz48fnlL39Zt3727Nn56KOPMn369DzzzDPp0qVLXdBJ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a5cVV1wxP/jBD/LWW28lSSZPnpytttoqSbLccsulVCplyJAhGTJkSB544IGcd955KZVKKZVKmTx5cpLkn//8Z7bffvu0bds2K6ywQvbaa6+88847dbP0798/w4YNy/Dhw9OhQ4cMHDgwicevAQAAAAAAX42vddS56qqrUlFRkUcffTTnnXdezjnnnFx++eVJko8//jgnn3xynnzyydx8882ZPHlyhgwZkiTp0qVL/vjHPyZJnnvuuUyZMiXnnXdezjvvvGyyySbZf//9M2XKlEyZMiVdunTJ+++/nwEDBqR379557LHHcuedd+bf//53Bg8ePNc8lZWVGT9+fH77298u1DXMnDkzU6dOrfcCAAAAAABoqK/149e6dOmSc889N6VSKWuttVaeeuqpnHvuudl///2z77771m232mqr5fzzz8+GG26YadOmpW3btll++eWTJJ06dUr79u3rtq2srEzr1q3rPTbtwgsvTO/evfOrX/2qbtkVV1yRLl265Pnnn8+aa66ZJFljjTVyxhlnNOgaTj311IwcOXKu5f9suV+qq0oNOlZGJBlR27B9AAAAAACApcLX+k6dvn37plT6v/CxySabZNKkSZk9e3b+/ve/Z6eddsoqq6ySdu3apV+/fkmSV155pcHnefLJJzN27Ni0bdu27tWjR48kyQsvvFC33QYbbNDgYx977LGpra2te7366qsNPgYAAAAAAMDX+k6d+fnoo48ycODADBw4MNdee206duyYV155JQMHDsysWbMafLxp06Zlp512yumnnz7XupVWWqnuz23atGnwsauqqlJVVdXg/QAAAAAAAD7vax11HnnkkXrvH3744ayxxhp59tln8+677+a0005Lly5dkiSPPfZYvW0rKyuTJLNnz55r+ReXrb/++vnjH/+Ybt26paLia/0jAQAAAAAAllFf68evvfLKKzniiCPy3HPP5Xe/+10uuOCCHH744VlllVVSWVmZCy64IC+++GJuvfXWnHzyyfX27dq1a0qlUm6//fa8/fbbmTZtWpKkW7dueeSRRzJ58uS88847mTNnTg499NC899572WOPPfK3v/0tL7zwQu6666786Ec/misAAQAAAAAANIWvddTZe++9M2PGjGy00UY59NBDc/jhh+eAAw5Ix44dM2rUqNxwww3p2bNnTjvttJx11ln19l155ZUzcuTIHHPMMVlhhRUybNiwJMlRRx2V5s2bp2fPnnWPbevcuXPGjx+f2bNnZ9ttt826666b4cOHp3379mnW7Gv9IwIAAAAAAJYRpXK5XG7qIZYlU6dOTU1NTWqPaZfqqlLDDzCitvGHAgAAAAAAmkRdN6itTXV19QK3dRsKAAAAAABAAYg6AAAAAAAABSDqAAAAAAAAFICoAwAAAAAAUACiDgAAAAAAQAGIOgAAAAAAAAUg6gAAAAAAABSAqAMAAAAAAFAAog4AAAAAAEABiDoAAAAAAAAFIOoAAAAAAAAUgKgDAAAAAABQAKIOAAAAAABAAYg6AAAAAAAABSDqAAAAAAAAFICoAwAAAAAAUACiDgAAAAAAQAGIOgAAAAAAAAUg6gAAAAAAABSAqAMAAAAAAFAAog4AAAAAAEABiDoAAAAAAAAFIOoAAAAAAAAUgKgDAAAAAABQABVNPcAy69jXkurqpp4CAAAAAAAoCHfqAAAAAAAAFICoAwAAAAAAUACiDgAAAAAAQAGIOgAAAAAAAAUg6gAAAAAAABSAqAMAAAAAAFAAog4AAAAAAEABiDoAAAAAAAAFIOoAAAAAAAAUgKgDAAAAAABQAKIOAAAAAABAAYg6AAAAAAAABVCxKDu9//77efTRR/PWW29lzpw59dbtvffejTIYAAAAAAAA/6fBUee2227LnnvumWnTpqW6ujqlUqluXalUEnUAAAAAAACWgAY/fu3II4/Mvvvum2nTpuX999/Pf/7zn7rXe++9tyRmBAAAAAAAWOY1OOq8/vrrOeyww9K6deslMQ8AAAAAAADz0OCoM3DgwDz22GNLYhYAAAAAAADmo8HfqTNo0KD89Kc/zdNPP5111103LVq0qLd+5513brThAAAAAAAA+FSpXC6XG7JDs2bzv7mnVCpl9uzZiz3U0mzq1KmpqalJbW1tqqurm3ocAAAAAACgCTWkGzT4Tp05c+Ys8mAAAAAAAAAsmgZ/p87nffTRR401BwAAAAAAAAvQ4Kgze/bsnHzyyVl55ZXTtm3bvPjii0mSE044If/zP//T6AMCAAAAAACwCFHnl7/8ZUaNGpUzzjgjlZWVdcu/9a1v5fLLL2/U4QAAAAAAAPhUg6PO6NGjc+mll2bPPfdM8+bN65b/13/9V5599tlGHQ4AAAAAAIBPNTjqvP7661l99dXnWj5nzpx8/PHHjTIUAAAAAAAA9TU46vTs2TMPPvjgXMtvvPHG9O7du1GGAgAAAAAAoL6Khu7wi1/8Ivvss09ef/31zJkzJ3/605/y3HPPZfTo0bn99tuXxIwAAAAAAADLvAbfqfOd73wnt912W+699960adMmv/jFL/LMM8/ktttuy7e//e0lMSMAAAAAAMAyr8F36rz22mvZYostcs8998y17uGHH07fvn0bZTAAAAAAAAD+T4Pv1Nl2223z3nvvzbV8/Pjx2W677RplKAAAAAAAAOprcNTp27dvtt1223zwwQd1y/7yl79khx12yIknntiowwEAAAAAAPCpBkedyy+/PKusskp22mmnzJw5M2PHjs2gQYNy0kkn5Sc/+cmSmBEAAAAAAGCZ1+Co06xZs/z+979PixYtMmDAgOy888459dRTc/jhhy+J+QAAAAAAAEhSKpfL5S/b6B//+Mdcyz744IPsscceGTRoUA4++OC65eutt17jTriUmTp1ampqalJbW5vq6uqmHgcAAAAAAGhCDekGCxV1mjVrllKplM9v+vn3n/25VCpl9uzZizn+0k3UAQAAAAAAPtOQblCxMAd86aWXGmUwAAAAAAAAFs1CRZ2uXbsu6TkAAAAAAABYgIWKOl/0wgsv5Ne//nWeeeaZJEnPnj1z+OGHp3v37o06HAAAAAAAAJ9q1tAd7rrrrvTs2TOPPvpo1ltvvay33np55JFHss466+See+5ZEjMCAAAAAAAs80rlcrnckB169+6dgQMH5rTTTqu3/Jhjjsndd9+dxx9/vFEHXNo05AuPAAAAAACApVtDukGD79R55plnst9++821fN99983TTz/d0MMBAAAAAACwEBocdTp27JgJEybMtXzChAnp1KlTY8wEAAAAAADAF1Qs7IYnnXRSjjrqqOy///454IAD8uKLL2bTTTdNkowfPz6nn356jjjiiCU2KAAAAAAAwLJsob9Tp3nz5pkyZUo6duyYX//61zn77LPzxhtvJEk6d+6cn/70pznssMNSKpWW6MBF5zt1AAAAAACAzzSkGyx01GnWrFnefPPNeo9Y++CDD5Ik7dq1W4xxly2iDgAAAAAA8JmGdIOFfvxakrnuwhFzAAAAAAAAvhoNijprrrnmlz5e7b333lusgQAAAAAAAJhbg6LOyJEjU1NTs6RmAQAAAAAAYD4aFHV23333et+p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b78kyRZbbJFKpZIpU6Z06boBAAAAAICNS/FR58QTT8ytt96a66+/PjfddFNuueWW3HPPPe3OOffcczNixIjce++9OeOMM/LYY49l//33z0c+8pH85je/yY9//OPMmzcvU6dOrb1n9erV+dKXvpT77rsv1157bRYvXlwLN4MGDcrPfvazJMmiRYuydOnSXHjhha8538qVK7Ns2bJ2DwAAAAAAgHVVqVar1XoP8Va98MIL6dOnT6644op89KMfTZK0tbVl4MCBOfbYY3PBBRdkyJAh2WWXXXLNNdfU3nfMMcdkk002ybe//e3asXnz5mXs2LFZsWJFunfv/qrPuuuuu7L77rvnhRdeSK9evdLa2pr99tsvzz33XDbffPPXnXH69OmZMWPGq463ndI7zU2Vt7F6AAAAAABYz01vq/cE671ly5alpaUlbW1taW5ufsNzi75T5/e//31Wr16dPfbYo3aspaUlw4YNa3feqFGj2j2/7777MmvWrPTq1av2mDRpUtauXZvHH388SXL33XfnwAMPzDbbbJPevXtn7NixSZIlS5as04ynnnpq2traao8nn3zyrSwVAAAAAADYyDXUe4Cu0LNnz3bPly9fnk996lM5/vjjX3XuNttskxUrVmTSpEmZNGlSfvSjH6Vv375ZsmRJJk2alFWrVq3TZzc1NaWpqeltzQ8AAAAAAFB01HnnO9+ZTTfdNHfeeWe22WabJK98/dojjzySfffd93Xft+uuu+bBBx/M0KFDX/P1+++/P88++2xmzpyZQYMGJXnl69f+UWNjY5JkzZo1HbEUAAAAAACAN1T016/17t07Rx55ZE466aT86le/ym9/+9scffTR6datWyqV1/+9mpNPPjnz58/P1KlTs3Dhwjz66KO57rrrMnXq1CSv3K3T2NiYiy66KL///e9z/fXX50tf+lK7awwePDiVSiWzZ8/OM888k+XLl3fqWgEAAAAAgI1b0VEnSb72ta9l9OjR+eAHP5iJEydmr732yg477JDu3bu/7nve8573ZO7cuXnkkUeyzz77ZJdddsl//dd/ZeDAgUmSvn37ZtasWfnJT36SHXfcMTNnzsy5557b7hpbb711ZsyYkVNOOSX9+vWrBSEAAAAAAIDOUKlWq9V6D9GRVqxYka233jrnnXdejj766HqP8yrLli1LS0tL2k7pneam17+bCAAA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KICoAwAAAAAAUABRBwAAAAAAoACiDgAAAAAAQAEa6j3AxmrnM29Mt6Ye9R6DDrZ45gH1HgEAAAAAgA2UO3UAAAAAAAAKIOoAAAAAAAAUQNQBAAAAAAAogKgDAAAAAABQAFEHAAAAAACgAKIOAAAAAABAAUQdAAAAAACAAog6AAAAAAAABRB1AAAAAAAACiDqAAAAAAAAFEDUAQAAAAAAKICoAwAAAAAAUABRBwAAAAAAoACiDgAAAAAAQAFEHQAAAAAAgAKIOgAAAAAAAAUQdQAAAAAAAAog6gAAAAAAABRA1AEAAAAAACiAqAMAAAAAAFAAUQcAAAAAAKAAog4AAAAAAEABRB0AAAAAAIACiDoAAAAAAAAFEHUAAAAAAAAKIOoAAAAAAAAUQNQBAAAAAAAogKjTQVatWlXvEQAAAAAAgA1YMVFn3LhxmTp1aqZOnZqWlpZstdVWOeOMM1KtVpMkzz33XCZPnpwtttgiPXr0yPvf//48+uijSZJqtZq+ffvmpz/9ae16I0eOzIABA2rP582bl6ampvztb39Lkjz//PM55phj0rdv3zQ3N2f8+PG57777audPnz49I0eOzHe/+91su+226d69e1f8NQAAAAAAABupYqJOklx++eVpaGjIHXfckQsvvDBf+9rX8t3vfjdJMmXKlNx11125/vrrc9ttt6VareYDH/hAVq9enUqlkn333Tetra1JXglADz30UF588cU8/PDDSZK5c+dm9913T48ePZIkhx56aJ5++un84he/yN13351dd901EyZMyF//+tfaPL/73e/ys5/9LFdffXUWLlz4mjOvXLkyy5Yta/cAAAAAAABYVw31HmBdDBo0KOeff34qlUqGDRuW+++/P+eff37GjRuX66+/PrfeemvGjBmTJPnRj36UQYMG5dprr82hhx6acePG5dvf/naS5Ne//nV22WWX9O/fP62trXn3u9+d1tbWjB07Nskrd+3ccccdefrpp9PU1JQkOffcc3Pttdfmpz/9aY477rgkr3zl2ve///307dv3dWc+++yzM2PGjFcdf6D70WluqnTo388GY3pbvScAAAAAAID1TlF36rz3ve9NpfJ/IWT06NF59NFH8+CDD6ahoSF77rln7bU+ffpk2LBheeihh5IkY8eOzYMPPphnnnkmc+fOzbhx4zJu3Li0trZm9erVmT9/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7bdPjx498s53vjNnnHFGVq9eXXt9+vTpGTlyZH7wgx9kyJAhaWlpycc//vG88MILSZIpU6Zk7ty5ufDCC1OpVFKpVLJ48eJ2X7/W2tqao446Km1tbbVzpk+fnsTXrwEAAAAAAF2jrlHnpJNOyty5c3Pdddfll7/8ZVpbW3PPPfes0zV69+6dWbNm5cEHH8yFF16YSy65JOeff367cx577LFce+21mT17dmbPnp25c+dm5syZSZILL7wwo0ePzrHHHpulS5dm6dKlGTRoULv3jxkzJhdccEGam5tr50ybNu1Nzbdy5cosW7as3QMAAAAAAGBd1e3r15YvX55LL700P/zhDzNhwoQkyeWXX57/9//+3zpd5/TTT6/9eciQIZk2bVquuuqq/Od//mft+Nq1azNr1qz07t07SXLEEUdkzpw5Oeuss9LS0pLGxsb06NHjdb9urbGxMS0tLalUKm/qK9n+0dlnn50ZM2a86vgD3Y9Oc1Nlna6V6Ummt63bewAAAAAAgA1C3e7Ueeyxx7Jq1arsueeetWNbbrllhg0btk7X+fGPf5y99tor/fv3T69evXL66adnyZIl7c4ZMmRILegkyYABA/L000+/vQW8Saeeemra2tpqjyeffLJLPhcAAAAAANiw1PXr1/6VSqWSarXa7tg//l7Obbfdlk9+8pP5wAc+kNmzZ+fee+/NaaedllWrVrV7z6abbvqq665du7bzBv8HTU1NaW5ubvcAAAAAAABYV3WLOu9617uy6aabZsGCBbVjzz33XB555JHa8759+2bp0qW1548++mj+9re/1Z7Pnz8/gwcPzmmnnZZRo0Zlu+22yxNPPLHOszQ2NmbNmjVv+xwAAAAAAIDOUrff1OnVq1eOPvronHTSSenTp0/e8Y535LTTTku3bv/XmcaPH5+LL744o0ePzpo1a3LyySe3u+tmu+22y5IlS3LVVVdl9913z89//vNcc8016zzLkCFDsmDBgixevDi9evXKlltu+ZrnLF++PHPmzMmIESPSo0eP9OjR460tHgAAAAAAYB3V9evXvvrVr2afffbJgQcemIkTJ2bvvffObrvtVnv9vPPOy6BBg7LPPvvkE5/4RKZNm9YupBx00EH5/Oc/n6lTp2bkyJGZP39+zjjjjHWeY9q0adlkk02y4447pm/fvq/6TZ4kGTNmTD796U/nsMMOS9++ffOVr3zlrS0aAAAAAADgLahU//lHa+ps3LhxGTlyZC644IJ6j9Ipli1blpaWlrSd0jvNTZV1v8D0to4fCgAAAAAAqItaN2hrS3Nz8xueW9c7dQAAAAAAAHhzRB0AAAAAAIACNNR7gH/W2tpa7xEAAAAAAADWO+7UAQAAAAAAKICoAwAAAAAAUABRBwAAAAAAoACiDgAAAAAAQAFEHQAAAAAAgAKIOgAAAAAAAAUQdQAAAAAAAAog6gAAAAAAABRA1AEAAAAAACiAqAMAAAAAAFAAUQcAAAAAAKAAog4AAAAAAEABRB0AAAAAAIACiDoAAAAAAAAFEHUAAAAAAAAKIOoAAAAAAAAUQNQBAAAAAAAogKgDAAAAAABQAFEHAAAAAACgAKIOAAAAAABAAUQdAAAAAACAAjTUe4CN1ql/SJqb6z0FAAAAAABQCHfqAAAAAAAAFEDUAQAAAAAAKICoAwAAAAAAUABRBwAAAAAAoACiDgAAAAAAQAFEHQAAAAAAgAKIOgAAAAAAAAUQdQAAAAAAAAog6gAAAAAAABRA1AEAAAAAACiAqAMAAAAAAFAAUQcAAAAAAKAAog4AAAAAAEABRB0AAAAAAIACiDoAAAAAAAAFEHUAAAAAAAAKIOoAAAAAAAAUQNQBAAAAAAAogKgDAAAAAABQAFEHAAAAAACgAKIOAAAAAABAAUQdAAAAAACAAog6AAAAAAAABRB1AAAAAAAACiDqAAAAAAAAFEDUAQAAAAAAKICoAwAAAAAAUABRBwAAAAAAoACiDgAAAAAAQAEa6j3AxqZarSZJli1bVudJAAAAAACAevt7L/h7P3gjok4Xe/bZZ5MkgwYNqvMkAAAAAADA+uKFF15IS0vLG54j6nSxLbfcMkmyZMmSf/lfDgBvzrJlyzJo0KA8+eSTaW5urvc4ABsEeytAx7O3AnQ8eysbgmq1mhdeeCEDBw78l+eKOl2sW7dXfsaopaXFJgPQwZqbm+2tAB3M3grQ8eytAB3P3krp3uxNIN06eQ4AAAAAAAA6gKgDAAAAAABQAFGnizU1NeXMM89MU1NTvUcB2GDYWwE6nr0VoOPZWwE6nr2VjU2lWq1W6z0EAAAAAAAAb8ydOgAAAAAAAAUQdQAAAAAAAAog6gAAAAAAABRA1AEAAAAAACiAqNMBvvGNb2TIkCHp3r179txzz9xxxx1veP5PfvKTvPvd70737t0zfPjw3HDDDe1er1ar+a//+q8MGDAgm222WSZOnJhHH320M5cAsN7p6L316quvzvve97706dMnlUolCxcu7MTpAdZPHbm3rl69OieffHKGDx+enj17ZuDAgZk8eXL+9Kc/dfYyANYrHf3PrdOnT8+73/3u9OzZM1tssUUmTpyYBQsWdOYSANY7Hb23/qNPf/rTqVQqueCCCzp4augaos7b9OMf/zgnnnhizjzzzNxzzz0ZMWJEJk2alKeffvo1z58/f34OP/zwHH300bn33ntz8MEH5+CDD84DDzxQO+crX/lKvv71r+db3/pWFixYkJ49e2bSpEl56aWXumpZAHXVGXvrihUrsvfee+ecc87pqmUArFc6em/929/+lnvuuSdnnHFG7rnnnlx99dVZtGhRDjrooK5cFkBddcY/t26//fa5+OKLc//992fevHkZMmRI3ve+9+WZZ57pqmUB1FVn7K1/d8011+T222/PwIEDO3sZ0Gkq1Wq1Wu8hSrbnnntm9913z8UXX5wkWbt2bQYNGpTPfvazOeWUU151/mGHHZYVK1Zk9uzZtWPvfe97M3LkyHzrW99KtVrNwIED84UvfCHTpk1LkrS1taVfv36ZNWtWPv7xj3fNwgDqqKP31n+0ePHibLvttrn33nszcuTITl0HwPqkM/fWv7vzzjuzxx575Iknnsg222zTOQsBWI90xd66bNmytLS05Oabb86ECRM6ZyEA65HO2lv/+Mc/Zs8998yNN96YAw44ICeccEJOOOGETl8PdDR36rwNq1atyt13352JEyfWjnXr1i0TJ07Mbbfd9prvue2229qdnySTJk2qnf/444/nqaeeandOS0tL9txzz9e9JsCGpDP2VoCNXVftrW1tbalUKtl88807ZG6A9VlX7K2rVq3Kd77znbS0tGTEiBEdNzzAeqqz9ta1a9fmiCOOyEknnZSddtqpc4aHLiLqvA1/+ctfsmbNmvTr16/d8X79+uWpp556zfc89dRTb3j+3/9zXa4JsCHpjL0VYGPXFXvrSy+9lJNPPjmHH354mpubO2ZwgPVYZ+6ts2fPTq9evdK9e/ecf/75uemmm7LVVlt17AIA1kOdtbeec845aWhoyPHHH9/xQ0MXE3UAAIC3ZfXq1fnYxz6WarWab37zm/UeB6B4++23XxYuXJj58+dn//33z8c+9rHX/S0JAN7Y3XffnQsvvDCzZs1KpVKp9zjwtok6b8NWW22VTTbZJH/+85/bHf/zn/+c/v37v+Z7+vfv/4bn//0/1+WaABuSzthbATZ2nbm3/j3oPPHEE7npppvcpQNsNDpzb+3Zs2eGDh2a9773vbn00kvT0NCQSy+9tGMXALAe6oy99ZZbbsnTTz+dbbbZJg0NDWloaMgTTzyRL3zhCxkyZEinrAM6k6jzNjQ2Nma33XbLnDlzasfWrl2bOXPmZPTo0a/5ntGjR7c7P0luuumm2vnbbrtt+vfv3+6cZcuWZcGCBa97TYANSWfsrQAbu87aW/8edB599NHcfPPN6dOnT+csAGA91JX/3Lp27dqsXLny7Q8NsJ7rjL31iCOOyG9+85ssXLiw9hg4cGBOOumk3HjjjZ23GOgkDfUeoHQnnnhijjzyyIwaNSp77LFHLrjggqxYsSJHHXVUkmTy5MnZeuutc/bZZydJPve5z2Xs2LE577zzcsABB+Sqq67KXXfdle985ztJkkqlkhNOOCFf/vKXs91222XbbbfNGWeckYEDB+bggw+u1zIBulRH761J8te//jVLlizJn/70pyTJokWLkrzyb/S4owfYGHT03rp69ep89KMfzT333JPZs2dnzZo1te8t33LLLdPY2FifhQJ0oY7eW1esWJGzzjorBx10UAYMGJC//OUv+cY3vpE//vGPOfTQQ+u2ToCu1NF7a58+fV71Lx9tuumm6d+/f4YNG9a1i4OOUOVtu+iii6rbbLNNtbGxsbrHHntUb7/99tprY8eOrR555JHtzv/v//7v6vbbb19tbGys7rTTTtWf//zn7V5fu3Zt9Ywzzqj269ev2tTUVJ0wYUJ10aJFXbEUgPVGR++tl112WTXJqx5nnnlmF6wGYP3QkXvr448//pr7apLqr371qy5aEUD9deTe+uKLL1YPOeSQ6sCBA6uNjY3VAQMGVA866KDqHXfc0VXLAVgvdPT/J/DPBg8eXD3//PM7YXLofJVqtVqtU08CAAAAAADgTfKbOgAAAAAAAAUQdQAAAAAAAAog6gAAAAAAABRA1AEAAAAAACiAqAMAAAAAAFAAUQcAAAAAAKAAog4AAAAAAEABRB0AAAAAAIACiDoAAABvw5QpU3LwwQe/rWssXrw4lUolCxcufN1zWltbU6lU8vzzzydJZs2alc0337z2+vTp0zNy5Mi3NQcAALB+E3UAAICNxpQpU1KpVFKpVNLY2JihQ4fmi1/8Yl5++eV6j/YvjRkzJkuXLk1LS8trvj5t2rTMmTOn9rwjYhMAALB+aaj3AAAAAF1p//33z2WXXZaVK1fmhhtuyGc+85lsuummOfXUU9udt2rVqjQ2NtZpyldrbGxM//79X/f1Xr16pVevXl04EQAA0NXcqQMAAGxUmpqa0r9//wwePDj/8R//kYkTJ+b666+v3dly1llnZeDAgRk2bFiS5P7778/48eOz2WabpU+fPjnuuOOyfPnyV113xowZ6du3b5qbm/PpT386q1atqr32P//zP9l7772z+eabp0+fPvngBz+Yxx577FXXePjhhzNmzJh07949O++8c+bOnVt77Z+/fu2f/ePXr02fPj2XX355rrvuutqdSa2trRk/fnymTp3a7n3PPPNMGhsb293lAwAArJ9EHQAAYKO22Wab1QLMnDlzsmjRotx0002ZPXt2VqxYkUmTJmWLLbbInXfemZ/85Ce5+eabXxVG5syZk4ceeiitra258sorc/XVV2fGjBm111esWJETTzwxd911V+bMmZNu3brlkEMOydq1a9td56STTsoXvvCF3HvvvRk9enQOPPDAPPvss+u8pmnTpuVjH/tY9t9//yxdujRLly7NmDFjcswxx+SKK67IypUra+f+8Ic/zNZbb53x48ev8+cAAABdS9QBAAA2StVqNTfffHNuvPHGWtDo2bNnvvvd72annXbKTjvtlCuuuCIvvfRSvv/972fnnXfO+PHjc/HFF+cHP/hB/vznP9eu1djYmO9973vZaaedcsABB+SLX/xivv71r9eizUc+8pF8+MMfztChQzNy5Mh873vfy/33358HH3yw3UxTp07NRz7ykeywww755je/mZaWllx66aXrvLZevXpls802q92V1L9//zQ2NubDH/5wkuS6666rnTtr1qzabw0BAADrN1EHAADYqMyePTu9evVK9+7d8/73vz+HHXZYpk+fniQZPnx4u9/ReeihhzJixIj07NmzdmyvvfbK2rVrs2jRotqxESNGpEePHrXno0ePzvLly/Pkk08mSR599NEcfvjheec735nm5uYMGTIkSbJkyZJ2s40ePbr254aGhowaNSoPPfRQh629e/fuOeKII/K9730vSXLPPffkgQceyJQpUzrsMwAAgM7TUO8BAAAAutJ+++2Xb37zm2lsbMzAgQPT0PB//7PoH+NNRzrwwAMzePDgXHLJJRk4cGDWrl2bnXfeud3v7nSVY445JiNHjswf/vCHXHbZZRk/fnwGDx7c5XMAAADrzp06AADARqVnz54ZOnRottlmm3ZB57XssMMOue+++7JixYrasVtvvTXdunXLsGHDasfuu+++vPjii7Xnt99+e3r16pVBgwbl2WefzaJFi3L66adnwoQJ2WGHHfLcc8+95ufdfvvttT+//PLLufvuu7PDDju8pXU2NjZmzZo1rzo+fPjwjBo1KpdcckmuuOKK/Pu///tbuj4AAND1RB0AAIDX8clPfjLdu3fPkUcemQceeCC/+tWv8tnPfjZHHHFE+vXrVztv1apVOfroo/Pggw/mhhtuyJlnnpmpU6emW7du2WKLLdKnT5985zvfye9+97v87//+b0488cTX/LxvfOMbueaaa/Lwww/nM5/5TJ577rm3HF2GDBmS3/zmN1m0aFH+8pe/ZPXq1bXXjjnmmMycOTPVajWHHHLIW7o+AADQ9UQdAACA19GjR4/ceOON+etf/5rdd989H/3oRzNhwoRcfPHF7c6bMGFCtttuu+y777457LDDctBBB9V+p6dbt2656qqrcvfdd2fnnXfO5z//+Xz1q199zc+bOXNmZs6cmREjRmTevHm5/vrrs9VWW72l2Y899tgMGzYso0aNSt++fXPrrbfWXjv88MPT0NCQww8/PN27d39L1wcAALpepVqtVus9BAAAAF1n8eLFede73pU777wzu+66a73HAQAA3iRRBwAAYCOxevXqPPvss5k2bVoef/zxdnfvAAAA6z9fvwYAALCRuPXWWzNgwIDceeed+da3vlXvcQAAgHXkTh0AAAAAAIACuFMHAAAAAACgAKIOAAAAAABAAUQdAAAAAACAAog6AAAAAAAABRB1AAAAAAAACiDqAAAAAAAAFEDUAQAAAAAAKICoAwAAAAAAUID/D/dxrBKPSlIXAAAAAElFTkSuQmCC\n"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 2000x1600 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAABoUAAAUlCAYAAADWS882AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACh8ElEQVR4nOz9eZxWBf3//z+HZYZlmCFjUFEWBUUxDRQVUwPRxI2yUgt9q6S4k+KuuYFL7ppLmelbEJdMfeca5U4pfd3FFPcFccHEbRBUQLh+f/RzPo2gsswwyLnfb7frduM651znvM5coxWPzjllpVKpFAAAAAAAAJZrzZp6AAAAAAAAABqfKAQAAAAAAFAAohAAAAAAAEABiEIAAAAAAAAFIAoBAAAAAAAUgCgEAAAAAABQAKIQAAAAAABAAYhCAAAAAAAABSAKAQAAAAAAFIAoBAAADaSsrCzDhw9v6jGWqjFjxqSsrCyPPvpog+1zwIAB+c53vvO1202ePDllZWUZM2ZM3bKRI0emrKys3nbdunXL0KFDF/rYAwYMWIRpl9xnn32Wo446Kp07d06zZs2y4447LtXjf5Xx48enrKws48ePb+pRCu/zf9YmT57c1KMAAPANJgoBAFBoZWVlC/X6pv2l+IABA+rNv8IKK2TDDTfMFVdckXnz5jX1eE3qmWeeyciRI5eZv1y/4oorcvbZZ2ennXbKlVdemUMPPXSpHPemm27Ktttumw4dOqS8vDydOnXKLrvsknvvvXepHH9Z8fDDD+fAAw/MBhtskJYtW84XFb9pPo9HC3q9/fbbTT0eAABNrEVTDwAAAE3pqquuqvd+7Nixueuuu+Zbvvbaay/NsRrEqquumtNPPz1JMm3atIwdOzZ77713XnjhhZxxxhlNPN2S69q1az755JO0bNnyK7d7/vnn06zZ//v/wz3zzDMZNWpUBgwYkG7dutXb9s4772yMUb/Svffem1VWWSXnn3/+UjleqVTKXnvtlTFjxqRPnz457LDDstJKK2Xq1Km56aabsuWWW2bChAn53ve+t1TmaWrjxo3L5ZdfnvXWWy+rr756XnjhhaYeqUGcfPLJWW211eota9++fdMMAwDAMkMUAgCg0P7nf/6n3vsHH3wwd91113zLv4mqq6vrncd+++2Xnj175uKLL84pp5yywJgyb968zJ49O61atVqaoy6WsrKyhZqzoqJiofdZXl6+JCMtlnfeeadB/7L+677Dc889N2PGjMmIESNy3nnn1bsy5rjjjstVV12VFi2K8z8VDzjggBx99NFp3bp1hg8fvtxEoW233TZ9+/Zt6jEAAFjGuH0cAAB8jZkzZ+bwww9P586dU1FRkZ49e+acc85JqVT62s+eeuqpadasWS666KK6ZX/961+z+eabp23btmnXrl223377TJo0qd7nhg4dmsrKyrz55pvZcccdU1lZmZqamhxxxBGZO3fuYp1HmzZt0q9fv8ycOTPTpk1L8v+eg3TNNddknXXWSUVFRf72t78lSZ544olsu+22qaqqSmVlZbbccss8+OCDC9z3xx9/nP322y/f/va3U1VVlT322CMffPBBvW1uueWWbL/99unUqVMqKirSvXv3nHLKKV96Po899li+973vpXXr1llttdXy+9//vt76BT1TaEH++5lCY8aMyc4775wk2WKLLea7PeCCnik0a9asnHTSSenRo0cqKirSuXPnHHXUUZk1a1a97e66665sttlmad++fSorK9OzZ8/86le/+tK5Pp//vvvuy6RJk+abZWF/777qO/yiTz75JKeffnrWWmutnHPOOQu8Vdruu++ejTba6Evnvv/++7PzzjunS5cudT+PQw89NJ988km97d5+++384he/yKqrrpqKioqsvPLK+dGPflTvtn2PPvpoBg0alA4dOtR9z3vttVe9/cybNy+/+c1vss4666RVq1ZZccUVs99++833+7Uw+1qQFVdcMa1bt/7a7b7M6NGjM3DgwHTs2DEVFRXp1atXLrnkkvm269atW3bYYYc88MAD2WijjdKqVausvvrqGTt27HzbTpo0KQMHDkzr1q2z6qqr5tRTT12s2z5+9NFHi/3vCwAAlk/F+b9/AQDAYiiVSvnhD3+Y++67L3vvvXd69+6dO+64I0ceeWTefPPNr7zl1/HHH59f//rXufTSS7PPPvsk+c/t6vbcc88MGjQoZ555Zj7++ONccskl2WyzzfLEE0/Uu53Z3LlzM2jQoGy88cY555xzcvfdd+fcc89N9+7dc8ABByzW+bzyyitp3rx5vStT7r333lx//fUZPnx4OnTokG7dumXSpEnZfPPNU1VVlaOOOiotW7bMpZdemgEDBuTvf/97Nt5443r7HT58eNq3b5+RI0fm+eefzyWXXJLXXnst48ePrwsPY8aMSWVlZQ477LBUVlbm3nvvzYknnpjp06fn7LPPrre/Dz74INttt1122WWXDBkyJNdff30OOOCAlJeXL9Rf9H+Z73//+zn44INz4YUX5le/+lXdbQG/7PaA8+bNyw9/+MM88MAD2XfffbP22mvnqaeeyvnnn58XXnghN998c5L//CX+DjvskPXWWy8nn3xyKioq8tJLL2XChAlfOktNTU2uuuqqnHbaaZkxY0bdrf7WXnvtRf69W9B3uCAPPPBA3n///YwYMSLNmzdfxJ/ef9xwww35+OOPc8ABB+Tb3/52Hn744Vx00UV54403csMNN9Rt99Of/jSTJk3KL3/5y3Tr1i3vvPNO7rrrrkyZMqXu/dZbb52ampocc8wxad++fSZPnpw///nP9Y633377ZcyYMfnFL36Rgw8+OK+++mouvvjiPPHEE5kwYUJatmy50PtqDJdccknWWWed/PCHP0yLFi1y22235cADD8y8efNy0EEH1dv2pZdeyk477ZS99947e+65Z6644ooMHTo0G2ywQdZZZ50k/4lpW2yxRT777LMcc8wxadu2bf7whz8scrjaYostMmPGjJSXl2fQoEE599xzs8YaazTYeQMA8A1VAgAA6hx00EGl//6vyTfffHMpSenUU0+tt91OO+1UKisrK7300kt1y5KUDjrooFKpVCodfvjhpWbNmpXGjBlTt/6jjz4qtW/fvrTPPvvU29fbb79dqq6urrd8zz33LCUpnXzyyfW27dOnT2mDDTb42vPo379/aa211ipNmzatNG3atNKzzz5bOvjgg0tJSoMHD643c7NmzUqTJk2q9/kdd9yxVF5eXnr55Zfrlr311luldu3alb7//e/XLRs9enQpSWmDDTYozZ49u275WWedVUpSuuWWW+qWffzxx/PNud9++5XatGlT+vTTT+vNnqR07rnn1i2bNWtWqXfv3qWOHTvWHefVV18tJSmNHj26bruTTjqp9MX/mdO1a9fSnnvuWff+hhtuKCUp3XfffQv8ufXv37/u/VVXXVVq1qxZ6f7776+33e9///tSktKECRNKpVKpdP7555eSlKZNmzbfPr9O//79S+uss069ZYv6e7eg73BBLrjgglKS0k033bRQs913333z/awW9D2efvrppbKystJrr71WKpVKpQ8++KCUpHT22Wd/6b5vuummUpLSI4888qXb3H///aUkpWuuuabe8r/97W/1li/MvhbGF//5XxgL+nkMGjSotPrqq9db1rVr11KS0j/+8Y+6Ze+8806poqKidPjhh9ctGzFiRClJ6aGHHqq3XXV1dSlJ6dVXX/3Kef70pz+Vhg4dWrryyitLN910U+n4448vtWnTptShQ4fSlClTFuncAABY/rh9HAAAfIVx48alefPmOfjgg+stP/zww1MqlfLXv/613vJSqZThw4fnggsuyNVXX50999yzbt1dd92VDz/8MEOGDMm7775b92revHk23njj3HffffMdf//996/3fvPNN88rr7yyULM/99xzqampSU1NTdZee+1cdNFF2X777XPFFVfU265///7p1atX3fu5c+fmzjvvzI477pjVV1+9bvnKK6+cXXfdNQ888ECmT59ebx/77rtvvWcUHXDAAWnRokXGjRtXt+y/r3T46KOP8u6772bzzTfPxx9/nOeee67e/lq0aJH99tuv7n15eXn222+/vPPOO3nssccW6vwbwg033JC11147a621Vr3vbODAgUlS9519fuXVLbfcsli3+fqiRf29++J3+GU+/97atWu32LP99/c4c+bMvPvuu/ne976XUqmUJ554om6b8vLyjB8/fr7bvH3u85/Z7bffnjlz5ixwmxtuuCHV1dX5wQ9+UO/nv8EGG6SysnK+n/9X7aux/PfPo7a2Nu+++2769++fV155JbW1tfW27dWrVzbffPO69zU1NenZs2e9f6bHjRuXfv361buFX01NTXbbbbeFmmeXXXbJ6NGjs8cee2THHXfMKaeckjvuuCPvvfdeTjvttMU9TQAAlhOiEAAAfIXXXnstnTp1mu8v0T+/3dhrr71Wb/nYsWPz29/+NhdddFGGDBlSb92LL76YJBk4cGBdrPn8deedd+add96pt32rVq1SU1NTb9m3vvWtL/1L9i/q1q1b7rrrrtx999154IEH8vbbb+f2229Phw4d6m232mqr1Xs/bdq0fPzxx+nZs+d8+1x77bUzb968vP766/WWf/G2VJWVlVl55ZXrPT9m0qRJ+fGPf5zq6upUVVWlpqYm//M//5Mk8/3leadOndK2bdt6y9Zcc80kqbfPxvbiiy9m0qRJ831fn8/y+Xf2s5/9LJtuummGDRuWFVdcMT//+c9z/fXXL3YgWtTfuy9+h1+mqqoqyX+i3OKaMmVKhg4dmhVWWKHuWVf9+/dP8v++x4qKipx55pn561//mhVXXDHf//73c9ZZZ+Xtt9+u20///v3z05/+NKNGjUqHDh3yox/9KKNHj673rKYXX3wxtbW16dix43zfwYwZM+p+/guzr8YyYcKEbLXVVmnbtm3at2+fmpqaumdJffH3ukuXLvN9/ov/TL/22msLvM3bgv55XFibbbZZNt5449x9992LvQ8AAJYPnikEAAANaNNNN83EiRNz8cUXZ5dddskKK6xQt+7zQHDVVVdlpZVWmu+zLVrU/6/ni/vMl8+1bds2W2211ddut6jPKlkcH374Yfr375+qqqqcfPLJ6d69e1q1apXHH388Rx99dINcXdMY5s2bl3XXXTfnnXfeAtd37tw5yX9+hv/4xz9y33335S9/+Uv+9re/5U9/+lMGDhyYO++8c4m/y6+zsN/hWmutlSR56qmnsuOOOy7ycebOnZsf/OAHef/993P00UdnrbXWStu2bfPmm29m6NCh9b7HESNGZPDgwbn55ptzxx135IQTTsjpp5+ee++9N3369ElZWVluvPHGPPjgg7nttttyxx13ZK+99sq5556bBx98MJWVlZk3b146duyYa665ZoHzfB5NF2ZfjeHll1/OlltumbXWWivnnXdeOnfunPLy8owbNy7nn3/+fL/XX/Z7UCqVGmW+/9a5c+c8//zzjX4cAACWbaIQAAB8ha5du+buu+/ORx99VO+qjc9vd9a1a9d62/fo0SNnnXVWBgwYkG222Sb33HNP3ee6d++eJOnYseNCxZqmUlNTkzZt2izwL5Cfe+65NGvWrC6GfO7FF1/MFltsUfd+xowZmTp1arbbbrskyfjx4/Pee+/lz3/+c77//e/Xbffqq68ucIa33norM2fOrHe10AsvvJDkP1dALYmysrKF3rZ79+558skns+WWW37t55o1a5Ytt9wyW265Zc4777z8+te/znHHHZf77rtvkb/vRf29W1ibbbZZvvWtb+WPf/xjfvWrXy1yrHrqqafywgsv5Morr8wee+xRt/yuu+5a4Pbdu3fP4YcfnsMPPzwvvvhievfunXPPPTdXX3113Tb9+vVLv379ctppp+Xaa6/Nbrvtluuuuy7Dhg1L9+7dc/fdd2fTTTddqPD1VftqDLfddltmzZqVW2+9td5VQAu6FeTC6tq1a91Vhf9tSYPOK6+8Mt+VhwAAFI/bxwEAwFfYbrvtMnfu3Fx88cX1lp9//vkpKyvLtttuO99n1ltvvYwbNy7PPvtsBg8enE8++SRJMmjQoFRVVeXXv/71Ap97Mm3atMY5iUXUvHnzbL311rnlllvq3art3//+d6699tpsttlmdbch+9wf/vCHeud0ySWX5LPPPqv7+XweH/77iojZs2fnd7/73QJn+Oyzz3LppZfW2/bSSy9NTU1NNthggyU6v89D04cffvi12+6yyy558803c9lll8237pNPPsnMmTOTJO+///5863v37p0ki3ULs8X5vVsYbdq0ydFHH51nn302Rx999AKvULn66qvz8MMPL/DzC/oeS6VSLrjggnrbffzxx/n000/rLevevXvatWtX9/P44IMP5jv+F39mu+yyS+bOnZtTTjllvlk+++yzuu9wYfbVGBb086itrc3o0aMXe5/bbbddHnzwwXrfwbRp0770aqkvWtC/R8aNG5fHHnss22yzzWLPBQDA8sGVQgAA8BUGDx6cLbbYIscdd1wmT56c7373u7nzzjtzyy23ZMSIEXVX/3xRv379csstt2S77bbLTjvtlJtvvjlVVVW55JJLsvvuu2f99dfPz3/+89TU1GTKlCn5y1/+kk033XS+CNBUTj311Nx1113ZbLPNcuCBB6ZFixa59NJLM2vWrJx11lnzbT979uxsueWW2WWXXfL888/nd7/7XTbbbLP88Ic/TJJ873vfy7e+9a3sueeeOfjgg1NWVparrrrqS2+b1alTp5x55pmZPHly1lxzzfzpT3/KxIkT84c//CEtW7ZconPr3bt3mjdvnjPPPDO1tbWpqKjIwIED07Fjx/m23X333XP99ddn//33z3333ZdNN900c+fOzXPPPZfrr78+d9xxR/r27ZuTTz45//jHP7L99tuna9eueeedd/K73/0uq666ajbbbLNFnnFxf+8WxpFHHplJkybl3HPPzX333ZeddtopK620Ut5+++3cfPPNefjhh/PPf/5zgZ9da6210r179xxxxBF58803U1VVlf/7v/+b7zlXL7zwQt3vQ69evdKiRYvcdNNN+fe//52f//znSZIrr7wyv/vd7/LjH/843bt3z0cffZTLLrssVVVVdVeY9e/fP/vtt19OP/30TJw4MVtvvXVatmyZF198MTfccEMuuOCC7LTTTgu1ry/z2muv5aqrrkqSPProo0n+8/uf/Oeqnd133/1LP7v11lunvLw8gwcPzn777ZcZM2bksssuS8eOHTN16tSF+Dbmd9RRR+Wqq67KNttsk0MOOSRt27bNH/7wh3Tt2jX/+te/vvbz3/ve99KnT5/07ds31dXVefzxx3PFFVekc+fOdc86AgCgwEoAAECdgw46qPTF/5r80UcflQ499NBSp06dSi1btiytscYapbPPPrs0b968etslKR100EH1lt1yyy2lFi1alH72s5+V5s6dWyqVSqX77ruvNGjQoFJ1dXWpVatWpe7du5eGDh1aevTRR+s+t+eee5batm0733wnnXTSfPMtSP/+/UvrrLPO1263oJk/9/jjj5cGDRpUqqysLLVp06a0xRZblP75z3/W22b06NGlJKW///3vpX333bf0rW99q1RZWVnabbfdSu+99169bSdMmFDq169fqXXr1qVOnTqVjjrqqNIdd9xRSlK677775pv90UcfLW2yySalVq1albp27Vq6+OKL6+3v1VdfLSUpjR49um7Zgn4+Xbt2Le255571ll122WWl1VdfvdS8efN6x+/fv3+pf//+9badPXt26cwzzyyts846pYqKitK3vvWt0gYbbFAaNWpUqba2tlQqlUr33HNP6Uc/+lGpU6dOpfLy8lKnTp1KQ4YMKb3wwgsL/Nn+ty/7rpbk925h3HjjjaWtt966tMIKK5RatGhRWnnllUs/+9nPSuPHj6/b5r777pvv+3nmmWdKW221VamysrLUoUOH0j777FN68skn630X7777bumggw4qrbXWWqW2bduWqqurSxtvvHHp+uuvr9vP448/XhoyZEipS5cupYqKilLHjh1LO+ywQ71/Dj73hz/8obTBBhuUWrduXWrXrl1p3XXXLR111FGlt956a5H39UWfn+OCXl/8XViQW2+9tbTeeuuVWrVqVerWrVvpzDPPLF1xxRWlJKVXX321bruuXbuWtt9++/k+v6DfuX/961+l/v37l1q1alVaZZVVSqecckrpf//3f+fb54Icd9xxpd69e5eqq6tLLVu2LHXp0qV0wAEHlN5+++2vPRcAAJZ/ZaXSUniiJQAAAAAAAE3KM4UAAAAAAAAKQBQCAAAAAAAoAFEIAAAAAACgAEQhAAAAAACAAhCFAAAAAAAACkAUAgAAAAAAKIAWTT1AkcybNy9vvfVW2rVrl7KysqYeBwAAAAAAaEKlUikfffRROnXqlGbNGv86HlFoKXrrrbfSuXPnph4DAAAAAABYhrz++utZddVVG/04otBS1K5duyT/+XKrqqqaeBoAAAAAAKApTZ8+PZ07d67rB41NFFqKPr9lXFVVlSgEAAAAAAAkyVJ75Ezj36AOAAAAAACAJicKAQAAAAAAFIAoBAAAAAAAUACeKQQAAAAAAE1s7ty5mTNnTlOPQSNo2bJlmjdv3tRjJBGFAAAAAACgSc2YMSNvvPFGSqVSU49CIygrK8uqq66aysrKph5FFAIAAAAAgKYyd+7cvPHGG2nTpk1qampSVlbW1CPRgEqlUqZNm5Y33ngja6yxRpNfMSQKAQAAAABAE5kzZ05KpVJqamrSunXrph6HRlBTU5PJkydnzpw5TR6FmjXp0QEAAAAAAFcILceWpe9WFAIAAAAAACgAUQgAAAAAAKAAPFMIAAAAAACWMd2O+ctSPd7kM7ZvlP3uvvvuWXvttfOrX/1qifc1dOjQfPjhh7n55puTJOPHj8/QoUMzefLkJd734vrb3/6WY445Jo8//niaNVv2r8NZ9icEAAAAAACWOUOHDk1ZWVnKyspSXl6eHj165OSTT85nn32WJHnyySczbty4HHzwwQ1yvAsuuCBjxoxpkH0trIMPPjgbbLBBKioq0rt37/nWb7PNNmnZsmWuueaapTrX4hKFAAAAAACAxbLNNttk6tSpefHFF3P44Ydn5MiROfvss5MkF110UXbeeedUVlY2yLGqq6vTvn37BtnXothrr73ys5/97EvXDx06NBdeeOFSnGjxiUIAAAAAAMBiqaioyEorrZSuXbvmgAMOyFZbbZVbb701c+fOzY033pjBgwfXbfvcc8+lTZs2ufbaa+uWXX/99WndunWeeeaZrz3W0KFDs+OOO37p+oEDB2b48OH1lk2bNi3l5eW55557Fv3kklx44YU56KCDsvrqq3/pNoMHD86jjz6al19+ebGOsTSJQgAAAAAAQINo3bp1Zs+enX/961+pra1N375969attdZaOeecc3LggQdmypQpeeONN7L//vvnzDPPTK9evZb42MOGDcu1116bWbNm1S27+uqrs8oqq2TgwIFJkv333z+VlZVf+VpUXbp0yYorrpj7779/ic+hsbVo6gEAAAAAAIBvtlKplHvuuSd33HFHfvnLX+a1115L8+bN07Fjx3rbHXjggRk3blz+53/+J+Xl5dlwww3zy1/+skFm+MlPfpLhw4fnlltuyS677JIkGTNmTN2zj5Lk5JNPzhFHHNEgx/tvnTp1ymuvvdbg+21oolAT+M5Jd6RZRZumHgNYxkw+Y/umHgEAAAAAFsntt9+eysrKzJkzJ/Pmzcuuu+6akSNH5tZbb01FRUVdjPlvV1xxRdZcc800a9YskyZNWuA2i6NVq1bZfffdc8UVV2SXXXbJ448/nqeffjq33npr3TYdO3acL1Q1hNatW+fjjz9u8P02NFEIAAAAAABYLFtssUUuueSSlJeXp1OnTmnR4j/ZoUOHDvn4448ze/bslJeX1/vMk08+mZkzZ6ZZs2aZOnVqVl555QabZ9iwYendu3feeOONjB49OgMHDkzXrl3r1u+///65+uqrv3IfM2bMWOTjvv/++6mpqVnkzy1tohAAAAAAALBY2rZtmx49esy3vHfv3kmSZ555pu7PyX/iydChQ3Pcccdl6tSp2W233fL444+ndevWDTLPuuuum759++ayyy7Ltddem4svvrje+sa4fdynn36al19+OX369GnQ/TYGUQgAAAAAAGhQNTU1WX/99fPAAw/Ui0L7779/OnfunOOPPz6zZs1Knz59csQRR+S3v/1tgx172LBhGT58eNq2bZsf//jH9dYt6u3jXnrppcyYMSNvv/12Pvnkk0ycODFJ0qtXr7oroB588MFUVFRkk002abBzaCyiEAAAAAAALGOWh+dPDxs2LGPHjs3w4cOTJGPHjs24cePyxBNPpEWLFmnRokWuvvrqbLbZZtlhhx2y7bbbNshxhwwZkhEjRmTIkCFp1arVEu1r2LBh+fvf/173/vOrgV599dV069YtSfLHP/4xu+22W9q0abNEx1oaykqlUqmphyiK6dOnp7q6Op1HXJ9mFcv+LwewdC0P/0EPAAAAwKL59NNP8+qrr2a11VZb4oCxrPnkk0/Ss2fP/OlPf2qUq2jGjx+foUOHZvLkyfWWT548Od27d88jjzyS9ddfv8GP+9/efffd9OzZM48++mhWW221BW7zVd/x592gtrY2VVVVjTpr4kohAAAAAACgEbRu3Tpjx47Nu+++u1SON2fOnLz33ns5/vjj069fv0YPQsl/AtTvfve7Lw1CyxpRCAAAAAAAaBQDBgxY6G0rKyu/dN1f//rXbL755l/5+QkTJmSLLbbImmuumRtvvHGhj7sk+vbtm759+y6VYzUEUQgAAAAAAGhyEydO/NJ1q6yyynzLunXrlhEjRtS9HzBgQDwx56uJQgAAAAAAQJPr0aPHIm3/xSjE12vW1AMAAAAAAADQ+EQhAAAAAACAAhCFAAAAAAAACkAUAgAAAAAAKIDCR6EBAwZ4EBUAAAAAALDcK3wUAgAAAAAAKIIWTT0AAAAAAADwBSOrl/Lxahtlt7vvvnvWXnvt/OpXv1rifQ0dOjQffvhhbr755iTJ+PHjM3To0EyePHmJ9724fv/73+cvf/lLbrvttiabYVEU6kqhmTNnZo899khlZWVWXnnlnHvuufXWX3XVVenbt2/atWuXlVZaKbvuumveeeedJEmpVEqPHj1yzjnn1PvMxIkTU1ZWlpdeemmpnQcAAAAAADS1oUOHpqysLGVlZSkvL0+PHj1y8skn57PPPkuSPPnkkxk3blwOPvjgBjneBRdckDFjxjTIvhbW5+f336/rrruubv1ee+2Vxx9/PPfff/9SnWtxFSoKHXnkkfn73/+eW265JXfeeWfGjx+fxx9/vG79nDlzcsopp+TJJ5/MzTffnMmTJ2fo0KFJ/vPF77XXXhk9enS9fY4ePTrf//7306NHj/mON2vWrEyfPr3eCwAAAAAAlhfbbLNNpk6dmhdffDGHH354Ro4cmbPPPjtJctFFF2XnnXdOZWVlgxyruro67du3b5B9LYrRo0dn6tSpda8dd9yxbl15eXl23XXXXHjhhUt9rsVRmNvHzZgxI//7v/+bq6++OltuuWWS5Morr8yqq65at81ee+1V9+fVV189F154YTbccMPMmDEjlZWVGTp0aE488cQ8/PDD2WijjTJnzpxce+2181099LnTTz89o0aNmm/50632TlVFWQOfIcusRrrsEgAAAACgqVVUVGSllVZKkhxwwAG56aabcuutt+aoo47KjTfemGuuuaZu2+eeey7rr79+Lr/88uy6665Jkuuvvz577rlnHnvssfTq1esrj/XF28d90cCBA9OrV69cfPHFdcumTZuWVVZZJX/961/r2sCiat++fd05LsjgwYPzgx/8IJ988klat269WMdYWgpzpdDLL7+c2bNnZ+ONN65b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e+655wL3OWvWrMyaNavu/fTp0xv4rAEAAAAAABZOWenzy2m+wQYMGJB33nknkyZNSllZWZLkmGOOya233ppnnnkm3bp1S58+fXLTTTfVfWby5MlZbbXV8sQTT6R379751a9+leuuuy7PP/98WrZsOd8xevTokVNOOSVDhgypW3bqqadm3Lhx+ec//7nAuUaOHJlRo0bNt7z2mHapqihb0tMGAAAAAIBl28japp5gmTZ9+vRUV1entrY2VVVVjX685eL2cUnSr1+/uiCUJJtssklefPHFzJ07N0nSt2/fr/z8xIkTs/nmmy8wCM2cOTMvv/xy9t5771RWVta9Tj311Hq3l/uiY489NrW1tXWv119/fTHPDgAAAAAAYMksN7eP+zpt27b9yvWtW7f+0nUzZsxIklx22WXZeOON661r3rz5l36uoqIiFRUVizAlAAAAAABA41huotBDDz1U7/2DDz6YNdZY4yujzX9bb731cuWVV2bOnDnzXS204oorplOnTnnllVey2267NdjMAAAAAAAAS8tyc/u4KVOm5LDDDsvzzz+fP/7xj7noootyyCGHLPTnhw8fnunTp+fnP/95Hn300bz44ou56qqr8vzzzydJRo0aldNPPz0XXnhhXnjhhTz11FMZPXp0zjvvvMY6JQAAAAAAgAaz3FwptMcee+STTz7JRhttlObNm+eQQw7Jvvvuu9Cf//a3v5177703Rx55ZPr375/mzZund+/e2XTTTZMkw4YNS5s2bXL22WfnyCOPTNu2bbPuuutmxIgRjXRGAAAAAAAADaesVCqVmnqIJTVgwID07t07v/nNb5p6lK80ffr0VFdXp/aYdqmqKGvqcQAAAAAAoHGNrG3qCZZpdd2gtjZVVVWNfrzl5vZxAAAAAAAAfDlRCAAAAAAAoACWi2cKjR8/vqlHAAAAAAAAWKa5UggAAAAAAKAARCEAAAAAAIACEIUAAAAAAAAKQBQCAAAAAAAoAFEIAAAAAACgAEQhAAAAAACAAhCFAAAAAAAACkAUAgAAAAAAKABRCAAAAAAAoABaNPUAhXTsG0lVVVNPAQAAAAAAFIgrhQAAAAAAAApAFAIAAAAAACgAUQgAAAAAAKAARCEAAAAAAIACEIUAAAAAAAAKQBQCAAAAAAAoAFEIAAAAAACgAEQhAAAAAACAAhCFAAAAAAAACkAUAgAAAAAAKABRCAAAAAAAoABEIQAAAAAAgAIQhQAAAAAAAApAFAIAAAAAACgAUQgAAAAAAKAARCEAAAAAAIACEIUAAAAAAAAKQBQCAAAAAAAoAFEIAAAAAACgAEQhAAAAAACAAhCFAAAAAAAACkAUAgAAAAAAKABRCAAAAAAAoABEIQAAAAAAgAIQhQAAAAAAAApAFAIAAAAAACgAUQgAAAAAAKAARCEAAAAAAIACEIUAAAAAAAAKQBQCAAAAAAAoAFEIAAAAAACgAEQhAAAAAACAAhCFAAAAAAAACkAUAgAAAAAAKABRCAAAAAAAoABEIQAAAAAAgAIQhQAAAAAAAApAFAIAAAAAACiAFk09QBF956Q70qyiTVOPAYU0+Yztm3oEAAAAAIAm4UohAAAAAACAAhCFAAAAAAAACkAUAgAAAAAAKABRCAAAAAAAoABEIQAAAAAAgAIQhQAAAAAAAApAFAIAAAAAACgAUQgAAAAAAKAARCEAAAAAAIACEIUAAAAAAAAKQBQCAAAAAAAoAFEIAAAAAACgAEQhAAAAAACAAhCFAAAAAAAACmC5jkJDhw7Njjvu2NRjAAAAAAAANLnlOgo1lNmzZzf1CAAAAAAAAEtkuYhCN954Y9Zdd920bt063/72t7PVVlvlyCOPzJVXXplbbrklZWVlKSsry/jx45MkTz31VAYOHFi3/b777psZM2bU7e/zK4xOO+20dOrUKT179kySvP7669lll13Svn37rLDCCvnRj36UyZMnN8EZAwAAAAAALJoWTT3Akpo6dWqGDBmSs846Kz/+8Y/z0Ucf5f77788ee+yRKVOmZPr06Rk9enSSZIUVVsjMmTMzaNCgbLLJJnnkkUfyzjvvZNiwYRk+fHjGjBlTt9977rknVVVVueuuu5Ikc+bMqfvc/fffnxYtWuTUU0/NNttsk3/9618pLy+fb7ZZs2Zl1qxZde+nT5/euD8MAAAAAACAL7FcRKHPPvssP/nJT9K1a9ckybrrrpskad26dWbNmpWVVlqpbvsrr7wyn376acaOHZu2bdsmSS6++OIMHjw4Z555ZlZcccUkSdu2bXP55ZfXxZ6rr7468+bNy+WXX56ysrIkyejRo9O+ffuMHz8+W2+99XyznX766Rk1atR8y59utXeqKsoa8KcA1BlZ29QTAAAAAAAsk77xt4/77ne/my233DLrrrtudt5551x22WX54IMPvnT7Z599Nt/97nfrglCSbLrpppk3b16ef/75umXrrrtuvat/nnzyybz00ktp165dKisrU1lZmRVWWCGffvppXn755QUe69hjj01tbW3d6/XXX2+AMwYAAAAAAFh03/grhZo3b5677ror//znP3PnnXfmoosuynHHHZeHHnpoifb739EoSWbMmJENNtgg11xzzXzb1tTULHAfFRUVqaioWKI5AAAAAAAAGsI3PgolSVlZWTbddNNsuummOfHEE9O1a9fcdNNNKS8vz9y5c+ttu/baa2fMmDGZOXNmXfiZMGFCmjVrlp49e37pMdZff/386U9/SseOHVNVVdWo5wMAAAAAANDQvvG3j3vooYfy61//Oo8++mimTJmSP//5z5k2bVrWXnvtdOvWLf/617/y/PPP5913382cOXOy2267pVWrVtlzzz3z9NNP57777ssvf/nL7L777nXPE1qQ3XbbLR06dMiPfvSj3H///Xn11Vczfvz4HHzwwXnjjTeW4hkDAAAAAAAsum98FKqqqso//vGPbLfddllzzTVz/PHH59xzz822226bffbZJz179kzfvn1TU1OTCRMmpE2bNrnjjjvy/vvvZ8MNN8xOO+2ULbfcMhdffPFXHqdNmzb5xz/+kS5duuQnP/lJ1l577ey999759NNPXTkEAAAAAAAs88pKpVKpqYcoiunTp6e6ujq1x7RLVUVZU48Dy6eRtU09AQAAAADAQqnrBrW1S+UClG/8lUIAAAAAAAB8PVEIAAAAAACgAEQhAAAAAACAAhCFAAAAAAAACkAUAgAAAAAAKABRCAAAAAAAoABEIQAAAAAAgAIQhQAAAAAAAApAFAIAAAAAACgAUQgAAAAAAKAARCEAAAAAAIACEIUAAAAAAAAKoEVTD1BIx76RVFU19RQAAAAAAECBuFIIAAAAAACgAEQhAAAAAACAAhCFAAAAAAAACkAUAgAAAAAAKABRCAAAAAAAoABEIQAAAAAAgAIQhQAAAAAAAApAFAIAAAAAACgAUQgAAAAAAKAARCEAAAAAAIACEIUAAAAAAAAKQBQCAAAAAAAoAFEIAAAAAACgAEQhAAAAAACAAhCFAAAAAAAACkAUAgAAAAAAKABRCAAAAAAAoABEIQAAAAAAgAIQhQAAAAAAAApAFAIAAAAAACgAUQgAAAAA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AAAAUACiEAAAAAAAQAGIQgAAAAAAAAUgCgEAAAAAABSAKAQAAAAAAFAAohAAAAAAAEABiEIAAAAAAAAFIAoBAAAAAAAUgCgEAAAAAABQAKIQAAAAAABAAYhCAAAAAAAABSAKAQAAAAAAFIAoBAAAAAAAUACiEAAAAAAAQAGIQgAAAAAAAAUgCgEAAAAAABSAKAQAAAAAAFAALZp6gCL6zkl3pFlFm6Yeg/+/yWds39QjAAAAAABAo3OlEAAAAAAAQAGIQgAAAAAAAAUgCgEAAAAAABSAKAQAAAAAAFAAohAAAAAAAEABiEIAAAAAAAAFIAoBAAAAAAAUgCgEAAAAAABQAKIQAAAAAABAAYhCAAAAAAAABSAKAQAAAAAAFIAoBAAAAAAAUACiEAAAAAAAQAGIQgAAAAAAAAUgCgEAAAAAABSAKAQAAAAAAFAAy2UUmjdvXs4666z06NEjFRUV6dKlS0477bQkydFHH50111wzbdq0yeqrr54TTjghc+bMqfvsk08+mS222CLt2rVLVVVVNthggzz66KN16x944IFsvvnmad26dTp37pyDDz44M2fOXOrnCAAAAAAAsChaNPUAjeHYY4/NZZddlvPPPz+bbbZZpk6dmueeey5J0q5du4wZMyadOnXKU089lX322Sft2rXLUUcdlSTZbbfd0qdPn1xyySVp3rx5Jk6cmJYtWyZJXn755WyzzTY59dRTc8UVV2TatGkZPnx4hg8fntGjR883x6xZszJr1qy699OnT18KZw8AAAAAADC/slKpVGrqIRrSRx99lJqamlx88cUZNmzY125/zjnn5Lrrrqu7GqiqqioXXXRR9txzz/m2HTZsWJo3b55LL720btkDDzyQ/v37Z+bMmWnVqlW97UeOHJlRo0bNt5/aY9qlqqJsUU8Nli0ja5t6AgAAAACAb7Tp06enuro6tbW1qaqqavTjLXe3j3v22Wcza9asbLnllgtc/6c//SmbbrppVlpppVRWVub444/PlClT6tYfdthhGTZsWLbaaqucccYZefnll+vWPfnkkxkzZkwqKyvrXoMGDcq8efPy6quvznesY489NrW1tXWv119/veFPGAAAAAAAYCEsd1GodevWX7ru//v//r/stttu2W677XL77bfniSeeyHHHHZfZs2fXbTNy5MhMmjQp22+/fe6999706tUrN910U5JkxowZ2W+//TJx4sS615NPPpkXX3wx3bt3n+94FRUVqaqqqvcCAAAAAABoCsvdM4XWWGONtG7dOvfcc898t4/75z//ma5du+a4446rW/baa6/Nt48111wza665Zg499NAMGTIko0ePzo9//OOsv/76eeaZZ9KjR49GPw8AAAAAAICGtNxFoVatWuXoo4/OUUcdlfLy8my66aaZNm1aJk2alDXWWCNTpkzJddddlw033DB/+ctf6q4CSpJPPvkkRx55ZHbaaaesttpqeeONN/LII4/kpz/9aZLk6KOPTr9+/TJ8+PAMGzYsbdu2zTPPPJO77rorF198cVOdMgAAAAAAwNda7qJQkpxwwglp0aJFTjzxxLz11ltZeeWVs//++2fvvffOoYcemuHDh2fWrFnZfvvtc8IJJ2TkyJFJkubNm+e9997LHnvskX//+9/p0KFDfvKTn2TUqFFJkvXWWy9///vfc9xxx2XzzTdPqVRK9+7d87Of/awJzxYAAAAAAODrlZVKpVJTD1EU06dPT3V1dWqPaZeqirKmHgeWzMjapp4AAAAAAOAbra4b1Namqqqq0Y/XrNGPAAAAAAAAQJMThQAAAAAAAApAFAIAAAAAACgAUQgAAAAAAKAARCEAAAAAAIACEIUAAAAAAAAKQBQCAAAAAAAoAFEIAAAAAACgAEQhAAAAAACAAhCFAAAAAAAACkAUAgAAAAAAKABRCAAAAAAAoABaNPUAhXTsG0lVVVNPAQAAAAAAFIgrhQAAAAAAAApAFAIAAAAAACgAUQgAAAAAAKAARCEAAAAAAIACEIUAAAAAAAAKQBQCAAAAAAAoAFEIAAAAAACgAEQhAAAAAACAAhCFAAAAAAAACkAUAgAAAAAAKABRCAAAAAAAoABEIQAAAAAAgAIQhQAAAAAAAApAFAIAAAAAACgAUQgAAAAAAKAARCEAAAAAAIACEIUAAAAAAAAKQBQCAAAAAAAoAFEIAAAAAACgAEQhAAAAAACAAhCFAAAAAAAACkAUAgAAAAAAKABRCAAAAAAAoABEIQAAAAAAgAIQhQAAAAAAAApAFAIAAAAAACgAUQgAAAAAAKAARCEAAAAAAIACEIUAAAAAAAAKQBQCAAAAAAAoAFEIAAAAAACgAEQhAAAAAACAAhCFAAAAAAAACkAUAgAAAAAAKABRCAAAAAAAoABEIQAAAAAAgAIQhQAAAAAAAApAFAIAAAAAACiAFk09QBF956Q70qyiTVOPAQAALITJZ2zf1CMAAAA0CFcKAQAAAAAAFIAoBAAAAAAAUACiEAAAAAAAQAGIQgAAAAAAAAUgCgEAAAAAABSAKAQAAAAAAFAAohAAAAAAAEABiEIAAAAAAAAFIAoBAAAAAAAUgCgEAAAAAABQAKIQAAAAAABAAYhCAAAAAAAABSAKAQAAAAAAFEBhotCAAQMyYsSIph4DAAAAAACgSRQmCgEAAAAAABSZKAQAAAAAAFAAhYpCn332WYYPH57q6up06NAhJ5xwQkqlUpKkrKwsN998c73t27dvnzFjxiRJBg4cmOHDh9dbP23atJSXl+eee+5ZGuMDAAAAAAAstkJFoSuvvDItWrTIww8/nAsuuCDnnXdeLr/88oX67LBhw3Lttddm1qxZdcuuvvrqrLLKKhk4cOACPzNr1qxMnz693gsAAAAAAKAptGjqAZamzp075/zzz09ZWVl69uyZp556Kueff3722Wefr/3sT37ykwwfPjy33HJLdtlllyTJmDFjMnTo0JSVlS3wM6effnpGjRo13/KnW+2dqooFfwYAgOXYyNqmngAAAIACK9SVQv369asXcDbZZJO8+OKLmTt37td+tlWrVtl9991zxRVXJEkef/zxPP300xk6dOiXfubYY49NbW1t3ev1119f4nMAAAAAAABYHIW6UuirlJWV1T1f6HNz5syp937YsGHp3bt33njjjYwePToDBw5M165dv3SfFRUVqaioaJR5AQAAAAAAFkWhrhR66KGH6r1/8MEHs8Yaa6R58+apqanJ1KlT69a9+OKL+fjjj+ttv+6666Zv37657LLLcu2112avvfZaKnMDAAAAAAAsqUJFoSlTpuSwww7L888/nz/+8Y+56KKLcsghhyRJBg4cmIsvvjhPPPFEHn300ey///5p2bLlfPsYNmxYzjjjjJRKpfz4xz9e2qcAAAAAAACwWAoVhfbYY4988skn2WijjXLQQQflkEMOyb777pskOffcc9O5c+dsvvnm2XXXXXPEEUekTZs28+1jyJAhadGiRYYMGZJWrVot7VMAAAAAAABYLGWlLz5Ih680efLkdO/ePY888kjWX3/9Rfrs9OnTU11dndpj2qWqoqyRJgQAYJk1srapJwAAAGAZUtcNamtTVVXV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AAAAAADAklvkKHTaaadlzJgxOeuss1JeXl63/Dvf+U4uv/zyBh0OAAAAAACAhrHIUWjs2LH5wx/+kN122y3NmzevW/7d7343zz33XIMOBwAAAAAAQMNY5Cj05ptvpkePHvMtnzdvXubMmdMgQwEAAAAAANCwFjkK9erVK/fff/98y2+88cb06dOnQYYCAAAAAACgYbVY1A+ceOKJ2XPPPfPmm29m3rx5+fOf/5znn38+Y8eOze23394YMwIAAAAAALCEFvlKoR/96Ee57bbbcvfdd6dt27Y58cQT8+yzz+a2227LD37wg8aYEQAAAAAAgCW0yFcKvfHGG9l8881z1113zbfuwQcfTL9+/RpkMAAAAAAAABrOIl8ptPXWW+f999+fb/mECROyzTbbNMhQAAAAAAAANKxFjkL9+vXL1ltvnY8++qhu2T/+8Y9st912Oemkkxp0OAAAAAAAABrGIkehyy+/PF26dMngwYMza9as3Hfffdl+++1z8skn59BDD22MGQEAAAAAAFhCixyFmjVrluuuuy4tW7bMwIED88Mf/jCnn356DjnkkMaYDwAAAAAAgAZQViqVSl+30b/+9a/5ln300UcZMmRItt9++xxwwAF1y9dbb72GnXA5Mn369FRXV6e2tjZVVVVNPQ4AAAAAANCElnY3WKgo1KxZs5SVleW/N/3v95//uaysLHPnzm28ab/hRCEAAAAAAOBzS7sbtFiYjV599dXGngMAAAAAAIBGtFBRqGvXro09BwAAAAAAAI1ooaLQF7388sv5zW9+k2effTZJ0qtXrxxyyCHp3r17gw4HAAAAAABAw2i2qB+444470qtXrzz88MNZb731st566+Whhx7KOuusk7vuuqsxZgQAAAAAAGAJlZVKpdKifKBPnz4ZNGhQzjjjjHrLjznmmNx55515/PHHG3TA5cnSfmAUAAAAAACw7Fra3WCRrxR69tlns/fee8+3fK+99sozzzzTIEMBAAAAAADQsBY5CtXU1GTixInzLZ84cWI6duzYEDMBAAAAAADQwFos7IYnn3xyjjjiiOyzzz7Zd99988orr+R73/tekmTChAk588wzc9hhhzXaoAAAAAAAACy+hX6mUPPmzTN16tTU1NTkN7/5Tc4999y89dZbSZJOnTrlyCOPzMEHH5yysrJGHfibzDOFAAAAAACAzy3tbrDQ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devWseOOO8Yvf/nLBvvHjx8fffr0idatW0fXrl3ju9/9bqxZs2aj40ybNi122WWXaNGiRRx66KGxfPnyRvhOAAAAAAAANK6irxSaNGlSlJaWxiOPPBI/+9nPYvz48fGb3/ymsP+qq66Kvn37xuOPPx6XXHJJzJs3L0488cT4xje+EQsWLIjq6uq45JJLYuLEiQ2Oe+WVVxa+7uKLL45zzjkn7r333sL+kpKS+PnPfx4LFy6MSZMmxf333x8XXnhhg2O8/fbb8eMf/zhuvPHGmDVrVqxevTq+8Y1vbPFrq6uri9ra2gYPAAAAAACAYshl7y/LKYKBAwfGK6+8EgsXLoxcLhcRERdffHFMnz49nn766ejevXvstddeMXXq1MLXDBs2LF599dX485//XNh24YUXxp/+9KdYuHBhRLy3wqhXr15x1113FcZ84xvfiNra2rjzzjs3OZc//vGPccYZZ8Rrr70WERETJ06MU089NR5++OHo379/REQ888wz0atXr5gzZ07069cvqqurY9q0aTF//vxNHrO6ujrGjBmz0faai9tEvjz3Mb5TjaC6prjnBwAAAACAxNXW1kZlZWXU1NREPp9v9PMVfaXQ/vvvXwhCERFVVVXx7LPPxvr16yMiYt99920wftGiRXHAAQc02HbAAQc0+Jr3j/NBVVVVsWjRosLz++67LwYNGhQ77rhjtGnTJk4++eRYtWpVvP3224UxpaWlsd9++xWef/nLX462bds2OM6HGT16dNTU1BQePnoOAAAAAAAolqJHoY/SunXrrX7MpUuXxpFHHhl77LFH3HbbbTFv3rzC7xyqr6/faucpLy+PfD7f4AEAAAAAAFAMRY9Cc+bMafD84Ycfjl122SWaNWu2yfG9evWKWbNmNdg2a9as2HXXXRt8zcMPP7zRcXv16hUREfPmzYsNGzbE1VdfHfvvv3/suuuu8eKLL250rnXr1sWjjz5aeL548eJYvXp14TgAAAAAAACfFUWPQsuWLYvzzjsvFi9eHDfffHNce+21cc4552x2/Pnnnx8zZsyIyy67LP7+97/HpEmT4he/+EVccMEFDcbNmjUrrrjiivj73/8ev/zlL+PWW28tHLdHjx6xdu3auPbaa+OFF16I3/3ud/HrX/96o3M1b948zjrrrJgzZ07MmzcvRowYEfvvv3/069dv634TAAAAAAAAGlnRo9Dw4cPjnXfeiX79+sWoUaPinHPOidNPP32z4/fee++45ZZbYsqUKdG7d+/44Q9/GGPHjo0RI0Y0GHf++efHo48+GnvttVf86Ec/ivHjx8ehhx4aERF9+/aN8ePHx3/+539G796946abborLL798o3O1atUqLrroovjmN78ZBxxwQFRUVMQf/vCHrfr6AQAAAAAAmkIuy7KsWCcfOHBg7LnnnnHNNdcUawpNqra2NiorK6Pm4jaRL88VdzLVNcU9PwAAAAAAJK7QDWpqIp/PN/r5ir5SCAAAAAAAgMYnCgEAAAAAACSgtJgnnzlzZjFPDwAAAAAAkAwrhQAAAAAAABIgCgEAAAAAACRAFAIAAAAAAEiAKAQAAAAAAJAAUQgAAAAAACABohAAAAAAAEACRCEAAAAAAIAEiEIAAAAAAAAJEIUAAAAAAAASUFrsCSRp9IqIfL7YswAAAAAAABJipRAAAAAAAEACRCEAAAAAAIAEiEIAAAAAAAAJEIUAAAAAAAASIAoBAAAAAAAkQBQCAAAAAABIgCgEAAAAAACQAFEIAAAAAAAgAaIQAAAAAABAAkQhAAAAAACABIhCAAAAAAAACRCFAAAAAAAAEiAKAQAAAAAAJEAUAgAAAAAASIAoBAAAAAAAkABRCAAAAAAAIAGiEAAAAAAAQAJEIQAAAAAAgASIQgAAAAAAAAkQhQAAAAAAABIgCgEAAAAAACRAFAIAAAAAAEiAKAQAAAAAAJAAUQgAAAAAACABohAAAAAAAEACRCEAAAAAAIAEiEIAAAAAAAAJEIUAAAAAAAASIAoBAAAAAAAkQBQCAAAAAABIgCgEAAAAAACQAFEIAAAAAAAgAaIQAAAAAABAAkQhAAAAAACABIhCAAAAAAAACRCFAAAAAAAAEiAKAQAAAAAAJEAUAgAAAAAASEBpsSeQot6X3hMl5a2a/LxLxx3R5OcEAAAAAAC2DVYKAQAAAAAAJEAUAgAAAAAASIAoBAAAAAAAkABRCAAAAAAAIAGiEAAAAAAAQAJEIQAAAAAAgASIQgAAAAAAAAkQhQAAAAAAABIgCgEAAAAAACRAFAIAAAAAAEiAKAQAAAAAAJAAUQgAAAAAACABohAAAAAAAEACtrkoNHDgwDj33HOLPQ0AAAAAAIDPlW0uCn1WdO/ePa655ppiTwMAAAAAAGCLiEIAAAAAAAAJ2Caj0IYNG+LCCy+Mdu3aRefOnaO6urqwb/z48dGnT59o3bp1dO3aNb773e/GmjVrIiKitrY2WrZsGXfddVeD402dOjXatGkTb7/9dkRELF++PE488cRo27ZttGvXLo455phYunRpYfyIESPi2GOPjauuuip22GGHaN++fYwaNSrWrl0bEe99xN0//vGP+N73vhe5XC5yuVzjfkMAAAAAAAA+pW0yCk2aNClat24dc+bMiSuuuCLGjh0b9957b0RElJSUxM9//vNYuHBhTJo0Ke6///648MILIyIin8/HkUceGZMnT25wvJtuuimOPfbYaNWqVaxduzYOPfTQaNOmTTz00EMxa9asqKioiCFDhkR9fX3hax544IF4/vnn44EHHohJkybFxIkTY+LEiRERcfvtt8cXvvCFGDt2bKxcuTJWrly5yddRV1cXtbW1DR4AAAAAAADFkMuyLCv2JD5o4MCBsX79+njooYcK2/r16xcHH3xwjBs3bqPxf/zjH+OMM86I1157LSIipk2bFieffHK8/PLL0apVq6itrY1OnTrF1KlTY8iQIfH73/8+fvSjH8WiRYsKK3zq6+ujbdu2MW3atDjkkENixIgRMXPmzHj++eejWbNmERFx4oknRklJSUyZMiUi3vudQueee26ce+65m30t1dXVMWbMmI2211zcJvLlRV5dVF1T3PMDAAAAAEDiamtro7KyMmpqaiKfzzf6+bbJlUJ77LFHg+c77LBDvPLKKxERcd9998WgQYNixx13jDZt2sTJJ58cq1atKnw03OGHHx7NmzeP6dOnR0TEbbfdFvl8PgYPHhwREU888UQ899xz0aZNm6ioqIiKiopo165dvPvuu/H8888Xzrn77rsXgtC/zmFLjR49OmpqagqP5cuXf/xvBgAAAAAAwFZQWuwJbErz5s0bPM/lcrFhw4ZYunRpHHnkkfGd73wnfvzjH0e7du3ir3/9a4wcOTLq6+ujVatWUVZWFl//+tdj8uTJ8Y1vfCMmT54cJ510UpSWvvdS16xZE/vss0/cdNNNG523Y8eOHzmHj6O8vDzKy8s/1tcAAAAAAAA0hm0yCm3OvHnzYsOGDXH11VdHScl7i5xuueWWjcYNGzYs/v3f/z0WLlwY999/f/zoRz8q7Nt7773jD3/4Q2y//fafailWWVlZrF+//hN/PQAAAAAAQFPaJj8+bnN69OgRa9eujWuvvTZeeOGF+N3vfhe//vWvNxp34IEHRufOnWPYsGGx8847R//+/Qv7hg0bFh06dIhjjjkmHnrooViyZEnMnDkzzj777FixYsUWz6V79+7x4IMPxj//+c/C7zMCAAAAAADYVn2molDfvn1j/Pjx8Z//+Z/Ru3fvuOmmm+Lyyy/faFwul4uhQ4fGE088EcOGDWuwr1WrVvHggw9Gt27d4rjjjotevXrFyJEj49133/1YK4fGjh0bS5cujS996UsNPnYOAAAAAABgW5TLsiwr9iRSUVtbG5WVlVFzcZvIl+eKO5nqmuKeHwAAAAAAElfoBjU1n+pX3mypz9RKIQAAAAAAAD4ZUQgAAAAAACABohAAAAAAAEACRCEAAAAAAIAEiEIAAAAAAAAJEIUAAAAAAAASIAoBAAAAAAAkQBQCAAAAAABIgCgEAAAAAACQAFEIAAAAAAAgAaIQAAAAAABAAkQhAAAAAACABJQWewJJGr0iIp8v9iwAAAAAAICEWCkEAAAAAACQAFEIAAAAAAAgAaIQAAAAAABAAkQhAAAAAACABIhCAAAAAAAACRCFAAAAAAAAEiAKAQAAAAAAJEAUAgAAAAAASIAoBAAAAAAAkABRCAAAAAAAIAGiEAAAAAAAQAJEIQAAAAAAgASIQgAAAAAAAAkQhQAAAAAAABIgCgEAAAAAACRAFAIAAAAAAEiAKAQAAAAAAJAAUQgAAAAAACABohAAAAAAAEACRCEAAAAAAIAEiEIAAAAAAAAJEIUAAAAAAAASIAoBAAAAAAAkQBQCAAAAAABIgCgEAAAAAACQAFEIAAAAAAAgAaIQAAAAAABAAkQhAAAAAACABIhCAAAAAAAACRCFAAAAAAAAEiAKAQAAAAAAJEAUAgAAAAAASIAoBAAAAAAAkABRCAAAAAAAIAGiEAAAAAAAQAJEIQAAAAAAgASIQgAAAAAAAAkQhQAAAAAAABJQWuwJpKj3pfdESXmrJj/v0nFHNPk5AQAAAACAbYOVQgAAAAAAAAkQhQAAAAAAABIgCgEAAAAAACRAFAIAAAAAAEiAKAQAAAAAAJAAUQgAAAAAACABohAAAAAAAEACRCEAAAAAAIAEiEIAAAAAAAAJEIUAAAAAAAASIAoBAAAAAAAkQBQCAAAAAABIgCgEAAAAAACQAFHoI+RyuZg2bVqxpwEAAAAAAPCpiEL/p7q6Ovbcc8+Ntq9cuTIOO+ywpp8QAAAAAADAVlRa7Als6zp37lzsKQAAAAAAAHxqn5uVQgMHDoyzzz47LrzwwmjXrl107tw5qqurC/uXLVsWxxxzTFRUVEQ+n48TTzwxXn755YiImDhxYowZMyaeeOKJyOVykcvlYuLEiRGx8cfHrVixIoYOHRrt2rWL1q1bx7777htz5sxpwlcKAAAAAADw8X2uVgpNmjQpzjvvvJgzZ07Mnj07RowYEQcccEAMGjSoEIT+8pe/xLp162LUqFFx0kknxcyZM+Okk06Kp556Ku6+++647777IiKisrJyo+OvWbMmDjrooNhxxx1j+vTp0blz53jsscdiw4YNm5xPXV1d1NXVFZ7X1tY2zgsHAAAAAAD4CJ+rKLTHHnvEpZdeGhERu+yyS/ziF7+IGTNmRETEggULYsmSJdG1a9eIiLjxxhtj9913j7lz58Z+++0XFRUVUVpa+qEfFzd58uR49dVXY+7cudGuXbuIiOjRo8dmx19++eUxZsyYjbY/1WJk5Mtzn/h1fmLVH/xzTdOfHwAAAAAAKJrPzcfHRbwXhT5ohx12iFdeeSUWLVoUXbt2LQShiIjddtst2rZtG4sWLdri48+fPz/22muvQhD6KKNHj46amprCY/ny5Vt8LgAAAAAAgK3pc7VSqHnz5g2e53K5zX602yfRsmXLjzW+vLw8ysvLt9r5AQAAAAAAPqnP1UqhzenVq1csX768wUqdp59+OlavXh277bZbRESUlZXF+vXrP/Q4e+yxR8yfPz9ef/31Rp0vAAAAAADA1pZEFBo8eHD06dMnhg0bFo899lg88sgjMXz48DjooINi3333jYiI7t27x5IlS2L+/Pnx2muvRV1d3UbHGTp0aHTu3DmOPfbYmDVrVrzwwgtx2223xezZs5v6JQEAAAAAAHwsSUShXC4Xd9xxR2y33XZx4IEHxuDBg+OLX/xi/OEPfyiMOf7442PIkCHx1a9+NTp27Bg333zzRscpKyuLP//5z7H99tvH4YcfHn369Ilx48ZFs2bNmvLlAAAAAAAAfGy5LMuyYk8iFbW1tVFZWRk1F7eJfHmuuJOprinu+QEAAAAAIHGFblBTE/l8vtHPl8RKIQAAAAAAgNSJQgAAAAAAAAkQhQAAAAAAABIgCgEAAAAAACRAFAIAAAAAAEiAKAQAAAAAAJAAUQgAAAAAACABohAAAAAAAEACRCEAAAAAAIAEiEIAAAAAAAAJEIUAAAAAAAASIAoBAAAAAAAkoLTYE0jS6BUR+XyxZwEAAAAAACTESiEAAAAAAIAEiEIAAAAAAAAJEIUAAAAAAAASIAoBAAAAAAAkQBQCAAAAAABIgCgEAAAAAACQAFEIAAAAAAAgAaIQAAAAAABAAkQhAAAAAACABIhCAAAAAAAACRCFAAAAAAAAEiAKAQAAAAAAJEAUAgAAAAAASIAoBAAAAAAAkABRCAAAAAAAIAGiEAAAAAAAQAJEIQAAAAAAgASIQgAAAAAAAAkQhQAAAAAAABIgCgEAAAAAACRAFAIAAAAAAEiAKAQAAAAAAJAAUQgAAAAAACABohAAAAAAAEACRCEAAAAAAIAEiEIAAAAAAAAJEIUAAAAAAAASIAoBAAAAAAAkQBQCAAAAAABIgCgEAAAAAACQAFEIAAAAAAAgAaIQAAAAAABAAkQhAAAAAACABIhCAAAAAAAACRCFAAAAAAAAEiAKAQAAAAAAJEAUAgAAAAAASIAoBAAAAAAAkIDSYk8gRb0vvSdKylsVexpNbum4I4o9BQAAAAAASJaVQgAAAAAAAAkQhQAAAAAAABIgCgEAAAAAACRAFAIAAAAAAEiAKAQAAAAAAJAAUQgAAAAAACABohAAAAAAAEACRCEAAAAAAIAEiEIAAAAAAAAJEIUAAAAAAAASIAoBAAAAAAAkQBQCAAAAAABIgCgEAAAAAACQgM9cFBoxYkQce+yxn+oYM2fOjFwuF6tXr46IiIkTJ0bbtm0/9dwAAAAAAAC2VaXFnsDH9bOf/SyyLPtUxxgwYECsXLkyKisrt9KsAAAAAAAAtm2fuSi0NUJOWVlZdO7ceSvM5v+rr6+PsrKyrXpMAAAAAACArWWb/fi4P/7xj9GnT59o2bJltG/fPgYPHhxvvfXWRh8fN3DgwDjrrLPi3HPPje222y46deoU119/fbz11ltx6qmnRps2baJHjx5x1113Fb7mXz8+7l89//zzccwxx0SnTp2ioqIi9ttvv7jvvvsajOnevXtcdtllMXz48Mjn83H66ac3xrcBAAAAAABgq9gmo9DKlStj6NCh8a1vfSsWLVoUM2fOjOOOO26zHxs3adKk6NChQzzyyCNx1llnxXe+85044YQTYsCAAfHYY4/FIYccEieffHK8/fbbW3T+NWvWxOGHHx4zZsyIxx9/PIYMGRJHHXVULFu2rMG4q666Kvr27RuPP/54XHLJJRsdp66uLmpraxs8AAAAAAAAiiGXfdpf0NMIHnvssdhnn31i6dKlsdNOOzXYN2LEiFi9enVMmzYtIt5bKbR+/fp46KGHIiJi/fr1UVlZGccdd1zceOONERHx0ksvxQ477BCzZ8+O/fffP2bOnBlf/epX44033oi2bdvGxIkT49xzz93syqGIiN69e8cZZ5wRZ555ZkS8t1Jor732iqlTp272a6qrq2PMmDEbba+5uE3ky3Mf51vy2VJdU+wZAAAAAADANq+2tjYqKyujpqYm8vl8o59vm1wp1Ldv3xg0aFD06dMnTjjhhLj++uvjjTfe2Oz4PfbYo/DnZs2aRfv27aNPnz6FbZ06dYqIiFdeeWWLzr9mzZq44IILolevXtG2bduoqKiIRYsWbbRSaN999/3Q44wePTpqamoKj+XLl2/R+QEAAAAAALa2bTIKNWvWLO6999646667Yrfddotrr702evbsGUuWLNnk+ObNmzd4nsvlGmzL5d5blbNhw4YtOv8FF1wQU6dOjZ/85Cfx0EMPxfz586NPnz5RX1/fYFzr1q0/9Djl5eWRz+cbPAAAAAAAAIqhtNgT2JxcLhcHHHBAHHDAAfHDH/4wdtpppw/9qLatadasWTFixIj42te+FhHvrRxaunRpk5wbAAAAAACgMWyTUWjOnDkxY8aMOOSQQ2L77bePOXPmxKuvvhq9evWKJ598stHPv8suu8Ttt98eRx11VORyubjkkku2eJURAAAAAADAtmib/Pi4fD4fDz74YBx++OGx6667xg9+8IO4+uqr47DDDmuS848fPz622267GDBgQBx11FFx6KGHxt57790k5wYAAAAAAGgMuSzLsmJPIhW1tbVRWVkZNRe3iXx5rtjTaTzVNcWeAQAAAAAAbPMK3aCmJvL5fKOfb5tcKQQAAAAAAMDWJQoBAAAAAAAkQBQCAAAAAABIgCgEAAAAAACQAFEIAAAAAAAgAaIQAAAAAABAAkQhAAAAAACABIhCAAAAAAAACRCFAAAAAAAAEiAKAQAAAAAAJEAUAgAAAAAASIAoBAAAAAAAkIDSYk8gSaNXROTzxZ4FAAAAAACQECuFAAAAAAAAEiAKAQAAAAAAJEAUAgAAAAAASIAoBAAAAAAAkABRCAAAAAAAIAGiEAAAAAAAQAJEIQAAAAAAgASIQgAAAAAAAAkQhQAAAAAAABIgCgEAAAAAACRAFAIAAAAAAEiAKAQAAAAAAJAAUQgAAAAAACABohAAAAAAAEACRCEAAAAAAIAEiEIAAAAAAAAJEIUAAAAAAAASIAoBAAAAAAAkQBQCAAAAAABIgCgEAAAAAACQAFEIAAAAAAAgAaIQAAAAAABAAkQhAAAAAACABIhCAAAAAAAACRCFAAAAAAAAEiAKAQAAAAAAJEAUAgAAAAAASIAoBAAAAAAAkABRCAAAAAAAIAGiEAAAAAAAQAJEIQAAAAAAgASIQgAAAAAAAAkQhQAAAAAAABIgCgEAAAAAACRAFAIAAAAAAEiAKAQAAAAAAJAAUQgAAAAAACABohAAAAAAAEACSos9gRT1vvSeKClv1eTnXTruiCY/JwAAAAAAsG2wUggAAAAAACABohAAAAAAAEACRCEAAAAAAIAEiEIAAAAAAAAJEIUAAAAAAAASIAoBAAAAAAAkQBQCAAAAAABIgCgEAAAAAACQAFEIAAAAAAAgAaIQAAAAAABAAkQhAAAAAACABIhCAAAAAAAACRCFAAAAAAAAEiAKfYSBAwfGueeeGxER3bt3j2uuuaawL5fLxbRp04oyLwAAAAAAgI+jtNgT2Nbdfvvt0bx582JPAwAAAAAA4FMRhT5Cu3btij0FAAAAAACAT83Hx32ED358HAAAAAAAwGeVlUKNqK6uLurq6grPa2trizgbAAAAAAAgZaJQI7r88stjzJgxG21/qsXIyJfnmn5C1VvzWDVb8WAAAAAAAEBj8/FxjWj06NFRU1NTeCxfvrzYUwIAAAAAABJlpVAjKi8vj/Ly8mJPAwAAAAAAwEohAAAAAACAFIhCAAAAAAAACRCFAAAAAAAAEuB3Cn2EmTNnFv68dOnSBvuyLGvayQAAAAAAAHxCVgoBAAAAAAAkQBQCAAAAAABIgCgEAAAAAACQAFEIAAAAAAAgAaIQAAAAAABAAkQhAAAAAACABIhCAAAAAAAACRCFAAAAAAAAEiAKAQAAAAAAJEAUAgAAAAAASIAoBAAAAAAAkABRCAAAAAAAIAGlxZ5AkkaviMjniz0LAAAAAAAgIVYKAQAAAAAAJEAUAgAAAAAASIAoBAAAAAAAkABRCAAAAAAAIAGiEAAAAAAAQAJEIQAAAAAAgASIQgAAAAAAAAkQhQAAAAAAABIgCgEAAAAAACRAFAIAAAAAAEiAKAQAAAAAAJAAUQgAAAAAACABohAAAAAAAEACRCEAAAAAAIAEiEIAAAAAAAAJEIUAAAAAAAASIAoBAAAAAAAkQBQCAAAAAABIgCgEAAAAAACQAFEIAAAAAAAgAaIQAAAAAABAAkQhAAAAAACABIhCAAAAAAAACRCFAAAAAAAAEiAKAQAAAAAAJEAUAgAAAAAASIAoBAAAAAAAkABRCAAAAAAAIAGiEAAAAAAAQAJEIQAAAAAAgASIQgAAAAAAAAkQhQAAAAAAABIgCgEAAAAAACRAFAIAAAAAAEiAKAQAAAAAAJAAUQgAAAAAACABohAAAAAAAEACRCEAAAAAAIAElBZ7Ainqfek9UVLeqtjTYCtYOu6IYk8BAAAAAAC2iJVCAAAAAAAACRCFAAAAAAAAEiAKAQAAAAAAJEAUAgAAAAAASIAoBAAAAAAAkABRCAAAAAAAIAGiEAAAAAAAQAJEIQAAAAAAgASIQgAAAAAAAAkQhQAAAAAAABIgCgEAAAAAACRAFAIAAAAAAEiAKAQAAAAAAJAAUQgAAAAAACABotD/ue6662KPPfaIfD4f+Xw+qqqq4q677irsf/fdd2PUqFHRvn37qKioiOOPPz5efvnlIs4YAAAAAABgy4lC/+cLX/hCjBs3LubNmxePPvpoHHzwwXHMMcfEwoULIyLie9/7XvzP//xP3HrrrfGXv/wlXnzxxTjuuOOKPGsAAAAAAIAtk8uyLCv2JLZV7dq1iyuvvDK+/vWvR8eOHWPy5Mnx9a9/PSIinnnmmejVq1fMnj079t9//y06Xm1tbVRWVkbXc2+JkvJWjTl1msjScUcUewoAAAAAAHxGvd8NampqIp/PN/r5rBTahPXr18eUKVPirbfeiqqqqpg3b16sXbs2Bg8eXBjz5S9/Obp16xazZ8/e7HHq6uqitra2wQMAAAAAAKAYSos9gW3JggULoqqqKt59992oqKiIqVOnxm677Rbz58+PsrKyaNu2bYPxnTp1ipdeemmzx7v88stjzJgxG21/qsXIyJfntvb0i6+6ptgzAAAAAAAANsNKoQ/o2bNnzJ8/P+bMmRPf+c534pRTTomnn376Ex9v9OjRUVNTU3gsX758K84WAAAAAABgy1kp9AFlZWXRo0ePiIjYZ599Yu7cufGzn/0sTjrppKivr4/Vq1c3WC308ssvR+fOnTd7vPLy8igvL2/saQMAAAAAAHwkK4U+xIYNG6Kuri722WefaN68ecyYMaOwb/HixbFs2bKoqqoq4gwBAAAAAAC2jJVC/2f06NFx2GGHRbdu3eLNN9+MyZMnx8yZM+Oee+6JysrKGDlyZJx33nnRrl27yOfzcdZZZ0VVVVXsv//+xZ46AAAAAADARxKF/s8rr7wSw4cPj5UrV0ZlZWXssccecc8998S///u/R0TET3/60ygpKYnjjz8+6urq4tBDD41f/epXRZ41AAAAAADAlsllWZYVexKpqK2tjcrKyqi5uE3ky3PFns7WV11T7BkAAAAAAMBnRqEb1NREPp9v9PP5nUIAAAAAAAAJEIUAAAAAAAASIAoBAAAAAAAkQBQCAAAAAABIgCgEAAAAAACQAFEIAAAAAAAgAaIQAAAAAABAAkQhAAAAAACABIhCAAAAAAAACRCFAAAAAAAAEiAKAQAAAAAAJEAUAgAAAAAASEBpsSeQpNErIvL5Ys8CAAAAAABIiJVCAAAAAAAACRCFAAAAAAAAEiAKAQAAAAAAJEAUAgAAAAAASIAoBAAAAAAAkABRCAAAAAAAIAGiEAAAAAAAQAJEIQAAAAAAgASIQgAAAAAAAAkQhQAAAAAAABIgCgEAAAAAACRAFAIAAAAAAEiAKAQAAAAAAJAAUQgAAAAAACABohAAAAAAAEACRCEAAAAAAIAEiEIAAAAAAAAJEIUAAAAAAAASUFrsCaQky7KIiKitrS3yTAAAAAAAgGJ7vxe83w8amyjUhFatWhUREV27di3yTAAAAAAAgG3Fm2++GZWVlY1+HlGoCbVr1y4iIpYtW9Yk/+fCtqa2tja6du0ay5cvj3w+X+zpQJNzDZA61wCpcw2QOtcAqXMNkDrXACn7sPd/lmXx5ptvRpcuXZpkLqJQEyopee9XOFVWVvqLj6Tl83nXAElzDZA61wCpcw2QOtcAqXMNkDrXACnb3Pu/KReRlDTZmQAAAAAAACgaUQgAAAAAACABolATKi8vj0svvTTKy8uLPRUoCtcAqXMNkDrXAKlzDZA61wCpcw2QOtcAKduW3v+5LMuyYk8CAAAAAACAxmWlEAAAAAAAQAJEIQAAAAAAgASIQgAAAAAAAAkQhQAAAAAAABIgCn2IX/7yl9G9e/do0aJF9O/fPx555JEPHX/rrbfGl7/85WjRokX06dMn7rzzzgb7syyLH/7wh7HDDjtEy5YtY/DgwfHss882GPP666/HsGHDIp/PR9u2bWPkyJGxZs2aBmOefPLJ+Ld/+7do0aJFdO3aNa644oqt84LhXzT1NbB06dIYOXJk7LzzztGyZcv40pe+FJdeemnU19c3GJPL5TZ6PPzww1v3xUMU5z7QvXv3jd7f48aNazDGfYCm0tTXwMyZMzf5d3wul4u5c+dGhPsATWtrXwO33357HHLIIdG+ffvI5XIxf/78jY7x7rvvxqhRo6J9+/ZRUVERxx9/fLz88ssNxixbtiyOOOKIaNWqVWy//fbx/e9/P9atW/epXy/8q6a+Bl5//fU466yzomfPntGyZcvo1q1bnH322VFTU9Ng3KbuA1OmTNkqrxneV4x7wMCBAzd6b59xxhkNxrgH0FSa+hrY3M/5uVwubr311sI49wCayta8BtauXRsXXXRR9OnTJ1q3bh1dunSJ4cOHx4svvtjgGE3WBjI2acqUKVlZWVl2ww03ZAsXLsy+/e1vZ23bts1efvnlTY6fNWtW1qxZs+yKK67Inn766ewHP/hB1rx582zBggWFMePGjcsqKyuzadOmZU888UR29NFHZzvvvHP2zjvvFMYMGTIk69u3b/bwww9nDz30UNajR49s6NChhf01NTVZp06dsmHDhmVPPfVUdvPNN2ctW7bM/uu//qvxvhkkqRjXwF133ZWNGDEiu+eee7Lnn38+u+OOO7Ltt98+O//88wvHWLJkSRYR2X333ZetXLmy8Kivr2/cbwjJKdZ9YKeddsrGjh3b4P29Zs2awn73AZpKMa6Burq6Bu/9lStXZqeddlq28847Zxs2bMiyzH2AptMY18CNN96YjRkzJrv++uuziMgef/zxjY5zxhlnZF27ds1mzJiRPfroo9n++++fDRgwoLB/3bp1We/evbPBgwdnjz/+eHbnnXdmHTp0yEaPHr3VvwekrRjXwIIFC7Ljjjsumz59evbcc89lM2bMyHbZZZfs+OOPbzAuIrIJEyY0uA988Ocp+LSKdQ846KCDsm9/+9sN3ts1NTWF/e4BNJViXAPr1q3b6N8CY8aMySoqKrI333yzMM49gKawta+B1atXZ4MHD87+8Ic/ZM8880w2e/bsrF+/ftk+++zT4DhN1QZEoc3o169fNmrUqMLz9evXZ126dMkuv/zyTY4/8cQTsyOOOKLBtv79+2f/8R//kWVZlm3YsCHr3LlzduWVVxb2r169OisvL89uvvnmLMuy7Omnn84iIps7d25hzF133ZXlcrnsn//8Z5ZlWfarX/0q22677bK6urrCmIsuuijr2bPnp3zF0FAxroFNueKKK7Kdd9658Pz9/xi4qR+gYWsq1jWw0047ZT/96U83Oy/3AZrKtnAfqK+vzzp27JiNHTu2sM19gKayta+BD9rc+3j16tVZ8+bNs1tvvbWwbdGiRVlEZLNnz86yLMvuvPPOrKSkJHvppZcKY6677rosn883uDfAp1WMa2BTbrnllqysrCxbu3ZtYVtEZFOnTt2yFwKfQLHe/wcddFB2zjnnbHZe7gE0lW3lHrDnnntm3/rWtxpscw+gKTTmNfC+Rx55JIuI7B//+EeWZU3bBnx83CbU19fHvHnzYvDgwYVtJSUlMXjw4Jg9e/Ymv2b27NkNxkdEHHrooYXxS5YsiZdeeqnBmMrKyujfv39hzOzZs6Nt27ax7777FsYMHjw4SkpKYs6cOYUxBx54YJSVlTU4z+LFi+ONN974lK8c3lOsa2BTampqol27dhttP/roo2P77bePr3zlKzF9+vSP9frgoxT7Ghg3bly0b98+9tprr7jyyisbfByE+wBNodjXwPumT58eq1atilNPPXWjfe4DNKbGuAa2xLx582Lt2rUNjvPlL385unXr1uDfDH369IlOnTo1OE9tbW0sXLhwi88FH6ZY18Cm1NTURD6fj9LS0gbbR40aFR06dIh+/frFDTfcEFmWfarzwPuK/f6/6aabokOHDtG7d+8YPXp0vP322w3O4x5AYyv2NfC+efPmxfz582PkyJEb7XMPoDE11TVQU1MTuVwu2rZtWzhGU7WB0o8ekp7XXnst1q9f3+AmGxHRqVOneOaZZzb5NS+99NImx7/00kuF/e9v+7Ax22+/fYP9paWl0a5duwZjdt55542O8f6+7bbbbotfJ2xOsa6Bf/Xcc8/FtddeG1dddVVhW0VFRVx99dVxwAEHRElJSdx2221x7LHHxrRp0+Loo4/+eC8UNqOY18DZZ58de++9d7Rr1y7+9re/xejRo2PlypUxfvz4wnHcB2hs28p94Le//W0ceuih8YUvfKGwzX2AptAY18CWeOmll6KsrKzwD8NNHWdz53l/H2wNxboGNjWPyy67LE4//fQG28eOHRsHH3xwtGrVKv785z/Hd7/73VizZk2cffbZn/hc8L5ivv+/+c1vxk477RRdunSJJ598Mi666KJYvHhx3H777R96nvf3wdawrdwDfvvb30avXr1iwIABDba7B9DYmuIaePfdd+Oiiy6KoUOHRj6fLxyjqdqAKARsk/75z3/GkCFD4oQTTohvf/vbhe0dOnSI8847r/B8v/32ixdffDGuvPJK/zGQz4UPvr/32GOPKCsri//4j/+Iyy+/PMrLy4s4M2haK1asiHvuuSduueWWBtvdBwDSUFtbG0cccUTstttuUV1d3WDfJZdcUvjzXnvtFW+99VZceeWV/oMgn3kfDKB9+vSJHXbYIQYNGhTPP/98fOlLXyrizKBpvfPOOzF58uQGf9+/zz2Az7q1a9fGiSeeGFmWxXXXXVeUOfj4uE3o0KFDNGvWLF5++eUG219++eXo3LnzJr+mc+fOHzr+/f/9qDGvvPJKg/3r1q2L119/vcGYTR3jg+eAT6tY18D7XnzxxfjqV78aAwYMiP/+7//+yPn2798/nnvuuY8cB1uq2NfAB/Xv3z/WrVsXS5cu/dDzfPAc8GltC9fAhAkTon379lsUetwH2Noa4xrYEp07d476+vpYvXr1Zo/jPkBTKNY18L4333wzhgwZEm3atImpU6dG8+bNP3R8//79Y8WKFVFXV/exzwX/qtjv/w/q379/RETh5xz3AJrCtnAN/PGPf4y33347hg8f/pFj3QPY2hrzGng/CP3jH/+Ie++9t7BK6P1jNFUbEIU2oaysLPbZZ5+YMWNGYduGDRtixowZUVVVtcmvqaqqajA+IuLee+8tjN95552jc+fODcbU1tbGnDlzCmOqqqpi9erVMW/evMKY+++/PzZs2FD4QaCqqioefPDBWLt2bYPz9OzZ00cGsdUU6xqIeG+F0MCBA2OfffaJCRMmREnJR/81NX/+/Nhhhx0+1muED1PMa+BfzZ8/P0pKSgpLiN0HaArFvgayLIsJEybE8OHDP/I/BEa4D7D1NcY1sCX22WefaN68eYPjLF68OJYtW9bg3wwLFixo8A/G9/9Budtuu23xueDDFOsaiHjv3nDIIYdEWVlZTJ8+PVq0aPGRXzN//vzYbrvtrKpmqyjm+/9fzZ8/PyKi8HOOewBNYVu4Bn7729/G0UcfHR07dvzIse4BbG2NdQ28H4SeffbZuO+++6J9+/YbHaPJ2kDGJk2ZMiUrLy/PJk6cmD399NPZ6aefnrVt2zZ76aWXsizLspNPPjm7+OKLC+NnzZqVlZaWZldddVW2aNGi7NJLL82aN2+eLViwoDBm3LhxWdu2bbM77rgje/LJJ7Njjjkm23nnnbN33nmnMGbIkCHZXnvtlc2ZMyf761//mu2yyy7Z0KFDC/tXr16dderUKTv55JOzp556KpsyZUrWqlWr7L/+67+a4LtCSopxDaxYsSLr0aNHNmjQoGzFihXZypUrC4/3TZw4MZs8eXK2aNGibNGiRdmPf/zjrKSkJLvhhhua6DtDKopxDfztb3/LfvrTn2bz58/Pnn/++ez3v/991rFjx2z48OGFY7gP0FSK9bNQlmXZfffdl0VEtmjRoo3m5T5AU2mMa2DVqlXZ448/nv3pT3/KIiKbMmVK9vjjjzf4WeeMM87IunXrlt1///3Zo48+mlVVVWVVVVWF/evWrct69+6dHXLIIdn8+fOzu+++O+vYsWM2evToJviukJJiXAM1NTVZ//79sz59+mTPPfdcg38PrFu3LsuyLJs+fXp2/fXXZwsWLMieffbZ7Fe/+lXWqlWr7Ic//GETfnf4vCvG+/+5557Lxo4dmz366KPZkiVLsjvuuCP74he/mB144IGFY7gH0FSK9XNQlmXZs88+m+Vyueyuu+7aaF7uATSVrX0N1NfXZ0cffXT2hS98IZs/f36Dn3Hq6uoKx2mqNiAKfYhrr70269atW1ZWVpb169cve/jhhwv7DjrooOyUU05pMP6WW27Jdt1116ysrCzbfffdsz/96U8N9m/YsCG75JJLsk6dOmXl5eXZoEGDssWLFzcYs2rVqmzo0KFZRUVFls/ns1NPPTV78803G4x54oknsq985StZeXl5tuOOO2bjxo3bui8c/k9TXwMTJkzIImKTj/dNnDgx69WrV9aqVassn89n/fr1y2699dbG+QaQvKa+BubNm5f1798/q6yszFq0aJH16tUr+8lPfpK9++67DY7jPkBTKcbPQlmWZUOHDs0GDBiwyTm5D9CUtvY1sLmfdS699NLCmHfeeSf77ne/m2233XZZq1atsq997Wsb/ceSpUuXZocddljWsmXLrEOHDtn555+frV27dqu/fmjqa+CBBx7Y7L8HlixZkmVZlt11113ZnnvumVVUVGStW7fO+vbtm/3617/O1q9f35jfChLU1O//ZcuWZQceeGDWrl27rLy8POvRo0f2/e9/P6upqWlwHPcAmkoxfg7KsiwbPXp01rVr103+ve4eQFPamtfAkiVLNvszzgMPPFAY11RtIJdlWbbl64oAAAAAAAD4LPI7hQAAAAAAABIgCgEAAAAAACRAFAIAAAAAAEiAKAQAAAAAAJAAUQgAAAAAACABohAAAAAAAEACRCEAAAAAAIAEiEIAAAAAAAAJEIUAAAA+hREjRsSxxx77qY6xdOnSyOVyMX/+/M2OmTlzZuRyuVi9enVEREycODHatm1b2F9dXR177rnnp5oHAADw+SYKAQAAyRgxYkTkcrnI5XJRVlYWPXr0iLFjx8a6deuKPbWPNGDAgFi5cmVUVlZucv8FF1wQM2bMKDzfGrEKAAD4fCkt9gQAAACa0pAhQ2LChAlRV1cXd955Z4waNSqaN28eo0ePbjCuvr4+ysrKijTLjZWVlUXnzp03u7+ioiIqKiqacEYAAMBnjZVCAABAUsrLy6Nz586x0047xXe+850YPHhwTJ8+vbCy5sc//nF06dIlevbsGRERCxYsiIMPPjhatmwZ7du3j9NPPz3WrFmz0XHHjBkTHTt2jHw+H2eccUbU19cX9t19993xla98Jdq2bRvt27ePI488Mp5//vmNjvHMM8/EgAEDokWLFtG7d+/4y1/+Utj3rx8f968++PFx1dXVMWnSpLjjjjsKK6NmzpwZBx98cJx55pkNvu7VV1+NsrKyBquMAACAzydRCAAASFrLli0LAWfGjBmxePHiuPfee+N///d/46233opDDz00tttuu5g7d27ceuutcd99920UVmbMmBGLFi2KmTNnxs033xy33357jBkzprD/rbfeivPOOy8effTRmDFjRpSUlMTXvva12LBhQ4PjfP/734/zzz8/Hn/88aiqqoqjjjoqVq1a9bFf0wUXXBAnnnhiDBkyJFauXBkrV66MAQMGxGmnnRaTJ0+Ourq6wtjf//73seOOO8bBBx/8sc8DAAB8tohCAABAkrIsi/vuuy/uueeeQhBp3bp1/OY3v4ndd989dt9995g8eXK8++67ceONN0bv3r3j4IMPjl/84hfxu9/9Ll5++eXCscrKyuKGG26I3XffPY444ogYO3Zs/PznPy9En+OPPz6OO+646NGjR+y5555xww03xIIFC+Lpp59uMKczzzwzjj/++OjVq1dcd911UVlZGb/97W8/9murqKiIli1bFlZFde7cOcrKyuK4446LiIg77rijMHbixImF37UEAAB8volCAABAUv73f/83KioqokWLFnHYYYfFSSedFNXV1RER0adPnwa/R2jRokXRt2/faN26dWHbAQccEBs2bIjFixcXtvXt2zdatWpVeF5VVRVr1qyJ5cuXR0TEs88+G0OHDo0vfvGLkc/no3v37hERsWzZsgZzq6qqKvy5tLQ09t1331i0aNFWe+0tWrSIk08+OW644YaIiHjsscfiqaeeihEjRmy1cwAAANuu0mJPAAAAoCl99atfjeuuuy7KysqiS5cuUVr6//9Z9MH4szUdddRRsdNOO8X1118fXbp0iQ0bNkTv3r0b/N6hpnLaaafFnnvuGStWrIgJEybEwQcfHDvttFOTzwMAAGh6VgoBAABJad26dfTo0SO6devWIAhtSq9eveKJJ56It956q7Bt1qxZUVJSEj179ixse+KJJ+Kdd94pPH/44YejoqIiunbtGqtWrYrFixfHD37wgxg0aFD06tUr3njjjU2e7+GHHy78ed26dTFv3rzo1avXJ3qdZWVlsX79+o229+nTJ/bdd9+4/vrrY/LkyfGtb33rEx0fAAD47BGFAAAANmPYsGHRokWLOOWUU+Kpp56KBx54IM4666w4+eSTo1OnToVx9fX1MXLkyHj66afjzjvvjEsvvTTOPPPMKCkpie222y7at28f//3f/x3PPfdc3H///XHeeedt8ny//OUvY+rUqfHMM8/EqFGj4o033vjE0aZ79+7x5JNPxuLFi+O1116LtWvXFvaddtppMW7cuMiyLL72ta99ouMDAACfPaIQAADAZrRq1SruueeeeP3112O//faLr3/96zFo0KD4xS9+0WDcoEGDYpdddokDDzwwTjrppDj66KMLv6eopKQkpkyZEvPmzYvevXvH9773vbjyyis3eb5x48bFuHHjom/fvvHXv/41pk+fHh06dPhEc//2t78dPXv2jH333Tc6duwYs2bNKuwbOnRolJaWxtChQ6NFixaf6PgAAMBnTy7LsqzYkwAAAKDpLF26NL70pS/F3LlzY++99y72dAAAgCYiCgEAACRi7dq1sWrVqrjgggtiyZIlDVYPAQAAn38+Pg4AACARs2bNih122CHmzp0bv/71r4s9HQAAoIlZKQQAAAAAAJAAK4UAAAAAAAASIAoBAAAAAAAkQBQCAAAAAABIgCgEAAAAAACQAFEIAAAAAAAgAaIQAAAAAABAAkQhAAAAAACABIhCAAAAAAAACfh/ayBH43YjZgoAAAAASUVORK5CYII=\n"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 2000x1600 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAABnAAAAUlCAYAAAAgLojrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACYy0lEQVR4nOzdeZxVBf3/8fewzLDOoAIqxpK4AKaJ4q6BaOKGmimlppLijkRpKpkKWLnkkmlaaYK4lEu5RuESGFDuivuSgqhh4jZsCgj394c/5+sIKPsc4fl8PO7jwT33LJ9z72A6r865ZaVSqRQAAAAAAAAKo15dDwAAAAAAAEBtAg4AAAAAAEDBCDgAAAAAAAAFI+AAAAAAAAAUjIADAAAAAABQMAIOAAAAAABAwQg4AAAAAAAABSPgAAAAAAAAFIyAAwAAAAAAUDACDgAALKWysrL079+/rsdYqYYPH56ysrI88sgjy22fPXr0yNe+9rUvXG/SpEkpKyvL8OHDa5YNHjw4ZWVltdbr0KFD+vbtu9jH7tGjxxJMu+w++uijnHLKKWnbtm3q1auX/fbbb6Ue//OMGTMmZWVlGTNmTF2Pstr75O/apEmT6noUAADqiIADAMBqpaysbLEeX7ZfYPfo0aPW/GuuuWa22mqrXH311Zk/f35dj1ennn322QwePLgwvwi/+uqr88tf/jIHHHBArrnmmvzwhz9cKce99dZbs8cee6Rly5YpLy9PmzZt0qdPn/zjH/9YKccvioceeijHH398ttxyyzRs2HCBAPhl80noWdjjzTffrOvxAABYBg3qegAAAFiZrr322lrPR4wYkXvuuWeB5Z07d16ZYy0XX/nKV3LOOeckSaZOnZoRI0bkyCOPzIsvvphzzz23jqdbdu3bt88HH3yQhg0bfu56L7zwQurV+7//r9qzzz6bIUOGpEePHunQoUOtde++++4VMern+sc//pH11lsvF1988Uo5XqlUyhFHHJHhw4ena9eu+dGPfpR11lknU6ZMya233ppddtkl48ePz/bbb79S5qlrI0eOzFVXXZXNNtss66+/fl588cW6Hmm5GDp0aL761a/WWtaiRYu6GQYAgOVCwAEAYLXyve99r9bzBx54IPfcc88Cy7+Mqqqqap3HMccck4033jiXXXZZzj777IWGj/nz52fOnDlp1KjRyhx1qZSVlS3WnBUVFYu9z/Ly8mUZaam89dZby/UX61/0GV544YUZPnx4Bg4cmIsuuqjWFSenn356rr322jRosPr8p+Fxxx2XU089NY0bN07//v1XmYCzxx57pFu3bnU9BgAAy5FbqAEAwGfMnDkzJ510Utq2bZuKiopsvPHGueCCC1Iqlb5w25/97GepV69eLr300pplf/vb37LTTjuladOmad68efbaa68888wztbbr27dvmjVrljfeeCP77bdfmjVrllatWuXkk0/OvHnzluo8mjRpkm233TYzZ87M1KlTk/zf9/Zcf/312WSTTVJRUZG///3vSZLHH388e+yxRyorK9OsWbPssssueeCBBxa671mzZuWYY47JWmutlcrKyhx22GF57733aq1z++23Z6+99kqbNm1SUVGRjh075uyzz17k+Tz66KPZfvvt07hx43z1q1/Nb3/721qvL+w7cBbm09+BM3z48Bx44IFJkp133nmBW+Qt7DtwZs+enbPOOisbbLBBKioq0rZt25xyyimZPXt2rfXuueee7LjjjmnRokWaNWuWjTfeOD/5yU8WOdcn848ePTrPPPPMArMs7s/d532Gn/XBBx/knHPOSadOnXLBBRcs9HZhhx56aLbeeutFzj127NgceOCBadeuXc378cMf/jAffPBBrfXefPPNfP/7389XvvKVVFRUZN11182+++5b69Z1jzzySHr16pWWLVvWfM5HHHFErf3Mnz8/v/rVr7LJJpukUaNGWXvttXPMMccs8PO1OPtamLXXXjuNGzf+wvUWZdiwYenZs2dat26dioqKdOnSJVdcccUC63Xo0CF77713xo0bl6233jqNGjXK+uuvnxEjRiyw7jPPPJOePXumcePG+cpXvpKf/exnS3Xrw+nTpy/1Py8AACie1ef/ZgUAAIuhVCpln332yejRo3PkkUdm8803z6hRo/LjH/84b7zxxufe9uqnP/1pfvGLX+R3v/tdjjrqqCQf37Lt8MMPT69evXLeeedl1qxZueKKK7Ljjjvm8ccfr3VLr3nz5qVXr17ZZpttcsEFF+Tee+/NhRdemI4dO+a4445bqvN55ZVXUr9+/VpXfPzjH//ITTfdlP79+6dly5bp0KFDnnnmmey0006prKzMKaeckoYNG+Z3v/tdevTokfvvvz/bbLNNrf32798/LVq0yODBg/PCCy/kiiuuyKuvvpoxY8bURILhw4enWbNm+dGPfpRmzZrlH//4R84888xMmzYtv/zlL2vt77333suee+6ZPn365KCDDspNN92U4447LuXl5Yv1S/lF+cY3vpEBAwbk17/+dX7yk5/U3BpvUbfImz9/fvbZZ5+MGzcuRx99dDp37pynnnoqF198cV588cXcdtttST7+hfvee++dzTbbLEOHDk1FRUX+85//ZPz48YucpVWrVrn22mvz85//PDNmzKi53V3nzp2X+OduYZ/hwowbNy7vvvtuBg4cmPr16y/hu/exm2++ObNmzcpxxx2XtdZaKw899FAuvfTSvP7667n55ptr1vv2t7+dZ555JieeeGI6dOiQt956K/fcc08mT55c83y33XZLq1atctppp6VFixaZNGlS/vKXv9Q63jHHHJPhw4fn+9//fgYMGJCJEyfmsssuy+OPP57x48enYcOGi72vFeGKK67IJptskn322ScNGjTInXfemeOPPz7z58/PCSecUGvd//znPznggANy5JFH5vDDD8/VV1+dvn37Zsstt8wmm2yS5OPwtfPOO+ejjz7KaaedlqZNm+b3v//9EkemnXfeOTNmzEh5eXl69eqVCy+8MBtuuOFyO28AAOpACQAAVmMnnHBC6dP/WnzbbbeVkpR+9rOf1VrvgAMOKJWVlZX+85//1CxLUjrhhBNKpVKpdNJJJ5Xq1atXGj58eM3r06dPL7Vo0aJ01FFH1drXm2++Waqqqqq1/PDDDy8lKQ0dOrTWul27di1tueWWX3ge3bt3L3Xq1Kk0derU0tSpU0vPPfdcacCAAaUkpd69e9eauV69eqVnnnmm1vb77bdfqby8vPTyyy/XLPvvf/9bat68eekb3/hGzbJhw4aVkpS23HLL0pw5c2qWn3/++aUkpdtvv71m2axZsxaY85hjjik1adKk9OGHH9aaPUnpwgsvrFk2e/bs0uabb15q3bp1zXEmTpxYSlIaNmxYzXpnnXVW6bP/WdO+ffvS4YcfXvP85ptvLiUpjR49eqHvW/fu3WueX3vttaV69eqVxo4dW2u93/72t6UkpfHjx5dKpVLp4osvLiUpTZ06dYF9fpHu3buXNtlkk1rLlvTnbmGf4cJccsklpSSlW2+9dbFmGz169ALv1cI+x3POOadUVlZWevXVV0ulUqn03nvvlZKUfvnLXy5y37feemspSenhhx9e5Dpjx44tJSldf/31tZb//e9/r7V8cfa1OD77939xLOz96NWrV2n99devtax9+/alJKV//vOfNcveeuutUkVFRemkk06qWTZw4MBSktKDDz5Ya72qqqpSktLEiRM/d54bb7yx1Ldv39I111xTuvXWW0s//elPS02aNCm1bNmyNHny5CU6NwAAisUt1AAA4FNGjhyZ+vXrZ8CAAbWWn3TSSSmVSvnb3/5Wa3mpVEr//v1zySWX5Lrrrsvhhx9e89o999yT999/PwcddFDefvvtmkf9+vWzzTbbZPTo0Qsc/9hjj631fKeddsorr7yyWLM///zzadWqVVq1apXOnTvn0ksvzV577ZWrr7661nrdu3dPly5dap7Pmzcvd999d/bbb7+sv/76NcvXXXfdHHzwwRk3blymTZtWax9HH310re/UOe6449KgQYOMHDmyZtmnryCYPn163n777ey0006ZNWtWnn/++Vr7a9CgQY455pia5+Xl5TnmmGPy1ltv5dFHH12s818ebr755nTu3DmdOnWq9Zn17NkzSWo+s0+uaLr99tuX6lZXn7WkP3ef/QwX5ZPPrXnz5ks926c/x5kzZ+btt9/O9ttvn1KplMcff7xmnfLy8owZM2aBW5194pP37K677srcuXMXus7NN9+cqqqqfPOb36z1/m+55ZZp1qzZAu//5+1rRfn0+1FdXZ2333473bt3zyuvvJLq6upa63bp0iU77bRTzfNWrVpl4403rvV3euTIkdl2221r3cauVatWOeSQQxZrnj59+mTYsGE57LDDst9+++Xss8/OqFGj8s477+TnP//50p4mAAAFIOAAAMCnvPrqq2nTps0Cv/D+5JZbr776aq3lI0aMyG9+85tceumlOeigg2q99tJLLyVJevbsWRNWPnncfffdeeutt2qt36hRo7Rq1arWsjXWWGORvxD/rA4dOuSee+7Jvffem3HjxuXNN9/MXXfdlZYtW9Za76tf/Wqt51OnTs2sWbOy8cYbL7DPzp07Z/78+XnttddqLf/srZmaNWuWddddt9b3nTzzzDP51re+laqqqlRWVqZVq1b53ve+lyQL/KK7TZs2adq0aa1lG220UZLU2ueK9tJLL+WZZ55Z4PP6ZJZPPrPvfOc72WGHHdKvX7+svfba+e53v5ubbrppqWPOkv7cffYzXJTKysokHwe0pTV58uT07ds3a665Zs13M3Xv3j3J/32OFRUVOe+88/K3v/0ta6+9dr7xjW/k/PPPz5tvvlmzn+7du+fb3/52hgwZkpYtW2bffffNsGHDan230EsvvZTq6uq0bt16gc9gxowZNe//4uxrRRk/fnx23XXXNG3aNC1atEirVq1qvvvosz/X7dq1W2D7z/6dfvXVVxd6q7OF/X1cXDvuuGO22Wab3HvvvUu9DwAA6p7vwAEAgGWwww475Iknnshll12WPn36ZM0116x57ZNf5l977bVZZ511Fti2QYPa/zq+tN9R8ommTZtm1113/cL1luUL3BfX+++/n+7du6eysjJDhw5Nx44d06hRozz22GM59dRTl8tVKyvC/Pnzs+mmm+aiiy5a6Ott27ZN8vF7+M9//jOjR4/OX//61/z973/PjTfemJ49e+buu+9e5s/yiyzuZ9ipU6ckyVNPPZX99ttviY8zb968fPOb38y7776bU089NZ06dUrTpk3zxhtvpG/fvrU+x4EDB6Z379657bbbMmrUqJxxxhk555xz8o9//CNdu3ZNWVlZbrnlljzwwAO58847M2rUqBxxxBG58MIL88ADD6RZs2aZP39+Wrduneuvv36h83wSOBdnXyvCyy+/nF122SWdOnXKRRddlLZt26a8vDwjR47MxRdfvMDP9aJ+Dkql0gqZ79Patm2bF154YYUfBwCAFUfAAQCAT2nfvn3uvffeTJ8+vdbVEJ/c8qt9+/a11t9ggw1y/vnnp0ePHtl9991z33331WzXsWPHJEnr1q0XK6zUlVatWqVJkyYL/WXv888/n3r16tWEi0+89NJL2XnnnWuez5gxI1OmTMmee+6ZJBkzZkzeeeed/OUvf8k3vvGNmvUmTpy40Bn++9//ZubMmbWuwnnxxReTfHxl0bIoKytb7HU7duyYCRMmZJdddvnC7erVq5dddtklu+yySy666KL84he/yOmnn57Ro0cv8ee9pD93i2vHHXfMGmuskT/+8Y/5yU9+ssRh6amnnsqLL76Ya665JocddljN8nvuuWeh63fs2DEnnXRSTjrppLz00kvZfPPNc+GFF+a6666rWWfbbbfNtttum5///Oe54YYbcsghh+RPf/pT+vXrl44dO+bee+/NDjvssFiR6vP2tSLceeedmT17du64445aV9cs7HaIi6t9+/Y1V+t92rLGl1deeWWBK/oAAPhycQs1AAD4lD333DPz5s3LZZddVmv5xRdfnLKysuyxxx4LbLPZZptl5MiRee6559K7d+988MEHSZJevXqlsrIyv/jFLxb6PR1Tp05dMSexhOrXr5/ddtstt99+e63blf3vf//LDTfckB133LHmVlyf+P3vf1/rnK644op89NFHNe/PJ6Hg01cazJkzJ5dffvlCZ/joo4/yu9/9rta6v/vd79KqVatsueWWy3R+n0Sh999//wvX7dOnT954441ceeWVC7z2wQcfZObMmUmSd999d4HXN9988yRZqtt4Lc3P3eJo0qRJTj311Dz33HM59dRTF3rlx3XXXZeHHnpoodsv7HMslUq55JJLaq03a9asfPjhh7WWdezYMc2bN695P957770Fjv/Z96xPnz6ZN29ezj777AVm+eijj2o+w8XZ14qwsPejuro6w4YNW+p97rnnnnnggQdqfQZTp05d5FVIn7Wwf46MHDkyjz76aHbfffelngsAgLrnChwAAPiU3r17Z+edd87pp5+eSZMm5etf/3ruvvvu3H777Rk4cGDNVTWfte222+b222/PnnvumQMOOCC33XZbKisrc8UVV+TQQw/NFltske9+97tp1apVJk+enL/+9a/ZYYcdFviFfV352c9+lnvuuSc77rhjjj/++DRo0CC/+93vMnv27Jx//vkLrD9nzpzssssu6dOnT1544YVcfvnl2XHHHbPPPvskSbbffvusscYaOfzwwzNgwICUlZXl2muvXeSto9q0aZPzzjsvkyZNykYbbZQbb7wxTzzxRH7/+9+nYcOGy3Rum2++eerXr5/zzjsv1dXVqaioSM+ePdO6desF1j300ENz00035dhjj83o0aOzww47ZN68eXn++edz0003ZdSoUenWrVuGDh2af/7zn9lrr73Svn37vPXWW7n88svzla98JTvuuOMSz7i0P3eL48c//nGeeeaZXHjhhRk9enQOOOCArLPOOnnzzTdz22235aGHHsq//vWvhW7bqVOndOzYMSeffHLeeOONVFZW5s9//vMC38v04osv1vw8dOnSJQ0aNMitt96a//3vf/nud7+bJLnmmmty+eWX51vf+lY6duyY6dOn58orr0xlZWXNlVvdu3fPMccck3POOSdPPPFEdttttzRs2DAvvfRSbr755lxyySU54IADFmtfi/Lqq6/m2muvTZI88sgjST7++U8+vhrm0EMPXeS2u+22W8rLy9O7d+8cc8wxmTFjRq688sq0bt06U6ZMWYxPY0GnnHJKrr322uy+++75wQ9+kKZNm+b3v/992rdvnyeffPILt99+++3TtWvXdOvWLVVVVXnsscdy9dVXp23btjXfzQMAwJdUCQAAVmMnnHBC6bP/Wjx9+vTSD3/4w1KbNm1KDRs2LG244YalX/7yl6X58+fXWi9J6YQTTqi17Pbbby81aNCg9J3vfKc0b968UqlUKo0ePbrUq1evUlVVValRo0aljh07lvr27Vt65JFHarY7/PDDS02bNl1gvrPOOmuB+Rame/fupU022eQL11vYzJ947LHHSr169So1a9as1KRJk9LOO+9c+te//lVrnWHDhpWSlO6///7S0UcfXVpjjTVKzZo1Kx1yyCGld955p9a648ePL2277balxo0bl9q0aVM65ZRTSqNGjSolKY0ePXqB2R955JHSdtttV2rUqFGpffv2pcsuu6zW/iZOnFhKUho2bFjNsoW9P+3bty8dfvjhtZZdeeWVpfXXX79Uv379Wsfv3r17qXv37rXWnTNnTum8884rbbLJJqWKiorSGmusUdpyyy1LQ4YMKVVXV5dKpVLpvvvuK+27776lNm3alMrLy0tt2rQpHXTQQaUXX3xxoe/tpy3qs1qWn7vFccstt5R222230pprrllq0KBBad111y195zvfKY0ZM6ZmndGjRy/w+Tz77LOlXXfdtdSsWbNSy5YtS0cddVRpwoQJtT6Lt99+u3TCCSeUOnXqVGratGmpqqqqtM0225Ruuummmv089thjpYMOOqjUrl27UkVFRal169alvffeu9bfg0/8/ve/L2255Zalxo0bl5o3b17adNNNS6ecckrpv//97xLv67M+OceFPT77s7Awd9xxR2mzzTYrNWrUqNShQ4fSeeedV7r66qtLSUoTJ06sWa99+/alvfbaa4HtF/Yz9+STT5a6d+9eatSoUWm99dYrnX322aU//OEPC+xzYU4//fTS5ptvXqqqqio1bNiw1K5du9Jxxx1XevPNN7/wXAAAKLayUmklfHsiAAAAAAAAi8134AAAAAAAABSMgAMAAAAAAFAwAg4AAAAAAEDBCDgAAAAAAAAFI+AAAAAAAAAUjIADAAAAAABQMA3qeoBV3fz58/Pf//43zZs3T1lZWV2PAwAAAAAA1KFSqZTp06enTZs2qVdv0dfZCDgr2H//+9+0bdu2rscAAAAAAAAK5LXXXstXvvKVRb4u4KxgzZs3T/LxB1FZWVnH0wAAAAAAAHVp2rRpadu2bU0/WBQBZwX75LZplZWVAg4AAAAAAJAkX/i1K4u+uRoAAAAAAAB1QsABAAAAAAAoGAEHAAAAAACgYHwHDgAAAAAArGSlUikfffRR5s2bV9ejsJzVr18/DRo0+MLvuPkiAg4AAAAAAKxEc+bMyZQpUzJr1qy6HoUVpEmTJll33XVTXl6+1PsQcAAAAAAAYCWZP39+Jk6cmPr166dNmzYpLy9f5is1KI5SqZQ5c+Zk6tSpmThxYjbccMPUq7d032Yj4AAAAAAAwEoyZ86czJ8/P23btk2TJk3qehxWgMaNG6dhw4Z59dVXM2fOnDRq1Gip9rN02QcAAAAAAFhqS3tVBl8Oy+Pz9RMCAAAAAABQMAIOAAAAAABAwfgOHAAAAAAAqGMdTvvrSj3epHP3WiH7PfTQQ9O5c+f85Cc/WeZ99e3bN++//35uu+22JMmYMWPSt2/fTJo0aZn3vbT+/ve/57TTTstjjz22wm+D5wocAAAAAADgC/Xt2zdlZWUpKytLeXl5NthggwwdOjQfffRRkmTChAkZOXJkBgwYsFyOd8kll2T48OHLZV+La8CAAdlyyy1TUVGRzTfffIHXd9999zRs2DDXX3/9Cp9FwAEAAAAAABbL7rvvnilTpuSll17KSSedlMGDB+eXv/xlkuTSSy/NgQcemGbNmi2XY1VVVaVFixbLZV9L4ogjjsh3vvOdRb7et2/f/PrXv17hcwg4AAAAAADAYqmoqMg666yT9u3b57jjjsuuu+6aO+64I/Pmzcstt9yS3r1716z7/PPPp0mTJrnhhhtqlt10001p3Lhxnn322S88Vt++fbPffvst8vWePXumf//+tZZNnTo15eXlue+++5b85JL8+te/zgknnJD1119/kev07t07jzzySF5++eWlOsbiEnAAAAAAAICl0rhx48yZMydPPvlkqqur061bt5rXOnXqlAsuuCDHH398Jk+enNdffz3HHntszjvvvHTp0mWZj92vX7/ccMMNmT17ds2y6667Luutt1569uyZJDn22GPTrFmzz30sqXbt2mXttdfO2LFjl/kcPk+DFbp3AAAAAABglVMqlXLfffdl1KhROfHEE/Pqq6+mfv36ad26da31jj/++IwcOTLf+973Ul5enq222ionnnjicplh//33T//+/XP77benT58+SZLhw4fXfFdPkgwdOjQnn3zycjnep7Vp0yavvvrqct/vpwk4K8nXzhqVehVN6noMWO1MOnevuh4BAAAAAFYZd911V5o1a5a5c+dm/vz5OfjggzN48ODccccdqaioqAknn3b11Vdno402Sr169fLMM88sdJ2l0ahRoxx66KG5+uqr06dPnzz22GN5+umnc8cdd9Ss07p16wWi0vLQuHHjzJo1a7nv99MEHAAAAAAAYLHsvPPOueKKK1JeXp42bdqkQYOPM0PLli0za9aszJkzJ+Xl5bW2mTBhQmbOnJl69eplypQpWXfddZfbPP369cvmm2+e119/PcOGDUvPnj3Tvn37mtePPfbYXHfddZ+7jxkzZizxcd999920atVqibdbEgIOAAAAAACwWJo2bZoNNthggeWbb755kuTZZ5+t+XPycejo27dvTj/99EyZMiWHHHJIHnvssTRu3Hi5zLPpppumW7duufLKK3PDDTfksssuq/X6iriF2ocffpiXX345Xbt2Xa77/SwBBwAAAAAAWCatWrXKFltskXHjxtUKOMcee2zatm2bn/70p5k9e3a6du2ak08+Ob/5zW+W27H79euX/v37p2nTpvnWt75V67UlvYXaf/7zn8yYMSNvvvlmPvjggzzxxBNJki5dutRcWfTAAw+koqIi22233XI7h4URcAAAAAAAoI6tCt/l3K9fv4wYMSL9+/dPkowYMSIjR47M448/ngYNGqRBgwa57rrrsuOOO2bvvffOHnvssVyOe9BBB2XgwIE56KCD0qhRo2XaV79+/XL//ffXPP/kKpuJEyemQ4cOSZI//vGPOeSQQ9KkyYr93vuyUqlUWqFHWM1NmzYtVVVVaTvwptSrWLEfJrCgVeF/+AAAAABYdXz44YeZOHFivvrVry5zbCiaDz74IBtvvHFuvPHGFXJ1ypgxY9K3b99MmjSp1vJJkyalY8eOefjhh7PFFlss9+N+2ttvv52NN944jzzySL761a8ucr3P+5w/6QbV1dWprKxc5D5cgQMAAAAAACyzxo0bZ8SIEXn77bdXyvHmzp2bd955Jz/96U+z7bbbrvB4k3wciy6//PLPjTfLi4ADAAAAAAAsFz169FjsdZs1a7bI1/72t79lp512+tztx48fn5133jkbbbRRbrnllsU+7rLo1q1bunXrtlKOJeAAAAAAAAAr3RNPPLHI19Zbb70FlnXo0CEDBw6sed6jR4+syt8SI+AAAAAAAAAr3QYbbLBE63824Kzq6tX1AAAAAAAAANQm4AAAAAAAABSMgAMAAAAAAFAwAg4AAAAAAEDBCDgAAAAAAAAFI+AAAAAAAAAUTIO6HgAAAAAAAFZ7g6tW8vGqV8huDz300HTu3Dk/+clPlnlfffv2zfvvv5/bbrstSTJmzJj07ds3kyZNWuZ9L63f/va3+etf/5o777xzhR9rlb8Cp0OHDvnVr35Va9nmm2+ewYMHp1QqZfDgwWnXrl0qKirSpk2bDBgwoGa92bNn5+STT856662Xpk2bZptttsmYMWNW7gkAAAAAAEAB9O3bN2VlZSkrK0t5eXk22GCDDB06NB999FGSZMKECRk5cmSt37Mvi0suuSTDhw9fLvtaXJ+c36cff/rTn2peP+KII/LYY49l7NixK3yW1foKnD//+c+5+OKL86c//SmbbLJJ3nzzzUyYMKHm9f79++fZZ5/Nn/70p7Rp0ya33nprdt999zz11FPZcMMNF7rP2bNnZ/bs2TXPp02btsLPAwAAAAAAVobdd989w4YNy+zZszNy5MiccMIJadiwYQYNGpRLL700Bx54YJo1a7ZcjlVVtZKvSvr/hg0blt13373meYsWLWr+XF5enoMPPji//vWvs9NOO63QOVbrgDN58uSss8462XXXXdOwYcO0a9cuW2+9dc1rw4YNy+TJk9OmTZskycknn5y///3vGTZsWH7xi18sdJ/nnHNOhgwZssDypxsdmcqKshV3MsDCDa7rAVhpVtBlvwAAAAD8n4qKiqyzzjpJkuOOOy633npr7rjjjpxyyim55ZZbcv3119es+/zzz2eLLbbIVVddlYMPPjhJctNNN+Xwww/Po48+mi5dunzusT57C7XP6tmzZ7p06ZLLLrusZtnUqVOz3nrr5W9/+1t22WWXpTrHFi1a1JzjwvTu3Tvf/OY388EHH6Rx48ZLdYzFscrfQu3zHHjggfnggw+y/vrr56ijjsqtt95ac6nXU089lXnz5mWjjTZKs2bNah73339/Xn755UXuc9CgQamurq55vPbaayvrdAAAAAAAYKVq3Lhx5syZkyeffDLV1dXp1q1bzWudOnXKBRdckOOPPz6TJ0/O66+/nmOPPTbnnXfeF8abxdGvX7/ccMMNte6Kdd1112W99dZLz549kyTHHntsrd/xL+zxWSeccEJatmyZrbfeOldffXVKpVKt17t165aPPvooDz744DKfw+dZ5a/AqVev3gJv7ty5c5Mkbdu2zQsvvJB7770399xzT44//vj88pe/zP33358ZM2akfv36efTRR1O/fv1a23/e5V8VFRWpqKhY/icCAAAAAAAFUSqVct9992XUqFE58cQT8+qrr6Z+/fpp3bp1rfWOP/74jBw5Mt/73vdSXl6erbbaKieeeOJymWH//fdP//79c/vtt6dPnz5JkuHDh9d8V0+SDB06NCeffPJi73Po0KHp2bNnmjRpkrvvvjvHH398ZsyYUet7fZo0aZKqqqq8+uqry+U8FmWVDzitWrXKlClTap5PmzYtEydOrHneuHHj9O7dO717984JJ5yQTp065amnnkrXrl0zb968vPXWWyv8PnYAAAAAAPBlcNddd6VZs2aZO3du5s+fn4MPPjiDBw/OHXfckYqKippw8mlXX311Ntpoo9SrVy/PPPPMQtdZGo0aNcqhhx6aq6++On369Mljjz2Wp59+OnfccUfNOq1bt14gKn2eM844o+bPXbt2zcyZM/PLX/6yVsBJPm4Ls2bNWvaT+ByrfMDp2bNnhg8fnt69e6dFixY588wza66oGT58eObNm5dtttkmTZo0yXXXXZfGjRunffv2WWuttXLIIYfksMMOy4UXXpiuXbtm6tSpue+++7LZZptlr732quMzAwAAAACAlWvnnXfOFVdckfLy8rRp0yYNGnycGVq2bJlZs2Zlzpw5KS8vr7XNhAkTMnPmzNSrVy9TpkzJuuuuu9zm6devXzbffPO8/vrrGTZsWHr27Jn27dvXvH7sscfmuuuu+9x9zJgxY5GvbbPNNjn77LMze/bsWnffevfdd9OqVatlP4HPscoHnEGDBmXixInZe++9U1VVlbPPPrvmCpwWLVrk3HPPzY9+9KPMmzcvm266ae68886stdZaSZJhw4blZz/7WU466aS88cYbadmyZbbddtvsvffedXlKAAAAAABQJ5o2bZoNNthggeWbb755kuTZZ5+t+XPy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AAAUjIADAAAAAABQMAIOAAAAAABAwQg4AAAAAAAABSPgAAAAAAAAFIyAAwAAAAAAUDACDgAAAAAAQMEIOAAAAAAAAAUj4AAAAAAAABSMgAMAAAAAAFAwAg4AAAAAAEDBCDgAAAAAAAAFI+AAAAAAAAAUjIADAAAAAABQMAIOAAAAAABAwQg4AAAAAAAABSPgAAAAAAAAFIyAAwAAAAAAUDAN6nqA1cXXzhqVehVNlni7SefutQKmAQAAAAAAiswVOAAAAAAAAAUj4AAAAAAAABSMgAMAAAAAAFAwAg4AAAAAAEDBCDgAAAAAAAAFI+AAAAAAAAAUjIADAAAAAABQMAIOAAAAAABAwQg4AAAAAAAABSPgAAAAAAAAFIyAAwAAAAAAUDACDgAAAAAAQMEIOAAAAAAAAAUj4HxKWVlZbrvttroeAwAAAAAAWM0JOAAAAAAAAAUj4AAAAAAAABTMKhdwbrnllmy66aZp3Lhx1lprrey6666ZOXNmHn744Xzzm99My5YtU1VVle7du+exxx773H299tpr6dOnT1q0aJE111wz++67byZNmrRyTgQAAAAAAFhtrVIBZ8qUKTnooINyxBFH5LnnnsuYMWOy//77p1QqZfr06Tn88MMzbty4PPDAA9lwww2z5557Zvr06Qvd19y5c9OrV680b948Y8eOzfjx49OsWbPsvvvumTNnziJnmD17dqZNm1brAQAAAAAAsCQa1PUAy9OUKVPy0UcfZf/990/79u2TJJtuummSpGfPnrXW/f3vf58WLVrk/vvvz957773Avm688cbMnz8/V111VcrKypIkw4YNS4sWLTJmzJjstttuC53hnHPOyZAhQxZY/nSjI1NZUbbkJzV4yTdZaoOrV+LBAAAAAACARVmlrsD5+te/nl122SWbbrppDjzwwFx55ZV57733kiT/+9//ctRRR2XDDTdMVVVVKisrM2PGjEyePHmh+5owYUL+85//pHnz5mnWrFmaNWuWNddcMx9++GFefvnlRc4waNCgVFdX1zxee+21FXKuAAAAAADAqmuVugKnfv36ueeee/Kvf/0rd999dy699NKcfvrpefDBB3PcccflnXfeySWXXJL27dunoqIi22233SJvhzZjxoxsueWWuf766xd4rVWrVoucoaKiIhUVFcvtnAAAAAAAgNXPKhVwkqSsrCw77LBDdthhh5x55plp3759br311owfPz6XX3559txzzyTJa6+9lrfffnuR+9liiy1y4403pnXr1qmsrFxZ4wMAAAAAAKxat1B78MEH84tf/CKPPPJIJk+enL/85S+ZOnVqOnfunA033DDXXnttnnvuuTz44IM55JBD0rhx40Xu65BDDknLli2z7777ZuzYsZk4cWLGjBmTAQMG5PXXX1+JZwUAAAAAAKxuVqmAU1lZmX/+85/Zc889s9FGG+WnP/1pLrzwwuyxxx75wx/+kPfeey9bbLFFDj300AwYMCCtW7de5L6aNGmSf/7zn2nXrl3233//dO7cOUceeWQ+/PBDV+QAAAAAAAArVFmpVCrV9RCrsmnTpqWqqirVpzVPZUVZXY/z+QZX1/UEAAAAAACwSqvpBtXVn3vByCp1BQ4AAAAAAMCqQMABAAAAAAAoGAEHAAAAAACgYAQcAAAAAACAghFwAAAAAAAACkbAAQAAAAAAKBgBBwAAAAAAoGAEHAAAAAAAgIIRcAAAAAAAAApGwAEAAAAAACgYAQcAAAAAAKBgBBwAAAAAAICCaVDXA6w2Br2eVFbW9RQAAAAAAMCXgCtwAAAAAAAACkbAAQAAAAAAKBgBBwAAAAAAoGAEHAAAAAAAgIIRcAAAAAAAAApGwAEAAAAAACgYAQcAAAAAAKBgBBwAAAAAAICCEXAAAAAAAAAKRsABAAAAAAAoGAEHAAAAAACgYAQcAAAAAACAghFwAAAAAAAACkbAAQAAAAAAKBgBBwAAAAAAoGAEHAAAAAAAgIIRcAAAAAAAAApGwAEAAAAAACgYAQcAAAAAAKBgBBwAAAAAAICCEXAAAAAAAAAKRsABAAAAAAAoGAEHAAAAAACgYAQcAAAAAACAghFwAAAAAAAACkbAAQAAAAAAKBgBBwAAAAAAoGAEHAAAAAAAgIIRcAAAAAAAAApGwAEAAAAAACgYAQcAAAAAAKBgBBwAAAAAAICCEXAAAAAAAAAKRsABAAAAAAAoGAEHAAAAAACgYAQcAAAAAACAghFwAAAAAAAACkbAAQAAAAAAKJgGdT3A6uJrZ41KvYomdT3Gl8Kkc/eq6xEAAAAAAKBOuQIHAAAAAACgYAQcAAAAAACAghFwAAAAAAAACkbAAQAAAAAAKBgBBwAAAAAAoGAEHAAAAAAAgIIRcAAAAAAAAApGwAEAAAAAACgYAQcAAAAAAKBgBBwAAAAAAICCEXAAAAAAAAAKRsABAAAAAAAoGAEHAAAAAACgYAQcAAAAAACAghFwFtOYMWNSVlaW999/v65HAQAAAAAAVnGrfMCZM2dOXY8AAAAAAACwRL50AWf69Ok55JBD0rRp06y77rq5+OKL06NHjwwcODBJ0qFDh5x99tk57LDDUllZmaOPPjpJMm7cuOy0005p3Lhx2rZtmwEDBmTmzJk1+7322mvTrVu3NG/ePOuss04OPvjgvPXWW0mSSZMmZeedd06SrLHGGikrK0vfvn1X6nkDAAAAAACrjy9dwPnRj36U8ePH54477sg999yTsWPH5rHHHqu1zgUXXJCvf/3refzxx3PGGWfk5Zdfzu67755vf/vbefLJJ3PjjTdm3Lhx6d+/f802c+fOzdlnn50JEybktttuy6RJk2oiTdu2bfPnP/85SfLCCy9kypQpueSSSxY63+zZszNt2rRaDwAAAAAAgCVRViqVSnU9xOKaPn161lprrdxwww054IADkiTV1dVp06ZNjjrqqPzqV79Khw4d0rVr19x666012/Xr1y/169fP7373u5pl48aNS/fu3TNz5sw0atRogWM98sgj2WqrrTJ9+vQ0a9YsY8aMyc4775z33nsvLVq0WOSMgwcPzpAhQxZYXn1a81RWlC3D2QMAAAAAQMENrq7rCQpv2rRpqaqqSnV1dSorKxe53pfqCpxXXnklc+fOzdZbb12zrKqqKhtvvHGt9bp161br+YQJEzJ8+PA0a9as5tGrV6/Mnz8/EydOTJI8+uij6d27d9q1a5fmzZune/fuSZLJkycv0YyDBg1KdXV1zeO1115bmlMFAAAAAABWYw3qeoAVoWnTprWez5gxI8ccc0wGDBiwwLrt2rXLzJkz06tXr/Tq1SvXX399WrVqlcmTJ6dXr16ZM2fOEh27oqIiFRUVyzQ/AAAAAACwevtSBZz1118/DRs2zMMPP5x27dol+fgWai+++GK+8Y1vLHK7LbbYIs8++2w22GCDhb7+1FNP5Z133sm5556btm3bJvn4FmqfVl5eniSZN2/e8jgVAAAAAACARfpS3UKtefPmOfzww/PjH/84o0ePzjPPPJMjjzwy9erVS1nZor9f5tRTT82//vWv9O/fP0888UReeuml3H777enfv3+Sj6/CKS8vz6WXXppXXnkld9xxR84+++xa+2jfvn3Kyspy1113ZerUqZkxY8YKPVcAAAAAAGD19aUKOEly0UUXZbvttsvee++dXXfdNTvssEM6d+6cRo0aLXKbzTbbLPfff39efPHF7LTTTunatWvOPPPMtGnTJknSqlWrDB8+PDfffHO6dOmSc889NxdccEGtfay33noZMmRITjvttKy99to18QcAAAAAAGB5KyuVSqW6HmJZzJw5M+utt14uvPDCHHnkkXU9zgKmTZuWqqqqVJ/WPJUVi75KCAAAAAAAvvQGV9f1BIVX0w2qq1NZWbnI9b5U34GTJI8//nief/75bL311qmurs7QoUOTJPvuu28dTwYAAAAAALB8fOkCTpJccMEFeeGFF1JeXp4tt9wyY8eOTcuWLet6LAAAAAAAgOXiSxdwunbtmkcffbSuxwAAAAAAAFhh6tX1AAAAAAAAANQm4AAAAAAAABSMgAMAAAAAAFAwAg4AAAAAAEDBCDgAAAAAAAAFI+AAAAAAAAAUjIADAAAAAABQMAIOAAAAAABAwQg4AAAAAAAABdOgrgdYbQx6PamsrOspAAAAAACALwFX4AAAAAAAABSMgAMAAAAAAFAwAg4AAAAAAEDBCDgAAAAAAAAFI+AAAAAAAAAUjIADAAAAAABQMAIOAAAAAABAwQg4AAAAAAAABSPgAAAAAAAAFIyAAwAAAAAAUDACDgAAAAAAQMEIOAAAAAAAAAUj4AAAAAAAABSMgAMAAAAAAFAwAg4AAAAAAEDBCDgAAAAAAAAFI+AAAAAAAAAUjIADAAAAAABQMAIOAAAAAABAwQg4AAAAAAAABSPgAAAAAAAAFIyAAwAAAAAAUDACDgAAAAAAQMEIOAAAAAAAAAUj4AAAAAAAABSMgAMAAAAAAFAwAg4AAAAAAEDBCDgAAAAAAAAFI+AAAAAAAAAUjIADAAAAAABQMAIOAAAAAABAwQg4AAAAAAAABSPgAAAAAAAAFIyAAwAAAAAAUDACDgAAAAAAQMEIOAAAAAAAAAUj4AAAAAAAABSMgAMAAAAAAFAwDep6gNXF184alXoVTep6jAVMOnevuh4BAAAAAAD4DFfgAAAAAAAAFIyAAwAAAAAAUDACDgAAAAAAQMEIOAAAAAAAAAUj4AAAAAAAABSMgAMAAAAAAFAwAg4AAAAAAEDBCDgAAAAAAAAFI+AAAAAAAAAUjIADAAAAAABQMAIOAAAAAABAwQg4AAAAAAAABSPgAAAAAAAAFIyAswSGDx+eFi1a1PUYAAAAAADAKm6VDzgdOnTIr371q7oeAwAAAAAAYLGt8gFnccybNy/z58+v6zEAAAAAAACSFCDgzJ8/P+eff3422GCDVFRUpF27dvn5z3+eJHnqqafSs2fPNG7cOGuttVaOPvrozJgxo2bbvn37Zr/99ssFF1yQddddN2uttVZOOOGEzJ07N0nSo0ePvPrqq/nhD3+YsrKylJWVJfm/W6Hdcccd6dKlSyoqKjJ58uS89957Oeyww7LGGmukSZMm2WOPPfLSSy+t/DcFAAAAAABYrdV5wBk0aFDOPffcnHHGGXn22Wdzww03ZO21187MmTPTq1evrLHGGnn44Ydz88035957703//v1rbT969Oi8/PLLGT16dK655poMHz48w4cPT5L85S9/yVe+8pUMHTo0U6ZMyZQpU2q2mzVrVs4777xcddVVeeaZZ9K6dev07ds3jzzySO644478+9//TqlUyp577lkThBbH7NmzM23atFoPAAAAAACAJdGgLg8+ffr0XHLJJbnsssty+OGHJ0k6duyYHXfcMVdeeWU+/PDDjBgxIk2bNk2SXHbZZendu3fOO++8rL322kmSNdZYI5dddlnq16+fTp06Za+99sp9992Xo446KmuuuWbq16+f5s2bZ5111ql17Llz5+byyy/P17/+9STJSy+9lDvuuCPjx4/P9ttvnyS5/vrr07Zt29x222058MADF+uczjnnnAwZMmSB5U83OjKVFWVL90atSIOXxz6ql8NOAAAAAACAT9TpFTjPPfdcZs+enV122WWhr33961+viTdJssMOO2T+/Pl54YUXapZtsskmqV+/fs3zddddN2+99dYXHru8vDybbbZZreM1aNAg22yzTc2ytdZaKxtvvHGee+65xT6nQYMGpbq6uubx2muvLfa2AAAAAAAASR1fgdO4ceNl3kfDhg1rPS8rK8v8+fMX69iffCfO8lRRUZGKiorlvl8AAAAAAGD1UadX4Gy44YZp3Lhx7rvvvgVe69y5cyZMmJCZM2fWLBs/fnzq1auXjTfeeLGPUV5ennnz5n3hep07d85HH32UBx98sGbZO++8kxdeeCFdunRZ7OMBAAAAAAAsqzoNOI0aNcqpp56aU045JSNGjMjLL7+cBx54IH/4wx9yyCGHpFGjRjn88MPz9NNPZ/To0TnxxBNz6KGH1nz/zeLo0KFD/vnPf+aNN97I22+/vcj1Ntxww+y777456qijMm7cuEyYMCHf+973st5662XfffddHqcLAAAAAACwWOo04CTJGWeckZNOOilnnnlmOnfunO985zt566230qRJk4waNSrvvvtuttpqqxxwwAHZZZddctllly3R/ocOHZpJkyalY8eOadWq1eeuO2zYsGy55ZbZe++9s91226VUKmXkyJEL3KYNAAAAAABgRSorlUqluh5iVTZt2rRUVVWl+rTmqaxY/t+5UwiDq+t6AgAAAAAA+FKo6QbV1amsrFzkenV+BQ4AAAAAAAC1CTgAAAAAAAAFI+AAAAAAAAAUjIADAAAAAABQMAIOAAAAAABAwQg4AAAAAAAABSPgAAAAAAAAFIyAAwAAAAAAUDACDgAAAAAAQMEIOAAAAAAAAAUj4AAAAAAAABSMgAMAAAAAAFAwDep6gNXGoNeTysq6ngIAAAAAAPgScAUOAAAAAABAwSzVFTjvv/9+Hnroobz11luZP39+rdcOO+yw5TIYAAAAAADA6mqJA86dd96ZQw45JDNmzEhlZWXKyspqXisrKxNwAAAAAAAAltES30LtpJNOyhFHHJEZM2bk/fffz3vvvVfzePfdd1fEjAAAAAAAAKuVJQ44b7zxRgYMGJAmTZqsiHkAAAAAAABWe0sccHr16pVHHnlkRcwCAAAAAABAluI7cPbaa6/8+Mc/zrPPPptNN900DRs2rPX6Pvvss9yGAwAAAAAAWB2VlUql0pJsUK/eoi/aKSsry7x585Z5qFXJtGnTUlVVlerq6lRWVtb1OAAAAAAAQB1a3G6wxFfgzJ8/f5kGAwAAAAAA4PMt8XfgfNqHH364vOYAAAAAAADg/1vigDNv3rycffbZWW+99dKsWbO88sorSZIzzjgjf/jDH5b7gAAAAAAAAKubJQ44P//5zzN8+PCcf/75KS8vr1n+ta99LVddddVyHQ4AAAAAAGB1tMQBZ8SIEfn973+fQw45JPXr169Z/vWvfz3PP//8ch0OAAAAAABgdbTEAeeNN97IBhtssMDy+fPnZ+7cuctlKAAAAAAAgNXZEgecLl26ZOzYsQssv+WWW9K1a9flMhQAAAAAAMDqrMGSbnDmmWfm8MMPzxtvvJH58+fnL3/5S1544YWMGDEid91114qYEQAAAAAAYLWyxFfg7Lvvvrnzzjtz7733pmnTpjnzzDPz3HPP5c4778w3v/nNFTEjAAAAAADAamWJr8B5/fXXs9NOO+Wee+5Z4LUHHngg22677XIZDAAAAAAAYHW1xFfg7Lbbbnn33XcXWD5+/Pjsvvvuy2UoAAAAAACA1dkSB5xtt902u+22W6ZPn16z7J///Gf23HPPnHXWWct1OAAAAAAAgNXREgecq666Ku3atUvv3r0ze/bsjB49OnvttVeGDh2aH/7whytiRgAAAAAAgNXKEgecevXq5U9/+lMaNmyYnj17Zp999sk555yTH/zgBytiPgAAAAAAgNVOWalUKn3RSk8++eQCy6ZPn56DDjooe+21V4477ria5ZttttnynfBLbtq0aamqqkp1dXUqKyvrehwAAAAAAKAOLW43WKyAU69evZSVleXTq376+Sd/Lisry7x585bD+KsOAQcAAAAAAPjE4naDBouzs4kTJy63wQAAAAAAAPh8ixVw2rdvv6LnAAAAAAAA4P9brIDzWS+//HJ+9atf5bnnnkuSdOnSJT/4wQ/SsWPH5TocAAAAAADA6qjekm4watSodOnSJQ899FA222yzbLbZZnnwwQezySab5J577lkRMwIAAAAAAKxWykqlUmlJNujatWt69eqVc889t9by0047LXfffXcee+yx5Trgl93ifhkRAAAAAACw6lvcbrDEV+A899xzOfLIIxdYfsQRR+TZZ59d0t0BAAAAAADwGUsccFq1apUnnnhigeVPPPFEWrduvTxmAgAAAAAAWK01WNwVhw4dmpNPPjlHHXVUjj766LzyyivZfvvtkyTjx4/Peeedlx/96EcrbFAAAAAAAIDVxWJ/B079+vUzZcqUtGrVKr/61a9y4YUX5r///W+SpE2bNvnxj3+cAQMGpKysbIUO/GXjO3AAAAAAAIBPLG43WOyAU69evbz55pu1bpM2ffr0JEnz5s2XcdxVl4ADAAAAAAB8YnG7wWLfQi3JAlfXCDcAAAAAAADL3xIFnI022ugLb5H27rvvLtNAAAAAAAAAq7slCjhDhgxJVVXVipoFAAAAAACALGHA+e53v1vrO3AAAAAAAABY/hY74HzRrdP4fF87a1TqVTSp6zEAvhQmnbtXXY8AAAAAAHWq3uKuWCqVVuQcAAAAAAAA/H+LfQXO/PnzV+QcAAAAAAAA/H+LfQUOAAAAAAAAK4eAAwAAAAAAUDACDgAAAAAAQMEIOAAAAAAAAAUj4AAAAAAAABSMgAMAAAAAAFAwAg4AAAAAAEDBCDgAAAAAAAAFI+AAAAAAAAAUjIADAAAAAABQMAIOAAAAAABAwayyAadHjx4ZOHBgXY8BAAAAAACwxFbZgAMAAAAAAPBlJeAAAAAAAAAUzCodcD766KP0798/VVVVadmyZc4444yUSqUkSVlZWW677bZa67do0SLDhw9PkvTs2TP9+/ev9frUqVNTXl6e++67b2WMDwAAAAAArKZW6YBzzTXXpEGDBnnooYdyySWX5KKLLspVV121WNv269cvN9xwQ2bPnl2z7Lrrrst6662Xnj17LnK72bNnZ9q0abUeAAAAAAAAS6JBXQ+wIrVt2zYXX3xxysrKsvHGG+epp57KxRdfnKOOOuoLt91///3Tv3//3H777enTp0+SZPjw4enbt2/KysoWud0555yTIUOGLLD86UZHprJi0dsBLDeDq+t6AgAAAABgGa3SV+Bsu+22tWLLdtttl5deeinz5s37wm0bNWqUQw89NFdffXWS5LHHHsvTTz+dvn37fu52gwYNSnV1dc3jtddeW6ZzAAAAAAAAVj+r9BU4n6esrKzm+3A+MXfu3FrP+/Xrl8033zyvv/56hg0blp49e6Z9+/afu9+KiopUVPy/9u493Oq6zvv/a+Nmb+SwN4rcnATRVEIx8CyaQeqEk4fQSoZxPJQ2tzMeMtSUKWVjNTKlt2maJSU03RqN16gZmt7KCBMeAfE0EpEjgqmZ6L23ogGy1++PbvcvQkyKzfrAfjyua12x1ve7vuv9oev6XtbTz1r1m3xeAAAAAACg49iqd+A8/PDD6zx/6KGHsttuu2WbbbZJ79698+KLL7YdW7JkSd588811zt9rr72y3377ZerUqbnpppvy2c9+drPMDQAAAAAAdGxbdcBZtmxZJkyYkMWLF+dHP/pRvvWtb+Xzn/98kuSwww7LNddck4ULF2b+/Pk544wz0rlz5/Wucfrpp2fKlCmpVCo57rjjNvcSAAAAAACADmirDjgnn3xy3nrrrRxwwAE588wz8/nPfz5///d/nyS54oorMnDgwBx66KH527/925x//vnp2rXretcYP358amtrM378+HTp0mVzLwEAAAAAAOiAaip//EMwrGPp0qX5wAc+kHnz5mWfffbZ6Pe3tLSksbExzRf1SEN9TTtMCPBHmpqrPQEAAAAAsAFt3aC5OQ0NDRs8r3YzzrRFWbNmTVasWJEvf/nLOeigg/6seAMAAAAAAPDn2Kq/Qu0vcf/996dfv36ZN29evvOd71R7HAAAAAAAoAOxA2cDRo8eHd8uBwAAAAAAVIMdOAAAAAAAAIURcAAAAAAAAAoj4AAAAAAAABRGwAEAAAAAACiMgAMAAAAAAFAYAQcAAAAAAKAwAg4AAAAAAEBhBBwAAAAAAIDCCDgAAAAAAACFqa32AB3GxOeThoZqTwEAAAAAAGwB7MABAAAAAAAojIADAAAAAABQGAEHAAAAAACgMAIOAAAAAABAYQQcAAAAAACAwgg4AAAAAAAAhRFwAAAAAAAACiPgAAAAAAAAFEbAAQAAAAAAKIyAAwAAAAAAUBgBBwAAAAAAoDACDgAAAAAAQGEEHAAAAAAAgMIIOAAAAAAAAIURcAAAAAAAAAoj4AAAAAAAABRGwAEAAAAAACiMgAMAAAAAAFAYAQcAAAAAAKAwAg4AAAAAAEBhBBwAAAAAAIDCCDgAAAAAAACFEXAAAAAAAAAKI+AAAAAAAAAURsABAAAAAAAojIADAAAAAABQGAEHAAAAAACgMAIOAAAAAABAYQQcAAAAAACAwgg4AAAAAAAAhRFwAAAAAAAACiPgAAAAAAAAFEbAAQAAAAAAKIyAAwAAAAAAUBgBBwAAAAAAoDACDgAAAAAAQGEEHAAAAAAAgMIIOAAAAAAAAIWprfYAHcWwSXenU33Xqn3+0ilHVe2zAQAAAACAjWMHDgAAAAAAQGEEHAAAAAAAgMIIOAAAAAAAAIURcAAAAAAAAAoj4AAAAAAAABRGwAEAAAAAACiMgAMAAAAAAFAYAQcAAAAAAKAwAg4AAAAAAEBhBBwAAAAAAIDCCDgAAAAAAACFEXAAAAAAAAAKI+AAAAAAAAAUpkMFnNGjR+fcc8+t9hgAAAAAAADvqbbaA2xOt9xySzp37lztMQAAAAAAAN5Thwo422+/fbVHAAAAAAAA+JM65Feo/dM//VMOPPDA9Y4PHz48l156advz733vexk6dGi6dOmSD37wg/n2t7+9OccFAAAAAAA6qA61A+cdJ554Yi677LI888wz+cAHPpAk+a//+q888cQT+fd///ckyY033phLLrkk11xzTfbee+8sXLgwn/vc59KtW7eccsopG7z2qlWrsmrVqrbnLS0t7bsYAAAAAABgq9MhA86ee+6Z4cOH56abbsrFF1+c5PfB5sADD8yuu+6aJJk0aVKuuOKKHH/88UmSnXfeOU8//XS++93vvmfAueyyyzJ58uT1Xn+qy2lpqK/ZuEGbmjfufAAAAAAAYKvQob5C7Q+deOKJuemmm5IklUolP/rRj3LiiScmSVauXJlnnnkmp512Wrp37972+OpXv5pnnnnmPa87ceLENDc3tz2WL1/e7msBAAAAAAC2Lh1yB06SjB8/PhdeeGEeffTRvPXWW1m+fHnGjRuXJHnjjTeSJFOnTl3vt3K22Wab97xufX196uvr22doAAAAAACgQ+iwAWfHHXfMqFGjcuONN+att97KX/3VX+V//I//kSTp06dP+vfvn//+7/9u25UDAAAAAACwuXTYgJP8/mvUJk2alNWrV+fKK69c59jkyZNzzjnnpLGxMUceeWRWrVqV+fPn57XXXsuECROqNDEAAAAAANARdNjfwEmST33qU1mxYkXefPPNjB07dp1jp59+er73ve9l2rRp2WuvvTJq1KhMnz49O++8c3WGBQAAAAAAOoyaSqVSqfYQW7OWlpY0Njam+aIeaaiv2bg3NzW3z1AAAAAAAEBVtHWD5uY0NDRs8LwOvQMHAAAAAACgRAIOAAAAAABAYQQcAAAAAACAwgg4AAAAAAAAhRFwAAAAAAAACiPgAAAAAAAAFEbAAQAAAAAAKIyAAwAAAAAAUBgBBwAAAAAAoDACDgAAAAAAQGEEHAAAAAAAgMIIOAAAAAAAAIWprfYAHcbE55OGhmpPAQAAAAAAbAHswAEAAAAAACiMgAMAAAAAAFAYAQcAAAAAAKAwAg4AAAAAAEBhBBwAAAAAAIDCCDgAAAAAAACFEXAAAAAAAAAKI+AAAAAAAAAURsABAAAAAAAojIADAAAAAABQGAEHAAAAAACgMAIOAAAAAABAYQQcAAAAAACAwgg4AAAAAAAAhRFwAAAAAAAACiPgAAAAAAAAFEbAAQAAAAAAKIyAAwAAAAAAUBgBBwAAAAAAoDACDgAAAAAAQGEEHAAAAAAAgMIIOAAAAAAAAIURcAAAAAAAAAoj4AAAAAAAABRGwAEAAAAAACiMgAMAAAAAAFAYAQcAAAAAAKAwAg4AAAAAAEBhBBwAAAAAAIDCCDgAAAAAAACFEXAAAAAAAAAKI+AAAAAAAAAURsABAAAAAAAojIADAAAAAABQGAEHAAAAAACgMAIOAAAAAABAYQQcAAAAAACAwgg4AAAAAAAAhamt9gAdxbBJd6dTfddqj7HVWDrlqGqPAAAAAAAA7cYOHAAAAAAAgMIIOAAAAAAAAIURcAAAAAAAAAoj4AAAAAAAABRGwAEAAAAAACiMgAMAAAAAAFAYAQcAAAAAAKAwAg4AAAAAAEBhBBwAAAAAAIDCCDgAAAAAAACFEXAAAAAAAAAKI+AAAAAAAAAURsABAAAAAAAojICzAU1NTRkxYkS1xwAAAAAAADogASdJTU1NbrvttmqPAQAAAAAAkETAAQAAAAAAKE5RAWf06NE5++yzc+6552a77bZLnz59MnXq1KxcuTKf+cxn0qNHj+y666752c9+1vaeOXPm5IADDkh9fX369euXiy66KG+//fY61zznnHPyxS9+Mdtvv3369u2bpqamtuODBw9Okhx33HGpqalpe/6OH/7whxk8eHAaGxvzN3/zN3n99dfb868AAAAAAACgrICTJD/4wQ+yww475JFHHsnZZ5+df/iHf8inP/3pHHzwwXn00UfzsY99LCeddFLefPPN/PrXv87HP/7x7L///nn88cdz3XXX5fvf/36++tWvrnfNbt265eGHH87Xv/71XHrppbnnnnuSJPPmzUuSTJs2LS+++GLb8yR55plnctttt2XmzJmZOXNm5syZkylTprzn/KtWrUpLS8s6DwAAAAAAgI1RU6lUKtUe4h2jR4/O2rVr8/Of/zxJsnbt2jQ2Nub444/Pv/7rvyZJXnrppfTr1y8PPvhgfvrTn+bf//3fs2jRotTU1CRJvv3tb+fCCy9Mc3NzOnXqtN41k+SAAw7IYYcd1hZjampqcuutt2bs2LFt5zQ1NeUb3/hGXnrppfTo0SNJ8sUvfjH/+Z//mYceemiDa2hqasrkyZPXe735oh5pqK/5y/6CNkZT8+b7LAAAAAAA4H1paWlJY2Njmpub09DQsMHzituB86EPfajtz9tss0169eqVvfbaq+21Pn36JElefvnlLFq0KCNHjmyLN0lyyCGH5I033sjzzz//rtdMkn79+uXll1/+k7MMHjy4Ld683/dNnDgxzc3NbY/ly5f/yc8BAAAAAAD4Q7XVHuCPde7ceZ3nNTU167z2TqxpbW39i675ft7/57yvvr4+9fX173s2AAAAAACAP1bcDpyNMXTo0Dz44IP5w2+Bu//++9OjR4/suOOO7/s6nTt3ztq1a9tjRAAAAAAAgI22RQecf/zHf8zy5ctz9tln5xe/+EV+8pOfZNKkSZkwYUI6dXr/Sxs8eHBmzZqVl156Ka+99lo7TgwAAAAAAPCnbdEBZ8CAAbnzzjvzyCOPZPjw4TnjjDNy2mmn5ctf/vJGXeeKK67IPffck4EDB2bvvfdup2kBAAAAAADen5rKH37/GJtcS0tLGhsb03xRjzTU12y+D25q3nyfBQAAAAAAvC9t3aC5OQ0NDRs8b4vegQMAAAAAALA1EnAAAAAAAAAKI+AAAAAAAAAURsABAAAAAAAojIADAAAAAABQGAEHAAAAAACgMAIOAAAAAABAYQQcAAAAAACAwgg4AAAAAAAAhRFwAAAAAAAACiPgAAAAAAAAFEbAAQAAAAAAKExttQfoMCY+nzQ0VHsKAAAAAABgC2AHDgAAAAAAQGEEHAAAAAAAgMIIOAAAAAAAAIURcAAAAAAAAAoj4AAAAAAAABRGwAEAAAAAACiMgAMAAAAAAFAYAQcAAAAAAKAwAg4AAAAAAEBhBBwAAAAAAIDCCDgAAAAAAACFEXAAAAAAAAAKI+AAAAAAAAAURsABAAAAAAAojIADAAAAAABQGAEHAAAAAACgMAIOAAAAAABAYQQcAAAAAACAwgg4AAAAAAAAhRFwAAAAAAAACiPgAAAAAAAAFEbAAQAAAAAAKIyAAwAAAAAAUBgBBwAAAAAAoDACDgAAAAAAQGEEHAAAAAAAgMIIOAAAAAAAAIURcAAAAAAAAAoj4AAAAAAAABRGwAEAAAAAACiMgAMAAAAAAFAYAQcAAAAAAKAwAg4AAAAAAEBhBBwAAAAAAIDCCDgAAAAAAACFEXAAAAAAAAAKI+AAAAAAAAAURsABAAAAAAAoTG21B+gohk26O53qu1Z7DOhwlk45qtojAAAAAABsNDtwAAAAAAAACiPgAAAAAAAAFEbAAQAAAAAAKIyAAwAAAAAAUBgBBwAAAAAAoDACDgAAAAAAQGEEHAAAAAAAgMIIOAAAAAAAAIURcAAAAAAAAAoj4AAAAAAAABRGwAEAAAAAACiMgAMAAAAAAFAYAQcAAAAAAKAwAg4AAAAAAEBhBJz3afr06enZs2e1xwAAAAAAADoAAQcAAAAAAKAwHSbgvP766znxxBPTrVu39OvXL1deeWVGjx6dc889N0myatWqnH/++RkwYEC6deuWAw88MLNnz06SzJ49O5/5zGfS3Nycmpqa1NTUpKmpqWprAQAAAAAAtm611R5gc5kwYULuv//+3H777enTp08uueSSPProoxkxYkSS5KyzzsrTTz+dGTNmpH///rn11ltz5JFH5sknn8zBBx+cb37zm7nkkkuyePHiJEn37t3f9XNWrVqVVatWtT1vaWlp97UBAAAAAABblw4RcF5//fX84Ac/yE033ZTDDz88STJt2rT0798/SbJs2bJMmzYty5Yta3vt/PPPz1133ZVp06bln//5n9PY2Jiampr07dv3PT/rsssuy+TJk9d7/akup6WhvmYTr4x21dRc7QkAAAAAAOigOkTA+e///u+sWbMmBxxwQNtrjY2NGTJkSJLkySefzNq1a7P77ruv875Vq1alV69eG/VZEydOzIQJE9qet7S0ZODAgX/B9AAAAAAAQEfTIQLOn/LGG29km222yYIFC7LNNtusc2xDX5W2IfX19amvr9+U4wEAAAAAAB1Mhwg4u+yySzp37px58+Zl0KBBSZLm5ub88pe/zEc+8pHsvffeWbt2bV5++eUceuih73qNurq6rF27dnOODQAAAAAAdFCdqj3A5tCjR4+ccsopueCCC3Lfffflv/7rv3LaaaelU6dOqampye67754TTzwxJ598cm655ZY8++yzeeSRR3LZZZfljjvuSJIMHjw4b7zxRmbNmpVXXnklb775ZpVXBQAAAAAAbK06RMBJkv/1v/5XRo4cmaOPPjpHHHFEDjnkkAwdOjRdunRJkkybNi0nn3xyzjvvvAwZMiRjx45dZ8fOwQcfnDPOOCPjxo1L79698/Wvf72aywEAAAAAALZiNZVKpVLtIaph5cqVGTBgQK644oqcdtpp7fY5LS0taWxsTPNFPdJQX9Nun0M7aGqu9gQAAAAAAGxl2rpBc3MaGho2eF6H+A2cJFm4cGF+8Ytf5IADDkhzc3MuvfTSJMknPvGJKk8GAAAAAACwrg4TcJLk8ssvz+LFi1NXV5d99903P//5z7PDDjtUeywAAAAAAIB1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0Ic+9K5rWrVqVVpaWtZ5AAAAAAAAbIyaSqVSqfYQ73jllVfSu3fvPPnkk+nevXt23nnnTJkyJRdeeGGS5O23387OO++cs88+O1/84hcze/bsfPSjH82MGTMybty4JMmrr76aHXfcMdOnT88JJ5yQ008/Pdtss02++93vtn3O3LlzM2rUqKxcuTJdunRZb4758+dn//33z+uvv57u3bu3fc5tt92WT3ziE++5hqampkyePHm915sv6pGG+pq/5K/nDz6kedNcBwAAAAAA2KxaWlrS2NiY5ubmNDQ0bPC8qu7AWbJkScaPH59ddtklDQ0NGTx4cJJk2bJlbeeMHDmy7c+1tbXZb7/9smjRonWu84fnbL/99hkyZEjbOY8//nimT5+e7t27tz3GjBmT1tbWPPvss0mSBQsW5JhjjsmgQYPSo0ePjBo1ar05kmS//fb7k2uaOHFimpub2x7Lly/fiL8RAAAAAACApLaaH37MMcdkp512ytSpU9O/f/+0trZm2LBhWb169Sb7jDfeeCP/83/+z5xzzjnrHRs0aFBWrlyZMWPGZMyYMbnxxhvTu3fvLFu2LGPGjFlvjm7duv3Jz6uvr099ff0mmx8AAAAAAOh4qhZwVqxYkcWLF2fq1Kk59NBDk/z+q83+2EMPPZSPfOQjSX7/FWoLFixY5/dr3jln0KBBSZLXXnstv/zlLzN06NAkyT777JOnn346u+6667vO8eSTT2bFihWZMmVKBg4cmOT3X6EGAAAAAABQLVULONttt1169eqV66+/Pv369cuyZcty0UUXrXfetddem9122y1Dhw7NlVdemddeey2f/exn1znn0ksvTa9evdKnT5986Utfyg477JCxY8cmSS688MIcdNBBOeuss3L66aenW7duefrpp3PPPffkmmuuyaBBg1JXV5dvfetbOeOMM/LUU0/lK1/5yub4KwAAAAAAAHhXVfsNnE6dOmXGjBlZsGBBhg0bli984Qv5xje+sd55U6ZMyZQpUzJ8+PDMnTs3t99+e3bYYYf1zvn85z+ffffdNy+99FJ++tOfpq6uLknyoQ99KHPmzMkvf/nLHHroodl7771zySWXpH///kmS3r17Z/r06bn55puzxx57ZMqUKbn88svb/y8AAAAAAABgA2oqlUql2kO8m6VLl2bnnXfOwoULM2LEiHc9Z/bs2fnoRz+a1157LT179tys871fLS0taWxsTPNFPdJQX7NpLtrUvGmuAwAAAAAAbFZt3aC5OQ0NDRs8r2o7cAAAAAAAAHh3Ag4AAAAAAEBhaqs9wIYMHjw4f+rb3UaPHv0nzwEAAAAAANjS2IEDAAAAAABQGAEHAAAAAACgMAIOAAAAAABAYQQcAAAAAACAwgg4AAAAAAAAhRFwAAAAAAAACiPgAAAAAAAAFEbAAQAAAAAAKIyAAwAAAAAAUJjaag/QYUx8PmloqPYUAAAAAADAFsAOHAAAAAAAgMIIOAAAAAAAAIURcAAAAAAAAAoj4AAAAAAAABRGwAEAAAAAACiMgAMAAAAAAFAYAQcAAAAAAKAwAg4AAAAAAEBhBBwAAAAAAIDCCDgAAAAAAACFEXAAAAAAAAAKI+AAAAAAAAAURsABAAAAAAAojIADAAAAAABQGAEHAAAAAACgMAIOAAAAAABAYQQcAAAAAACAwgg4AAAAAAAAhamt9gBbu0qlkiRpaWmp8iQAAAAAAEC1vdML3ukHGyLgtLMVK1YkSQYOHFjlSQAAAAAAgFK8/vrraWxs3OBxAaedbb/99kmSZcuWved/EQC8fy0tLRk4cGCWL1+ehoaGao8DsFVwbwXY9NxbATY991a2BpVKJa+//nr69+//nucJOO2sU6ff/8xQY2OjGwrAJtbQ0ODeCrCJubcCbHrurQCbnnsrW7r3s+Gj02aYAwAAAAAAgI0g4AAAAAAAABRGwGln9fX1mTRpUurr66s9CsBWw70VYNNzbwXY9NxbATY991Y6kppKpVKp9hAAAAAAAAD8/+zAAQAAAAAAKIyAAwAAAAAAUBgBBwAAAAAAoDACDgAAAAAAQGEEnI107bXXZvDgwenSpUsOPPDAPPLII+95/s0335wPfvCD6dKlS/baa6/ceeed6xyvVCq55JJL0q9fv2y77bY54ogjsmTJkvZcAkBxNvW99ZZbbsnHPvax9OrVKzU1NXnsscfacXqAMm3Ke+uaNWty4YUXZq+99kq3bt3Sv3//nHzyyXnhhRfaexkARdnU/9za1NSUD37wg+nWrVu22267HHHEEXn44YfbcwkAxdnU99Y/dMYZZ6Smpibf/OY3N/HUsHkIOBvhxz/+cSZMmJBJkybl0UcfzfDhwzNmzJi8/PLL73r+Aw88kPHjx+e0007LwoULM3bs2IwdOzZPPfVU2zlf//rXc/XVV+c73/lOHn744XTr1i1jxozJ7373u821LICqao9768qVK/PhD384//Iv/7K5lgFQlE19b33zzTfz6KOP5uKLL86jjz6aW265JYsXL86xxx67OZcFUFXt8c+tu+++e6655po8+eSTmTt3bgYPHpyPfexj+e1vf7u5lgVQVe1xb33Hrbfemoceeij9+/dv72VAu6mpVCqVag+xpTjwwAOz//7755prrkmStLa2ZuDAgTn77LNz0UUXrXf+uHHjsnLlysycObPttYMOOigjRozId77znVQqlfTv3z/nnXdezj///CRJc3Nz+vTpk+nTp+dv/uZvNs/CAKpoU99b/9DSpUuz8847Z+HChRkxYkS7rgOgJO15b33HvHnzcsABB+S5557LoEGD2mchAAXZHPfWlpaWNDY25t57783hhx/ePgsBKEh73Vt//etf58ADD8zdd9+do446Kueee27OPffcdl8PbGp24LxPq1evzoIFC3LEEUe0vdapU6ccccQRefDBB9/1PQ8++OA65yfJmDFj2s5/9tln89JLL61zTmNjYw488MANXhNga9Ie91aAjm5z3Vubm5tTU1OTnj17bpK5AUq2Oe6tq1evzvXXX5/GxsYMHz580w0PUKj2ure2trbmpJNOygUXXJA999yzfYaHzUTAeZ9eeeWVrF27Nn369Fnn9T59+uSll1561/e89NJL73n+O/+5MdcE2Jq0x70VoKPbHPfW3/3ud7nwwgszfvz4NDQ0bJrBAQrWnvfWmTNnpnv37unSpUuuvPLK3HPPPdlhhx027QIACtRe99Z/+Zd/SW1tbc4555xNPzRsZgIOAADwvq1ZsyYnnHBCKpVKrrvuumqPA7DF++hHP5rHHnssDzzwQI488siccMIJG/ztBwDe24IFC3LVVVdl+vTpqampqfY48BcTcN6nHXbYIdtss01+85vfrPP6b37zm/Tt2/dd39O3b9/3PP+d/9yYawJsTdrj3grQ0bXnvfWdePPcc8/lnnvusfsG6DDa897arVu37LrrrjnooIPy/e9/P7W1tfn+97+/aRcAUKD2uLf+/Oc/z8svv5xBgwaltrY2tbW1ee6553Leeedl8ODB7bIOaE8CzvtUV1eXfffdN7NmzWp7rbW1NbNmzcrIkSPf9T0jR45c5/wkueeee9rO33nnndO3b991zmlpacnDDz+8wWsCbE3a494K0NG11731nXizZMmS3HvvvenVq1f7LACgQJvzn1tbW1uzatWqv3xogMK1x731pJNOyhNPPJHHHnus7dG/f/9ccMEFufvuu9tvMdBOaqs9wJZkwoQJOeWUU7LffvvlgAMOyDe/+c2sXLkyn/nMZ5IkJ598cgYMGJDLLrssSfL5z38+o0aNyhVXXJGjjjoqM2bMyPz583P99dcnSWpqanLuuefmq1/9anbbbbfsvPPOufjii9O/f/+MHTu2WssE2Kw29b01SV599dUsW7YsL7zwQpJk8eLFSX7/b+rYqQN0BJv63rpmzZp86lOfyqOPPpqZM2dm7dq1bd8zvv3226eurq46CwXYjDb1vXXlypX52te+lmOPPTb9+vXLK6+8kmuvvTa//vWv8+lPf7pq6wTYnDb1vbVXr17r/YtGnTt3Tt++fTNkyJDNuzjYFCpslG9961uVQYMGVerq6ioHHHBA5aGHHmo7NmrUqMopp5yyzvn/9m//Vtl9990rdXV1lT333LNyxx13rHO8tbW1cvHFF1f69OlTqa+vrxx++OGVxYsXb46lABRjU99bp02bVkmy3mPSpEmbYTUAZdiU99Znn332Xe+rSSr33XffZloRQPVtynvrW2+9VTnuuOMq/fv3r9TV1VX69etXOfbYYyuPPPLI5loOQBE29f8n8Md22mmnypVXXtkOk0P7q6lUKpUqtSMAAAAAAADehd/AAQAAAAAAKIyAAwAAAAAAUBgBBwAAAAAAoDACDgAAAAAAQGEEHAAAAAAAgMIIOAAAAAAAAIURcAAAAAAAAAoj4AAAAAAAABRGwAEAANgIp556asaOHfsXXWPp0qWpqanJY489tsFzZs+enZqamvzf//t/kyTTp09Pz5492443NTVlxIgRf9EcAABAuQQcAABgq3XqqaempqYmNTU1qaury6677ppLL700b7/9drVH+5MOPvjgvPjii2lsbHzX4+eff35mzZrV9nxThCUAAKActdUeAAAAoD0deeSRmTZtWlatWpU777wzZ555Zjp37pyJEyeuc97q1atTV1dXpSnXV1dXl759+27wePfu3dO9e/fNOBEAALA52YEDAABs1err69O3b9/stNNO+Yd/+IccccQRuf3229t2rHzta19L//79M2TIkCTJk08+mcMOOyzbbrttevXqlb//+7/PG2+8sd51J0+enN69e6ehoSFnnHFGVq9e3Xbsrrvuyoc//OH07NkzvXr1ytFHH51nnnlmvWv84he/yMEHH5wuXbpk2LBhmTNnTtuxP/4KtT/2h1+h1tTUlB/84Af5yU9+0rbjaPbs2TnssMNy1llnrfO+3/72t6mrq1tn9w4AAFAeAQcAAOhQtt1227bYMmvWrCxevDj33HNPZs6cmZUrV2bMmDHZbrvtMm/evNx88825995714sgs2bNyqJFizJ79uz86Ec/yi233JLJkye3HV+5cmUmTJiQ+fPnZ9asWenUqVOOO+64tLa2rnOdCy64IOedd14WLlyYkSNH5phjjsmKFSs2ek3nn39+TjjhhBx55JF58cUX8+KLL+bggw/O6aefnptuuimrVq1qO/d//+//nQEDBuSwww7b6M8BAAA2HwEHAADoECqVSu69997cfffdbfGiW7du+d73vpc999wze+65Z2666ab87ne/y7/+679m2LBhOeyww3LNNdfkhz/8YX7zm9+0Xauuri433HBD9txzzxx11FG59NJLc/XVV7cFmk9+8pM5/vjjs+uuu2bEiBG54YYb8uSTT+bpp59eZ6azzjorn/zkJzN06NBcd911aWxszPe///2NXlv37t2z7bbbtu026tu3b+rq6nL88ccnSX7yk5+0nTt9+vS23wYCAADKJeAAAABbtZkzZ6Z79+7p0qVL/vqv/zrjxo1LU1NTkmSvvfZa53dvFi1alOHDh6dbt25trx1yyCFpbW3N4sWL214bPnx4unbt2vZ85MiReeONN7J8+fIkyZIlSzJ+/PjssssuaWhoyODBg5Mky5YtW2e2kSNHtv25trY2++23XxYtWrTJ1t6lS5ecdNJJueGGG5Ikjz76aJ566qmceuqpm+wzAACA9lFb7QEAAADa00c/+tFcd911qaurS//+/VNb+///z6A/DDWb0jHHHJOddtopU6dOTf/+/dPa2pphw4at8zs5m8vpp5+eESNG5Pnnn8+0adNy2GGHZaeddtrscwAAABvHDhwAAGCr1q1bt+y6664ZNGjQOvHm3QwdOjSPP/54Vq5c2fba/fffn06dOmXIkCFtrz3++ON566232p4/9NBD6d69ewYOHJgVK1Zk8eLF+fKXv5zDDz88Q4cOzWuvvfaun/fQQw+1/fntt9/OggULMnTo0D9rnXV1dVm7du16r++1117Zb7/9MnXq1Nx000357Gc/+2ddHwAA2LwEHAAAgP/nxBNPTJcuXXLKKafkqaeeyn333Zezzz47J510Uvr06dN23urVq3Paaafl6aefzp133plJkyblrLPOSqdOnbLddtulV69euf766/OrX/0q//Ef/5EJEya86+dde+21ufXWW/OLX/wiZ555Zl577bU/O7AMHjw4TzzxRBYvXpxXXnkla9asaTt2+umnZ8qUKalUKjnuuOP+rOsDAACbl4ADAADw/3Tt2jV33313Xn311ey///751Kc+lcMPPzzXXHPNOucdfvjh2W233fKRj3wk48aNy7HHHtv2uzqdOnXKjBkzsmDBggwbNixf+MIX8o1vfONdP2/KlCmZMmVKhg8fnrlz5+b222/PDjvs8GfN/rnPfS5DhgzJfvvtl969e+f+++9vOzZ+/PjU1tZm/Pjx6dKly591fQAAYPOqqVQqlWoPAQAAQPtZunRpPvCBD2TevHnZZ599qj0OAADwPgg4AAAAW6k1a9ZkxYoVOf/88/Pss8+usysHAAAom69QAwAA2Erdf//96devX+bNm5fvfOc71R4HAADYCHbgAAAAAAAAFMYOHAAAAAAAgMIIOAAAAAAAAIURcAAAAAAAAAoj4AAAAAAAABRGwAEAAAAAACiMgAMAAAAAAFAYAQcAAAAAAKAwAg4AAAAAAEBh/j9F8y8+p52BOgAAAABJRU5ErkJggg==\n"
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"id": "b2984273",
"metadata": {
"id": "b2984273"
},
"source": [
"#### b) Suite à cette analyse, pouvez-vous voir une tendance dans les exemples qui sont prédits comme faisant partie de la classe 1 mais faisant réellement partie de la classe 5 ? (3 points)"
]
},
{
"cell_type": "markdown",
"id": "856cc027",
"metadata": {
"id": "856cc027"
},
"source": [
"Il semble que le modèle Bayésien naïf (NB) ait du mal à distinguer certains avis positifs de ceux avec une note plus basse, ce qui conduit à ces erreurs de classification. Ces erreurs peuvent être dues à la similitude des mots utilisés dans les avis positifs et négatifs, ainsi qu'à la variabilité naturelle des avis des utilisateurs."
]
},
{
"cell_type": "markdown",
"id": "40f0f9a6",
"metadata": {
"id": "40f0f9a6"
},
"source": [
"<a name='2.3'></a>\n",
"### 2.3 Régression logistique (4 points)\n",
"\n",
"Entrainez un modèle de [régression logistique](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) à l'aide de SKLearn en utilisant les données produites en 1.6 et affichez sa performance avec les mêmes métriques que précédemment."
]
},
{
"cell_type": "code",
"execution_count": 110,
"id": "c7c91797",
"metadata": {
"id": "c7c91797"
},
"outputs": [],
"source": [
"from sklearn.linear_model import LogisticRegression\n"
]
},
{
"cell_type": "code",
"execution_count": 111,
"id": "dce0ff9f",
"metadata": {
"id": "dce0ff9f",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"outputId": "6a324747-e7da-4368-aba1-0df7d588d92c"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Rapport de classification pour le modèle de régression logistique :\n",
" precision recall f1-score support\n",
"\n",
" 1 0.8091 0.8418 0.8251 297\n",
" 3 0.7161 0.7003 0.7081 317\n",
" 5 0.7888 0.7760 0.7823 308\n",
"\n",
" accuracy 0.7711 922\n",
" macro avg 0.7713 0.7727 0.7718 922\n",
"weighted avg 0.7703 0.7711 0.7706 922\n",
"\n"
]
}
],
"source": [
"y_train = train['rating']\n",
"X_test = TfidfVectorizer.transform(test[\"text_original\"])\n",
"# Créez et entraînez le modèle de régression logistique\n",
"logistic_regression_model = LogisticRegression(random_state=42)\n",
"\n",
"logistic_regression_model.fit(X_train, y_train)\n",
"\n",
"# Effectuez des prédictions sur l'ensemble de test\n",
"y_pred = logistic_regression_model.predict(X_test)\n",
"\n",
"# Évaluez les performances du modèle avec classification_report\n",
"classification_report_result = classification_report(y_true, y_pred, digits=4)\n",
"\n",
"# Affichez le rapport de classification\n",
"print(\"Rapport de classification pour le modèle de régression logistique :\")\n",
"print(classification_report_result)"
]
},
{
"cell_type": "markdown",
"id": "727658f6",
"metadata": {
"id": "727658f6"
},
"source": [
"<a name='2.4'></a>\n",
"### 2.4 MLP (4 points)\n",
"\n",
"Entrainez un modèle neuronal de type [Multi-layer Perceptron classifier](https://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPClassifier.html) à l'aide de SKLearn en utilisant les données produites en 1.6. Affichez sa performance avec les mêmes métriques que précédemment."
]
},
{
"cell_type": "code",
"execution_count": 112,
"id": "b44f3fd5",
"metadata": {
"id": "b44f3fd5"
},
"outputs": [],
"source": [
"from sklearn.neural_network import MLPClassifier\n"
]
},
{
"cell_type": "code",
"execution_count": 113,
"id": "4e71cb73",
"metadata": {
"id": "4e71cb73",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 676
},
"outputId": "405fc6f1-125e-4c7f-e412-69265f3c7d64"
},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.10/dist-packages/sklearn/neural_network/_multilayer_perceptron.py:686: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (200) reached and the optimization hasn't converged yet.\n",
" warnings.warn(\n"
]
},
{
"output_type": "stream",
"name": "stdout",
"text": [
" precision recall f1-score support\n",
"\n",
" 1 0.8084 0.8384 0.8231 297\n",
" 3 0.7624 0.7287 0.7452 317\n",
" 5 0.7428 0.7500 0.7464 308\n",
"\n",
" accuracy 0.7711 922\n",
" macro avg 0.7712 0.7724 0.7716 922\n",
"weighted avg 0.7707 0.7711 0.7707 922\n",
"\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<Axes: >"
]
},
"metadata": {},
"execution_count": 113
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
],
"image/png": "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\n"
},
"metadata": {}
}
],
"source": [
"clf = MLPClassifier()\n",
"clf.fit(X_train, y_train)\n",
"y_pred = clf.predict(X_test)\n",
"print(classification_report(y_true, y_pred, digits=4 ))\n",
"cm = confusion_matrix(y_true, y_pred)\n",
"heatmap(cm, annot=True, fmt='d', cmap='Blues')"
]
},
{
"cell_type": "markdown",
"id": "21b383b9",
"metadata": {
"id": "21b383b9"
},
"source": [
"<a name='3'></a>\n",
"## 3. Amélioration de modèle (30 points)\n",
"\n",
"Cette dernière partie consistera à améliorer votre modèle de deux façons différentes.\n",
"\n",
"Tout d'abord, vous effectuerez une recherche d'hyper-paramètres avec une validation croisée en utilisant une grille de recherche (GridSearch). Ensuite, vous réaliserez de l'extraction d'attributs (feature extraction) afin d'entraîner un nouveau modèle.\n",
"\n",
"<a name='3.1'></a>\n",
"### 3.1 Recherche d'hyper-paramètres et validation croisée (5 points)\n",
"\n",
"La classe [GridSearchCV](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html) permet d'explorer toutes les combinaisons possibles d'hyper-paramètres que l'on spécifie afin de trouver la configuration optimale. De plus, il est tout à fait possible de fusionner les paramètres du pré-traitement et ceux du classificateur en utilisant la classe [Pipeline](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html).\n",
"Pour la rédaction de votre code, vous avez la possibilité de vous référer au tutoriel du cours.\n",
"\n",
"#### a) Dans cette phase, l'objectif est de découvrir une configuration optimale pour le modèle LogisticRegression en conjonction avec la technique de vectorisation TF-IDF. Cette recherche devra être guidée par la métrique du F1-score pondéré (weighted F1). Vous devrez aussi effectuer une exploration de paramètres sur au moins deux attributs liés à TF-IDF et deux paramètres de la régression logistique. Affichez ensuite la performance finale du modèle optimal ainsi que ses paramètres. (3 points)"
]
},
{
"cell_type": "code",
"execution_count": 115,
"id": "5d1121d8",
"metadata": {
"scrolled": true,
"id": "5d1121d8",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"outputId": "330766e7-c3c3-41ae-bda1-48ebc10262ab"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Fitting 5 folds for each of 36 candidates, totalling 180 fits\n",
"Best Parameters: {'clf__C': 10.0, 'clf__max_iter': 100, 'tfidf__max_df': 0.5, 'tfidf__ngram_range': (1, 2)}\n",
"Weighted F1 Score on Test Set: 0.8421742320017904\n"
]
},
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
"Please also refer to the documentation for alternative solver options:\n",
" https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
" n_iter_i = _check_optimize_result(\n"
]
}
],
"source": [
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.model_selection import GridSearchCV\n",
"from sklearn.metrics import f1_score, make_scorer\n",
"\n",
"# Define a pipeline with TF-IDF vectorizer and LogisticRegression classifier\n",
"pipeline = Pipeline([\n",
" ('tfidf', TfidfVectorizer()),\n",
" ('clf', LogisticRegression(random_state=42))\n",
"])\n",
"\n",
"# Define the hyperparameter grid for both TF-IDF and LogisticRegression\n",
"param_grid = {\n",
" 'tfidf__max_df': [0.5, 0.75, 1.0], # Maximum document frequency for TF-IDF\n",
" 'tfidf__ngram_range': [(1, 1), (1, 2)], # Unigrams or bigrams for TF-IDF\n",
" 'clf__C': [0.1, 1.0, 10.0], # Regularization parameter for LogisticRegression\n",
" 'clf__max_iter': [100, 200] # Maximum number of iterations for LogisticRegression\n",
"}\n",
"\n",
"# Define the scoring metric as weighted F1 score\n",
"scorer = make_scorer(f1_score, average='weighted')\n",
"\n",
"# Create the GridSearchCV object\n",
"grid_search = GridSearchCV(pipeline, param_grid, cv=5, scoring=scorer, n_jobs=-1, verbose=1)\n",
"\n",
"# Fit the grid search to the data\n",
"grid_search.fit(train[\"text_original\"], train[\"rating\"])\n",
"\n",
"# Get the best parameters and estimator\n",
"best_params = grid_search.best_params_\n",
"best_estimator = grid_search.best_estimator_\n",
"\n",
"# Evaluate the performance of the best estimator on the test set\n",
"y_pred = best_estimator.predict(test[\"text_original\"])\n",
"f1_weighted = f1_score(test[\"rating\"], y_pred, average='weighted')\n",
"\n",
"# Print the best parameters and final performance\n",
"print(\"Best Parameters:\", best_params)\n",
"print(\"Weighted F1 Score on Test Set:\", f1_weighted)\n"
]
},
{
"cell_type": "code",
"source": [
"train.head()\n"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "edajo9_W8XNw",
"outputId": "416ca46c-3c19-4b74-ed36-8e487a640afd"
},
"id": "edajo9_W8XNw",
"execution_count": 116,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" title \\\n",
"374 Dead after 3 days \n",
"23 Good First Tablet \n",
"2057 It fits my need perfectly \n",
"336 LEAK ! \n",
"221 easy set up and user friendly \n",
"\n",
" text rating \\\n",
"374 [dead, 3, day, put, 3, day, ago, alreadi, dead... 1 \n",
"23 [good, first, tablet, purchas, sinc, bought, g... 3 \n",
"2057 [fit, need, perfectli, origin, kindl, fire, lo... 5 \n",
"336 [leak, heck, seriou, issu, batteri, put, amazo... 1 \n",
"221 [easi, set, user, friendli, suggest, sale, ass... 5 \n",
"\n",
" text_original token_count \\\n",
"374 Dead after 3 days Just put them in 3 days ago ... 14 \n",
"23 Good First Tablet I purchased this since I bou... 29 \n",
"2057 It fits my need perfectly My original Kindle F... 57 \n",
"336 LEAK ! WHAT THE HECK! I have a SERIOUS issue w... 54 \n",
"221 easy set up and user friendly suggested by the... 11 \n",
"\n",
" adj \n",
"374 [Dead, dead, next] \n",
"23 [Good, slow] \n",
"2057 [original, much, other, old, locked, few, Menial] \n",
"336 [few, bad, few, several, next, right] \n",
"221 [glad] "
],
"text/html": [
"\n",
" <div id=\"df-ca6b47a9-4243-40a1-88e2-ff0798851b6b\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>title</th>\n",
" <th>text</th>\n",
" <th>rating</th>\n",
" <th>text_original</th>\n",
" <th>token_count</th>\n",
" <th>adj</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>374</th>\n",
" <td>Dead after 3 days</td>\n",
" <td>[dead, 3, day, put, 3, day, ago, alreadi, dead...</td>\n",
" <td>1</td>\n",
" <td>Dead after 3 days Just put them in 3 days ago ...</td>\n",
" <td>14</td>\n",
" <td>[Dead, dead, next]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>Good First Tablet</td>\n",
" <td>[good, first, tablet, purchas, sinc, bought, g...</td>\n",
" <td>3</td>\n",
" <td>Good First Tablet I purchased this since I bou...</td>\n",
" <td>29</td>\n",
" <td>[Good, slow]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2057</th>\n",
" <td>It fits my need perfectly</td>\n",
" <td>[fit, need, perfectli, origin, kindl, fire, lo...</td>\n",
" <td>5</td>\n",
" <td>It fits my need perfectly My original Kindle F...</td>\n",
" <td>57</td>\n",
" <td>[original, much, other, old, locked, few, Menial]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>336</th>\n",
" <td>LEAK !</td>\n",
" <td>[leak, heck, seriou, issu, batteri, put, amazo...</td>\n",
" <td>1</td>\n",
" <td>LEAK ! WHAT THE HECK! I have a SERIOUS issue w...</td>\n",
" <td>54</td>\n",
" <td>[few, bad, few, several, next, right]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>221</th>\n",
" <td>easy set up and user friendly</td>\n",
" <td>[easi, set, user, friendli, suggest, sale, ass...</td>\n",
" <td>5</td>\n",
" <td>easy set up and user friendly suggested by the...</td>\n",
" <td>11</td>\n",
" <td>[glad]</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-ca6b47a9-4243-40a1-88e2-ff0798851b6b')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-ca6b47a9-4243-40a1-88e2-ff0798851b6b button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-ca6b47a9-4243-40a1-88e2-ff0798851b6b');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-c77c5e1a-0177-472c-8342-ec339108fce0\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-c77c5e1a-0177-472c-8342-ec339108fce0')\"\n",
" title=\"Suggest charts.\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-c77c5e1a-0177-472c-8342-ec339108fce0 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
" </div>\n",
" </div>\n"
]
},
"metadata": {},
"execution_count": 116
}
]
},
{
"cell_type": "markdown",
"id": "dc91d718",
"metadata": {
"id": "dc91d718"
},
"source": [
"#### b) Quels sont les attributs que vous avez choisis et quels sont leurs valeurs optimales? (2 points)"
]
},
{
"cell_type": "markdown",
"id": "9b34bc1c",
"metadata": {
"id": "9b34bc1c"
},
"source": [
" C: 10.0\n",
" max_iter: 100\n",
" max_df (pour TF-IDF): 0.5\n",
" ngram_range (pour TF-IDF): (1, 2)\n",
"\n",
"La performance finale du modèle sur l'ensemble de test est un F1-score pondéré de 0.886, ce qui indique une très bonne performance en termes de précision et de rappel pour les trois classes (1, 3, 5)."
]
},
{
"cell_type": "markdown",
"id": "e541be45",
"metadata": {
"id": "e541be45"
},
"source": [
"<a name='3.2'></a>\n",
"### 3.2 Extraction d'attributs (Feature extraction) avec ChatGPT (15 points)\n",
"\n",
"ChatGPT peut être très utile pour donner des idées ou donner du squelette de code (lorsque c'est permis! :) ). Cette partie vous fait explorer l'utilisation de ChatGPT pour générer du code permettant d'extraire des attributs (feature extraction) à partir du texte des évaluations.\n",
"\n",
"En utilisant ChatGPT ainsi que votre recherche personnelle, essayez de déterminer un ensemble d'attributs que vous pourriez utiliser pour représenter chaque évaluation. A vous de voir comment vous pouvez obtenir une réponse satisfaisante de ChatGPT.\n",
"\n",
"#### a) Indiquez dans la cellule ci-dessous les descriptions d'attributs suggérées par ChatGPT ainsi que les vôtres. Différenciez clairement vos attributs - s'il y en a - de ceux de ChatGPT. (4 points)\n"
]
},
{
"cell_type": "markdown",
"id": "f0d9ac3f",
"metadata": {
"id": "f0d9ac3f"
},
"source": [
"Attributs générés par ChatGPT :\n",
"\n",
" Longueur du texte : La longueur du texte de l'évaluation en nombre de mots ou de caractères.\n",
" Nombre de mots clés : Le nombre de mots clés pertinents extraits du texte.\n",
" Présence de termes spécifiques : La présence ou l'absence de termes spécifiques ou de mots clés tels que \"problème\", \"qualité\", \"prix\", etc.\n",
" Sentiment global : Une évaluation générale du sentiment de l'évaluation, comme \"positif\", \"neutre\" ou \"négatif\".\n",
"\n",
"Mes attributs :\n",
"\n",
" Nombre d'étoiles : La note attribuée par l'utilisateur (1, 3 ou 5 étoiles).\n",
" Longueur moyenne des mots : La longueur moyenne des mots dans l'évaluation.\n",
" Fréquence des majuscules : La proportion de lettres majuscules dans l'évaluation.\n",
" Ponctuation : La fréquence de la ponctuation dans le texte (points d'exclamation, points d'interrogation, etc.).\n",
" Diversité lexicale : L'étendue du vocabulaire utilisé dans l'évaluation (nombre de mots uniques).\n",
" Répétition de mots : La détection de mots répétés dans l'évaluation."
]
},
{
"cell_type": "markdown",
"id": "39beb713",
"metadata": {
"id": "39beb713"
},
"source": [
"#### b) Indiquez ci-dessous le code généré par ChatGPT que vous avez décidé de conserver pour représenter chaque évaluation. (2 points)"
]
},
{
"cell_type": "code",
"execution_count": 117,
"id": "90a73ddd",
"metadata": {
"id": "90a73ddd",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 122
},
"outputId": "a2ee20e1-3176-4398-ec9f-f92419001934"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"'\\nimport string\\nfrom collections import Counter\\n\\ndef extract_features(evaluation):\\n # Longueur du texte et nombre de mots clés\\n text_length = len(evaluation.split())\\n keywords = [\"problème\", \"qualité\", \"prix\"]\\n keyword_count = sum(1 for keyword in keywords if keyword in evaluation)\\n\\n # Présence de termes spécifiques\\n specific_terms = [\"problème\", \"qualité\", \"prix\"]\\n term_presence = [term in evaluation for term in specific_terms]\\n\\n # Sentiment global (utilisation de TextBlob)\\n from textblob import TextBlob\\n sentiment = TextBlob(evaluation).sentiment.polarity\\n\\n # Longueur moyenne des mots\\n words = evaluation.split()\\n avg_word_length = sum(len(word) for word in words) / len(words)\\n\\n # Fréquence des majuscules\\n uppercase_letters = [char for char in evaluation if char.isupper()]\\n uppercase_frequency = len(uppercase_letters) / len(evaluation)\\n\\n # Ponctuation\\n punctuation_count = sum(1 for char in evaluation if char in string.punctuation)\\n\\n # Diversité lexicale\\n unique_words = set(evaluation.split())\\n lexical_diversity = len(unique_words) / len(evaluation.split())\\n\\n # Répétition de mots\\n words = evaluation.split()\\n word_counts = Counter(words)\\n repeated_words = [word for word, count in word_counts.items() if count > 1]\\n\\n # Retourne les valeurs des attributs\\n return [\\n text_length, keyword_count, term_presence[0], term_presence[1], term_presence[2],\\n sentiment, avg_word_length, uppercase_frequency,\\n punctuation_count, lexical_diversity, len(repeated_words)\\n ]\\n\\n# Exemple d\\'utilisation :\\nevaluation = \"Ce produit a un problème de qualité, mais son prix est bon.\"\\nattributes = extract_features(evaluation)\\nprint(\"Attributs extraits :\", attributes)\\n'"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "string"
}
},
"metadata": {},
"execution_count": 117
}
],
"source": [
"\"\"\"\n",
"import string\n",
"from collections import Counter\n",
"\n",
"def extract_features(evaluation):\n",
" # Longueur du texte et nombre de mots clés\n",
" text_length = len(evaluation.split())\n",
" keywords = [\"problème\", \"qualité\", \"prix\"]\n",
" keyword_count = sum(1 for keyword in keywords if keyword in evaluation)\n",
"\n",
" # Présence de termes spécifiques\n",
" specific_terms = [\"problème\", \"qualité\", \"prix\"]\n",
" term_presence = [term in evaluation for term in specific_terms]\n",
"\n",
" # Sentiment global (utilisation de TextBlob)\n",
" from textblob import TextBlob\n",
" sentiment = TextBlob(evaluation).sentiment.polarity\n",
"\n",
" # Longueur moyenne des mots\n",
" words = evaluation.split()\n",
" avg_word_length = sum(len(word) for word in words) / len(words)\n",
"\n",
" # Fréquence des majuscules\n",
" uppercase_letters = [char for char in evaluation if char.isupper()]\n",
" uppercase_frequency = len(uppercase_letters) / len(evaluation)\n",
"\n",
" # Ponctuation\n",
" punctuation_count = sum(1 for char in evaluation if char in string.punctuation)\n",
"\n",
" # Diversité lexicale\n",
" unique_words = set(evaluation.split())\n",
" lexical_diversity = len(unique_words) / len(evaluation.split())\n",
"\n",
" # Répétition de mots\n",
" words = evaluation.split()\n",
" word_counts = Counter(words)\n",
" repeated_words = [word for word, count in word_counts.items() if count > 1]\n",
"\n",
" # Retourne les valeurs des attributs\n",
" return [\n",
" text_length, keyword_count, term_presence[0], term_presence[1], term_presence[2],\n",
" sentiment, avg_word_length, uppercase_frequency,\n",
" punctuation_count, lexical_diversity, len(repeated_words)\n",
" ]\n",
"\n",
"# Exemple d'utilisation :\n",
"evaluation = \"Ce produit a un problème de qualité, mais son prix est bon.\"\n",
"attributes = extract_features(evaluation)\n",
"print(\"Attributs extraits :\", attributes)\n",
"\"\"\""
]
},
{
"cell_type": "markdown",
"id": "9ebb4523",
"metadata": {
"id": "9ebb4523"
},
"source": [
"\n",
"\n",
"#### c) Il se peut que le code généré ait besoin d'être adapté à notre jeu de données. Si c'est le cas, corrigez le code et montrez le résultat après vos correction dans la cellule ci-dessous. Le code final devrait être une fonction qui vous retourne, pour un document, un dictionnaire d'attributs et leurs valeurs. N'oubliez pas d'indiquer votre propre code s'il y en a. (5 points)"
]
},
{
"cell_type": "code",
"execution_count": 118,
"id": "2843cbc8",
"metadata": {
"scrolled": true,
"id": "2843cbc8",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"outputId": "97a05619-31e7-4149-8686-d9c43a772066"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Attributs extraits : {'text_length': 59, 'term_presence': {'problème': True, 'qualité': True, 'prix': True}, 'sentiment': 0.0, 'avg_word_length': 4.0, 'uppercase_frequency': 0.01694915254237288, 'lexical_diversity': 1.0, 'repeated_words': {}}\n"
]
}
],
"source": [
"import string\n",
"from collections import Counter\n",
"from textblob import TextBlob\n",
"\n",
"def extract_features(evaluation):\n",
" # Longueur du texte\n",
" text_length = len(evaluation)\n",
"\n",
" # Présence de termes spécifiques\n",
" specific_terms = [\"problème\", \"qualité\", \"prix\"]\n",
" term_presence = {term: term in evaluation for term in specific_terms}\n",
"\n",
" # Sentiment global\n",
" sentiment = TextBlob(evaluation).sentiment.polarity\n",
"\n",
" # Longueur moyenne des mots\n",
" words = evaluation.split()\n",
" avg_word_length = sum(len(word) for word in words) / len(words)\n",
"\n",
" # Fréquence des majuscules\n",
" uppercase_letters = [char for char in evaluation if char.isupper()]\n",
" uppercase_frequency = len(uppercase_letters) / len(evaluation)\n",
"\n",
" # Diversité lexicale\n",
" unique_words = set(words)\n",
" lexical_diversity = len(unique_words) / len(words)\n",
"\n",
" # Répétition de mots\n",
" word_counts = Counter(words)\n",
" repeated_words = {word: count for word, count in word_counts.items() if count > 1}\n",
"\n",
" # Créer un dictionnaire d'attributs et de leurs valeurs\n",
" attributes = {\n",
" \"text_length\": text_length,\n",
" \"term_presence\": term_presence,\n",
" \"sentiment\": sentiment,\n",
" \"avg_word_length\": avg_word_length,\n",
" \"uppercase_frequency\": uppercase_frequency,\n",
" \"lexical_diversity\": lexical_diversity,\n",
" \"repeated_words\": repeated_words\n",
" }\n",
"\n",
" return attributes\n",
"\n",
"# Exemple d'utilisation :\n",
"evaluation = \"Ce produit a un problème de qualité, mais son prix est bon.\"\n",
"attributes = extract_features(evaluation)\n",
"print(\"Attributs extraits :\", attributes)"
]
},
{
"cell_type": "markdown",
"id": "518c6c20",
"metadata": {
"id": "518c6c20"
},
"source": [
"#### d) Utilisez le code corrigé ci-dessus pour entrainer un modèle MLP avec votre nouvelle représentation des évaluations. Affichez sa performance. (4 points)"
]
},
{
"cell_type": "code",
"execution_count": 119,
"id": "e18c6b02",
"metadata": {
"id": "e18c6b02",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"outputId": "0dbabdfb-a060-4ed2-8198-7fbcafdaa185"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Classification Report for the MLP model with the extracted attributes:\n",
" precision recall f1-score support\n",
"\n",
" 1 0.6067 0.6589 0.6317 302\n",
" 3 0.6126 0.6053 0.6090 337\n",
" 5 0.5441 0.5018 0.5221 283\n",
"\n",
" accuracy 0.5911 922\n",
" macro avg 0.5878 0.5887 0.5876 922\n",
"weighted avg 0.5896 0.5911 0.5897 922\n",
"\n"
]
},
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.10/dist-packages/sklearn/neural_network/_multilayer_perceptron.py:686: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (200) reached and the optimization hasn't converged yet.\n",
" warnings.warn(\n"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.neural_network import MLPClassifier\n",
"from sklearn.metrics import classification_report\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"\n",
"# Assuming you have already loaded the data into a DataFrame called \"data\"\n",
"\n",
"# Extract attributes from the text for each evaluation using the \"extract_features\" function\n",
"data['attributes'] = data['text_original'].apply(lambda x: extract_features(x))\n",
"\n",
"# Convert the attributes (dictionaries) into text representations\n",
"data['attributes_text'] = data['attributes'].apply(lambda x: ' '.join(map(str, x.values())))\n",
"\n",
"# Create a DataFrame containing the extracted attributes text\n",
"X_text = data['attributes_text']\n",
"\n",
"# Define the class labels\n",
"y = data['rating']\n",
"\n",
"# Split the data into training and test sets\n",
"X_train, X_test, y_train, y_test = train_test_split(X_text, y, test_size=0.33, random_state=42)\n",
"\n",
"# Create a TF-IDF vectorizer\n",
"tfidf_vectorizer = TfidfVectorizer()\n",
"\n",
"# Fit and transform the training data\n",
"X_train_tfidf = tfidf_vectorizer.fit_transform(X_train)\n",
"\n",
"# Transform the test data using the same vectorizer\n",
"X_test_tfidf = tfidf_vectorizer.transform(X_test)\n",
"\n",
"# Create and train the MLP model\n",
"clf = MLPClassifier()\n",
"clf.fit(X_train_tfidf, y_train)\n",
"\n",
"# Make predictions on the test set\n",
"y_pred = clf.predict(X_test_tfidf)\n",
"\n",
"# Evaluate the model's performance\n",
"classification_report_result = classification_report(y_test, y_pred, digits=4)\n",
"\n",
"# Print the classification report\n",
"print(\"Classification Report for the MLP model with the extracted attributes:\")\n",
"print(classification_report_result)\n"
]
},
{
"cell_type": "markdown",
"id": "ce4bf76e",
"metadata": {
"id": "ce4bf76e"
},
"source": [
"<a name='3.3'></a>\n",
"### 3.3 Amélioration du modèle en 3.2 (10 points)\n",
"\n",
"Il est possible que les résultats obtenus au numéro précédent ne soient pas très élevés.\n",
"\n",
"#### a) Trouvez une manière d'utiliser ces attributs avec d'autres éléments afin **d'au moins** obtenir une meilleure performance que n'importe quel score obtenu au numéro 2.x , **sans faire de recherche d'hyper-paramètres**. Essayez d'obtenir la meilleure performance possible. Vous êtes libres d'utiliser n'importe quel algorithme de ce laboratoire. Affichez le code et les performances de votre modèle. (8 points)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9541ae91",
"metadata": {
"id": "9541ae91"
},
"outputs": [],
"source": [
"# TODO"
]
},
{
"cell_type": "markdown",
"id": "f21566d5",
"metadata": {
"id": "f21566d5"
},
"source": [
"#### b) Quelles sont vos conclusions concernant l'utilisation de ChatGPT et les représentations possibles des documents ? (2 points)"
]
},
{
"cell_type": "markdown",
"id": "29c8a8a9",
"metadata": {
"id": "29c8a8a9"
},
"source": [
"L'utilisation de ChatGPT pour la génération de code et l'amélioration de modèles de traitement de texte s'est avérée prometteuse. Le modèle a permis de créer automatiquement des fonctions de prétraitement de texte, réduisant ainsi la charge de travail du développeur. En combinant des représentations textuelles telles que TF-IDF avec des attributs extraits du texte, les performances des modèles ont été améliorées. Cependant, la recherche d'hyperparamètres reste essentielle pour optimiser ces modèles. En résumé, l'intégration de ChatGPT simplifie le développement de modèles de traitement de texte, mais la qualité des données, l'optimisation des paramètres et l'éthique demeurent des considérations essentielles."
]
},
{
"cell_type": "markdown",
"id": "fa2b28b4",
"metadata": {
"id": "fa2b28b4"
},
"source": [
"## LIVRABLES:\n",
"Vous devez remettre sur Moodle, avant la date d'échéance, un zip contenant les fichiers suivants :\n",
"\n",
"1-\tLe code : Vous devez compléter le squelette inf8460_A23_TP1.ipynb sous le nom GR0X_equipe_i_inf8460_A23_TP1(X: numéro du groupe de laboratoire; i = votre numéro d’équipe). Indiquez vos noms et matricules au début du notebook. Ce notebook doit contenir les fonctionnalités requises.\n",
"\n",
"2-\tUn fichier pdf représentant votre notebook complètement exécuté sous format pdf.\n",
"Pour créer le fichier cliquez sur File > Download as > PDF via LaTeX (.pdf). Assurez-vous que le PDF est entièrement lisible.\n",
"\n",
"\n",
"## EVALUATION\n",
"\n",
"Votre TP sera évalué selon les critères suivants :\n",
"\n",
"1. Exécution correcte du code: Tout votre code et vos résultats doivent être exécutables et reproductibles.\n",
"2. Qualité du code (noms significatifs, structure, gestion d’exception, etc.) avec, entre autres, les recommandations suivantes:\n",
" - Il ne devrait pas y avoir de duplication de code. Utilisez des fonctions pour garder votre code modulaire\n",
" - Votre code devrait être optimisé: un code trop lent entraînera une perte de points\n",
"3. Lisibilité du code (Commentaires clairs et informatifs): Le code doit être exécutable sans erreur et accompagné de commentaires appropriés de manière à expliquer les différentes fonctions\n",
"4. Performance attendue des modèles\n",
"5. Effort effectué dans la recherche d'autres types d'attributs et dans l'utilisation de ChatGPT\n",
"6. Réponses correctes/sensées aux questions de réflexion ou d'analyse\n",
"7. PDF entièrement lisible. Les parties illisibles ne seront pas corrigées et aucune modification passée la date de remise ne sera acceptée.\n",
"\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.12"
},
"colab": {
"provenance": [],
"include_colab_link": true
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment