From 4cef1e4013806998f6d3571dfa84c0ba76c3153e Mon Sep 17 00:00:00 2001 From: Soan Kim <39689481+SoanKim@users.noreply.github.com> Date: Sun, 6 Aug 2023 18:44:55 +0200 Subject: [PATCH 01/12] # Solved problems with the video # Students can easily modify the reward function and run it directly with Custom_LunarLander class --- .../ReinforcementLearning/lunar_lander.ipynb | 249 ++++++++++++++---- 1 file changed, 198 insertions(+), 51 deletions(-) diff --git a/projects/ReinforcementLearning/lunar_lander.ipynb b/projects/ReinforcementLearning/lunar_lander.ipynb index 5f58f38f8..8106a6c89 100644 --- a/projects/ReinforcementLearning/lunar_lander.ipynb +++ b/projects/ReinforcementLearning/lunar_lander.ipynb @@ -60,7 +60,9 @@ "# @title Update/Upgrade the system and install libs\n", "!apt-get update > /dev/null 2>&1\n", "!apt-get install -y xvfb python-opengl ffmpeg > /dev/null 2>&1\n", - "!apt-get install -y swig build-essential python-dev python3-dev > /dev/null 2>&1" + "!apt-get install -y swig build-essential python-dev python3-dev > /dev/null 2>&1\n", + "!apt-get install x11-utils\n", + "!apt-get install xvfb" ] }, { @@ -75,23 +77,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m178.4/178.4 kB\u001b[0m \u001b[31m4.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m925.5/925.5 kB\u001b[0m \u001b[31m25.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m434.7/434.7 kB\u001b[0m \u001b[31m42.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", - " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.7/1.7 MB\u001b[0m \u001b[31m54.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Building wheel for AutoROM.accept-rom-license (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m374.4/374.4 kB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m18.3/18.3 MB\u001b[0m \u001b[31m74.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.8/1.8 MB\u001b[0m \u001b[31m86.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Building wheel for box2d-py (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m853.1/853.1 kB\u001b[0m \u001b[31m12.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m103.1/103.1 kB\u001b[0m \u001b[31m3.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.9/13.9 MB\u001b[0m \u001b[31m79.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h" + "\u001B[2K \u001B[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001B[0m \u001B[32m178.4/178.4 kB\u001B[0m \u001B[31m4.6 MB/s\u001B[0m eta \u001B[36m0:00:00\u001B[0m\n", + "\u001B[2K \u001B[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001B[0m \u001B[32m925.5/925.5 kB\u001B[0m \u001B[31m25.5 MB/s\u001B[0m eta \u001B[36m0:00:00\u001B[0m\n", + "\u001B[2K \u001B[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001B[0m \u001B[32m434.7/434.7 kB\u001B[0m \u001B[31m42.9 MB/s\u001B[0m eta \u001B[36m0:00:00\u001B[0m\n", + "\u001B[?25h Installing build dependencies ... \u001B[?25l\u001B[?25hdone\n", + " Getting requirements to build wheel ... \u001B[?25l\u001B[?25hdone\n", + " Preparing metadata (pyproject.toml) ... \u001B[?25l\u001B[?25hdone\n", + "\u001B[2K \u001B[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001B[0m \u001B[32m1.7/1.7 MB\u001B[0m \u001B[31m54.4 MB/s\u001B[0m eta \u001B[36m0:00:00\u001B[0m\n", + "\u001B[?25h Building wheel for AutoROM.accept-rom-license (pyproject.toml) ... \u001B[?25l\u001B[?25hdone\n", + "\u001B[2K \u001B[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001B[0m \u001B[32m374.4/374.4 kB\u001B[0m \u001B[31m7.4 MB/s\u001B[0m eta \u001B[36m0:00:00\u001B[0m\n", + "\u001B[?25h Preparing metadata (setup.py) ... \u001B[?25l\u001B[?25hdone\n", + "\u001B[2K \u001B[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001B[0m \u001B[32m18.3/18.3 MB\u001B[0m \u001B[31m74.1 MB/s\u001B[0m eta \u001B[36m0:00:00\u001B[0m\n", + "\u001B[2K \u001B[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001B[0m \u001B[32m1.8/1.8 MB\u001B[0m \u001B[31m86.1 MB/s\u001B[0m eta \u001B[36m0:00:00\u001B[0m\n", + "\u001B[?25h Building wheel for box2d-py (setup.py) ... \u001B[?25l\u001B[?25hdone\n", + "\u001B[2K \u001B[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001B[0m \u001B[32m853.1/853.1 kB\u001B[0m \u001B[31m12.8 MB/s\u001B[0m eta \u001B[36m0:00:00\u001B[0m\n", + "\u001B[2K \u001B[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001B[0m \u001B[32m103.1/103.1 kB\u001B[0m \u001B[31m3.3 MB/s\u001B[0m eta \u001B[36m0:00:00\u001B[0m\n", + "\u001B[2K \u001B[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001B[0m \u001B[32m13.9/13.9 MB\u001B[0m \u001B[31m79.6 MB/s\u001B[0m eta \u001B[36m0:00:00\u001B[0m\n", + "\u001B[?25h" ] } ], @@ -104,7 +106,11 @@ "!pip install pyvirtualdisplay --quiet\n", "!pip install pyglet --quiet\n", "!pip install pygame --quiet\n", - "!pip install minigrid --quiet" + "!pip install minigrid --quiet\n", + "!pip install -q swig --quiet\n", + "!pip install -q gymnasium[box2d] --quiet\n", + "!pip install 'minigrid<=2.1.1' --quiet\n", + "!pip3 install box2d-py --quiet" ] }, { @@ -154,6 +160,7 @@ "\n", "import gymnasium as gym\n", "from gym import spaces\n", + "from gym.envs.box2d.lunar_lander import *\n", "from gym.wrappers.monitoring.video_recorder import VideoRecorder" ] }, @@ -391,7 +398,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python3.10/dist-packages/gym/wrappers/monitoring/video_recorder.py:101: DeprecationWarning: \u001b[33mWARN: is marked as deprecated and will be removed in the future.\u001b[0m\n", + "/usr/local/lib/python3.10/dist-packages/gym/wrappers/monitoring/video_recorder.py:101: DeprecationWarning: \u001B[33mWARN: is marked as deprecated and will be removed in the future.\u001B[0m\n", " logger.deprecation(\n" ] }, @@ -551,7 +558,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python3.10/dist-packages/gym/wrappers/monitoring/video_recorder.py:101: DeprecationWarning: \u001b[33mWARN: is marked as deprecated and will be removed in the future.\u001b[0m\n", + "/usr/local/lib/python3.10/dist-packages/gym/wrappers/monitoring/video_recorder.py:101: DeprecationWarning: \u001B[33mWARN: is marked as deprecated and will be removed in the future.\u001B[0m\n", " logger.deprecation(\n" ] }, @@ -771,36 +778,176 @@ }, "outputs": [], "source": [ - "def step(self, actions):\n", - " ...\n", - " ...\n", - " ...\n", - " reward = 0\n", - " shaping = (\n", - " -100 * np.sqrt(state[0] * state[0] + state[1] * state[1])\n", - " - 100 * np.sqrt(state[2] * state[2] + state[3] * state[3])\n", - " - 100 * abs(state[4])\n", - " + 10 * state[6]\n", - " + 10 * state[7]\n", - " ) # And ten points for legs contact, the idea is if you\n", - " # lose contact again after landing, you get negative reward\n", - " if self.prev_shaping is not None:\n", - " reward = shaping - self.prev_shaping\n", - " self.prev_shaping = shaping\n", - "\n", - " reward -= (\n", - " m_power * 0.30\n", - " ) # less fuel spent is better, about -30 for heuristic landing. You should modify these values.\n", - " reward -= s_power * 0.03\n", - "\n", - " done = False\n", - " if self.game_over or abs(state[0]) >= 1.0:\n", - " done = True\n", - " reward = -100\n", - " if not self.lander.awake:\n", - " done = True\n", - " reward = +100\n", - " return np.array(state, dtype=np.float32), reward, done, {}" + "class Custom_LunarLander(LunarLander):\n", + "\n", + " def step(self, action):\n", + " assert self.lander is not None\n", + "\n", + " # Update wind\n", + " assert self.lander is not None, \"You forgot to call reset()\"\n", + " if self.enable_wind and not (\n", + " self.legs[0].ground_contact or self.legs[1].ground_contact\n", + " ):\n", + " # the function used for wind is tanh(sin(2 k x) + sin(pi k x)),\n", + " # which is proven to never be periodic, k = 0.01\n", + " wind_mag = (\n", + " math.tanh(\n", + " math.sin(0.02 * self.wind_idx)\n", + " + (math.sin(math.pi * 0.01 * self.wind_idx))\n", + " )\n", + " * self.wind_power\n", + " )\n", + " self.wind_idx += 1\n", + " self.lander.ApplyForceToCenter(\n", + " (wind_mag, 0.0),\n", + " True,\n", + " )\n", + "\n", + " # the function used for torque is tanh(sin(2 k x) + sin(pi k x)),\n", + " # which is proven to never be periodic, k = 0.01\n", + " torque_mag = math.tanh(\n", + " math.sin(0.02 * self.torque_idx)\n", + " + (math.sin(math.pi * 0.01 * self.torque_idx))\n", + " ) * (self.turbulence_power)\n", + " self.torque_idx += 1\n", + " self.lander.ApplyTorque(\n", + " (torque_mag),\n", + " True,\n", + " )\n", + "\n", + " if self.continuous:\n", + " action = np.clip(action, -1, +1).astype(np.float32)\n", + " else:\n", + " assert self.action_space.contains(\n", + " action\n", + " ), f\"{action!r} ({type(action)}) invalid \"\n", + "\n", + " # Engines\n", + " tip = (math.sin(self.lander.angle), math.cos(self.lander.angle))\n", + " side = (-tip[1], tip[0])\n", + " dispersion = [self.np_random.uniform(-1.0, +1.0) / SCALE for _ in range(2)]\n", + "\n", + " m_power = 0.0\n", + " if (self.continuous and action[0] > 0.0) or (\n", + " not self.continuous and action == 2\n", + " ):\n", + " # Main engine\n", + " if self.continuous:\n", + " m_power = (np.clip(action[0], 0.0, 1.0) + 1.0) * 0.5 # 0.5..1.0\n", + " assert m_power >= 0.5 and m_power <= 1.0\n", + " else:\n", + " m_power = 1.0\n", + " # 4 is move a bit downwards, +-2 for randomness\n", + " ox = tip[0] * (4 / SCALE + 2 * dispersion[0]) + side[0] * dispersion[1]\n", + " oy = -tip[1] * (4 / SCALE + 2 * dispersion[0]) - side[1] * dispersion[1]\n", + " impulse_pos = (self.lander.position[0] + ox, self.lander.position[1] + oy)\n", + " p = self._create_particle(\n", + " 3.5, # 3.5 is here to make particle speed adequate\n", + " impulse_pos[0],\n", + " impulse_pos[1],\n", + " m_power,\n", + " ) # particles are just a decoration\n", + " p.ApplyLinearImpulse(\n", + " (ox * MAIN_ENGINE_POWER * m_power, oy * MAIN_ENGINE_POWER * m_power),\n", + " impulse_pos,\n", + " True,\n", + " )\n", + " self.lander.ApplyLinearImpulse(\n", + " (-ox * MAIN_ENGINE_POWER * m_power, -oy * MAIN_ENGINE_POWER * m_power),\n", + " impulse_pos,\n", + " True,\n", + " )\n", + "\n", + " s_power = 0.0\n", + " if (self.continuous and np.abs(action[1]) > 0.5) or (\n", + " not self.continuous and action in [1, 3]\n", + " ):\n", + " # Orientation engines\n", + " if self.continuous:\n", + " direction = np.sign(action[1])\n", + " s_power = np.clip(np.abs(action[1]), 0.5, 1.0)\n", + " assert s_power >= 0.5 and s_power <= 1.0\n", + " else:\n", + " direction = action - 2\n", + " s_power = 1.0\n", + " ox = tip[0] * dispersion[0] + side[0] * (\n", + " 3 * dispersion[1] + direction * SIDE_ENGINE_AWAY / SCALE\n", + " )\n", + " oy = -tip[1] * dispersion[0] - side[1] * (\n", + " 3 * dispersion[1] + direction * SIDE_ENGINE_AWAY / SCALE\n", + " )\n", + " impulse_pos = (\n", + " self.lander.position[0] + ox - tip[0] * 17 / SCALE,\n", + " self.lander.position[1] + oy + tip[1] * SIDE_ENGINE_HEIGHT / SCALE,\n", + " )\n", + " p = self._create_particle(0.7, impulse_pos[0], impulse_pos[1], s_power)\n", + " p.ApplyLinearImpulse(\n", + " (ox * SIDE_ENGINE_POWER * s_power, oy * SIDE_ENGINE_POWER * s_power),\n", + " impulse_pos,\n", + " True,\n", + " )\n", + " self.lander.ApplyLinearImpulse(\n", + " (-ox * SIDE_ENGINE_POWER * s_power, -oy * SIDE_ENGINE_POWER * s_power),\n", + " impulse_pos,\n", + " True,\n", + " )\n", + "\n", + " self.world.Step(1.0 / FPS, 6 * 30, 2 * 30)\n", + "\n", + " pos = self.lander.position\n", + " vel = self.lander.linearVelocity\n", + " state = [\n", + " (pos.x - VIEWPORT_W / SCALE / 2) / (VIEWPORT_W / SCALE / 2),\n", + " (pos.y - (self.helipad_y + LEG_DOWN / SCALE)) / (VIEWPORT_H / SCALE / 2),\n", + " vel.x * (VIEWPORT_W / SCALE / 2) / FPS,\n", + " vel.y * (VIEWPORT_H / SCALE / 2) / FPS,\n", + " self.lander.angle,\n", + " 20.0 * self.lander.angularVelocity / FPS,\n", + " 1.0 if self.legs[0].ground_contact else 0.0,\n", + " 1.0 if self.legs[1].ground_contact else 0.0,\n", + " ]\n", + " assert len(state) == 8\n", + "\n", + " # Compare with / without shaping, referring the state description below\n", + " '''\n", + " state[0]: the horizontal coordinate\n", + " state[1]: the vertical coordinate\n", + " state[2]: the horizontal speed\n", + " state[3]: the vertical speed\n", + " state[4]: the angle\n", + " state[5]: the angular speed\n", + " state[6]: first leg contact\n", + " state[7]: second leg contact\n", + " '''\n", + " reward = 0\n", + " shaping = (\n", + " -100 * np.sqrt(state[0] * state[0] + state[1] * state[1])\n", + " - 100 * np.sqrt(state[2] * state[2] + state[3] * state[3])\n", + " - 100 * abs(state[4])\n", + " + 10 * state[6]\n", + " + 10 * state[7]\n", + " ) # And ten points for legs contact, the idea is if you\n", + " # lose contact again after landing, you get negative reward\n", + " if self.prev_shaping is not None:\n", + " reward = shaping - self.prev_shaping\n", + " self.prev_shaping = shaping\n", + "\n", + " reward -= (\n", + " m_power * 0.30\n", + " ) # less fuel spent is better, about -30 for heuristic landing\n", + " reward -= s_power * 0.03\n", + "\n", + " terminated = False\n", + " if self.game_over or abs(state[0]) >= 1.0:\n", + " terminated = True\n", + " reward = -100\n", + " if not self.lander.awake:\n", + " terminated = True\n", + " reward = +100\n", + "\n", + " if self.render_mode == \"human\":\n", + " self.render()\n", + " return np.array(state, dtype=np.float32), reward, terminated, False, {}" ] }, { From 4f22506213ac428d4db1024e8cf60cacc0b41964 Mon Sep 17 00:00:00 2001 From: Soan Kim <39689481+SoanKim@users.noreply.github.com> Date: Wed, 3 Jul 2024 18:41:04 +0900 Subject: [PATCH 02/12] # swig should be installed before gym[box2d] to avoid "error: subprocess-exited-with-error; ERROR: Failed building wheel for box2d-py ERROR: Could not build wheels for box2d-py, which is required to install pyproject.toml-based projects." --- projects/ReinforcementLearning/lunar_lander.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/ReinforcementLearning/lunar_lander.ipynb b/projects/ReinforcementLearning/lunar_lander.ipynb index 8106a6c89..7622f5b5a 100644 --- a/projects/ReinforcementLearning/lunar_lander.ipynb +++ b/projects/ReinforcementLearning/lunar_lander.ipynb @@ -102,12 +102,12 @@ "!pip install rarfile --quiet\n", "!pip install stable-baselines3[extra] --quiet\n", "!pip install ale-py --quiet\n", + "!pip install -q swig --quiet\n", "!pip install gym[box2d] --quiet\n", "!pip install pyvirtualdisplay --quiet\n", "!pip install pyglet --quiet\n", "!pip install pygame --quiet\n", "!pip install minigrid --quiet\n", - "!pip install -q swig --quiet\n", "!pip install -q gymnasium[box2d] --quiet\n", "!pip install 'minigrid<=2.1.1' --quiet\n", "!pip3 install box2d-py --quiet" From 7c4989e40cc9f105dd4e201b7b079845ce2e7570 Mon Sep 17 00:00:00 2001 From: dalia-nasr Date: Thu, 4 Jul 2024 00:50:24 +0300 Subject: [PATCH 03/12] updated dataset source for Twitter sentiment analysis template --- .../sentiment_analysis.ipynb | 1677 +---------------- 1 file changed, 1 insertion(+), 1676 deletions(-) diff --git a/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb b/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb index 7cc1ac416..a6f073666 100644 --- a/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb +++ b/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb @@ -1,1676 +1 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "execution": {}, - "id": "view-in-github" - }, - "source": [ - "\"Open   \"Open" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "# Twitter Sentiment Analysis\n", - "\n", - "**By Neuromatch Academy**\n", - "\n", - "__Content creators:__ Juan Manuel Rodriguez, Salomey Osei, Gonzalo Uribarri\n", - "\n", - "__Production editors:__ Amita Kapoor, Spiros Chavlis" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "---\n", - "# Welcome to the NLP project template\n", - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "---\n", - "# Step 1: Questions and goals\n", - "\n", - "* Can we infer emotion from a tweet text?\n", - "* How words are distributed accross the dataset?\n", - "* Are words related to one kind of emotion?" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "---\n", - "# Step 2: Literature review\n", - "\n", - "[Original Dataset Paper](https://cs.stanford.edu/people/alecmgo/papers/TwitterDistantSupervision09.pdf)\n", - "\n", - "[Papers with code](https://paperswithcode.com/dataset/imdb-movie-reviews)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "---\n", - "# Step 3: Load and explore the dataset" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "cellView": "form", - "execution": {} - }, - "outputs": [], - "source": [ - "# @title Install dependencies\n", - "!pip install pandas --quiet\n", - "!pip install torchtext --quiet" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "# We import some libraries to load the dataset\n", - "import os\n", - "import numpy as np\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "\n", - "from collections import Counter\n", - "from tqdm.notebook import tqdm\n", - "\n", - "import torch\n", - "import torch.nn as nn\n", - "import torch.optim as optim\n", - "import torch.nn.functional as F\n", - "from torch.utils.data import TensorDataset, DataLoader\n", - "\n", - "import torchtext\n", - "from torchtext.data import get_tokenizer\n", - "\n", - "from sklearn.utils import shuffle\n", - "from sklearn.metrics import classification_report\n", - "from sklearn.linear_model import LogisticRegression\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.feature_extraction.text import CountVectorizer" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "You can find the dataset we are going to use in [this website](http://help.sentiment140.com/for-students/)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "import requests, zipfile, io\n", - "url = 'http://cs.stanford.edu/people/alecmgo/trainingandtestdata.zip'\n", - "r = requests.get(url)\n", - "z = zipfile.ZipFile(io.BytesIO(r.content))\n", - "z.extractall()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
polarityiddatequeryusertext
001467810369Mon Apr 06 22:19:45 PDT 2009NO_QUERY_TheSpecialOne_@switchfoot http://twitpic.com/2y1zl - Awww, t...
101467810672Mon Apr 06 22:19:49 PDT 2009NO_QUERYscotthamiltonis upset that he can't update his Facebook by ...
201467810917Mon Apr 06 22:19:53 PDT 2009NO_QUERYmattycus@Kenichan I dived many times for the ball. Man...
301467811184Mon Apr 06 22:19:57 PDT 2009NO_QUERYElleCTFmy whole body feels itchy and like its on fire
401467811193Mon Apr 06 22:19:57 PDT 2009NO_QUERYKaroli@nationwideclass no, it's not behaving at all....
\n", - "
" - ], - "text/plain": [ - " polarity ... text\n", - "0 0 ... @switchfoot http://twitpic.com/2y1zl - Awww, t...\n", - "1 0 ... is upset that he can't update his Facebook by ...\n", - "2 0 ... @Kenichan I dived many times for the ball. Man...\n", - "3 0 ... my whole body feels itchy and like its on fire \n", - "4 0 ... @nationwideclass no, it's not behaving at all....\n", - "\n", - "[5 rows x 6 columns]" - ] - }, - "execution_count": 4, - "metadata": { - "tags": [] - }, - "output_type": "execute_result" - } - ], - "source": [ - "# We load the dataset\n", - "header_list = [\"polarity\", \"id\", \"date\", \"query\", \"user\", \"text\"]\n", - "df = pd.read_csv('training.1600000.processed.noemoticon.csv',\n", - " encoding = \"ISO-8859-1\", names=header_list)\n", - "\n", - "# Let's have a look at it\n", - "df.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "For this project we will use only the text and the polarity of the tweet. Notice that polarity is 0 for negative tweets and 4 for positive tweet." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "X = df.text.values\n", - "\n", - "# Changes values from [0,4] to [0,1]\n", - "y = (df.polarity.values > 1).astype(int)\n", - "\n", - "\n", - "# Split the data into train and test\n", - "x_train_text, x_test_text, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42,stratify=y)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "The first thing we have to do before working on the models is to familiarize ourselves with the dataset. This is called Exploratory Data Analisys (EDA)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1: @paisleypaisley LOL why do i get ideas so far in advance? it's not even june yet! we need a third knitter to have our own summer group \n", - "0: worst headache ever \n", - "0: @ewaniesciuszko i am so sad i wont see you! I miss you already. and yeah! that's perfect; i come back the 18th!\n", - "1: doesn't know how to spell conked \n", - "0: "So we stand here now and no one knows us at all I won't get used to this I won't get used to being gone"...I miss home and everyone -a\n" - ] - } - ], - "source": [ - "for s, l in zip(x_train_text[:5], y_train[:5]):\n", - " print('{}: {}'.format(l, s))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "An interesting thing to analyze is the Word Distribution. In order to count the occurrences of each word, we should tokenize the sentences first." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Before Tokenize: worst headache ever \n", - "After Tokenize: ['worst', 'headache', 'ever']\n" - ] - } - ], - "source": [ - "tokenizer = get_tokenizer(\"basic_english\")\n", - "\n", - "print('Before Tokenize: ', x_train_text[1])\n", - "print('After Tokenize: ', tokenizer(x_train_text[1]))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "499e7fb54aa048afb3cba78dd8d6bb0e", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HBox(children=(FloatProgress(value=0.0, max=1280000.0), HTML(value='')))" - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "fff9bd0ae74e46b0ad97ad980a834a58", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HBox(children=(FloatProgress(value=0.0, max=320000.0), HTML(value='')))" - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], - "source": [ - "x_train_token = [tokenizer(s) for s in tqdm(x_train_text)]\n", - "x_test_token = [tokenizer(s) for s in tqdm(x_test_text)]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "We can count the words occurences and see how many different words are present in our dataset." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of different Tokens in our Dataset: 669284\n", - "['.', 'i', '!', \"'\", 'to', 'the', ',', 'a', 'my', 'it', 'and', 'you', '?', 'is', 'for', 'in', 's', 'of', 't', 'on', 'that', 'me', 'so', 'have', 'm', 'but', 'just', 'with', 'be', 'at', 'not', 'was', 'this', 'now', 'can', 'good', 'up', 'day', 'all', 'get', 'out', 'like', 'are', 'no', 'go', 'http', '-', 'today', 'do', 'too', 'your', 'work', 'going', 'love', 'we', 'got', 'what', 'lol', 'time', 'back', 'from', 'u', 'one', 'will', 'know', 'about', 'im', 'really', 'don', 'am', 'had', ')', 'see', 'some', 'there', 'its', '&', 'how', 'if', 'still', 'they', '"', 'night', '(', 'well', 'want', 'new', 'think', '2', 'home', 'thanks', 'll', 'oh', 'when', 'as', 'he', 'more', 'here', 'much', 'off']\n" - ] - } - ], - "source": [ - "words = Counter()\n", - "for s in x_train_token:\n", - " for w in s:\n", - " words[w] += 1\n", - "\n", - "sorted_words = list(words.keys())\n", - "sorted_words.sort(key=lambda w: words[w], reverse=True)\n", - "print(f\"Number of different Tokens in our Dataset: {len(sorted_words)}\")\n", - "print(sorted_words[:100])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "Now we can plot their distribution." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The 0.13970153178620734% most common words account for the 80.00532743602652% of the occurrences\n" - ] - } - ], - "source": [ - "count_occurences = sum(words.values())\n", - "\n", - "accumulated = 0\n", - "counter = 0\n", - "\n", - "while accumulated < count_occurences * 0.8:\n", - " accumulated += words[sorted_words[counter]]\n", - " counter += 1\n", - "\n", - "print(f\"The {counter * 100 / len(words)}% most common words \"\n", - " f\"account for the {accumulated * 100 / count_occurences}% of the occurrences\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light", - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "plt.bar(range(100), [words[w] for w in sorted_words[:100]])\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "It is very common to find this kind of distribution when analyzing corpus of text. This is referred to as the [zipf's law](https://en.wikipedia.org/wiki/Zipf%27s_law)." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "Usually the number of words in the dictionary will be very large. \n", - "\n", - "Here are some thing we can do to reduce that number:\n", - "\n", - "* Remove puntuation.\n", - "* Remove stop-words.\n", - "* Steaming.\n", - "* Remove very uncommon words (the words that appears in fewer than N occations).\n", - "* Nothing: we can use a pretrain model that handles this kind of situations.\n", - "\n", - "\n", - "We used one of the simplest tokenizers availables. This tokenizer does not take into account many quirks of the language. Moreover, diferent languages have different quirks, so there is no \"universal\" tokenizers. There are many libraries that have \"better\" tokenizers:\n", - "\n", - "* [Spacy](https://spacy.io/): it can be accessed using: `get_tokenizer(\"spacy\")`. Spacy supports a wide range of languages.\n", - "* [Huggingface](https://huggingface.co/): it has many tokenizers for different laguages. [Doc](https://huggingface.co/transformers/main_classes/tokenizer.html)\n", - "* [NLTK](https://www.nltk.org/): it provides several tokenizers. One of them can be accessed using: `get_tokenizer(\"toktok\")`\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "---\n", - "# Step 4: choose toolkit\n", - "\n", - "Our goal is to train a model capable of estimating the sentiment of a tweet (positive or negative) by reading its content. To that end we will try 2 different approaches:\n", - "\n", - "* A logistic regression using sklearn. **NOTE**: it can probaly work better than an SVM model.\n", - "* A simple Embedding + RNN." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "## Logistic regression\n", - "\n", - "We will represent our senteces using binary vectorization. This means that our data would be represented as a matrix of instances by word with a one if the word is in the instance, and zero otherwise. Sklean vectorizers can also do things such as stop-word removal and puntuation removal, you can read more about in [the documentation](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "vectorizer = CountVectorizer(binary=True)\n", - "x_train_cv = vectorizer.fit_transform(x_train_text)\n", - "x_test_cv = vectorizer.transform(x_test_text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Before Vectorize: doesn't know how to spell conked \n" - ] - } - ], - "source": [ - "print('Before Vectorize: ', x_train_text[3])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "After Vectorize: \n", - " (0, 528584)\t1\n", - " (0, 165468)\t1\n", - " (0, 300381)\t1\n", - " (0, 242211)\t1\n", - " (0, 489893)\t1\n", - " (0, 134160)\t1\n" - ] - } - ], - "source": [ - "# Notice that the matriz is sparse\n", - "print('After Vectorize: ')\n", - "print(x_train_cv[3])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "Now we can train our model. You can check the documentation of this logistic regressor [here](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic#sklearn.linear_model.LogisticRegression)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "data": { - "text/plain": [ - "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", - " intercept_scaling=1, l1_ratio=None, max_iter=100,\n", - " multi_class='auto', n_jobs=None, penalty='l2',\n", - " random_state=None, solver='saga', tol=0.0001, verbose=0,\n", - " warm_start=False)" - ] - }, - "execution_count": 15, - "metadata": { - "tags": [] - }, - "output_type": "execute_result" - } - ], - "source": [ - "model = LogisticRegression(solver='saga')\n", - "model.fit(x_train_cv, y_train)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " precision recall f1-score support\n", - "\n", - " 0 0.81 0.79 0.80 160000\n", - " 1 0.79 0.81 0.80 160000\n", - "\n", - " accuracy 0.80 320000\n", - " macro avg 0.80 0.80 0.80 320000\n", - "weighted avg 0.80 0.80 0.80 320000\n", - "\n" - ] - } - ], - "source": [ - "y_pred = model.predict(x_test_cv)\n", - "\n", - "print(classification_report(y_test, y_pred))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "## Explainable AI\n", - "The best thing about logistic regresion is that it is simple, and we can get some explanations." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(1, 589260)\n", - "589260\n" - ] - } - ], - "source": [ - "print(model.coef_.shape)\n", - "print(len(vectorizer.vocabulary_))\n", - "\n", - "words_sk = list(vectorizer.vocabulary_.keys())\n", - "words_sk.sort(key=lambda w: model.coef_[0, vectorizer.vocabulary_[w]])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "roni: -3.862597673594883\n", - "inaperfectworld: -3.5734362290886375\n", - "dontyouhate: -3.500197620227523\n", - "xbllygbsn: -3.412645372640648\n", - "anqju: -3.336405291553548\n", - "sad: -3.200522312464158\n", - "pakcricket: -3.1949158120163412\n", - "condolences: -3.132498019366488\n", - "heartbreaking: -3.066508733796654\n", - "saddest: -3.041999809733714\n", - "sadd: -3.029070563580306\n", - "heartbroken: -3.0287688233900174\n", - "boohoo: -3.022608649696793\n", - "sadface: -2.9918411285807234\n", - "rachelle_lefevr: -2.925057253107806\n", - "disappointing: -2.902524113779547\n", - "lvbu: -2.894705935001672\n", - "saddens: -2.8855127179984654\n", - "bummed: -2.83650014970307\n", - "neda: -2.792944556837498\n" - ] - } - ], - "source": [ - "for w in words_sk[:20]:\n", - " print('{}: {}'.format(w, model.coef_[0, vectorizer.vocabulary_[w]]))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "iamsoannoyed: 2.8494314732277672\n", - "myfax: 2.797451563471618\n", - "jennamadison: 2.5667257393706113\n", - "yeyy: 2.478028598852801\n", - "tryout: 2.4383315790116677\n", - "goldymom: 2.4374026022205535\n", - "wooohooo: 2.40297322137544\n", - "thesupergirl: 2.3565118467330004\n", - "iammaxathotspot: 2.311648368632618\n", - "londicreations: 2.3074490293400993\n", - "smilin: 2.2991891636718216\n", - "worries: 2.2899429774914717\n", - "sinfulsignorita: 2.2798963640981817\n", - "finchensnail: 2.264302079155878\n", - "smackthis: 2.2376679263761083\n", - "kv: 2.2158393907798413\n", - "tojosan: 2.211784259253832\n", - "russmarshalek: 2.2095374025599384\n", - "traciknoppe: 2.1768297770350835\n", - "congratulations: 2.171590496227557\n" - ] - } - ], - "source": [ - "for w in reversed(words_sk[-20:]):\n", - " print('{}: {}'.format(w, model.coef_[0, vectorizer.vocabulary_[w]]))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "What does this mean?\n", - "\n", - "Remember the `model.coef_` is the $W$ in:\n", - "\n", - "$$h(x)=\\sigma(WX + b)$$\n", - "\n", - "where the label 1 is a positive tweet and the label 0 is a negative tweet." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "## Recurrent Neural Network with Pytorch" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "In the previous section we use a Bag-Of-Words approach to represent each of the tweets. That meas that we only consider how many times each of the words appear in each of the tweets, we didnt take into account the order of the words. But we know that the word order is very important and carries relevant information.\n", - "\n", - "In this section we will solve the same task, but this time we will implement a Recurrent Neural Network (RNN) instead of using a simple Logistic Regression.Unlike feedforward neural networks, RNNs have cyclic connections making them powerful for modeling sequences.\n", - "\n", - "Let's start by importing the relevant libraries.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "def set_device():\n", - " device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", - " if device != \"cuda\":\n", - " print(\"WARNING: For this notebook to perform best, \"\n", - " \"if possible, in the menu under `Runtime` -> \"\n", - " \"`Change runtime type.` select `GPU` \")\n", - " else:\n", - " print(\"GPU is enabled in this notebook.\")\n", - "\n", - " return device" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "GPU is enabled in this notebook.\n" - ] - } - ], - "source": [ - "# Set the device (check if gpu is available)\n", - "device = set_device()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "First we will create a Dictionary (`word_to_idx`). This dictionary will map each Token (usually words) to an index (an integer number). We want to limit our dictionary to a certain number of tokens (`num_words_dict`), so we will include in our ditionary those with more occurrences." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['.', 'i', '!', \"'\", 'to', 'the', ',', 'a', 'my', 'it']" - ] - }, - "execution_count": 22, - "metadata": { - "tags": [] - }, - "output_type": "execute_result" - } - ], - "source": [ - "# From previous section, we have a list with the most used tokens\n", - "sorted_words[:10]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "Let's select only the most used." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "num_words_dict = 30000\n", - "# We reserve two numbers for special tokens.\n", - "most_used_words = sorted_words[:num_words_dict-2]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "We will add two extra Tokens to the dictionary, one for words outside the dictionary (`'UNK'`) and one for padding the sequences (`'PAD'`)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "# dictionary to go from words to idx\n", - "word_to_idx = {}\n", - "# dictionary to go from idx to words (just in case)\n", - "idx_to_word = {}\n", - "\n", - "\n", - "# We include the special tokens first\n", - "PAD_token = 0\n", - "UNK_token = 1\n", - "\n", - "word_to_idx['PAD'] = PAD_token\n", - "word_to_idx['UNK'] = UNK_token\n", - "\n", - "idx_to_word[PAD_token] = 'PAD'\n", - "idx_to_word[UNK_token] = 'UNK'\n", - "\n", - "# We popullate our dictionaries with the most used words\n", - "for num,word in enumerate(most_used_words):\n", - " word_to_idx[word] = num + 2\n", - " idx_to_word[num+2] = word" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "Our goal now is to transform each tweet from a sequence of tokens to a sequence of indexes. These sequences of indexes will be the input to our pytorch model." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "# A function to convert list of tokens to list of indexes\n", - "def tokens_to_idx(sentences_tokens,word_to_idx):\n", - " sentences_idx = []\n", - " for sent in sentences_tokens:\n", - " sent_idx = []\n", - " for word in sent:\n", - " if word in word_to_idx:\n", - " sent_idx.append(word_to_idx[word])\n", - " else:\n", - " sent_idx.append(word_to_idx['UNK'])\n", - " sentences_idx.append(sent_idx)\n", - " return sentences_idx" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "x_train_idx = tokens_to_idx(x_train_token,word_to_idx)\n", - "x_test_idx = tokens_to_idx(x_test_token,word_to_idx)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Before converting: ['worst', 'headache', 'ever']\n", - "After converting: [721, 458, 237]\n" - ] - } - ], - "source": [ - "some_number = 1\n", - "print('Before converting: ', x_train_token[some_number])\n", - "print('After converting: ', x_train_idx[some_number])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "We need all the sequences to have the same length. To select an adequate sequence length, let's explore some statistics about the length of the tweets:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Max tweet word length: 229\n", - "Mean tweet word length: 15.0\n", - "99% percent under: 37.0\n" - ] - } - ], - "source": [ - "tweet_lens = np.asarray([len(sentence) for sentence in x_train_idx])\n", - "print('Max tweet word length: ',tweet_lens.max())\n", - "print('Mean tweet word length: ',np.median(tweet_lens))\n", - "print('99% percent under: ',np.quantile(tweet_lens,0.99))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "We cut the sequences which are larger than our chosen maximum length (`max_lenght`) and fill with zeros the ones that are shorter." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - " # We choose the max length\n", - " max_length = 40\n", - "\n", - "# A function to make all the sequence have the same lenght\n", - "# Note that the output is a Numpy matrix\n", - " def padding(sentences, seq_len):\n", - " features = np.zeros((len(sentences), seq_len),dtype=int)\n", - " for ii, tweet in enumerate(sentences):\n", - " len_tweet = len(tweet)\n", - " if len_tweet != 0:\n", - " if len_tweet <= seq_len:\n", - " # If its shorter, we fill with zeros (the padding Token index)\n", - " features[ii, -len(tweet):] = np.array(tweet)[:seq_len]\n", - " if len_tweet > seq_len:\n", - " # If its larger, we take the last 'seq_len' indexes\n", - " features[ii, :] = np.array(tweet)[-seq_len:]\n", - " return features" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "# We convert our list of tokens into a numpy matrix\n", - "# where all instances have the same lenght\n", - "x_train_pad = padding(x_train_idx,max_length)\n", - "x_test_pad = padding(x_test_idx,max_length)\n", - "\n", - "# We convert our target list a numpy matrix\n", - "y_train_np = np.asarray(y_train)\n", - "y_test_np = np.asarray(y_test)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Before padding: [1, 3, 71, 24, 122, 3, 533, 74, 13, 4, 3, 102, 13, 209, 2, 12, 150, 4, 22, 5, 18, 667, 3, 138, 61, 7, 3296, 4]\n", - "After padding: [ 0 0 0 0 0 0 0 0 0 0 0 0 1 3\n", - " 71 24 122 3 533 74 13 4 3 102 13 209 2 12\n", - " 150 4 22 5 18 667 3 138 61 7 3296 4]\n" - ] - } - ], - "source": [ - "some_number = 2\n", - "print('Before padding: ', x_train_idx[some_number])\n", - "print('After padding: ', x_train_pad[some_number])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "Now, let's convert the data to pytorch format.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "# create Tensor datasets\n", - "train_data = TensorDataset(torch.from_numpy(x_train_pad), torch.from_numpy(y_train_np))\n", - "valid_data = TensorDataset(torch.from_numpy(x_test_pad), torch.from_numpy(y_test_np))\n", - "\n", - "# Batch size (this is an important hyperparameter)\n", - "batch_size = 100\n", - "\n", - "# dataloaders\n", - "# make sure to SHUFFLE your data\n", - "train_loader = DataLoader(train_data, shuffle=True, batch_size=batch_size,drop_last = True)\n", - "valid_loader = DataLoader(valid_data, shuffle=True, batch_size=batch_size,drop_last = True)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "Each batch of data in our traning proccess will have the folllowing format:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sample input size: torch.Size([100, 40])\n", - "Sample input: \n", - " tensor([[ 0, 0, 0, ..., 4, 4, 4],\n", - " [ 0, 0, 0, ..., 7447, 14027, 2],\n", - " [ 0, 0, 0, ..., 100, 22241, 4],\n", - " ...,\n", - " [ 0, 0, 0, ..., 2702, 4409, 2],\n", - " [ 0, 0, 0, ..., 162, 17, 1],\n", - " [ 0, 0, 0, ..., 67, 12904, 49]])\n", - "Sample input: \n", - " tensor([0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0,\n", - " 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1,\n", - " 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0,\n", - " 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0,\n", - " 0, 0, 1, 0])\n" - ] - } - ], - "source": [ - "# Obtain one batch of training data\n", - "dataiter = iter(train_loader)\n", - "sample_x, sample_y = dataiter.next()\n", - "\n", - "print('Sample input size: ', sample_x.size()) # batch_size, seq_length\n", - "print('Sample input: \\n', sample_x)\n", - "print('Sample input: \\n', sample_y)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "Now, we will define the `SentimentRNN` class. Most of the model's class will be familiar to you, but there are two important layers we would like you to pay attention to:\n", - "\n", - "* Embedding Layer\n", - "> This layer is like a linear layer, but it makes it posible to use a sequence of inedexes as inputs (instead of a sequence of one-hot-encoded vectors). During training, the Embedding layer learns a linear transformation from the space of words (a vector space of dimension `num_words_dict`) into the a new, smaller, vector space of dimension `embedding_dim`. We suggest you to read this [thread](https://discuss.pytorch.org/t/how-does-nn-embedding-work/88518/3) and the [pytorch documentation](https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html) if you want to learn more about this particular kind of layers.\n", - "\n", - "\n", - "* LSTM layer\n", - "> This is one of the most used class of Recurrent Neural Networks. In Pytorch we can add several stacked layers in just one line of code. In our case, the number of layers added are decided with the parameter `no_layers`. If you want to learn more about LSTMs we strongly recommend you this [Colahs thread](https://colah.github.io/posts/2015-08-Understanding-LSTMs/) about them.\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "class SentimentRNN(nn.Module):\n", - " def __init__(self,no_layers,vocab_size,hidden_dim,embedding_dim,drop_prob=0.1):\n", - " super(SentimentRNN,self).__init__()\n", - "\n", - " self.output_dim = output_dim\n", - " self.hidden_dim = hidden_dim\n", - " self.no_layers = no_layers\n", - " self.vocab_size = vocab_size\n", - " self.drop_prob = drop_prob\n", - "\n", - " # Embedding Layer\n", - " self.embedding = nn.Embedding(vocab_size, embedding_dim)\n", - "\n", - " # LSTM Layers\n", - " self.lstm = nn.LSTM(input_size=embedding_dim,hidden_size=self.hidden_dim,\n", - " num_layers=no_layers, batch_first=True,\n", - " dropout=self.drop_prob)\n", - "\n", - " # Dropout layer\n", - " self.dropout = nn.Dropout(drop_prob)\n", - "\n", - " # Linear and Sigmoid layer\n", - " self.fc = nn.Linear(self.hidden_dim, output_dim)\n", - " self.sig = nn.Sigmoid()\n", - "\n", - " def forward(self,x,hidden):\n", - " batch_size = x.size(0)\n", - "\n", - " # Embedding out\n", - " embeds = self.embedding(x)\n", - " #Shape: [batch_size x max_length x embedding_dim]\n", - "\n", - " # LSTM out\n", - " lstm_out, hidden = self.lstm(embeds, hidden)\n", - " # Shape: [batch_size x max_length x hidden_dim]\n", - "\n", - " # Select the activation of the last Hidden Layer\n", - " lstm_out = lstm_out[:,-1,:].contiguous()\n", - " # Shape: [batch_size x hidden_dim]\n", - "\n", - " ## You can instead average the activations across all the times\n", - " # lstm_out = torch.mean(lstm_out, 1).contiguous()\n", - "\n", - " # Dropout and Fully connected layer\n", - " out = self.dropout(lstm_out)\n", - " out = self.fc(out)\n", - "\n", - " # Sigmoid function\n", - " sig_out = self.sig(out)\n", - "\n", - " # return last sigmoid output and hidden state\n", - " return sig_out, hidden\n", - "\n", - " def init_hidden(self, batch_size):\n", - " ''' Initializes hidden state '''\n", - " # Create two new tensors with sizes n_layers x batch_size x hidden_dim,\n", - " # initialized to zero, for hidden state and cell state of LSTM\n", - " h0 = torch.zeros((self.no_layers,batch_size,self.hidden_dim)).to(device)\n", - " c0 = torch.zeros((self.no_layers,batch_size,self.hidden_dim)).to(device)\n", - " hidden = (h0,c0)\n", - " return hidden" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "We choose the parameters of the model." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "# Parameters of our network\n", - "\n", - "# Size of our vocabulary\n", - "vocab_size = num_words_dict\n", - "\n", - "# Embedding dimension\n", - "embedding_dim = 32\n", - "\n", - "# Number of stacked LSTM layers\n", - "no_layers = 2\n", - "\n", - "# Dimension of the hidden layer in LSTMs\n", - "hidden_dim = 64\n", - "\n", - "# Dropout parameter for regularization\n", - "output_dim = 1\n", - "\n", - "# Dropout parameter for regularization\n", - "drop_prob = 0.25" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SentimentRNN(\n", - " (embedding): Embedding(30000, 32)\n", - " (lstm): LSTM(32, 64, num_layers=2, batch_first=True, dropout=0.25)\n", - " (dropout): Dropout(p=0.25, inplace=False)\n", - " (fc): Linear(in_features=64, out_features=1, bias=True)\n", - " (sig): Sigmoid()\n", - ")\n" - ] - } - ], - "source": [ - "# Let's define our model\n", - "model = SentimentRNN(no_layers, vocab_size, hidden_dim,\n", - " embedding_dim, drop_prob=drop_prob)\n", - "# Moving to gpu\n", - "model.to(device)\n", - "print(model)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Total Number of parameters: 1018433\n" - ] - } - ], - "source": [ - "# How many trainable parameters does our model have?\n", - "model_parameters = filter(lambda p: p.requires_grad, model.parameters())\n", - "params = sum([np.prod(p.size()) for p in model_parameters])\n", - "print('Total Number of parameters: ',params)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "We choose the losses and the optimizer for the training procces." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [], - "source": [ - "# loss and optimization functions\n", - "lr = 0.001\n", - "\n", - "# Binary crossentropy is a good loss function for a binary classification problem\n", - "criterion = nn.BCELoss()\n", - "\n", - "# We choose an Adam optimizer\n", - "optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n", - "\n", - "# function to predict accuracy\n", - "def acc(pred,label):\n", - " pred = torch.round(pred.squeeze())\n", - " return torch.sum(pred == label.squeeze()).item()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "We are ready to train our model." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1\n", - "train_loss : 0.4367361353733577 val_loss : 0.39174133955966683\n", - "train_accuracy : 79.530625 val_accuracy : 82.3628125\n", - "Validation loss decreased (inf --> 0.391741). Saving model ...\n", - "==================================================\n", - "Epoch 2\n", - "train_loss : 0.3765802335098851 val_loss : 0.3724124691961333\n", - "train_accuracy : 83.19140625 val_accuracy : 83.42031250000001\n", - "Validation loss decreased (0.391741 --> 0.372412). Saving model ...\n", - "==================================================\n", - "Epoch 3\n", - "train_loss : 0.35746844720793886 val_loss : 0.365050206175074\n", - "train_accuracy : 84.16882812499999 val_accuracy : 83.7440625\n", - "Validation loss decreased (0.372412 --> 0.365050). Saving model ...\n", - "==================================================\n", - "Epoch 4\n", - "train_loss : 0.34491546426317654 val_loss : 0.36467386982403693\n", - "train_accuracy : 84.879140625 val_accuracy : 83.77\n", - "Validation loss decreased (0.365050 --> 0.364674). Saving model ...\n", - "==================================================\n", - "Epoch 5\n", - "train_loss : 0.33429012800217606 val_loss : 0.36189084346871825\n", - "train_accuracy : 85.44296875 val_accuracy : 84.0221875\n", - "Validation loss decreased (0.364674 --> 0.361891). Saving model ...\n", - "==================================================\n" - ] - } - ], - "source": [ - "# Number of training Epochs\n", - "epochs = 5\n", - "\n", - "# Maximum absolute value accepted for the gradeint\n", - "clip = 5\n", - "\n", - "# Initial Loss value (assumed big)\n", - "valid_loss_min = np.Inf\n", - "\n", - "# Lists to follow the evolution of the loss and accuracy\n", - "epoch_tr_loss,epoch_vl_loss = [],[]\n", - "epoch_tr_acc,epoch_vl_acc = [],[]\n", - "\n", - "# Train for a number of Epochs\n", - "for epoch in range(epochs):\n", - " train_losses = []\n", - " train_acc = 0.0\n", - " model.train()\n", - "\n", - " for inputs, labels in train_loader:\n", - "\n", - " # Initialize hidden state\n", - " h = model.init_hidden(batch_size)\n", - " # Creating new variables for the hidden state\n", - " h = tuple([each.data.to(device) for each in h])\n", - "\n", - " # Move batch inputs and labels to gpu\n", - " inputs, labels = inputs.to(device), labels.to(device)\n", - "\n", - " # Set gradient to zero\n", - " model.zero_grad()\n", - "\n", - " # Compute model output\n", - " output,h = model(inputs,h)\n", - "\n", - " # Calculate the loss and perform backprop\n", - " loss = criterion(output.squeeze(), labels.float())\n", - " loss.backward()\n", - " train_losses.append(loss.item())\n", - "\n", - " # calculating accuracy\n", - " accuracy = acc(output,labels)\n", - " train_acc += accuracy\n", - "\n", - " #`clip_grad_norm` helps prevent the exploding gradient problem in RNNs / LSTMs.\n", - " nn.utils.clip_grad_norm_(model.parameters(), clip)\n", - " optimizer.step()\n", - "\n", - "\n", - " # Evaluate on the validation set for this epoch\n", - " val_losses = []\n", - " val_acc = 0.0\n", - " model.eval()\n", - " for inputs, labels in valid_loader:\n", - "\n", - " # Initialize hidden state\n", - " val_h = model.init_hidden(batch_size)\n", - " val_h = tuple([each.data.to(device) for each in val_h])\n", - "\n", - " # Move batch inputs and labels to gpu\n", - " inputs, labels = inputs.to(device), labels.to(device)\n", - "\n", - " # Compute model output\n", - " output, val_h = model(inputs, val_h)\n", - "\n", - " # Compute Loss\n", - " val_loss = criterion(output.squeeze(), labels.float())\n", - "\n", - " val_losses.append(val_loss.item())\n", - "\n", - " accuracy = acc(output,labels)\n", - " val_acc += accuracy\n", - "\n", - " epoch_train_loss = np.mean(train_losses)\n", - " epoch_val_loss = np.mean(val_losses)\n", - " epoch_train_acc = train_acc/len(train_loader.dataset)\n", - " epoch_val_acc = val_acc/len(valid_loader.dataset)\n", - " epoch_tr_loss.append(epoch_train_loss)\n", - " epoch_vl_loss.append(epoch_val_loss)\n", - " epoch_tr_acc.append(epoch_train_acc)\n", - " epoch_vl_acc.append(epoch_val_acc)\n", - " print(f'Epoch {epoch+1}')\n", - " print(f'train_loss : {epoch_train_loss} val_loss : {epoch_val_loss}')\n", - " print(f'train_accuracy : {epoch_train_acc*100} val_accuracy : {epoch_val_acc*100}')\n", - " if epoch_val_loss <= valid_loss_min:\n", - " print('Validation loss decreased ({:.6f} --> {:.6f}). Saving model ...'.format(valid_loss_min,epoch_val_loss))\n", - " # torch.save(model.state_dict(), '../working/state_dict.pt')\n", - " valid_loss_min = epoch_val_loss\n", - " print(25*'==')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {} - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light", - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "fig = plt.figure(figsize = (20, 6))\n", - "plt.subplot(1, 2, 1)\n", - "plt.plot(epoch_tr_acc, label='Train Acc')\n", - "plt.plot(epoch_vl_acc, label='Validation Acc')\n", - "plt.title(\"Accuracy\")\n", - "plt.legend()\n", - "plt.grid()\n", - "\n", - "plt.subplot(1, 2, 2)\n", - "plt.plot(epoch_tr_loss, label='Train loss')\n", - "plt.plot(epoch_vl_loss, label='Validation loss')\n", - "plt.title(\"Loss\")\n", - "plt.legend()\n", - "plt.grid()\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {} - }, - "source": [ - "---\n", - "# What's Next?\n", - "\n", - "You can use this project template as a starting point to think about your own project. There are a lot of ways to continue, here we share with you some ideas you migth find useful:\n", - "\n", - "* **Work on the Preproccesing.** We used a very rudimentary way to tokenize tweets. But there are better ways to preprocess the data. Can you think of a suitable way to preprocess the data for this particular task? How does the performance of the model change when the data is processed correctly?\n", - "* **Work on the Model.** The RNN model proposed in this notebook is not optimized at all. You can work on finding a better architecture or better hyperparamenters. May be using bidirectonal LSTMs or increasing the number of stacked layers can improve the performance, feel free to try different approaches.\n", - "* **Work on the Embedding.** Our model learnt an embedding during the training on this Twitter corpus for a particular task. You can explore the representation of different words in this learned embedding. Also, you can try using different word embeddings. You can train them on this corpus or you can use an embedding trained on another corpus of data. How does the change of the embedding affect the model performance?\n", - "* **Try sentiment analysis on another dataset.** There are lots of available dataset to work with, we can help you find one that is interesting to you. Do you belive that a sentiment analysis model trained on some corpus (Twitter dataset) will perform well on another type of data (for example, youtube comments)?\n", - "\n" - ] - } - ], - "metadata": { - "accelerator": "GPU", - "colab": { - "collapsed_sections": [], - "include_colab_link": true, - "name": "sentiment_analysis", - "provenance": [], - "toc_visible": true - }, - "kernel": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "kernelspec": { - "display_name": "Python 3", - "name": "python3" - }, - "language_info": { - "name": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} +{"cells":[{"cell_type":"markdown","metadata":{"execution":{},"id":"view-in-github"},"source":["\"Open   \"Open"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"D_fgc45VfjDz"},"source":["# Twitter Sentiment Analysis\n","\n","**By Neuromatch Academy**\n","\n","__Content creators:__ Juan Manuel Rodriguez, Salomey Osei, Gonzalo Uribarri\n","\n","__Production editors:__ Amita Kapoor, Spiros Chavlis"]},{"cell_type":"markdown","metadata":{"execution":{}},"source":["---\n","# Welcome to the NLP project template\n","\n",""]},{"cell_type":"markdown","metadata":{"execution":{}},"source":["---\n","# Step 1: Questions and goals\n","\n","* Can we infer emotion from a tweet text?\n","* How words are distributed accross the dataset?\n","* Are words related to one kind of emotion?"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"Vd1qdNW9fjD1"},"source":["---\n","# Step 2: Literature review\n","\n","[Original Dataset Paper](https://cs.stanford.edu/people/alecmgo/papers/TwitterDistantSupervision09.pdf)\n","\n","[Papers with code](https://paperswithcode.com/dataset/imdb-movie-reviews)"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"oOYDQElpfjD2"},"source":["---\n","# Step 3: Load and explore the dataset"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":103706,"status":"ok","timestamp":1720042135196,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"EZpxSExUfjD2","outputId":"19b01445-9b83-4a93-9cc2-7830ab0dcf5b"},"outputs":[],"source":["# @title Install dependencies\n","!pip install pandas --quiet\n","!pip install torchtext --quiet\n","!pip install datasets --quiet"]},{"cell_type":"code","execution_count":2,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":9008,"status":"ok","timestamp":1720042144200,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"DxqD3Tk5fjD3","outputId":"451d68c5-7894-4f93-9f54-bf0b7f482e20"},"outputs":[{"name":"stderr","output_type":"stream","text":["/usr/local/lib/python3.10/dist-packages/torchtext/data/__init__.py:4: UserWarning: \n","/!\\ IMPORTANT WARNING ABOUT TORCHTEXT STATUS /!\\ \n","Torchtext is deprecated and the last released version will be 0.18 (this one). You can silence this warning by calling the following at the beginnign of your scripts: `import torchtext; torchtext.disable_torchtext_deprecation_warning()`\n"," warnings.warn(torchtext._TORCHTEXT_DEPRECATION_MSG)\n"]}],"source":["# We import some libraries to load the dataset\n","import os\n","import numpy as np\n","import pandas as pd\n","import matplotlib.pyplot as plt\n","\n","from datasets import load_dataset\n","\n","from collections import Counter\n","from tqdm.notebook import tqdm\n","\n","import torch\n","import torch.nn as nn\n","import torch.optim as optim\n","import torch.nn.functional as F\n","from torch.utils.data import TensorDataset, DataLoader\n","\n","import torchtext\n","from torchtext.data import get_tokenizer\n","\n","from sklearn.utils import shuffle\n","from sklearn.metrics import classification_report\n","from sklearn.linear_model import LogisticRegression\n","from sklearn.model_selection import train_test_split\n","from sklearn.feature_extraction.text import CountVectorizer"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"63Eg1SLbfjD4"},"source":["You can find the dataset we are going to use in [this website](http://help.sentiment140.com/for-students/)."]},{"cell_type":"code","execution_count":3,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":567,"referenced_widgets":["fbb4191426bd485e8e965b6d432eecae","df7eba182d1b4c21bc21d157eac6b996","6d64402d9da74516ab4e1d46ae9f1ee3","d9ca809f7b1c49e595a05458251f3ab2","90908b6f69524a72860214ef8bd2d946","db432a2cd6244a7592fc9732f0ca4738","84485541f3a14c65a67d10a97b72bbad","5fa7ab2ab2004e5cb692199e2bd27d6b","ab71bd2b452146829e973d6cf99f31ed","55ba92cfe0724286ac1c2bbe6577e5c8","67a4fa49ca5349d58512a16a3742d401","afd671543846468abfe37669a72845c3","057e918ace004506aedc4e4b9942c3a8","325387f6b62d47b0b21bea61676cea72","ea1e3eb0e6ec4f8d82cf9b12cfe6e700","96c2d7ee644a438982e1792b7ec0453c","9baa1a735c0646b89953bf4a7c7fc92c","0ac9711c8ece4c5397a8cd810713adfb","a8d69769921241b8b1081e84f7770858","d189f24b0e964d1a9fc86379bad38cca","db9bf44dec914db793cc4f73751c272c","1cf3ba0f756f4aa5ad1dcb675a791cfa","c432c4efcb794ce781fcb6f176f1b60d","510eeffb32694e7798f23e3931d7a943","a8b3dfaa2831416582d8eeef01451386","db1cdafaf36f4c339476f3221abc17b3","ffd3778a96e046718828bbc5aa73f173","49c5a3fbe87b491cb3f0f450a0af0659","252949e8784c4878a62eb2e30b1e3466","7bcef602e7f441308472bc145b12dcd3","97fb30a5a31742efa1d188b9361f9938","9b34daddb9cc48bba109e547177ec654","fd2b5a6533794a2794579956c25247fb","f3a9667c8c994324a2409f227bd0a1e9","6e6c5372ffe045c0b72587989567429e","2ead0216695e4227aef44552f4ec3cc9","53843f49adda4bce8450fd91fa9fd587","40262cb3eefa45fcbe37aaafccb69f5f","b54b826314ea4b3a92eebd218c093fc1","8cd7be688b8c4818be48915db14a0792","a9a0f6ce71ed415c8c8513f68e34e162","7f638a6deacd42e88c031fa47797516b","849e39cc86f64e558ff94bf542a5121a","67b0b03c391c414bad5ea9fb3c947a2f","1cef38981af6457dbaeb393f9936a389","b0b5cfae51214c60bbca9a09b196c217","5ee2a4b33be04c6db8ee4d7995c2376d","403fffb635c2409ebeabc90063750ed3","6279343019064572adedf34cfbd437fa","2715d00db77545f9aa5eace8a0eb2839","942ce490d87347c789e229589b1b9c9f","f04df4daeb6049ab85d3d75b472ccf6e","fd0b3c53b66543cea0c396d8047445a8","2c42e2fef6314c9e842a7e9641af3cab","913d95e58aa94e4a8009768a23fbf304"]},"execution":{},"executionInfo":{"elapsed":189390,"status":"ok","timestamp":1720042333586,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"3HLOsd3rfjD4","outputId":"7653fee1-a871-472b-a978-d8ec0250dc84"},"outputs":[{"name":"stderr","output_type":"stream","text":["/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_token.py:89: UserWarning: \n","The secret `HF_TOKEN` does not exist in your Colab secrets.\n","To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n","You will be able to reuse this secret in all of your notebooks.\n","Please note that authentication is recommended but still optional to access public models or datasets.\n"," warnings.warn(\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"fbb4191426bd485e8e965b6d432eecae","version_major":2,"version_minor":0},"text/plain":["Downloading builder script: 0%| | 0.00/4.03k [00:00\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
polarityuserdatequeryusertext
00_TheSpecialOne_Mon Apr 06 22:19:45 PDT 2009NO_QUERY_TheSpecialOne_@switchfoot http://twitpic.com/2y1zl - Awww, t...
10scotthamiltonMon Apr 06 22:19:49 PDT 2009NO_QUERYscotthamiltonis upset that he can't update his Facebook by ...
20mattycusMon Apr 06 22:19:53 PDT 2009NO_QUERYmattycus@Kenichan I dived many times for the ball. Man...
30ElleCTFMon Apr 06 22:19:57 PDT 2009NO_QUERYElleCTFmy whole body feels itchy and like its on fire
40KaroliMon Apr 06 22:19:57 PDT 2009NO_QUERYKaroli@nationwideclass no, it's not behaving at all....
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n"," \n"],"text/plain":[" polarity user date query \\\n","0 0 _TheSpecialOne_ Mon Apr 06 22:19:45 PDT 2009 NO_QUERY \n","1 0 scotthamilton Mon Apr 06 22:19:49 PDT 2009 NO_QUERY \n","2 0 mattycus Mon Apr 06 22:19:53 PDT 2009 NO_QUERY \n","3 0 ElleCTF Mon Apr 06 22:19:57 PDT 2009 NO_QUERY \n","4 0 Karoli Mon Apr 06 22:19:57 PDT 2009 NO_QUERY \n","\n"," user text \n","0 _TheSpecialOne_ @switchfoot http://twitpic.com/2y1zl - Awww, t... \n","1 scotthamilton is upset that he can't update his Facebook by ... \n","2 mattycus @Kenichan I dived many times for the ball. Man... \n","3 ElleCTF my whole body feels itchy and like its on fire \n","4 Karoli @nationwideclass no, it's not behaving at all.... "]},"execution_count":3,"metadata":{},"output_type":"execute_result"}],"source":["# We load the dataset\n","\n","dataset = load_dataset(\"stanfordnlp/sentiment140\", trust_remote_code= True)\n","\n","train_data = dataset[\"train\"]\n","df = pd.DataFrame(train_data)\n","df = df.rename(columns={'sentiment': 'polarity'})\n","df = df[['polarity', 'user', 'date', 'query', 'user', 'text']]\n","df.head()"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"fuKShcfjfjD4"},"source":["For this project we will use only the text and the polarity of the tweet. Notice that polarity is 0 for negative tweets and 4 for positive tweet."]},{"cell_type":"code","execution_count":4,"metadata":{"execution":{},"executionInfo":{"elapsed":1059,"status":"ok","timestamp":1720042334642,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"GXHQOn6gfjD5"},"outputs":[],"source":["X = df.text.values\n","\n","# Changes values from [0,4] to [0,1]\n","y = (df.polarity.values > 1).astype(int)\n","\n","\n","# Split the data into train and test\n","x_train_text, x_test_text, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42,stratify=y)"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"7kr3TO_LfjD5"},"source":["The first thing we have to do before working on the models is to familiarize ourselves with the dataset. This is called Exploratory Data Analisys (EDA)."]},{"cell_type":"code","execution_count":5,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":12,"status":"ok","timestamp":1720042334642,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"FsL-xY03fjD5","outputId":"655f0ef8-c177-4f42-c024-1d628241401a"},"outputs":[{"name":"stdout","output_type":"stream","text":["1: @paisleypaisley LOL why do i get ideas so far in advance? it's not even june yet! we need a third knitter to have our own summer group \n","0: worst headache ever \n","0: @ewaniesciuszko i am so sad i wont see you! I miss you already. and yeah! that's perfect; i come back the 18th!\n","1: doesn't know how to spell conked \n","0: "So we stand here now and no one knows us at all I won't get used to this I won't get used to being gone"...I miss home and everyone -a\n"]}],"source":["for s, l in zip(x_train_text[:5], y_train[:5]):\n"," print('{}: {}'.format(l, s))"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"4cPGXSc-fjD5"},"source":["An interesting thing to analyze is the Word Distribution. In order to count the occurrences of each word, we should tokenize the sentences first."]},{"cell_type":"code","execution_count":6,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":9,"status":"ok","timestamp":1720042334642,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"U1OugpZ0fjD5","outputId":"9e6cb4e3-8d8c-4db0-c113-bdd4fe87db5f"},"outputs":[{"name":"stdout","output_type":"stream","text":["Before Tokenize: worst headache ever \n","After Tokenize: ['worst', 'headache', 'ever']\n"]}],"source":["tokenizer = get_tokenizer(\"basic_english\")\n","\n","print('Before Tokenize: ', x_train_text[1])\n","print('After Tokenize: ', tokenizer(x_train_text[1]))"]},{"cell_type":"code","execution_count":7,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":81,"referenced_widgets":["e1348a02ceeb4af19fbd63d52b7d843b","fbf51b14e6b34d0485ddf59c43d22c49","c29e06a72ac9401b8c41f4195021071e","48b812211db04284bfbbf02823fb879a","5455119809c74916acc50e1905903ded","2475bd62a3224bacb38a6334d07d6a8c","3d29947b5d2d4e2abc1355d900096642","3f7a8f56f15c434da70029366a37167a","3610a2db297f4686bf9043f2b7ee55b5","a1bd0616199e44538977ee2ea6049690","835fb9a91b34471fa6d61adf37616f52","d8de1a85076b453a92295e79110ba8fd","78d48ee2fb9f42089f475fcf5fc368c8","b0ca3012d0b84c5a9d7c1fc176251af7","39fa73efcbf54d8dad225d8380061dbf","6b6cc35257fe433e93736d02e898b6b8","e0fc900d8b5940a6bd6a97e58adb4651","6b7286d74e0f4a0199dbfcaf3dd0d622","a4bbd3df99cd4acab5e1b3ba5cd7c114","9a7140a6197945d5bac5c48b820dfb04","0bdc146792a64853ae06a9d185aa2b15","768da964ffcd44fea1af09e81f5621f3"]},"execution":{},"executionInfo":{"elapsed":29122,"status":"ok","timestamp":1720042363757,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"7ZggzGCXfjD6","outputId":"ae19f8d6-224d-4224-d3a0-d00c659ec9b2"},"outputs":[{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"e1348a02ceeb4af19fbd63d52b7d843b","version_major":2,"version_minor":0},"text/plain":[" 0%| | 0/1280000 [00:00"]},"metadata":{},"output_type":"display_data"}],"source":["plt.bar(range(100), [words[w] for w in sorted_words[:100]])\n","plt.show()"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"o9IYA0cZfjD7"},"source":["It is very common to find this kind of distribution when analyzing corpus of text. This is referred to as the [zipf's law](https://en.wikipedia.org/wiki/Zipf%27s_law)."]},{"cell_type":"markdown","metadata":{"execution":{},"id":"5FQIOqoRfjD7"},"source":["Usually the number of words in the dictionary will be very large.\n","\n","Here are some thing we can do to reduce that number:\n","\n","* Remove puntuation.\n","* Remove stop-words.\n","* Steaming.\n","* Remove very uncommon words (the words that appears in fewer than N occations).\n","* Nothing: we can use a pretrain model that handles this kind of situations.\n","\n","\n","We used one of the simplest tokenizers availables. This tokenizer does not take into account many quirks of the language. Moreover, diferent languages have different quirks, so there is no \"universal\" tokenizers. There are many libraries that have \"better\" tokenizers:\n","\n","* [Spacy](https://spacy.io/): it can be accessed using: `get_tokenizer(\"spacy\")`. Spacy supports a wide range of languages.\n","* [Huggingface](https://huggingface.co/): it has many tokenizers for different laguages. [Doc](https://huggingface.co/transformers/main_classes/tokenizer.html)\n","* [NLTK](https://www.nltk.org/): it provides several tokenizers. One of them can be accessed using: `get_tokenizer(\"toktok\")`\n"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"_ul5MgYcfjD7"},"source":["---\n","# Step 4: choose toolkit\n","\n","Our goal is to train a model capable of estimating the sentiment of a tweet (positive or negative) by reading its content. To that end we will try 2 different approaches:\n","\n","* A logistic regression using sklearn. **NOTE**: it can probaly work better than an SVM model.\n","* A simple Embedding + RNN."]},{"cell_type":"markdown","metadata":{"execution":{},"id":"GteI1PxTfjD7"},"source":["## Logistic regression\n","\n","We will represent our senteces using binary vectorization. This means that our data would be represented as a matrix of instances by word with a one if the word is in the instance, and zero otherwise. Sklean vectorizers can also do things such as stop-word removal and puntuation removal, you can read more about in [the documentation](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html)."]},{"cell_type":"code","execution_count":11,"metadata":{"execution":{},"executionInfo":{"elapsed":22699,"status":"ok","timestamp":1720042396408,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"S_ei2qu8fjD7"},"outputs":[],"source":["vectorizer = CountVectorizer(binary=True)\n","x_train_cv = vectorizer.fit_transform(x_train_text)\n","x_test_cv = vectorizer.transform(x_test_text)"]},{"cell_type":"code","execution_count":12,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":17,"status":"ok","timestamp":1720042396409,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"iK_zfqnLfjD7","outputId":"9b3f6db3-01bf-4246-b943-359620c717a2"},"outputs":[{"name":"stdout","output_type":"stream","text":["Before Vectorize: doesn't know how to spell conked \n"]}],"source":["print('Before Vectorize: ', x_train_text[3])"]},{"cell_type":"code","execution_count":13,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":5,"status":"ok","timestamp":1720042396409,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"wKxY8e38fjD8","outputId":"19530135-070d-4259-d6a9-7ba06b519763"},"outputs":[{"name":"stdout","output_type":"stream","text":["After Vectorize: \n"," (0, 528584)\t1\n"," (0, 165468)\t1\n"," (0, 300381)\t1\n"," (0, 242211)\t1\n"," (0, 489893)\t1\n"," (0, 134160)\t1\n"]}],"source":["# Notice that the matriz is sparse\n","print('After Vectorize: ')\n","print(x_train_cv[3])"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"QTPPEMd9fjD8"},"source":["Now we can train our model. You can check the documentation of this logistic regressor [here](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic#sklearn.linear_model.LogisticRegression)."]},{"cell_type":"code","execution_count":14,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":74},"execution":{},"executionInfo":{"elapsed":127277,"status":"ok","timestamp":1720042523682,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"2vEPOQS6fjD8","outputId":"3be77fc0-76e6-40b8-8847-5f6e7c6c0ce0"},"outputs":[{"data":{"text/html":["
LogisticRegression(solver='saga')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
"],"text/plain":["LogisticRegression(solver='saga')"]},"execution_count":14,"metadata":{},"output_type":"execute_result"}],"source":["model = LogisticRegression(solver='saga')\n","model.fit(x_train_cv, y_train)"]},{"cell_type":"code","execution_count":15,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":7,"status":"ok","timestamp":1720042523683,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"37bUbqB6fjD8","outputId":"7eb9178d-6130-47d0-bdf4-ce4be164bc97"},"outputs":[{"name":"stdout","output_type":"stream","text":[" precision recall f1-score support\n","\n"," 0 0.81 0.79 0.80 160000\n"," 1 0.79 0.81 0.80 160000\n","\n"," accuracy 0.80 320000\n"," macro avg 0.80 0.80 0.80 320000\n","weighted avg 0.80 0.80 0.80 320000\n","\n"]}],"source":["y_pred = model.predict(x_test_cv)\n","\n","print(classification_report(y_test, y_pred))"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"161kDLhofjD8"},"source":["## Explainable AI\n","The best thing about logistic regresion is that it is simple, and we can get some explanations."]},{"cell_type":"code","execution_count":16,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":1105,"status":"ok","timestamp":1720042524784,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"EILTmxzifjD9","outputId":"b7ce6853-7385-4a24-d4eb-e6d0843ca5d5"},"outputs":[{"name":"stdout","output_type":"stream","text":["(1, 589260)\n","589260\n"]}],"source":["print(model.coef_.shape)\n","print(len(vectorizer.vocabulary_))\n","\n","words_sk = list(vectorizer.vocabulary_.keys())\n","words_sk.sort(key=lambda w: model.coef_[0, vectorizer.vocabulary_[w]])"]},{"cell_type":"code","execution_count":17,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":12,"status":"ok","timestamp":1720042524784,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"NGjVPON6fjD9","outputId":"d40443bc-476d-4f5a-ce90-4b5b17e47933"},"outputs":[{"name":"stdout","output_type":"stream","text":["roni: -3.8625952420933984\n","inaperfectworld: -3.5734321547933936\n","dontyouhate: -3.5002133484207576\n","xbllygbsn: -3.4126303898325787\n","anqju: -3.3363997631497493\n","sad: -3.200516823534637\n","pakcricket: -3.1949062976331675\n","condolences: -3.132503698316079\n","heartbreaking: -3.0665219866881297\n","saddest: -3.042020604188048\n","sadd: -3.029036146667248\n","heartbroken: -3.0287524416643463\n","boohoo: -3.0226033087262802\n","sadface: -2.991829110065316\n","rachelle_lefevr: -2.925076661509848\n","disappointing: -2.902522686643491\n","lvbu: -2.8947109582208865\n","saddens: -2.8855187276040715\n","bummed: -2.836500453805889\n","neda: -2.792917726280752\n"]}],"source":["for w in words_sk[:20]:\n"," print('{}: {}'.format(w, model.coef_[0, vectorizer.vocabulary_[w]]))"]},{"cell_type":"code","execution_count":18,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":10,"status":"ok","timestamp":1720042524784,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"oxQ_jlNRfjD9","outputId":"363de58b-817a-4205-f019-2379d0d64e0d"},"outputs":[{"name":"stdout","output_type":"stream","text":["iamsoannoyed: 2.8493838469077013\n","myfax: 2.7974330510971424\n","jennamadison: 2.5667217237933104\n","yeyy: 2.4780234846131646\n","tryout: 2.438315611477797\n","goldymom: 2.4374072779309204\n","wooohooo: 2.402957513257194\n","thesupergirl: 2.356525094856456\n","iammaxathotspot: 2.3116551216589682\n","londicreations: 2.3074264075299316\n","smilin: 2.2991796213822497\n","worries: 2.2899555142510084\n","sinfulsignorita: 2.27989578448778\n","finchensnail: 2.2642827277181063\n","smackthis: 2.237672991997692\n","kv: 2.2157591386122775\n","tojosan: 2.2117938132889696\n","russmarshalek: 2.20953890861265\n","traciknoppe: 2.1768232307222153\n","congratulations: 2.1715901103136876\n"]}],"source":["for w in reversed(words_sk[-20:]):\n"," print('{}: {}'.format(w, model.coef_[0, vectorizer.vocabulary_[w]]))"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"9KSSAC3qfjD9"},"source":["What does this mean?\n","\n","Remember the `model.coef_` is the $W$ in:\n","\n","$$h(x)=\\sigma(WX + b)$$\n","\n","where the label 1 is a positive tweet and the label 0 is a negative tweet."]},{"cell_type":"markdown","metadata":{"execution":{},"id":"oDHjTP2_fjD9"},"source":["## Recurrent Neural Network with Pytorch"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"TbgpKy95fjD9"},"source":["In the previous section we use a Bag-Of-Words approach to represent each of the tweets. That meas that we only consider how many times each of the words appear in each of the tweets, we didnt take into account the order of the words. But we know that the word order is very important and carries relevant information.\n","\n","In this section we will solve the same task, but this time we will implement a Recurrent Neural Network (RNN) instead of using a simple Logistic Regression.Unlike feedforward neural networks, RNNs have cyclic connections making them powerful for modeling sequences.\n","\n","Let's start by importing the relevant libraries.\n"]},{"cell_type":"code","execution_count":19,"metadata":{"execution":{},"executionInfo":{"elapsed":8,"status":"ok","timestamp":1720042524784,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"7nmUJV99fjEB"},"outputs":[],"source":["def set_device():\n"," device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n"," if device != \"cuda\":\n"," print(\"WARNING: For this notebook to perform best, \"\n"," \"if possible, in the menu under `Runtime` -> \"\n"," \"`Change runtime type.` select `GPU` \")\n"," else:\n"," print(\"GPU is enabled in this notebook.\")\n","\n"," return device"]},{"cell_type":"code","execution_count":20,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":7,"status":"ok","timestamp":1720042524784,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"chI-18LcfjEB","outputId":"7f633079-6548-48f3-802e-94bc9cfada93"},"outputs":[{"name":"stdout","output_type":"stream","text":["GPU is enabled in this notebook.\n"]}],"source":["# Set the device (check if gpu is available)\n","device = set_device()"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"01UtIN7ofjEC"},"source":["First we will create a Dictionary (`word_to_idx`). This dictionary will map each Token (usually words) to an index (an integer number). We want to limit our dictionary to a certain number of tokens (`num_words_dict`), so we will include in our ditionary those with more occurrences."]},{"cell_type":"code","execution_count":21,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":5,"status":"ok","timestamp":1720042524784,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"afus9SyUfjEC","outputId":"bb4eb869-e2f0-4ccd-f64c-e55908272345"},"outputs":[{"data":{"text/plain":["['.', 'i', '!', \"'\", 'to', 'the', ',', 'a', 'my', 'it']"]},"execution_count":21,"metadata":{},"output_type":"execute_result"}],"source":["# From previous section, we have a list with the most used tokens\n","sorted_words[:10]"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"6vfQFjaufjEC"},"source":["Let's select only the most used."]},{"cell_type":"code","execution_count":22,"metadata":{"execution":{},"executionInfo":{"elapsed":5,"status":"ok","timestamp":1720042524785,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"tGLkxaGcfjEC"},"outputs":[],"source":["num_words_dict = 30000\n","# We reserve two numbers for special tokens.\n","most_used_words = sorted_words[:num_words_dict-2]"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"AzhQvekCfjEC"},"source":["We will add two extra Tokens to the dictionary, one for words outside the dictionary (`'UNK'`) and one for padding the sequences (`'PAD'`)."]},{"cell_type":"code","execution_count":23,"metadata":{"execution":{},"executionInfo":{"elapsed":4,"status":"ok","timestamp":1720042524785,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"73Wrb-lEfjEC"},"outputs":[],"source":["# dictionary to go from words to idx\n","word_to_idx = {}\n","# dictionary to go from idx to words (just in case)\n","idx_to_word = {}\n","\n","\n","# We include the special tokens first\n","PAD_token = 0\n","UNK_token = 1\n","\n","word_to_idx['PAD'] = PAD_token\n","word_to_idx['UNK'] = UNK_token\n","\n","idx_to_word[PAD_token] = 'PAD'\n","idx_to_word[UNK_token] = 'UNK'\n","\n","# We popullate our dictionaries with the most used words\n","for num,word in enumerate(most_used_words):\n"," word_to_idx[word] = num + 2\n"," idx_to_word[num+2] = word"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"kMHVkEisfjEC"},"source":["Our goal now is to transform each tweet from a sequence of tokens to a sequence of indexes. These sequences of indexes will be the input to our pytorch model."]},{"cell_type":"code","execution_count":24,"metadata":{"execution":{},"executionInfo":{"elapsed":4,"status":"ok","timestamp":1720042524785,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"tkCIu3PKfjED"},"outputs":[],"source":["# A function to convert list of tokens to list of indexes\n","def tokens_to_idx(sentences_tokens,word_to_idx):\n"," sentences_idx = []\n"," for sent in sentences_tokens:\n"," sent_idx = []\n"," for word in sent:\n"," if word in word_to_idx:\n"," sent_idx.append(word_to_idx[word])\n"," else:\n"," sent_idx.append(word_to_idx['UNK'])\n"," sentences_idx.append(sent_idx)\n"," return sentences_idx"]},{"cell_type":"code","execution_count":25,"metadata":{"execution":{},"executionInfo":{"elapsed":9346,"status":"ok","timestamp":1720042534127,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"aHru4vpzfjED"},"outputs":[],"source":["x_train_idx = tokens_to_idx(x_train_token,word_to_idx)\n","x_test_idx = tokens_to_idx(x_test_token,word_to_idx)"]},{"cell_type":"code","execution_count":26,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":8,"status":"ok","timestamp":1720042534127,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"Ofj3OD7zfjED","outputId":"b2788d03-dbfa-41d7-8231-5011206baa59"},"outputs":[{"name":"stdout","output_type":"stream","text":["Before converting: ['worst', 'headache', 'ever']\n","After converting: [721, 458, 237]\n"]}],"source":["some_number = 1\n","print('Before converting: ', x_train_token[some_number])\n","print('After converting: ', x_train_idx[some_number])"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"NcCicvb-fjED"},"source":["We need all the sequences to have the same length. To select an adequate sequence length, let's explore some statistics about the length of the tweets:"]},{"cell_type":"code","execution_count":27,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":6,"status":"ok","timestamp":1720042534128,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"BSjhdyYUfjED","outputId":"82e49be9-7868-44ac-b496-c7a48da1efee"},"outputs":[{"name":"stdout","output_type":"stream","text":["Max tweet word length: 229\n","Mean tweet word length: 15.0\n","99% percent under: 37.0\n"]}],"source":["tweet_lens = np.asarray([len(sentence) for sentence in x_train_idx])\n","print('Max tweet word length: ',tweet_lens.max())\n","print('Mean tweet word length: ',np.median(tweet_lens))\n","print('99% percent under: ',np.quantile(tweet_lens,0.99))"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"t311WY6ZfjEE"},"source":["We cut the sequences which are larger than our chosen maximum length (`max_lenght`) and fill with zeros the ones that are shorter."]},{"cell_type":"code","execution_count":28,"metadata":{"execution":{},"executionInfo":{"elapsed":5,"status":"ok","timestamp":1720042534128,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"r4S8KTWLfjEE"},"outputs":[],"source":[" # We choose the max length\n"," max_length = 40\n","\n","# A function to make all the sequence have the same lenght\n","# Note that the output is a Numpy matrix\n"," def padding(sentences, seq_len):\n"," features = np.zeros((len(sentences), seq_len),dtype=int)\n"," for ii, tweet in enumerate(sentences):\n"," len_tweet = len(tweet)\n"," if len_tweet != 0:\n"," if len_tweet <= seq_len:\n"," # If its shorter, we fill with zeros (the padding Token index)\n"," features[ii, -len(tweet):] = np.array(tweet)[:seq_len]\n"," if len_tweet > seq_len:\n"," # If its larger, we take the last 'seq_len' indexes\n"," features[ii, :] = np.array(tweet)[-seq_len:]\n"," return features"]},{"cell_type":"code","execution_count":29,"metadata":{"execution":{},"executionInfo":{"elapsed":4762,"status":"ok","timestamp":1720042538886,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"Z-Cw-bBxfjEE"},"outputs":[],"source":["# We convert our list of tokens into a numpy matrix\n","# where all instances have the same lenght\n","x_train_pad = padding(x_train_idx,max_length)\n","x_test_pad = padding(x_test_idx,max_length)\n","\n","# We convert our target list a numpy matrix\n","y_train_np = np.asarray(y_train)\n","y_test_np = np.asarray(y_test)"]},{"cell_type":"code","execution_count":30,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":12,"status":"ok","timestamp":1720042538886,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"8eC3YswlfjEE","outputId":"3bb0ea7f-518f-4545-9241-feb783f48122"},"outputs":[{"name":"stdout","output_type":"stream","text":["Before padding: [1, 3, 71, 24, 122, 3, 533, 74, 13, 4, 3, 102, 13, 209, 2, 12, 150, 4, 22, 5, 18, 667, 3, 138, 61, 7, 3296, 4]\n","After padding: [ 0 0 0 0 0 0 0 0 0 0 0 0 1 3\n"," 71 24 122 3 533 74 13 4 3 102 13 209 2 12\n"," 150 4 22 5 18 667 3 138 61 7 3296 4]\n"]}],"source":["some_number = 2\n","print('Before padding: ', x_train_idx[some_number])\n","print('After padding: ', x_train_pad[some_number])"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"SzDhnauUfjEE"},"source":["Now, let's convert the data to pytorch format.\n"]},{"cell_type":"code","execution_count":31,"metadata":{"execution":{},"executionInfo":{"elapsed":10,"status":"ok","timestamp":1720042538886,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"--Yd22YWfjEF"},"outputs":[],"source":["# create Tensor datasets\n","train_data = TensorDataset(torch.from_numpy(x_train_pad), torch.from_numpy(y_train_np))\n","valid_data = TensorDataset(torch.from_numpy(x_test_pad), torch.from_numpy(y_test_np))\n","\n","# Batch size (this is an important hyperparameter)\n","batch_size = 100\n","\n","# dataloaders\n","# make sure to SHUFFLE your data\n","train_loader = DataLoader(train_data, shuffle=True, batch_size=batch_size,drop_last = True)\n","valid_loader = DataLoader(valid_data, shuffle=True, batch_size=batch_size,drop_last = True)"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"jQ5qPOWTfjEF"},"source":["Each batch of data in our traning proccess will have the folllowing format:"]},{"cell_type":"code","execution_count":33,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":598,"status":"ok","timestamp":1720042563992,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"S1mqhk1hfjEF","outputId":"c97e7edd-695f-4336-a2e6-f6bed4852a63"},"outputs":[{"name":"stdout","output_type":"stream","text":["Sample input size: torch.Size([100, 40])\n","Sample input: \n"," tensor([[ 0, 0, 0, ..., 32, 203, 86],\n"," [ 0, 0, 0, ..., 1, 1, 4661],\n"," [ 0, 0, 0, ..., 169, 43, 34],\n"," ...,\n"," [ 0, 0, 0, ..., 2, 2961, 4076],\n"," [ 0, 0, 0, ..., 2319, 1325, 2],\n"," [ 0, 0, 0, ..., 7, 253, 1]])\n","Sample input: \n"," tensor([0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1,\n"," 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0,\n"," 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,\n"," 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1,\n"," 0, 1, 0, 1])\n"]}],"source":["# Obtain one batch of training data\n","dataiter = iter(train_loader)\n","sample_x, sample_y = dataiter.__next__()\n","\n","print('Sample input size: ', sample_x.size()) # batch_size, seq_length\n","print('Sample input: \\n', sample_x)\n","print('Sample input: \\n', sample_y)"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"jn0PzZdGfjEF"},"source":["Now, we will define the `SentimentRNN` class. Most of the model's class will be familiar to you, but there are two important layers we would like you to pay attention to:\n","\n","* Embedding Layer\n","> This layer is like a linear layer, but it makes it posible to use a sequence of inedexes as inputs (instead of a sequence of one-hot-encoded vectors). During training, the Embedding layer learns a linear transformation from the space of words (a vector space of dimension `num_words_dict`) into the a new, smaller, vector space of dimension `embedding_dim`. We suggest you to read this [thread](https://discuss.pytorch.org/t/how-does-nn-embedding-work/88518/3) and the [pytorch documentation](https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html) if you want to learn more about this particular kind of layers.\n","\n","\n","* LSTM layer\n","> This is one of the most used class of Recurrent Neural Networks. In Pytorch we can add several stacked layers in just one line of code. In our case, the number of layers added are decided with the parameter `no_layers`. If you want to learn more about LSTMs we strongly recommend you this [Colahs thread](https://colah.github.io/posts/2015-08-Understanding-LSTMs/) about them.\n","\n","\n","\n","\n","\n"]},{"cell_type":"code","execution_count":34,"metadata":{"execution":{},"executionInfo":{"elapsed":433,"status":"ok","timestamp":1720042567199,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"vfzcowAxfjEF"},"outputs":[],"source":["class SentimentRNN(nn.Module):\n"," def __init__(self,no_layers,vocab_size,hidden_dim,embedding_dim,drop_prob=0.1):\n"," super(SentimentRNN,self).__init__()\n","\n"," self.output_dim = output_dim\n"," self.hidden_dim = hidden_dim\n"," self.no_layers = no_layers\n"," self.vocab_size = vocab_size\n"," self.drop_prob = drop_prob\n","\n"," # Embedding Layer\n"," self.embedding = nn.Embedding(vocab_size, embedding_dim)\n","\n"," # LSTM Layers\n"," self.lstm = nn.LSTM(input_size=embedding_dim,hidden_size=self.hidden_dim,\n"," num_layers=no_layers, batch_first=True,\n"," dropout=self.drop_prob)\n","\n"," # Dropout layer\n"," self.dropout = nn.Dropout(drop_prob)\n","\n"," # Linear and Sigmoid layer\n"," self.fc = nn.Linear(self.hidden_dim, output_dim)\n"," self.sig = nn.Sigmoid()\n","\n"," def forward(self,x,hidden):\n"," batch_size = x.size(0)\n","\n"," # Embedding out\n"," embeds = self.embedding(x)\n"," #Shape: [batch_size x max_length x embedding_dim]\n","\n"," # LSTM out\n"," lstm_out, hidden = self.lstm(embeds, hidden)\n"," # Shape: [batch_size x max_length x hidden_dim]\n","\n"," # Select the activation of the last Hidden Layer\n"," lstm_out = lstm_out[:,-1,:].contiguous()\n"," # Shape: [batch_size x hidden_dim]\n","\n"," ## You can instead average the activations across all the times\n"," # lstm_out = torch.mean(lstm_out, 1).contiguous()\n","\n"," # Dropout and Fully connected layer\n"," out = self.dropout(lstm_out)\n"," out = self.fc(out)\n","\n"," # Sigmoid function\n"," sig_out = self.sig(out)\n","\n"," # return last sigmoid output and hidden state\n"," return sig_out, hidden\n","\n"," def init_hidden(self, batch_size):\n"," ''' Initializes hidden state '''\n"," # Create two new tensors with sizes n_layers x batch_size x hidden_dim,\n"," # initialized to zero, for hidden state and cell state of LSTM\n"," h0 = torch.zeros((self.no_layers,batch_size,self.hidden_dim)).to(device)\n"," c0 = torch.zeros((self.no_layers,batch_size,self.hidden_dim)).to(device)\n"," hidden = (h0,c0)\n"," return hidden"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"YfrLPa9mfjEF"},"source":["We choose the parameters of the model."]},{"cell_type":"code","execution_count":35,"metadata":{"execution":{},"executionInfo":{"elapsed":471,"status":"ok","timestamp":1720042569608,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"rOm-xoFkfjEG"},"outputs":[],"source":["# Parameters of our network\n","\n","# Size of our vocabulary\n","vocab_size = num_words_dict\n","\n","# Embedding dimension\n","embedding_dim = 32\n","\n","# Number of stacked LSTM layers\n","no_layers = 2\n","\n","# Dimension of the hidden layer in LSTMs\n","hidden_dim = 64\n","\n","# Dropout parameter for regularization\n","output_dim = 1\n","\n","# Dropout parameter for regularization\n","drop_prob = 0.25"]},{"cell_type":"code","execution_count":36,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":465,"status":"ok","timestamp":1720042571776,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"xapxpe7ufjEG","outputId":"51c90159-7d2b-4fc4-f34a-98e9901d40e4"},"outputs":[{"name":"stdout","output_type":"stream","text":["SentimentRNN(\n"," (embedding): Embedding(30000, 32)\n"," (lstm): LSTM(32, 64, num_layers=2, batch_first=True, dropout=0.25)\n"," (dropout): Dropout(p=0.25, inplace=False)\n"," (fc): Linear(in_features=64, out_features=1, bias=True)\n"," (sig): Sigmoid()\n",")\n"]}],"source":["# Let's define our model\n","model = SentimentRNN(no_layers, vocab_size, hidden_dim,\n"," embedding_dim, drop_prob=drop_prob)\n","# Moving to gpu\n","model.to(device)\n","print(model)"]},{"cell_type":"code","execution_count":37,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":3,"status":"ok","timestamp":1720042571776,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"GEvTs3uwfjEG","outputId":"2e15f6df-2aa8-4665-b2da-7363d2bfa09e"},"outputs":[{"name":"stdout","output_type":"stream","text":["Total Number of parameters: 1018433\n"]}],"source":["# How many trainable parameters does our model have?\n","model_parameters = filter(lambda p: p.requires_grad, model.parameters())\n","params = sum([np.prod(p.size()) for p in model_parameters])\n","print('Total Number of parameters: ',params)"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"Pc2OC5GDfjEG"},"source":["We choose the losses and the optimizer for the training procces."]},{"cell_type":"code","execution_count":38,"metadata":{"execution":{},"executionInfo":{"elapsed":1740,"status":"ok","timestamp":1720042574210,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"iBWjPADUfjEG"},"outputs":[],"source":["# loss and optimization functions\n","lr = 0.001\n","\n","# Binary crossentropy is a good loss function for a binary classification problem\n","criterion = nn.BCELoss()\n","\n","# We choose an Adam optimizer\n","optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n","\n","# function to predict accuracy\n","def acc(pred,label):\n"," pred = torch.round(pred.squeeze())\n"," return torch.sum(pred == label.squeeze()).item()"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"OZgMwOe2fjEG"},"source":["We are ready to train our model."]},{"cell_type":"code","execution_count":39,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":304614,"status":"ok","timestamp":1720042880244,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"3B6YhEocfjEH","outputId":"76276a1f-7775-4b98-aab0-0e199aa133e4"},"outputs":[{"name":"stdout","output_type":"stream","text":["Epoch 1\n","train_loss : 0.4366412344621494 val_loss : 0.3881208170717582\n","train_accuracy : 79.485546875 val_accuracy : 82.475\n","Validation loss decreased (inf --> 0.388121). Saving model ...\n","==================================================\n","Epoch 2\n","train_loss : 0.3760281792609021 val_loss : 0.3713956154882908\n","train_accuracy : 83.186328125 val_accuracy : 83.4575\n","Validation loss decreased (0.388121 --> 0.371396). Saving model ...\n","==================================================\n","Epoch 3\n","train_loss : 0.3574051411205437 val_loss : 0.36425656544510276\n","train_accuracy : 84.19953125 val_accuracy : 83.80375\n","Validation loss decreased (0.371396 --> 0.364257). Saving model ...\n","==================================================\n","Epoch 4\n","train_loss : 0.344456663565943 val_loss : 0.3613302929420024\n","train_accuracy : 84.89265625 val_accuracy : 84.00874999999999\n","Validation loss decreased (0.364257 --> 0.361330). Saving model ...\n","==================================================\n","Epoch 5\n","train_loss : 0.33407817618339325 val_loss : 0.3601334386831149\n","train_accuracy : 85.444921875 val_accuracy : 84.03625\n","Validation loss decreased (0.361330 --> 0.360133). Saving model ...\n","==================================================\n"]}],"source":["# Number of training Epochs\n","epochs = 5\n","\n","# Maximum absolute value accepted for the gradeint\n","clip = 5\n","\n","# Initial Loss value (assumed big)\n","valid_loss_min = np.Inf\n","\n","# Lists to follow the evolution of the loss and accuracy\n","epoch_tr_loss,epoch_vl_loss = [],[]\n","epoch_tr_acc,epoch_vl_acc = [],[]\n","\n","# Train for a number of Epochs\n","for epoch in range(epochs):\n"," train_losses = []\n"," train_acc = 0.0\n"," model.train()\n","\n"," for inputs, labels in train_loader:\n","\n"," # Initialize hidden state\n"," h = model.init_hidden(batch_size)\n"," # Creating new variables for the hidden state\n"," h = tuple([each.data.to(device) for each in h])\n","\n"," # Move batch inputs and labels to gpu\n"," inputs, labels = inputs.to(device), labels.to(device)\n","\n"," # Set gradient to zero\n"," model.zero_grad()\n","\n"," # Compute model output\n"," output,h = model(inputs,h)\n","\n"," # Calculate the loss and perform backprop\n"," loss = criterion(output.squeeze(), labels.float())\n"," loss.backward()\n"," train_losses.append(loss.item())\n","\n"," # calculating accuracy\n"," accuracy = acc(output,labels)\n"," train_acc += accuracy\n","\n"," #`clip_grad_norm` helps prevent the exploding gradient problem in RNNs / LSTMs.\n"," nn.utils.clip_grad_norm_(model.parameters(), clip)\n"," optimizer.step()\n","\n","\n"," # Evaluate on the validation set for this epoch\n"," val_losses = []\n"," val_acc = 0.0\n"," model.eval()\n"," for inputs, labels in valid_loader:\n","\n"," # Initialize hidden state\n"," val_h = model.init_hidden(batch_size)\n"," val_h = tuple([each.data.to(device) for each in val_h])\n","\n"," # Move batch inputs and labels to gpu\n"," inputs, labels = inputs.to(device), labels.to(device)\n","\n"," # Compute model output\n"," output, val_h = model(inputs, val_h)\n","\n"," # Compute Loss\n"," val_loss = criterion(output.squeeze(), labels.float())\n","\n"," val_losses.append(val_loss.item())\n","\n"," accuracy = acc(output,labels)\n"," val_acc += accuracy\n","\n"," epoch_train_loss = np.mean(train_losses)\n"," epoch_val_loss = np.mean(val_losses)\n"," epoch_train_acc = train_acc/len(train_loader.dataset)\n"," epoch_val_acc = val_acc/len(valid_loader.dataset)\n"," epoch_tr_loss.append(epoch_train_loss)\n"," epoch_vl_loss.append(epoch_val_loss)\n"," epoch_tr_acc.append(epoch_train_acc)\n"," epoch_vl_acc.append(epoch_val_acc)\n"," print(f'Epoch {epoch+1}')\n"," print(f'train_loss : {epoch_train_loss} val_loss : {epoch_val_loss}')\n"," print(f'train_accuracy : {epoch_train_acc*100} val_accuracy : {epoch_val_acc*100}')\n"," if epoch_val_loss <= valid_loss_min:\n"," print('Validation loss decreased ({:.6f} --> {:.6f}). Saving model ...'.format(valid_loss_min,epoch_val_loss))\n"," # torch.save(model.state_dict(), '../working/state_dict.pt')\n"," valid_loss_min = epoch_val_loss\n"," print(25*'==')"]},{"cell_type":"code","execution_count":40,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":364},"execution":{},"executionInfo":{"elapsed":894,"status":"ok","timestamp":1720042881135,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"ttJazP-nfjEH","outputId":"992bed02-611e-4614-c60f-77223d5b801a"},"outputs":[{"data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAABkoAAAIQCAYAAADO7zKKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADxbklEQVR4nOzdd3xUVfrH8c/MpJNGKgECCZ1QlRKkWQhVIyAqooKg2HFV1sYKIipi2WWxrfhTEAsuVhQXBAII0psivSeEmkKAhASSycz8/ggMxIQSJuGmfN+vFy+Yc8+997kPE5h7nznnmBwOhwMREREREREREREREZEqyGx0ACIiIiIiIiIiIiIiIkZRoURERERERERERERERKosFUpERERERERERERERKTKUqFERERERERERERERESqLBVKRERERERERERERESkylKhREREREREREREREREqiwVSkREREREREREREREpMpSoURERERERERERERERKosFUpERERERERERERERKTKUqFERERERERERERERESqLBVKREQqsP/85z+YTCZiY2ONDkVERERERKTSmjZtGiaTiXXr1hkdioiIlAEVSkREKrDp06cTFRXFmjVr2L17t9HhiIiIiIiIiIiIVDgqlIiIVFCJiYmsWLGCiRMnEhoayvTp040OqVjZ2dlGhyAiIiIiIiIiInJBKpSIiFRQ06dPp3r16tx8883cfvvtxRZKjh8/ztNPP01UVBSenp7Url2bIUOGkJ6e7uxz+vRpXn75ZRo1aoSXlxcRERHcdttt7NmzB4DFixdjMplYvHhxoWMnJSVhMpmYNm2as23o0KH4+vqyZ88e+vTpg5+fH/fccw8AS5cu5Y477qBOnTp4enoSGRnJ008/zalTp4rEvX37du68805CQ0Px9vamcePGvPjiiwD8+uuvmEwmZs6cWWS/r776CpPJxMqVK0ucTxEREREREVf88ccf9O7dG39/f3x9fenWrRurVq0q1MdqtTJu3DgaNmyIl5cXwcHBdO7cmYSEBGefI0eOMGzYMGrXro2npycRERH07duXpKSkq3xFIiJVh5vRAYiIyJWZPn06t912Gx4eHgwaNIgPP/yQtWvX0q5dOwBOnjxJly5d2LZtG/fffz/XXnst6enpzJo1iwMHDhASEoLNZuOWW25h4cKF3HXXXTz55JNkZWWRkJDA5s2bqV+/fonjys/Pp2fPnnTu3Jl//vOf+Pj4APDtt9+Sk5PDo48+SnBwMGvWrOG9997jwIEDfPvtt879N27cSJcuXXB3d+ehhx4iKiqKPXv28PPPPzN+/HhuuOEGIiMjmT59Ov379y+Sk/r163Pddde5kFkREREREZGS2bJlC126dMHf35/nnnsOd3d3PvroI2644QaWLFniXFfy5ZdfZsKECQwfPpz27duTmZnJunXr+P333+nevTsAAwYMYMuWLTzxxBNERUWRmppKQkICycnJREVFGXiVIiKVlwolIiIV0Pr169m+fTvvvfceAJ07d6Z27dpMnz7dWSh5++232bx5Mz/88EOhgsLo0aNxOBwAfP755yxcuJCJEyfy9NNPO/u88MILzj4llZubyx133MGECRMKtb/55pt4e3s7Xz/00EM0aNCAf/zjHyQnJ1OnTh0AnnjiCRwOB7///ruzDeCNN94AwGQyce+99zJx4kROnDhBQEAAAGlpacyfP9858kRERERERORqGT16NFarlWXLllGvXj0AhgwZQuPGjXnuuedYsmQJALNnz6ZPnz783//9X7HHOX78OCtWrODtt9/mmWeecbaPGjWq7C9CRKQK09RbIiIV0PTp0wkPD+fGG28ECooHAwcOZMaMGdhsNgC+//57WrVqVWTUxdn+Z/uEhITwxBNPXLDPlXj00UeLtJ1fJMnOziY9PZ2OHTvicDj4448/gIJix2+//cb9999fqEjy13iGDBlCbm4u3333nbPt66+/Jj8/n3vvvfeK4xYRERERESkpm83G/Pnz6devn7NIAhAREcHdd9/NsmXLyMzMBCAwMJAtW7awa9euYo/l7e2Nh4cHixcv5tixY1clfhERUaFERKTCsdlszJgxgxtvvJHExER2797N7t27iY2NJSUlhYULFwKwZ88emjdvftFj7dmzh8aNG+PmVnoDDN3c3Khdu3aR9uTkZIYOHUpQUBC+vr6EhoZy/fXXA3DixAkA9u7dC3DJuJs0aUK7du0Krcsyffp0OnToQIMGDUrrUkRERERERC4pLS2NnJwcGjduXGRb06ZNsdvt7N+/H4BXXnmF48eP06hRI1q0aMGzzz7Lxo0bnf09PT158803+eWXXwgPD6dr16689dZbHDly5Kpdj4hIVaRCiYhIBbNo0SIOHz7MjBkzaNiwofPX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WJnE0E7RRoclIiIiZaUsntNerhI8px04cCCfffYZo0ePrjLPaX/99VciIiJK9Jz2fO+88w7/+te/+PDDD2nYsCHffvstt956K1u2bKFhw4a8++67zJo1i2+++YY6deqwf/9+9u/fDxTMHvTvf/+bGTNm0KxZM44cOcKff/55Wee9UlWzUGLNgddrluohzUDg5XT8xyHwuLy55+6//37efvttlixZwg033AAUDOcaMGAAAQEBBAQE8Mwzzzj7P/HEE8ybN49vvvnmsn4AFyxYwPbt25k3bx41axbk4/XXX6d3796F+o0ePdr556ioKJ555hlmzJjBc889h7e3N76+vri5uV10CNdXX33F6dOn+fzzz51z773//vvEx8fz5ptvOoeaVa9enffffx+LxUKTJk24+eabWbhw4UV/AKdOnUrv3r2d8+z17NmTTz/9lJdffhmADz74gICAAGbMmIG7e8HDnEaNGjn3f+211/j73//Ok08+6Wxr167dJfMnIiJSkeXb7Gw+mMmvh0z8PP0P1iUf53hO4W8HebiZaR0Z6CyMXFunOtU8q+bHRxG5emoGevN8r8aM+WkLb83bQVxMOLWr+xgdloiIiJSFMnhOe9lK8Jz23nvv5b333qsSz2nDw8OBK3tOe75//vOfPP/889x1111kZmbyxhtvsHjxYiZNmsQHH3xAcnIyDRs2pHPnzphMJueX3gGSk5OpUaMGcXFxuLu7U6dOncvKoyt0p1uONWnShI4dOzJ16lRuuOEGdu/ezdKlS3nllVcAsNlsvP7663zzzTccPHiQvLw8cnNz8fG5vJuIbdu2ERkZ6fzhA7juuuuK9Pv6669599132bNnDydPniQ/Px9/f/8SXcu2bdto1apVoQWKOnXqhN1uZ8eOHc5CSUxMDBaLxdknIiKCTZs2XfC4NpuNzz77jHfeecfZdu+99/LMM8/w0ksvYTab2bBhA126dHEWSc6XmprKoUOH6NatW4muR0REpKLJy7ez6eBxVp1ZX2T9vmOczM0HLEAaAD4eFtrUrU77qILCSKvIQLzcLRc9rohIWbgnti6z/jzE2qRj/GPmZj4b1s757U0RERGRq61Ro0ZV5jnt2UJJs2bNSvSc9nyZmZkcOnSITp06FWrv1KmTc2TI0KFD6d69O40bN6ZXr17ccsst9OjRA4A77riDSZMmUa9ePXr1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0W/068C/txymvNJG1+ZVjOrqb3Q5IiIiIiIiIiIiIiLXlZPFTI+Q5vQIac6U4eGcKavku8O51TNO9p3IJzGzEL+A+r8Ul4KSOjBzXARtfdzgRHyDXH9NRERERERERERERMQRbs4WhnZsydCOLQHILSpj48FM0vbvMriyK2sYC4TVcxaziftvaoOfq9GViIiIiIiIiIiIiIgYz8fDmdsiAwlpZnQlV6agREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mQpKBERERERERERERERkSZLQYmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlAiIiIiIiIiIiIiIiJNloISERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mQpKBERERERERERERERkSZLQYmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlAiIiIiIiIiIiIiIiJNloISERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwnowuoKzabDYD8/HxDXr+8vJzi4mLy8/OxWq2G1NCQqX+OUf8co/45Rv1zjPrnGPXPMeqfY4zu37mfe8/9HCxyJRozNWzqn2PUP8eof45R/xyj/jlG/XOceugYo/t3teOmRhOUFBQUABASEmJwJSIiIiIiN05BQQHe3t5GlyENgMZMIiIiItJUXWncZLI1kj9Bq6qq4sSJE3h6emIymW746+fn5xMSEsLRo0fx8vK64a/f0Kl/jlH/HKP+OUb9c4z65xj1zzHqn2OM7p/NZqOgoIBWrVphNmtFXbkyjZkaNvXPMeqfY9Q/x6h/jlH/HKP+OU49dIzR/bvacVOjmVFiNptp3bq10WXg5eWl/2AcoP45Rv1zjPrnGPXPMeqfY9Q/x6h/jjGyf5pJIrWhMVPjoP45Rv1zjPrnGPXPMeqfY9Q/x6mHjqnv4yb96ZmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlBSR1xcXJg5cyYuLi5Gl9IgqX+OUf8co/45Rv1zjPrnGPXPMeqfY9Q/kdrRfzOOUf8co/45Rv1zjPrnGPXPMeqf49RDxzSU/jWazdxFRERERERERERERERqSzNKRERERERERERERESkyVJQIiIiIiIiIiIiIiIiTZaCEhERERERERERERERabIUlIiIiIiIiIiIiIiISJOloKQW5s+fT2hoKK6urvTv35/t27f/6PWffPIJnTt3xtXVlaioKJYvX36DKq2fatO/RYsWYTKZahyurq43sNr6Y/369YwbN45WrVphMplYunTpFR8TGxtLr169cHFxITw8nEWLFl33Ouur2vYvNjb2oveeyWQiIyPjxhRcz8yZM4e+ffvi6emJv78/EyZMIDEx8YqP0/c/u2vpn77/nbdgwQK6deuGl5cXXl5eDBgwgK+//vpHH6P33nm17Z/eez/uT3/6EyaTiSeeeOJHr9N7UJo6jZkcozHTtdO4yTEaN107jZkcozGT4zRucozGTXWnoY+ZFJRcpY8//piYmBhmzpzJrl276N69O6NHjyYrK+uS12/evJl7772XX/7yl+zevZsJEyYwYcIE4uPjb3Dl9UNt+wfg5eVFenp69XHkyJEbWHH9UVRURPfu3Zk/f/5VXZ+amsrYsWMZPnw4e/bs4YknnuChhx7im2++uc6V1k+17d85iYmJNd5//v7+16nC+m3dunVMmTKFrVu3smrVKsrLyxk1ahRFRUWXfYy+/513Lf0Dff87p3Xr1vzpT39i586d7Nixg5tvvpnx48ezb9++S16v915Nte0f6L13Od999x1vvvkm3bp1+9Hr9B6Upk5jJsdozOQYjZsco3HTtdOYyTEaMzlO4ybHaNxUNxrFmMkmV6Vfv362KVOmVH9eWVlpa9WqlW3OnDmXvP6nP/2pbezYsTXO9e/f3/arX/3qutZZX9W2f++++67N29v7BlXXcAC2JUuW/Og1v//9720RERE1zt1zzz220aNHX8fKGoar6d/atWttgO3UqVM3pKaGJisrywbY1q1bd9lr9P3v8q6mf/r+9+NatGhhe/vtty/5Nb33ruzH+qf33qUVFBTYOnToYFu1apVt2LBhtmnTpl32Wr0HpanTmMkxGjPVHY2bHKNxk2M0ZnKMxkx1Q+Mmx2jcVDuNZcykGSVXoaysjJ07dzJixIjqc2azmREjRrBly5ZLPmbLli01rgcYPXr0Za9vzK6lfwCFhYW0bduWkJCQKya5cp7ee3WjR48eBAUFMXLkSDZt2mR0OfVGXl4eAD4+Ppe9Ru/By7ua/oG+/11KZWUlH330EUVFRQwYMOCS1+i9d3lX0z/Qe+9SpkyZwtixYy96b12K3oPSlGnM5BiNmW48vf/qhsZNF9OYyTEaMzlG4ybHaNx0bRrLmElByVXIycmhsrKSgICAGucDAgIuu/5mRkZGra5vzK6lf506deKdd97h888/Z/HixVRVVTFw4ECOHTt2I0pu0C733svPz+fMmTMGVdVwBAUFsXDhQj799FM+/fRTQkJCiI6OZteuXUaXZriqqiqeeOIJBg0aRGRk5GWv0/e/S7va/un7X01xcXE0a9YMFxcXHn30UZYsWULXrl0vea3eexerTf/03rvYRx99xK5du5gzZ85VXa/3oDRlGjM5RmOmG0/jJsdo3HRpGjM5RmOma6dxk2M0brp2jWnM5GR0ASKXMmDAgBrJ7cCBA+nSpQtvvvkmL730koGVSWPXqVMnOnXqVP35wIEDSU5O5tVXX+X99983sDLjTZkyhfj4eDZu3Gh0KQ3S1fZP3/9q6tSpE3v27CEvL4///e9/TJo0iXXr1l32h1apqTb903uvpqNHjzJt2jRWrVqlzRlFpF7S920xksZNl6Yxk2M0Zrp2Gjc5RuOma9PYxkwKSq6Cn58fFouFzMzMGuczMzMJDAy85GMCAwNrdX1jdi39+yGr1UrPnj1JSkq6HiU2Kpd773l5eeHm5mZQVQ1bv379mvwPulOnTuWrr75i/fr1tG7d+kev1fe/i9Wmfz/U1L//OTs7Ex4eDkDv3r357rvveO2113jzzTcvulbvvYvVpn8/1NTfezt37iQrK4tevXpVn6usrGT9+vX84x//oLS0FIvFUuMxeg9KU6Yxk2M0ZrrxNG6qe0193KQxk2M0ZnKMxk2O0bjp2jS2MZOW3roKzs7O9O7dm9WrV1efq6qqYvXq1Zddr27AgAE1rgdYtWrVj65v11hdS/9+qLKykri4OIKCgq5XmY2G3nt1b8+ePU32vWez2Zg6dSpLlixhzZo1tGvX7oqP0XvwvGvp3w/p+19NVVVVlJaWXvJreu9d2Y/174ea+nvvlltuIS4ujj179lQfffr04ec//zl79uy56Ad+0HtQmjaNmRyjMdONp/df3Wuq4yaNmRyjMdP1oXGTYzRuujqNbsxk7F7yDcdHH31kc3FxsS1atMi2f/9+2yOPPGJr3ry5LSMjw2az2WwTJ060Pf3009XXb9q0yebk5GT761//aktISLDNnDnTZrVabXFxcUbdgqFq279Zs2bZvvnmG1tycrJt586dtp/97Gc2V1dX2759+4y6BcMUFBTYdu/ebdu9e7cNsM2dO9e2e/du25EjR2w2m8329NNP2yZOnFh9fUpKis3d3d321FNP2RISEmzz58+3WSwW24oVK4y6BUPVtn+vvvqqbenSpbZDhw7Z4uLibNOmTbOZzWbbt99+a9QtGOqxxx6zeXt722JjY23p6enVR3FxcfU1+v53edfSP33/O+/pp5+2rVu3zpaammrbu3ev7emnn7aZTCbbypUrbTab3ntXUtv+6b13ZcOGDbNNmzat+nO9B0Vq0pjJMRozOUbjJsdo3HTtNGZyjMZMjtO4yTEaN9WthjxmUlBSC6+//rqtTZs2NmdnZ1u/fv1sW7durf7asGHDbJMmTapx/X//+19bx44dbc7OzraIiAjbsmXLbnDF9Utt+vfEE09UXxsQEGAbM2aMbdeuXQZUbby1a9fagIuOc/2aNGmSbdiwYRc9pkePHjZnZ2db+/btbe++++4Nr7u+qG3/XnnlFVtYWJjN1dXV5uPjY4uOjratWbPGmOLrgUv1DqjxntL3v8u7lv7p+995Dz74oK1t27Y2Z2dnW8uWLW233HJL9Q+rNpvee1dS2/7pvXdlP/yhX+9BkYtpzOQYjZmuncZNjtG46dppzOQYjZkcp3GTYzRuqlsNecxkstlstrqfpyIiIiIiIiIiIiIiIlL/aY8SERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mQpKBERERERERERERERkSZLQYmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlAiIiIiIiIiIiIiIiJNloISERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mT9P7WuLgMvviw8AAAAAElFTkSuQmCC","text/plain":["
"]},"metadata":{},"output_type":"display_data"}],"source":["fig = plt.figure(figsize = (20, 6))\n","plt.subplot(1, 2, 1)\n","plt.plot(epoch_tr_acc, label='Train Acc')\n","plt.plot(epoch_vl_acc, label='Validation Acc')\n","plt.title(\"Accuracy\")\n","plt.legend()\n","plt.grid()\n","\n","plt.subplot(1, 2, 2)\n","plt.plot(epoch_tr_loss, label='Train loss')\n","plt.plot(epoch_vl_loss, label='Validation loss')\n","plt.title(\"Loss\")\n","plt.legend()\n","plt.grid()\n","\n","plt.show()"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"iUyaF-EbfjEH"},"source":["---\n","# What's Next?\n","\n","You can use this project template as a starting point to think about your own project. There are a lot of ways to continue, here we share with you some ideas you migth find useful:\n","\n","* **Work on the Preproccesing.** We used a very rudimentary way to tokenize tweets. But there are better ways to preprocess the data. Can you think of a suitable way to preprocess the data for this particular task? How does the performance of the model change when the data is processed correctly?\n","* **Work on the Model.** The RNN model proposed in this notebook is not optimized at all. You can work on finding a better architecture or better hyperparamenters. May be using bidirectonal LSTMs or increasing the number of stacked layers can improve the performance, feel free to try different approaches.\n","* **Work on the Embedding.** Our model learnt an embedding during the training on this Twitter corpus for a particular task. You can explore the representation of different words in this learned embedding. Also, you can try using different word embeddings. You can train them on this corpus or you can use an embedding trained on another corpus of data. How does the change of the embedding affect the model performance?\n","* **Try sentiment analysis on another dataset.** There are lots of available dataset to work with, we can help you find one that is interesting to you. Do you belive that a sentiment analysis model trained on some corpus (Twitter dataset) will perform well on another type of data (for example, youtube comments)?\n","\n"]}],"metadata":{"accelerator":"GPU","colab":{"provenance":[],"toc_visible":true},"kernel":{"display_name":"Python 3","language":"python","name":"python3"},"kernelspec":{"display_name":"Python 3","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.11.2"},"widgets":{"application/vnd.jupyter.widget-state+json":{"057e918ace004506aedc4e4b9942c3a8":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_9baa1a735c0646b89953bf4a7c7fc92c","placeholder":"​","style":"IPY_MODEL_0ac9711c8ece4c5397a8cd810713adfb","value":"Downloading readme: 100%"}},"0ac9711c8ece4c5397a8cd810713adfb":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"0bdc146792a64853ae06a9d185aa2b15":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"1cef38981af6457dbaeb393f9936a389":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_b0b5cfae51214c60bbca9a09b196c217","IPY_MODEL_5ee2a4b33be04c6db8ee4d7995c2376d","IPY_MODEL_403fffb635c2409ebeabc90063750ed3"],"layout":"IPY_MODEL_6279343019064572adedf34cfbd437fa"}},"1cf3ba0f756f4aa5ad1dcb675a791cfa":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"2475bd62a3224bacb38a6334d07d6a8c":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"252949e8784c4878a62eb2e30b1e3466":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"2715d00db77545f9aa5eace8a0eb2839":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"2c42e2fef6314c9e842a7e9641af3cab":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"2ead0216695e4227aef44552f4ec3cc9":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_a9a0f6ce71ed415c8c8513f68e34e162","max":1600000,"min":0,"orientation":"horizontal","style":"IPY_MODEL_7f638a6deacd42e88c031fa47797516b","value":1600000}},"325387f6b62d47b0b21bea61676cea72":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_a8d69769921241b8b1081e84f7770858","max":6837,"min":0,"orientation":"horizontal","style":"IPY_MODEL_d189f24b0e964d1a9fc86379bad38cca","value":6837}},"3610a2db297f4686bf9043f2b7ee55b5":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"39fa73efcbf54d8dad225d8380061dbf":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_0bdc146792a64853ae06a9d185aa2b15","placeholder":"​","style":"IPY_MODEL_768da964ffcd44fea1af09e81f5621f3","value":" 320000/320000 [00:06<00:00, 58691.43it/s]"}},"3d29947b5d2d4e2abc1355d900096642":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"3f7a8f56f15c434da70029366a37167a":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"40262cb3eefa45fcbe37aaafccb69f5f":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"403fffb635c2409ebeabc90063750ed3":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_2c42e2fef6314c9e842a7e9641af3cab","placeholder":"​","style":"IPY_MODEL_913d95e58aa94e4a8009768a23fbf304","value":" 498/498 [00:00<00:00, 7393.07 examples/s]"}},"48b812211db04284bfbbf02823fb879a":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_a1bd0616199e44538977ee2ea6049690","placeholder":"​","style":"IPY_MODEL_835fb9a91b34471fa6d61adf37616f52","value":" 1280000/1280000 [00:22<00:00, 77416.28it/s]"}},"49c5a3fbe87b491cb3f0f450a0af0659":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"510eeffb32694e7798f23e3931d7a943":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_49c5a3fbe87b491cb3f0f450a0af0659","placeholder":"​","style":"IPY_MODEL_252949e8784c4878a62eb2e30b1e3466","value":"Downloading data: 100%"}},"53843f49adda4bce8450fd91fa9fd587":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_849e39cc86f64e558ff94bf542a5121a","placeholder":"​","style":"IPY_MODEL_67b0b03c391c414bad5ea9fb3c947a2f","value":" 1600000/1600000 [01:18<00:00, 14710.70 examples/s]"}},"5455119809c74916acc50e1905903ded":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"55ba92cfe0724286ac1c2bbe6577e5c8":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"5ee2a4b33be04c6db8ee4d7995c2376d":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_f04df4daeb6049ab85d3d75b472ccf6e","max":498,"min":0,"orientation":"horizontal","style":"IPY_MODEL_fd0b3c53b66543cea0c396d8047445a8","value":498}},"5fa7ab2ab2004e5cb692199e2bd27d6b":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6279343019064572adedf34cfbd437fa":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"67a4fa49ca5349d58512a16a3742d401":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"67b0b03c391c414bad5ea9fb3c947a2f":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"6b6cc35257fe433e93736d02e898b6b8":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6b7286d74e0f4a0199dbfcaf3dd0d622":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"6d64402d9da74516ab4e1d46ae9f1ee3":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_5fa7ab2ab2004e5cb692199e2bd27d6b","max":4033,"min":0,"orientation":"horizontal","style":"IPY_MODEL_ab71bd2b452146829e973d6cf99f31ed","value":4033}},"6e6c5372ffe045c0b72587989567429e":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_b54b826314ea4b3a92eebd218c093fc1","placeholder":"​","style":"IPY_MODEL_8cd7be688b8c4818be48915db14a0792","value":"Generating train split: 100%"}},"768da964ffcd44fea1af09e81f5621f3":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"78d48ee2fb9f42089f475fcf5fc368c8":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_e0fc900d8b5940a6bd6a97e58adb4651","placeholder":"​","style":"IPY_MODEL_6b7286d74e0f4a0199dbfcaf3dd0d622","value":"100%"}},"7bcef602e7f441308472bc145b12dcd3":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7f638a6deacd42e88c031fa47797516b":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"835fb9a91b34471fa6d61adf37616f52":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"84485541f3a14c65a67d10a97b72bbad":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"849e39cc86f64e558ff94bf542a5121a":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"8cd7be688b8c4818be48915db14a0792":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"90908b6f69524a72860214ef8bd2d946":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"913d95e58aa94e4a8009768a23fbf304":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"942ce490d87347c789e229589b1b9c9f":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"96c2d7ee644a438982e1792b7ec0453c":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"97fb30a5a31742efa1d188b9361f9938":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"9a7140a6197945d5bac5c48b820dfb04":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"9b34daddb9cc48bba109e547177ec654":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9baa1a735c0646b89953bf4a7c7fc92c":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a1bd0616199e44538977ee2ea6049690":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a4bbd3df99cd4acab5e1b3ba5cd7c114":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a8b3dfaa2831416582d8eeef01451386":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_7bcef602e7f441308472bc145b12dcd3","max":81363704,"min":0,"orientation":"horizontal","style":"IPY_MODEL_97fb30a5a31742efa1d188b9361f9938","value":81363704}},"a8d69769921241b8b1081e84f7770858":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a9a0f6ce71ed415c8c8513f68e34e162":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ab71bd2b452146829e973d6cf99f31ed":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"afd671543846468abfe37669a72845c3":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_057e918ace004506aedc4e4b9942c3a8","IPY_MODEL_325387f6b62d47b0b21bea61676cea72","IPY_MODEL_ea1e3eb0e6ec4f8d82cf9b12cfe6e700"],"layout":"IPY_MODEL_96c2d7ee644a438982e1792b7ec0453c"}},"b0b5cfae51214c60bbca9a09b196c217":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_2715d00db77545f9aa5eace8a0eb2839","placeholder":"​","style":"IPY_MODEL_942ce490d87347c789e229589b1b9c9f","value":"Generating test split: 100%"}},"b0ca3012d0b84c5a9d7c1fc176251af7":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_a4bbd3df99cd4acab5e1b3ba5cd7c114","max":320000,"min":0,"orientation":"horizontal","style":"IPY_MODEL_9a7140a6197945d5bac5c48b820dfb04","value":320000}},"b54b826314ea4b3a92eebd218c093fc1":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"c29e06a72ac9401b8c41f4195021071e":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_3f7a8f56f15c434da70029366a37167a","max":1280000,"min":0,"orientation":"horizontal","style":"IPY_MODEL_3610a2db297f4686bf9043f2b7ee55b5","value":1280000}},"c432c4efcb794ce781fcb6f176f1b60d":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_510eeffb32694e7798f23e3931d7a943","IPY_MODEL_a8b3dfaa2831416582d8eeef01451386","IPY_MODEL_db1cdafaf36f4c339476f3221abc17b3"],"layout":"IPY_MODEL_ffd3778a96e046718828bbc5aa73f173"}},"d189f24b0e964d1a9fc86379bad38cca":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"d8de1a85076b453a92295e79110ba8fd":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_78d48ee2fb9f42089f475fcf5fc368c8","IPY_MODEL_b0ca3012d0b84c5a9d7c1fc176251af7","IPY_MODEL_39fa73efcbf54d8dad225d8380061dbf"],"layout":"IPY_MODEL_6b6cc35257fe433e93736d02e898b6b8"}},"d9ca809f7b1c49e595a05458251f3ab2":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_55ba92cfe0724286ac1c2bbe6577e5c8","placeholder":"​","style":"IPY_MODEL_67a4fa49ca5349d58512a16a3742d401","value":" 4.03k/4.03k [00:00<00:00, 114kB/s]"}},"db1cdafaf36f4c339476f3221abc17b3":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_9b34daddb9cc48bba109e547177ec654","placeholder":"​","style":"IPY_MODEL_fd2b5a6533794a2794579956c25247fb","value":" 81.4M/81.4M [00:06<00:00, 15.3MB/s]"}},"db432a2cd6244a7592fc9732f0ca4738":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"db9bf44dec914db793cc4f73751c272c":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"df7eba182d1b4c21bc21d157eac6b996":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_db432a2cd6244a7592fc9732f0ca4738","placeholder":"​","style":"IPY_MODEL_84485541f3a14c65a67d10a97b72bbad","value":"Downloading builder script: 100%"}},"e0fc900d8b5940a6bd6a97e58adb4651":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e1348a02ceeb4af19fbd63d52b7d843b":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_fbf51b14e6b34d0485ddf59c43d22c49","IPY_MODEL_c29e06a72ac9401b8c41f4195021071e","IPY_MODEL_48b812211db04284bfbbf02823fb879a"],"layout":"IPY_MODEL_5455119809c74916acc50e1905903ded"}},"ea1e3eb0e6ec4f8d82cf9b12cfe6e700":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_db9bf44dec914db793cc4f73751c272c","placeholder":"​","style":"IPY_MODEL_1cf3ba0f756f4aa5ad1dcb675a791cfa","value":" 6.84k/6.84k [00:00<00:00, 157kB/s]"}},"f04df4daeb6049ab85d3d75b472ccf6e":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f3a9667c8c994324a2409f227bd0a1e9":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_6e6c5372ffe045c0b72587989567429e","IPY_MODEL_2ead0216695e4227aef44552f4ec3cc9","IPY_MODEL_53843f49adda4bce8450fd91fa9fd587"],"layout":"IPY_MODEL_40262cb3eefa45fcbe37aaafccb69f5f"}},"fbb4191426bd485e8e965b6d432eecae":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_df7eba182d1b4c21bc21d157eac6b996","IPY_MODEL_6d64402d9da74516ab4e1d46ae9f1ee3","IPY_MODEL_d9ca809f7b1c49e595a05458251f3ab2"],"layout":"IPY_MODEL_90908b6f69524a72860214ef8bd2d946"}},"fbf51b14e6b34d0485ddf59c43d22c49":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_2475bd62a3224bacb38a6334d07d6a8c","placeholder":"​","style":"IPY_MODEL_3d29947b5d2d4e2abc1355d900096642","value":"100%"}},"fd0b3c53b66543cea0c396d8047445a8":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"fd2b5a6533794a2794579956c25247fb":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"ffd3778a96e046718828bbc5aa73f173":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}}}}},"nbformat":4,"nbformat_minor":0} From 288633f4382a3b4ad15e8109589dfaf41940b281 Mon Sep 17 00:00:00 2001 From: Soan Kim <39689481+SoanKim@users.noreply.github.com> Date: Wed, 3 Jul 2024 18:41:04 +0900 Subject: [PATCH 04/12] =?UTF-8?q?#=20blurry=5Fvision.ipynb:=20=E2=80=9Ccat?= =?UTF-8?q?s-and-dogs.zip=E2=80=9D=20has=20zero=20bytes,=20and=20the=20dow?= =?UTF-8?q?nloadable=20link=20doesn=E2=80=99t=20exist.=20404=20-=20File=20?= =?UTF-8?q?or=20directory=20not=20found?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # cellular_segmentation.ipynb: "numpy long type issue" # lunar_lanter: swig should be installed before gym[box2d] to avoid the error --- projects/Neuroscience/blurry_vision.ipynb | 4 ++-- projects/Neuroscience/cellular_segmentation.ipynb | 9 ++++++--- projects/ReinforcementLearning/lunar_lander.ipynb | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/projects/Neuroscience/blurry_vision.ipynb b/projects/Neuroscience/blurry_vision.ipynb index 320e6d77d..ee68c5f6d 100644 --- a/projects/Neuroscience/blurry_vision.ipynb +++ b/projects/Neuroscience/blurry_vision.ipynb @@ -60,7 +60,7 @@ "name": "stdout", "output_type": "stream", "text": [ - " Building wheel for torch-intermediate-layer-getter (setup.py) ... \u001b[?25l\u001b[?25hdone\n" + " Building wheel for torch-intermediate-layer-getter (setup.py) ... \u001B[?25l\u001B[?25hdone\n" ] } ], @@ -1877,7 +1877,7 @@ "# # Download the Data\n", "# if \"cats-and-dogs.zip\" not in os.listdir():\n", "# !wget --no-check-certificate \\\n", - "# \"https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_3367a.zip\" \\\n", + "# \"https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_5340.zip\" \\\n", "# -O \"cats-and-dogs.zip\"\n", "\n", "# local_zip = 'cats-and-dogs.zip'\n", diff --git a/projects/Neuroscience/cellular_segmentation.ipynb b/projects/Neuroscience/cellular_segmentation.ipynb index 7903fa871..39ea6c19b 100644 --- a/projects/Neuroscience/cellular_segmentation.ipynb +++ b/projects/Neuroscience/cellular_segmentation.ipynb @@ -304,14 +304,14 @@ "labels_train = np.zeros((len(masks_train), 2,\n", " masks_train.shape[-2],\n", " masks_train.shape[-1]),\n", - " np.long)\n", + " np.longlong)\n", "labels_train[:, 0] = masks_train == 0\n", "labels_train[:, 1] = masks_train > 0\n", "\n", "labels_test = np.zeros((len(masks_test), 2,\n", " masks_test.shape[-2],\n", " masks_test.shape[-1]),\n", - " np.long)\n", + " np.longlong)\n", "labels_test[:, 0] = masks_test == 0\n", "labels_test[:, 1] = masks_test > 0" ] @@ -831,12 +831,15 @@ " for ibatch in np.arange(0, n_train, batch_size):\n", " # augment the data\n", " inds = np.arange(ibatch, min(n_train, ibatch+batch_size))\n", + " train_data = train_data.astype(np.float32)\n", + " train_labels = train_labels.astype(np.float32)\n", " imgs, lbls, _ = random_rotate_and_resize(train_data[inds],\n", " train_labels[inds])\n", "\n", " # transfer to torch + GPU\n", " imgs = torch.from_numpy(imgs).to(device=device)\n", " lbls = torch.from_numpy(lbls).to(device=device)\n", + " lbls = lbls.long()\n", "\n", " # compute the loss\n", " y = net(imgs)\n", @@ -1379,7 +1382,7 @@ "from tifffile import imread\n", "\n", "fname = \"gt1.tif\"\n", - "url = \"https://www.suite2p.org/test_data/gt1.tif\"\n", + "url = \"https://www.suite2p.org/test_data/gt1.tif\" # This URL does not exist.\n", "\n", "if not os.path.isfile(fname):\n", " try:\n", diff --git a/projects/ReinforcementLearning/lunar_lander.ipynb b/projects/ReinforcementLearning/lunar_lander.ipynb index 8106a6c89..7622f5b5a 100644 --- a/projects/ReinforcementLearning/lunar_lander.ipynb +++ b/projects/ReinforcementLearning/lunar_lander.ipynb @@ -102,12 +102,12 @@ "!pip install rarfile --quiet\n", "!pip install stable-baselines3[extra] --quiet\n", "!pip install ale-py --quiet\n", + "!pip install -q swig --quiet\n", "!pip install gym[box2d] --quiet\n", "!pip install pyvirtualdisplay --quiet\n", "!pip install pyglet --quiet\n", "!pip install pygame --quiet\n", "!pip install minigrid --quiet\n", - "!pip install -q swig --quiet\n", "!pip install -q gymnasium[box2d] --quiet\n", "!pip install 'minigrid<=2.1.1' --quiet\n", "!pip3 install box2d-py --quiet" From 02925083085e48890ca6b848180484490a68725d Mon Sep 17 00:00:00 2001 From: Soan Kim <39689481+SoanKim@users.noreply.github.com> Date: Sat, 6 Jul 2024 06:50:14 +0900 Subject: [PATCH 05/12] suppressed excessive root-user warning messages --- projects/ReinforcementLearning/human_rl.ipynb | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/projects/ReinforcementLearning/human_rl.ipynb b/projects/ReinforcementLearning/human_rl.ipynb index ae9d35d7e..e72d4367f 100644 --- a/projects/ReinforcementLearning/human_rl.ipynb +++ b/projects/ReinforcementLearning/human_rl.ipynb @@ -64,24 +64,24 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "numba 0.56.4 requires numpy<1.24,>=1.18, but you have numpy 1.25.1 which is incompatible.\u001b[0m\u001b[31m\n", - "\u001b[0m\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "chex 0.1.81 requires numpy>=1.25.0, but you have numpy 1.23.3 which is incompatible.\u001b[0m\u001b[31m\n", - "\u001b[0m" + "\u001B[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "numba 0.56.4 requires numpy<1.24,>=1.18, but you have numpy 1.25.1 which is incompatible.\u001B[0m\u001B[31m\n", + "\u001B[0m\u001B[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "chex 0.1.81 requires numpy>=1.25.0, but you have numpy 1.23.3 which is incompatible.\u001B[0m\u001B[31m\n", + "\u001B[0m" ] } ], "source": [ "# @title Install dependencies\n", - "!pip install jedi --quiet\n", - "!pip install --upgrade pip setuptools wheel --quiet\n", - "!pip install dm-acme[jax] --quiet\n", - "!pip install dm-sonnet --quiet\n", - "!pip install trfl --quiet\n", - "!pip install numpy==1.23.3 --quiet --ignore-installed\n", - "!pip uninstall seaborn -y --quiet\n", - "!pip install seaborn --quiet" + "!pip install jedi --quiet --root-user-action=ignore\n", + "!pip install --upgrade pip setuptools wheel --quiet --root-user-action=ignore\n", + "!pip install dm-acme[jax] --quiet --root-user-action=ignore\n", + "!pip install dm-sonnet --quiet --root-user-action=ignore\n", + "!pip install trfl --quiet --root-user-action=ignore\n", + "!pip install numpy==1.23.3 --quiet --ignore-installed --root-user-action=ignore\n", + "!pip uninstall seaborn -y --quiet --root-user-action=ignore\n", + "!pip install seaborn --quiet --root-user-action=ignore" ] }, { From 36080adc1539e96ecc4e7ba493dd2199ce7dd996 Mon Sep 17 00:00:00 2001 From: dalia-nasr Date: Sat, 6 Jul 2024 17:55:20 +0300 Subject: [PATCH 06/12] restarted kernel and cleared output cells --- .../sentiment_analysis.ipynb | 4641 ++++++++++++++++- 1 file changed, 4640 insertions(+), 1 deletion(-) diff --git a/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb b/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb index a6f073666..eb393529a 100644 --- a/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb +++ b/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb @@ -1 +1,4640 @@ -{"cells":[{"cell_type":"markdown","metadata":{"execution":{},"id":"view-in-github"},"source":["\"Open   \"Open"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"D_fgc45VfjDz"},"source":["# Twitter Sentiment Analysis\n","\n","**By Neuromatch Academy**\n","\n","__Content creators:__ Juan Manuel Rodriguez, Salomey Osei, Gonzalo Uribarri\n","\n","__Production editors:__ Amita Kapoor, Spiros Chavlis"]},{"cell_type":"markdown","metadata":{"execution":{}},"source":["---\n","# Welcome to the NLP project template\n","\n",""]},{"cell_type":"markdown","metadata":{"execution":{}},"source":["---\n","# Step 1: Questions and goals\n","\n","* Can we infer emotion from a tweet text?\n","* How words are distributed accross the dataset?\n","* Are words related to one kind of emotion?"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"Vd1qdNW9fjD1"},"source":["---\n","# Step 2: Literature review\n","\n","[Original Dataset Paper](https://cs.stanford.edu/people/alecmgo/papers/TwitterDistantSupervision09.pdf)\n","\n","[Papers with code](https://paperswithcode.com/dataset/imdb-movie-reviews)"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"oOYDQElpfjD2"},"source":["---\n","# Step 3: Load and explore the dataset"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":103706,"status":"ok","timestamp":1720042135196,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"EZpxSExUfjD2","outputId":"19b01445-9b83-4a93-9cc2-7830ab0dcf5b"},"outputs":[],"source":["# @title Install dependencies\n","!pip install pandas --quiet\n","!pip install torchtext --quiet\n","!pip install datasets --quiet"]},{"cell_type":"code","execution_count":2,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":9008,"status":"ok","timestamp":1720042144200,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"DxqD3Tk5fjD3","outputId":"451d68c5-7894-4f93-9f54-bf0b7f482e20"},"outputs":[{"name":"stderr","output_type":"stream","text":["/usr/local/lib/python3.10/dist-packages/torchtext/data/__init__.py:4: UserWarning: \n","/!\\ IMPORTANT WARNING ABOUT TORCHTEXT STATUS /!\\ \n","Torchtext is deprecated and the last released version will be 0.18 (this one). You can silence this warning by calling the following at the beginnign of your scripts: `import torchtext; torchtext.disable_torchtext_deprecation_warning()`\n"," warnings.warn(torchtext._TORCHTEXT_DEPRECATION_MSG)\n"]}],"source":["# We import some libraries to load the dataset\n","import os\n","import numpy as np\n","import pandas as pd\n","import matplotlib.pyplot as plt\n","\n","from datasets import load_dataset\n","\n","from collections import Counter\n","from tqdm.notebook import tqdm\n","\n","import torch\n","import torch.nn as nn\n","import torch.optim as optim\n","import torch.nn.functional as F\n","from torch.utils.data import TensorDataset, DataLoader\n","\n","import torchtext\n","from torchtext.data import get_tokenizer\n","\n","from sklearn.utils import shuffle\n","from sklearn.metrics import classification_report\n","from sklearn.linear_model import LogisticRegression\n","from sklearn.model_selection import train_test_split\n","from sklearn.feature_extraction.text import CountVectorizer"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"63Eg1SLbfjD4"},"source":["You can find the dataset we are going to use in [this website](http://help.sentiment140.com/for-students/)."]},{"cell_type":"code","execution_count":3,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":567,"referenced_widgets":["fbb4191426bd485e8e965b6d432eecae","df7eba182d1b4c21bc21d157eac6b996","6d64402d9da74516ab4e1d46ae9f1ee3","d9ca809f7b1c49e595a05458251f3ab2","90908b6f69524a72860214ef8bd2d946","db432a2cd6244a7592fc9732f0ca4738","84485541f3a14c65a67d10a97b72bbad","5fa7ab2ab2004e5cb692199e2bd27d6b","ab71bd2b452146829e973d6cf99f31ed","55ba92cfe0724286ac1c2bbe6577e5c8","67a4fa49ca5349d58512a16a3742d401","afd671543846468abfe37669a72845c3","057e918ace004506aedc4e4b9942c3a8","325387f6b62d47b0b21bea61676cea72","ea1e3eb0e6ec4f8d82cf9b12cfe6e700","96c2d7ee644a438982e1792b7ec0453c","9baa1a735c0646b89953bf4a7c7fc92c","0ac9711c8ece4c5397a8cd810713adfb","a8d69769921241b8b1081e84f7770858","d189f24b0e964d1a9fc86379bad38cca","db9bf44dec914db793cc4f73751c272c","1cf3ba0f756f4aa5ad1dcb675a791cfa","c432c4efcb794ce781fcb6f176f1b60d","510eeffb32694e7798f23e3931d7a943","a8b3dfaa2831416582d8eeef01451386","db1cdafaf36f4c339476f3221abc17b3","ffd3778a96e046718828bbc5aa73f173","49c5a3fbe87b491cb3f0f450a0af0659","252949e8784c4878a62eb2e30b1e3466","7bcef602e7f441308472bc145b12dcd3","97fb30a5a31742efa1d188b9361f9938","9b34daddb9cc48bba109e547177ec654","fd2b5a6533794a2794579956c25247fb","f3a9667c8c994324a2409f227bd0a1e9","6e6c5372ffe045c0b72587989567429e","2ead0216695e4227aef44552f4ec3cc9","53843f49adda4bce8450fd91fa9fd587","40262cb3eefa45fcbe37aaafccb69f5f","b54b826314ea4b3a92eebd218c093fc1","8cd7be688b8c4818be48915db14a0792","a9a0f6ce71ed415c8c8513f68e34e162","7f638a6deacd42e88c031fa47797516b","849e39cc86f64e558ff94bf542a5121a","67b0b03c391c414bad5ea9fb3c947a2f","1cef38981af6457dbaeb393f9936a389","b0b5cfae51214c60bbca9a09b196c217","5ee2a4b33be04c6db8ee4d7995c2376d","403fffb635c2409ebeabc90063750ed3","6279343019064572adedf34cfbd437fa","2715d00db77545f9aa5eace8a0eb2839","942ce490d87347c789e229589b1b9c9f","f04df4daeb6049ab85d3d75b472ccf6e","fd0b3c53b66543cea0c396d8047445a8","2c42e2fef6314c9e842a7e9641af3cab","913d95e58aa94e4a8009768a23fbf304"]},"execution":{},"executionInfo":{"elapsed":189390,"status":"ok","timestamp":1720042333586,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"3HLOsd3rfjD4","outputId":"7653fee1-a871-472b-a978-d8ec0250dc84"},"outputs":[{"name":"stderr","output_type":"stream","text":["/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_token.py:89: UserWarning: \n","The secret `HF_TOKEN` does not exist in your Colab secrets.\n","To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n","You will be able to reuse this secret in all of your notebooks.\n","Please note that authentication is recommended but still optional to access public models or datasets.\n"," warnings.warn(\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"fbb4191426bd485e8e965b6d432eecae","version_major":2,"version_minor":0},"text/plain":["Downloading builder script: 0%| | 0.00/4.03k [00:00\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
polarityuserdatequeryusertext
00_TheSpecialOne_Mon Apr 06 22:19:45 PDT 2009NO_QUERY_TheSpecialOne_@switchfoot http://twitpic.com/2y1zl - Awww, t...
10scotthamiltonMon Apr 06 22:19:49 PDT 2009NO_QUERYscotthamiltonis upset that he can't update his Facebook by ...
20mattycusMon Apr 06 22:19:53 PDT 2009NO_QUERYmattycus@Kenichan I dived many times for the ball. Man...
30ElleCTFMon Apr 06 22:19:57 PDT 2009NO_QUERYElleCTFmy whole body feels itchy and like its on fire
40KaroliMon Apr 06 22:19:57 PDT 2009NO_QUERYKaroli@nationwideclass no, it's not behaving at all....
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n"," \n"],"text/plain":[" polarity user date query \\\n","0 0 _TheSpecialOne_ Mon Apr 06 22:19:45 PDT 2009 NO_QUERY \n","1 0 scotthamilton Mon Apr 06 22:19:49 PDT 2009 NO_QUERY \n","2 0 mattycus Mon Apr 06 22:19:53 PDT 2009 NO_QUERY \n","3 0 ElleCTF Mon Apr 06 22:19:57 PDT 2009 NO_QUERY \n","4 0 Karoli Mon Apr 06 22:19:57 PDT 2009 NO_QUERY \n","\n"," user text \n","0 _TheSpecialOne_ @switchfoot http://twitpic.com/2y1zl - Awww, t... \n","1 scotthamilton is upset that he can't update his Facebook by ... \n","2 mattycus @Kenichan I dived many times for the ball. Man... \n","3 ElleCTF my whole body feels itchy and like its on fire \n","4 Karoli @nationwideclass no, it's not behaving at all.... "]},"execution_count":3,"metadata":{},"output_type":"execute_result"}],"source":["# We load the dataset\n","\n","dataset = load_dataset(\"stanfordnlp/sentiment140\", trust_remote_code= True)\n","\n","train_data = dataset[\"train\"]\n","df = pd.DataFrame(train_data)\n","df = df.rename(columns={'sentiment': 'polarity'})\n","df = df[['polarity', 'user', 'date', 'query', 'user', 'text']]\n","df.head()"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"fuKShcfjfjD4"},"source":["For this project we will use only the text and the polarity of the tweet. Notice that polarity is 0 for negative tweets and 4 for positive tweet."]},{"cell_type":"code","execution_count":4,"metadata":{"execution":{},"executionInfo":{"elapsed":1059,"status":"ok","timestamp":1720042334642,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"GXHQOn6gfjD5"},"outputs":[],"source":["X = df.text.values\n","\n","# Changes values from [0,4] to [0,1]\n","y = (df.polarity.values > 1).astype(int)\n","\n","\n","# Split the data into train and test\n","x_train_text, x_test_text, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42,stratify=y)"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"7kr3TO_LfjD5"},"source":["The first thing we have to do before working on the models is to familiarize ourselves with the dataset. This is called Exploratory Data Analisys (EDA)."]},{"cell_type":"code","execution_count":5,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":12,"status":"ok","timestamp":1720042334642,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"FsL-xY03fjD5","outputId":"655f0ef8-c177-4f42-c024-1d628241401a"},"outputs":[{"name":"stdout","output_type":"stream","text":["1: @paisleypaisley LOL why do i get ideas so far in advance? it's not even june yet! we need a third knitter to have our own summer group \n","0: worst headache ever \n","0: @ewaniesciuszko i am so sad i wont see you! I miss you already. and yeah! that's perfect; i come back the 18th!\n","1: doesn't know how to spell conked \n","0: "So we stand here now and no one knows us at all I won't get used to this I won't get used to being gone"...I miss home and everyone -a\n"]}],"source":["for s, l in zip(x_train_text[:5], y_train[:5]):\n"," print('{}: {}'.format(l, s))"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"4cPGXSc-fjD5"},"source":["An interesting thing to analyze is the Word Distribution. In order to count the occurrences of each word, we should tokenize the sentences first."]},{"cell_type":"code","execution_count":6,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":9,"status":"ok","timestamp":1720042334642,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"U1OugpZ0fjD5","outputId":"9e6cb4e3-8d8c-4db0-c113-bdd4fe87db5f"},"outputs":[{"name":"stdout","output_type":"stream","text":["Before Tokenize: worst headache ever \n","After Tokenize: ['worst', 'headache', 'ever']\n"]}],"source":["tokenizer = get_tokenizer(\"basic_english\")\n","\n","print('Before Tokenize: ', x_train_text[1])\n","print('After Tokenize: ', tokenizer(x_train_text[1]))"]},{"cell_type":"code","execution_count":7,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":81,"referenced_widgets":["e1348a02ceeb4af19fbd63d52b7d843b","fbf51b14e6b34d0485ddf59c43d22c49","c29e06a72ac9401b8c41f4195021071e","48b812211db04284bfbbf02823fb879a","5455119809c74916acc50e1905903ded","2475bd62a3224bacb38a6334d07d6a8c","3d29947b5d2d4e2abc1355d900096642","3f7a8f56f15c434da70029366a37167a","3610a2db297f4686bf9043f2b7ee55b5","a1bd0616199e44538977ee2ea6049690","835fb9a91b34471fa6d61adf37616f52","d8de1a85076b453a92295e79110ba8fd","78d48ee2fb9f42089f475fcf5fc368c8","b0ca3012d0b84c5a9d7c1fc176251af7","39fa73efcbf54d8dad225d8380061dbf","6b6cc35257fe433e93736d02e898b6b8","e0fc900d8b5940a6bd6a97e58adb4651","6b7286d74e0f4a0199dbfcaf3dd0d622","a4bbd3df99cd4acab5e1b3ba5cd7c114","9a7140a6197945d5bac5c48b820dfb04","0bdc146792a64853ae06a9d185aa2b15","768da964ffcd44fea1af09e81f5621f3"]},"execution":{},"executionInfo":{"elapsed":29122,"status":"ok","timestamp":1720042363757,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"7ZggzGCXfjD6","outputId":"ae19f8d6-224d-4224-d3a0-d00c659ec9b2"},"outputs":[{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"e1348a02ceeb4af19fbd63d52b7d843b","version_major":2,"version_minor":0},"text/plain":[" 0%| | 0/1280000 [00:00"]},"metadata":{},"output_type":"display_data"}],"source":["plt.bar(range(100), [words[w] for w in sorted_words[:100]])\n","plt.show()"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"o9IYA0cZfjD7"},"source":["It is very common to find this kind of distribution when analyzing corpus of text. This is referred to as the [zipf's law](https://en.wikipedia.org/wiki/Zipf%27s_law)."]},{"cell_type":"markdown","metadata":{"execution":{},"id":"5FQIOqoRfjD7"},"source":["Usually the number of words in the dictionary will be very large.\n","\n","Here are some thing we can do to reduce that number:\n","\n","* Remove puntuation.\n","* Remove stop-words.\n","* Steaming.\n","* Remove very uncommon words (the words that appears in fewer than N occations).\n","* Nothing: we can use a pretrain model that handles this kind of situations.\n","\n","\n","We used one of the simplest tokenizers availables. This tokenizer does not take into account many quirks of the language. Moreover, diferent languages have different quirks, so there is no \"universal\" tokenizers. There are many libraries that have \"better\" tokenizers:\n","\n","* [Spacy](https://spacy.io/): it can be accessed using: `get_tokenizer(\"spacy\")`. Spacy supports a wide range of languages.\n","* [Huggingface](https://huggingface.co/): it has many tokenizers for different laguages. [Doc](https://huggingface.co/transformers/main_classes/tokenizer.html)\n","* [NLTK](https://www.nltk.org/): it provides several tokenizers. One of them can be accessed using: `get_tokenizer(\"toktok\")`\n"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"_ul5MgYcfjD7"},"source":["---\n","# Step 4: choose toolkit\n","\n","Our goal is to train a model capable of estimating the sentiment of a tweet (positive or negative) by reading its content. To that end we will try 2 different approaches:\n","\n","* A logistic regression using sklearn. **NOTE**: it can probaly work better than an SVM model.\n","* A simple Embedding + RNN."]},{"cell_type":"markdown","metadata":{"execution":{},"id":"GteI1PxTfjD7"},"source":["## Logistic regression\n","\n","We will represent our senteces using binary vectorization. This means that our data would be represented as a matrix of instances by word with a one if the word is in the instance, and zero otherwise. Sklean vectorizers can also do things such as stop-word removal and puntuation removal, you can read more about in [the documentation](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html)."]},{"cell_type":"code","execution_count":11,"metadata":{"execution":{},"executionInfo":{"elapsed":22699,"status":"ok","timestamp":1720042396408,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"S_ei2qu8fjD7"},"outputs":[],"source":["vectorizer = CountVectorizer(binary=True)\n","x_train_cv = vectorizer.fit_transform(x_train_text)\n","x_test_cv = vectorizer.transform(x_test_text)"]},{"cell_type":"code","execution_count":12,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":17,"status":"ok","timestamp":1720042396409,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"iK_zfqnLfjD7","outputId":"9b3f6db3-01bf-4246-b943-359620c717a2"},"outputs":[{"name":"stdout","output_type":"stream","text":["Before Vectorize: doesn't know how to spell conked \n"]}],"source":["print('Before Vectorize: ', x_train_text[3])"]},{"cell_type":"code","execution_count":13,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":5,"status":"ok","timestamp":1720042396409,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"wKxY8e38fjD8","outputId":"19530135-070d-4259-d6a9-7ba06b519763"},"outputs":[{"name":"stdout","output_type":"stream","text":["After Vectorize: \n"," (0, 528584)\t1\n"," (0, 165468)\t1\n"," (0, 300381)\t1\n"," (0, 242211)\t1\n"," (0, 489893)\t1\n"," (0, 134160)\t1\n"]}],"source":["# Notice that the matriz is sparse\n","print('After Vectorize: ')\n","print(x_train_cv[3])"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"QTPPEMd9fjD8"},"source":["Now we can train our model. You can check the documentation of this logistic regressor [here](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic#sklearn.linear_model.LogisticRegression)."]},{"cell_type":"code","execution_count":14,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":74},"execution":{},"executionInfo":{"elapsed":127277,"status":"ok","timestamp":1720042523682,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"2vEPOQS6fjD8","outputId":"3be77fc0-76e6-40b8-8847-5f6e7c6c0ce0"},"outputs":[{"data":{"text/html":["
LogisticRegression(solver='saga')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
"],"text/plain":["LogisticRegression(solver='saga')"]},"execution_count":14,"metadata":{},"output_type":"execute_result"}],"source":["model = LogisticRegression(solver='saga')\n","model.fit(x_train_cv, y_train)"]},{"cell_type":"code","execution_count":15,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":7,"status":"ok","timestamp":1720042523683,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"37bUbqB6fjD8","outputId":"7eb9178d-6130-47d0-bdf4-ce4be164bc97"},"outputs":[{"name":"stdout","output_type":"stream","text":[" precision recall f1-score support\n","\n"," 0 0.81 0.79 0.80 160000\n"," 1 0.79 0.81 0.80 160000\n","\n"," accuracy 0.80 320000\n"," macro avg 0.80 0.80 0.80 320000\n","weighted avg 0.80 0.80 0.80 320000\n","\n"]}],"source":["y_pred = model.predict(x_test_cv)\n","\n","print(classification_report(y_test, y_pred))"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"161kDLhofjD8"},"source":["## Explainable AI\n","The best thing about logistic regresion is that it is simple, and we can get some explanations."]},{"cell_type":"code","execution_count":16,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":1105,"status":"ok","timestamp":1720042524784,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"EILTmxzifjD9","outputId":"b7ce6853-7385-4a24-d4eb-e6d0843ca5d5"},"outputs":[{"name":"stdout","output_type":"stream","text":["(1, 589260)\n","589260\n"]}],"source":["print(model.coef_.shape)\n","print(len(vectorizer.vocabulary_))\n","\n","words_sk = list(vectorizer.vocabulary_.keys())\n","words_sk.sort(key=lambda w: model.coef_[0, vectorizer.vocabulary_[w]])"]},{"cell_type":"code","execution_count":17,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":12,"status":"ok","timestamp":1720042524784,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"NGjVPON6fjD9","outputId":"d40443bc-476d-4f5a-ce90-4b5b17e47933"},"outputs":[{"name":"stdout","output_type":"stream","text":["roni: -3.8625952420933984\n","inaperfectworld: -3.5734321547933936\n","dontyouhate: -3.5002133484207576\n","xbllygbsn: -3.4126303898325787\n","anqju: -3.3363997631497493\n","sad: -3.200516823534637\n","pakcricket: -3.1949062976331675\n","condolences: -3.132503698316079\n","heartbreaking: -3.0665219866881297\n","saddest: -3.042020604188048\n","sadd: -3.029036146667248\n","heartbroken: -3.0287524416643463\n","boohoo: -3.0226033087262802\n","sadface: -2.991829110065316\n","rachelle_lefevr: -2.925076661509848\n","disappointing: -2.902522686643491\n","lvbu: -2.8947109582208865\n","saddens: -2.8855187276040715\n","bummed: -2.836500453805889\n","neda: -2.792917726280752\n"]}],"source":["for w in words_sk[:20]:\n"," print('{}: {}'.format(w, model.coef_[0, vectorizer.vocabulary_[w]]))"]},{"cell_type":"code","execution_count":18,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":10,"status":"ok","timestamp":1720042524784,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"oxQ_jlNRfjD9","outputId":"363de58b-817a-4205-f019-2379d0d64e0d"},"outputs":[{"name":"stdout","output_type":"stream","text":["iamsoannoyed: 2.8493838469077013\n","myfax: 2.7974330510971424\n","jennamadison: 2.5667217237933104\n","yeyy: 2.4780234846131646\n","tryout: 2.438315611477797\n","goldymom: 2.4374072779309204\n","wooohooo: 2.402957513257194\n","thesupergirl: 2.356525094856456\n","iammaxathotspot: 2.3116551216589682\n","londicreations: 2.3074264075299316\n","smilin: 2.2991796213822497\n","worries: 2.2899555142510084\n","sinfulsignorita: 2.27989578448778\n","finchensnail: 2.2642827277181063\n","smackthis: 2.237672991997692\n","kv: 2.2157591386122775\n","tojosan: 2.2117938132889696\n","russmarshalek: 2.20953890861265\n","traciknoppe: 2.1768232307222153\n","congratulations: 2.1715901103136876\n"]}],"source":["for w in reversed(words_sk[-20:]):\n"," print('{}: {}'.format(w, model.coef_[0, vectorizer.vocabulary_[w]]))"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"9KSSAC3qfjD9"},"source":["What does this mean?\n","\n","Remember the `model.coef_` is the $W$ in:\n","\n","$$h(x)=\\sigma(WX + b)$$\n","\n","where the label 1 is a positive tweet and the label 0 is a negative tweet."]},{"cell_type":"markdown","metadata":{"execution":{},"id":"oDHjTP2_fjD9"},"source":["## Recurrent Neural Network with Pytorch"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"TbgpKy95fjD9"},"source":["In the previous section we use a Bag-Of-Words approach to represent each of the tweets. That meas that we only consider how many times each of the words appear in each of the tweets, we didnt take into account the order of the words. But we know that the word order is very important and carries relevant information.\n","\n","In this section we will solve the same task, but this time we will implement a Recurrent Neural Network (RNN) instead of using a simple Logistic Regression.Unlike feedforward neural networks, RNNs have cyclic connections making them powerful for modeling sequences.\n","\n","Let's start by importing the relevant libraries.\n"]},{"cell_type":"code","execution_count":19,"metadata":{"execution":{},"executionInfo":{"elapsed":8,"status":"ok","timestamp":1720042524784,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"7nmUJV99fjEB"},"outputs":[],"source":["def set_device():\n"," device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n"," if device != \"cuda\":\n"," print(\"WARNING: For this notebook to perform best, \"\n"," \"if possible, in the menu under `Runtime` -> \"\n"," \"`Change runtime type.` select `GPU` \")\n"," else:\n"," print(\"GPU is enabled in this notebook.\")\n","\n"," return device"]},{"cell_type":"code","execution_count":20,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":7,"status":"ok","timestamp":1720042524784,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"chI-18LcfjEB","outputId":"7f633079-6548-48f3-802e-94bc9cfada93"},"outputs":[{"name":"stdout","output_type":"stream","text":["GPU is enabled in this notebook.\n"]}],"source":["# Set the device (check if gpu is available)\n","device = set_device()"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"01UtIN7ofjEC"},"source":["First we will create a Dictionary (`word_to_idx`). This dictionary will map each Token (usually words) to an index (an integer number). We want to limit our dictionary to a certain number of tokens (`num_words_dict`), so we will include in our ditionary those with more occurrences."]},{"cell_type":"code","execution_count":21,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":5,"status":"ok","timestamp":1720042524784,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"afus9SyUfjEC","outputId":"bb4eb869-e2f0-4ccd-f64c-e55908272345"},"outputs":[{"data":{"text/plain":["['.', 'i', '!', \"'\", 'to', 'the', ',', 'a', 'my', 'it']"]},"execution_count":21,"metadata":{},"output_type":"execute_result"}],"source":["# From previous section, we have a list with the most used tokens\n","sorted_words[:10]"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"6vfQFjaufjEC"},"source":["Let's select only the most used."]},{"cell_type":"code","execution_count":22,"metadata":{"execution":{},"executionInfo":{"elapsed":5,"status":"ok","timestamp":1720042524785,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"tGLkxaGcfjEC"},"outputs":[],"source":["num_words_dict = 30000\n","# We reserve two numbers for special tokens.\n","most_used_words = sorted_words[:num_words_dict-2]"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"AzhQvekCfjEC"},"source":["We will add two extra Tokens to the dictionary, one for words outside the dictionary (`'UNK'`) and one for padding the sequences (`'PAD'`)."]},{"cell_type":"code","execution_count":23,"metadata":{"execution":{},"executionInfo":{"elapsed":4,"status":"ok","timestamp":1720042524785,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"73Wrb-lEfjEC"},"outputs":[],"source":["# dictionary to go from words to idx\n","word_to_idx = {}\n","# dictionary to go from idx to words (just in case)\n","idx_to_word = {}\n","\n","\n","# We include the special tokens first\n","PAD_token = 0\n","UNK_token = 1\n","\n","word_to_idx['PAD'] = PAD_token\n","word_to_idx['UNK'] = UNK_token\n","\n","idx_to_word[PAD_token] = 'PAD'\n","idx_to_word[UNK_token] = 'UNK'\n","\n","# We popullate our dictionaries with the most used words\n","for num,word in enumerate(most_used_words):\n"," word_to_idx[word] = num + 2\n"," idx_to_word[num+2] = word"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"kMHVkEisfjEC"},"source":["Our goal now is to transform each tweet from a sequence of tokens to a sequence of indexes. These sequences of indexes will be the input to our pytorch model."]},{"cell_type":"code","execution_count":24,"metadata":{"execution":{},"executionInfo":{"elapsed":4,"status":"ok","timestamp":1720042524785,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"tkCIu3PKfjED"},"outputs":[],"source":["# A function to convert list of tokens to list of indexes\n","def tokens_to_idx(sentences_tokens,word_to_idx):\n"," sentences_idx = []\n"," for sent in sentences_tokens:\n"," sent_idx = []\n"," for word in sent:\n"," if word in word_to_idx:\n"," sent_idx.append(word_to_idx[word])\n"," else:\n"," sent_idx.append(word_to_idx['UNK'])\n"," sentences_idx.append(sent_idx)\n"," return sentences_idx"]},{"cell_type":"code","execution_count":25,"metadata":{"execution":{},"executionInfo":{"elapsed":9346,"status":"ok","timestamp":1720042534127,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"aHru4vpzfjED"},"outputs":[],"source":["x_train_idx = tokens_to_idx(x_train_token,word_to_idx)\n","x_test_idx = tokens_to_idx(x_test_token,word_to_idx)"]},{"cell_type":"code","execution_count":26,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":8,"status":"ok","timestamp":1720042534127,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"Ofj3OD7zfjED","outputId":"b2788d03-dbfa-41d7-8231-5011206baa59"},"outputs":[{"name":"stdout","output_type":"stream","text":["Before converting: ['worst', 'headache', 'ever']\n","After converting: [721, 458, 237]\n"]}],"source":["some_number = 1\n","print('Before converting: ', x_train_token[some_number])\n","print('After converting: ', x_train_idx[some_number])"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"NcCicvb-fjED"},"source":["We need all the sequences to have the same length. To select an adequate sequence length, let's explore some statistics about the length of the tweets:"]},{"cell_type":"code","execution_count":27,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":6,"status":"ok","timestamp":1720042534128,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"BSjhdyYUfjED","outputId":"82e49be9-7868-44ac-b496-c7a48da1efee"},"outputs":[{"name":"stdout","output_type":"stream","text":["Max tweet word length: 229\n","Mean tweet word length: 15.0\n","99% percent under: 37.0\n"]}],"source":["tweet_lens = np.asarray([len(sentence) for sentence in x_train_idx])\n","print('Max tweet word length: ',tweet_lens.max())\n","print('Mean tweet word length: ',np.median(tweet_lens))\n","print('99% percent under: ',np.quantile(tweet_lens,0.99))"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"t311WY6ZfjEE"},"source":["We cut the sequences which are larger than our chosen maximum length (`max_lenght`) and fill with zeros the ones that are shorter."]},{"cell_type":"code","execution_count":28,"metadata":{"execution":{},"executionInfo":{"elapsed":5,"status":"ok","timestamp":1720042534128,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"r4S8KTWLfjEE"},"outputs":[],"source":[" # We choose the max length\n"," max_length = 40\n","\n","# A function to make all the sequence have the same lenght\n","# Note that the output is a Numpy matrix\n"," def padding(sentences, seq_len):\n"," features = np.zeros((len(sentences), seq_len),dtype=int)\n"," for ii, tweet in enumerate(sentences):\n"," len_tweet = len(tweet)\n"," if len_tweet != 0:\n"," if len_tweet <= seq_len:\n"," # If its shorter, we fill with zeros (the padding Token index)\n"," features[ii, -len(tweet):] = np.array(tweet)[:seq_len]\n"," if len_tweet > seq_len:\n"," # If its larger, we take the last 'seq_len' indexes\n"," features[ii, :] = np.array(tweet)[-seq_len:]\n"," return features"]},{"cell_type":"code","execution_count":29,"metadata":{"execution":{},"executionInfo":{"elapsed":4762,"status":"ok","timestamp":1720042538886,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"Z-Cw-bBxfjEE"},"outputs":[],"source":["# We convert our list of tokens into a numpy matrix\n","# where all instances have the same lenght\n","x_train_pad = padding(x_train_idx,max_length)\n","x_test_pad = padding(x_test_idx,max_length)\n","\n","# We convert our target list a numpy matrix\n","y_train_np = np.asarray(y_train)\n","y_test_np = np.asarray(y_test)"]},{"cell_type":"code","execution_count":30,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":12,"status":"ok","timestamp":1720042538886,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"8eC3YswlfjEE","outputId":"3bb0ea7f-518f-4545-9241-feb783f48122"},"outputs":[{"name":"stdout","output_type":"stream","text":["Before padding: [1, 3, 71, 24, 122, 3, 533, 74, 13, 4, 3, 102, 13, 209, 2, 12, 150, 4, 22, 5, 18, 667, 3, 138, 61, 7, 3296, 4]\n","After padding: [ 0 0 0 0 0 0 0 0 0 0 0 0 1 3\n"," 71 24 122 3 533 74 13 4 3 102 13 209 2 12\n"," 150 4 22 5 18 667 3 138 61 7 3296 4]\n"]}],"source":["some_number = 2\n","print('Before padding: ', x_train_idx[some_number])\n","print('After padding: ', x_train_pad[some_number])"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"SzDhnauUfjEE"},"source":["Now, let's convert the data to pytorch format.\n"]},{"cell_type":"code","execution_count":31,"metadata":{"execution":{},"executionInfo":{"elapsed":10,"status":"ok","timestamp":1720042538886,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"--Yd22YWfjEF"},"outputs":[],"source":["# create Tensor datasets\n","train_data = TensorDataset(torch.from_numpy(x_train_pad), torch.from_numpy(y_train_np))\n","valid_data = TensorDataset(torch.from_numpy(x_test_pad), torch.from_numpy(y_test_np))\n","\n","# Batch size (this is an important hyperparameter)\n","batch_size = 100\n","\n","# dataloaders\n","# make sure to SHUFFLE your data\n","train_loader = DataLoader(train_data, shuffle=True, batch_size=batch_size,drop_last = True)\n","valid_loader = DataLoader(valid_data, shuffle=True, batch_size=batch_size,drop_last = True)"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"jQ5qPOWTfjEF"},"source":["Each batch of data in our traning proccess will have the folllowing format:"]},{"cell_type":"code","execution_count":33,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":598,"status":"ok","timestamp":1720042563992,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"S1mqhk1hfjEF","outputId":"c97e7edd-695f-4336-a2e6-f6bed4852a63"},"outputs":[{"name":"stdout","output_type":"stream","text":["Sample input size: torch.Size([100, 40])\n","Sample input: \n"," tensor([[ 0, 0, 0, ..., 32, 203, 86],\n"," [ 0, 0, 0, ..., 1, 1, 4661],\n"," [ 0, 0, 0, ..., 169, 43, 34],\n"," ...,\n"," [ 0, 0, 0, ..., 2, 2961, 4076],\n"," [ 0, 0, 0, ..., 2319, 1325, 2],\n"," [ 0, 0, 0, ..., 7, 253, 1]])\n","Sample input: \n"," tensor([0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1,\n"," 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0,\n"," 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,\n"," 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1,\n"," 0, 1, 0, 1])\n"]}],"source":["# Obtain one batch of training data\n","dataiter = iter(train_loader)\n","sample_x, sample_y = dataiter.__next__()\n","\n","print('Sample input size: ', sample_x.size()) # batch_size, seq_length\n","print('Sample input: \\n', sample_x)\n","print('Sample input: \\n', sample_y)"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"jn0PzZdGfjEF"},"source":["Now, we will define the `SentimentRNN` class. Most of the model's class will be familiar to you, but there are two important layers we would like you to pay attention to:\n","\n","* Embedding Layer\n","> This layer is like a linear layer, but it makes it posible to use a sequence of inedexes as inputs (instead of a sequence of one-hot-encoded vectors). During training, the Embedding layer learns a linear transformation from the space of words (a vector space of dimension `num_words_dict`) into the a new, smaller, vector space of dimension `embedding_dim`. We suggest you to read this [thread](https://discuss.pytorch.org/t/how-does-nn-embedding-work/88518/3) and the [pytorch documentation](https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html) if you want to learn more about this particular kind of layers.\n","\n","\n","* LSTM layer\n","> This is one of the most used class of Recurrent Neural Networks. In Pytorch we can add several stacked layers in just one line of code. In our case, the number of layers added are decided with the parameter `no_layers`. If you want to learn more about LSTMs we strongly recommend you this [Colahs thread](https://colah.github.io/posts/2015-08-Understanding-LSTMs/) about them.\n","\n","\n","\n","\n","\n"]},{"cell_type":"code","execution_count":34,"metadata":{"execution":{},"executionInfo":{"elapsed":433,"status":"ok","timestamp":1720042567199,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"vfzcowAxfjEF"},"outputs":[],"source":["class SentimentRNN(nn.Module):\n"," def __init__(self,no_layers,vocab_size,hidden_dim,embedding_dim,drop_prob=0.1):\n"," super(SentimentRNN,self).__init__()\n","\n"," self.output_dim = output_dim\n"," self.hidden_dim = hidden_dim\n"," self.no_layers = no_layers\n"," self.vocab_size = vocab_size\n"," self.drop_prob = drop_prob\n","\n"," # Embedding Layer\n"," self.embedding = nn.Embedding(vocab_size, embedding_dim)\n","\n"," # LSTM Layers\n"," self.lstm = nn.LSTM(input_size=embedding_dim,hidden_size=self.hidden_dim,\n"," num_layers=no_layers, batch_first=True,\n"," dropout=self.drop_prob)\n","\n"," # Dropout layer\n"," self.dropout = nn.Dropout(drop_prob)\n","\n"," # Linear and Sigmoid layer\n"," self.fc = nn.Linear(self.hidden_dim, output_dim)\n"," self.sig = nn.Sigmoid()\n","\n"," def forward(self,x,hidden):\n"," batch_size = x.size(0)\n","\n"," # Embedding out\n"," embeds = self.embedding(x)\n"," #Shape: [batch_size x max_length x embedding_dim]\n","\n"," # LSTM out\n"," lstm_out, hidden = self.lstm(embeds, hidden)\n"," # Shape: [batch_size x max_length x hidden_dim]\n","\n"," # Select the activation of the last Hidden Layer\n"," lstm_out = lstm_out[:,-1,:].contiguous()\n"," # Shape: [batch_size x hidden_dim]\n","\n"," ## You can instead average the activations across all the times\n"," # lstm_out = torch.mean(lstm_out, 1).contiguous()\n","\n"," # Dropout and Fully connected layer\n"," out = self.dropout(lstm_out)\n"," out = self.fc(out)\n","\n"," # Sigmoid function\n"," sig_out = self.sig(out)\n","\n"," # return last sigmoid output and hidden state\n"," return sig_out, hidden\n","\n"," def init_hidden(self, batch_size):\n"," ''' Initializes hidden state '''\n"," # Create two new tensors with sizes n_layers x batch_size x hidden_dim,\n"," # initialized to zero, for hidden state and cell state of LSTM\n"," h0 = torch.zeros((self.no_layers,batch_size,self.hidden_dim)).to(device)\n"," c0 = torch.zeros((self.no_layers,batch_size,self.hidden_dim)).to(device)\n"," hidden = (h0,c0)\n"," return hidden"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"YfrLPa9mfjEF"},"source":["We choose the parameters of the model."]},{"cell_type":"code","execution_count":35,"metadata":{"execution":{},"executionInfo":{"elapsed":471,"status":"ok","timestamp":1720042569608,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"rOm-xoFkfjEG"},"outputs":[],"source":["# Parameters of our network\n","\n","# Size of our vocabulary\n","vocab_size = num_words_dict\n","\n","# Embedding dimension\n","embedding_dim = 32\n","\n","# Number of stacked LSTM layers\n","no_layers = 2\n","\n","# Dimension of the hidden layer in LSTMs\n","hidden_dim = 64\n","\n","# Dropout parameter for regularization\n","output_dim = 1\n","\n","# Dropout parameter for regularization\n","drop_prob = 0.25"]},{"cell_type":"code","execution_count":36,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":465,"status":"ok","timestamp":1720042571776,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"xapxpe7ufjEG","outputId":"51c90159-7d2b-4fc4-f34a-98e9901d40e4"},"outputs":[{"name":"stdout","output_type":"stream","text":["SentimentRNN(\n"," (embedding): Embedding(30000, 32)\n"," (lstm): LSTM(32, 64, num_layers=2, batch_first=True, dropout=0.25)\n"," (dropout): Dropout(p=0.25, inplace=False)\n"," (fc): Linear(in_features=64, out_features=1, bias=True)\n"," (sig): Sigmoid()\n",")\n"]}],"source":["# Let's define our model\n","model = SentimentRNN(no_layers, vocab_size, hidden_dim,\n"," embedding_dim, drop_prob=drop_prob)\n","# Moving to gpu\n","model.to(device)\n","print(model)"]},{"cell_type":"code","execution_count":37,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":3,"status":"ok","timestamp":1720042571776,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"GEvTs3uwfjEG","outputId":"2e15f6df-2aa8-4665-b2da-7363d2bfa09e"},"outputs":[{"name":"stdout","output_type":"stream","text":["Total Number of parameters: 1018433\n"]}],"source":["# How many trainable parameters does our model have?\n","model_parameters = filter(lambda p: p.requires_grad, model.parameters())\n","params = sum([np.prod(p.size()) for p in model_parameters])\n","print('Total Number of parameters: ',params)"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"Pc2OC5GDfjEG"},"source":["We choose the losses and the optimizer for the training procces."]},{"cell_type":"code","execution_count":38,"metadata":{"execution":{},"executionInfo":{"elapsed":1740,"status":"ok","timestamp":1720042574210,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"iBWjPADUfjEG"},"outputs":[],"source":["# loss and optimization functions\n","lr = 0.001\n","\n","# Binary crossentropy is a good loss function for a binary classification problem\n","criterion = nn.BCELoss()\n","\n","# We choose an Adam optimizer\n","optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n","\n","# function to predict accuracy\n","def acc(pred,label):\n"," pred = torch.round(pred.squeeze())\n"," return torch.sum(pred == label.squeeze()).item()"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"OZgMwOe2fjEG"},"source":["We are ready to train our model."]},{"cell_type":"code","execution_count":39,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{},"executionInfo":{"elapsed":304614,"status":"ok","timestamp":1720042880244,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"3B6YhEocfjEH","outputId":"76276a1f-7775-4b98-aab0-0e199aa133e4"},"outputs":[{"name":"stdout","output_type":"stream","text":["Epoch 1\n","train_loss : 0.4366412344621494 val_loss : 0.3881208170717582\n","train_accuracy : 79.485546875 val_accuracy : 82.475\n","Validation loss decreased (inf --> 0.388121). Saving model ...\n","==================================================\n","Epoch 2\n","train_loss : 0.3760281792609021 val_loss : 0.3713956154882908\n","train_accuracy : 83.186328125 val_accuracy : 83.4575\n","Validation loss decreased (0.388121 --> 0.371396). Saving model ...\n","==================================================\n","Epoch 3\n","train_loss : 0.3574051411205437 val_loss : 0.36425656544510276\n","train_accuracy : 84.19953125 val_accuracy : 83.80375\n","Validation loss decreased (0.371396 --> 0.364257). Saving model ...\n","==================================================\n","Epoch 4\n","train_loss : 0.344456663565943 val_loss : 0.3613302929420024\n","train_accuracy : 84.89265625 val_accuracy : 84.00874999999999\n","Validation loss decreased (0.364257 --> 0.361330). Saving model ...\n","==================================================\n","Epoch 5\n","train_loss : 0.33407817618339325 val_loss : 0.3601334386831149\n","train_accuracy : 85.444921875 val_accuracy : 84.03625\n","Validation loss decreased (0.361330 --> 0.360133). Saving model ...\n","==================================================\n"]}],"source":["# Number of training Epochs\n","epochs = 5\n","\n","# Maximum absolute value accepted for the gradeint\n","clip = 5\n","\n","# Initial Loss value (assumed big)\n","valid_loss_min = np.Inf\n","\n","# Lists to follow the evolution of the loss and accuracy\n","epoch_tr_loss,epoch_vl_loss = [],[]\n","epoch_tr_acc,epoch_vl_acc = [],[]\n","\n","# Train for a number of Epochs\n","for epoch in range(epochs):\n"," train_losses = []\n"," train_acc = 0.0\n"," model.train()\n","\n"," for inputs, labels in train_loader:\n","\n"," # Initialize hidden state\n"," h = model.init_hidden(batch_size)\n"," # Creating new variables for the hidden state\n"," h = tuple([each.data.to(device) for each in h])\n","\n"," # Move batch inputs and labels to gpu\n"," inputs, labels = inputs.to(device), labels.to(device)\n","\n"," # Set gradient to zero\n"," model.zero_grad()\n","\n"," # Compute model output\n"," output,h = model(inputs,h)\n","\n"," # Calculate the loss and perform backprop\n"," loss = criterion(output.squeeze(), labels.float())\n"," loss.backward()\n"," train_losses.append(loss.item())\n","\n"," # calculating accuracy\n"," accuracy = acc(output,labels)\n"," train_acc += accuracy\n","\n"," #`clip_grad_norm` helps prevent the exploding gradient problem in RNNs / LSTMs.\n"," nn.utils.clip_grad_norm_(model.parameters(), clip)\n"," optimizer.step()\n","\n","\n"," # Evaluate on the validation set for this epoch\n"," val_losses = []\n"," val_acc = 0.0\n"," model.eval()\n"," for inputs, labels in valid_loader:\n","\n"," # Initialize hidden state\n"," val_h = model.init_hidden(batch_size)\n"," val_h = tuple([each.data.to(device) for each in val_h])\n","\n"," # Move batch inputs and labels to gpu\n"," inputs, labels = inputs.to(device), labels.to(device)\n","\n"," # Compute model output\n"," output, val_h = model(inputs, val_h)\n","\n"," # Compute Loss\n"," val_loss = criterion(output.squeeze(), labels.float())\n","\n"," val_losses.append(val_loss.item())\n","\n"," accuracy = acc(output,labels)\n"," val_acc += accuracy\n","\n"," epoch_train_loss = np.mean(train_losses)\n"," epoch_val_loss = np.mean(val_losses)\n"," epoch_train_acc = train_acc/len(train_loader.dataset)\n"," epoch_val_acc = val_acc/len(valid_loader.dataset)\n"," epoch_tr_loss.append(epoch_train_loss)\n"," epoch_vl_loss.append(epoch_val_loss)\n"," epoch_tr_acc.append(epoch_train_acc)\n"," epoch_vl_acc.append(epoch_val_acc)\n"," print(f'Epoch {epoch+1}')\n"," print(f'train_loss : {epoch_train_loss} val_loss : {epoch_val_loss}')\n"," print(f'train_accuracy : {epoch_train_acc*100} val_accuracy : {epoch_val_acc*100}')\n"," if epoch_val_loss <= valid_loss_min:\n"," print('Validation loss decreased ({:.6f} --> {:.6f}). Saving model ...'.format(valid_loss_min,epoch_val_loss))\n"," # torch.save(model.state_dict(), '../working/state_dict.pt')\n"," valid_loss_min = epoch_val_loss\n"," print(25*'==')"]},{"cell_type":"code","execution_count":40,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":364},"execution":{},"executionInfo":{"elapsed":894,"status":"ok","timestamp":1720042881135,"user":{"displayName":"Dalia Nasr","userId":"11103095680145801589"},"user_tz":-180},"id":"ttJazP-nfjEH","outputId":"992bed02-611e-4614-c60f-77223d5b801a"},"outputs":[{"data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAABkoAAAIQCAYAAADO7zKKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADxbklEQVR4nOzdd3xUVfrH8c/MpJNGKgECCZ1QlRKkWQhVIyAqooKg2HFV1sYKIipi2WWxrfhTEAsuVhQXBAII0psivSeEmkKAhASSycz8/ggMxIQSJuGmfN+vFy+Yc8+997kPE5h7nznnmBwOhwMREREREREREREREZEqyGx0ACIiIiIiIiIiIiIiIkZRoURERERERERERERERKosFUpERERERERERERERKTKUqFERERERERERERERESqLBVKRERERERERERERESkylKhREREREREREREREREqiwVSkREREREREREREREpMpSoURERERERERERERERKosFUpERERERERERERERKTKUqFERERERERERERERESqLBVKREQqsP/85z+YTCZiY2ONDkVERERERKTSmjZtGiaTiXXr1hkdioiIlAEVSkREKrDp06cTFRXFmjVr2L17t9HhiIiIiIiIiIiIVDgqlIiIVFCJiYmsWLGCiRMnEhoayvTp040OqVjZ2dlGhyAiIiIiIiIiInJBKpSIiFRQ06dPp3r16tx8883cfvvtxRZKjh8/ztNPP01UVBSenp7Url2bIUOGkJ6e7uxz+vRpXn75ZRo1aoSXlxcRERHcdttt7NmzB4DFixdjMplYvHhxoWMnJSVhMpmYNm2as23o0KH4+vqyZ88e+vTpg5+fH/fccw8AS5cu5Y477qBOnTp4enoSGRnJ008/zalTp4rEvX37du68805CQ0Px9vamcePGvPjiiwD8+uuvmEwmZs6cWWS/r776CpPJxMqVK0ucTxEREREREVf88ccf9O7dG39/f3x9fenWrRurVq0q1MdqtTJu3DgaNmyIl5cXwcHBdO7cmYSEBGefI0eOMGzYMGrXro2npycRERH07duXpKSkq3xFIiJVh5vRAYiIyJWZPn06t912Gx4eHgwaNIgPP/yQtWvX0q5dOwBOnjxJly5d2LZtG/fffz/XXnst6enpzJo1iwMHDhASEoLNZuOWW25h4cKF3HXXXTz55JNkZWWRkJDA5s2bqV+/fonjys/Pp2fPnnTu3Jl//vOf+Pj4APDtt9+Sk5PDo48+SnBwMGvWrOG9997jwIEDfPvtt879N27cSJcuXXB3d+ehhx4iKiqKPXv28PPPPzN+/HhuuOEGIiMjmT59Ov379y+Sk/r163Pddde5kFkREREREZGS2bJlC126dMHf35/nnnsOd3d3PvroI2644QaWLFniXFfy5ZdfZsKECQwfPpz27duTmZnJunXr+P333+nevTsAAwYMYMuWLTzxxBNERUWRmppKQkICycnJREVFGXiVIiKVlwolIiIV0Pr169m+fTvvvfceAJ07d6Z27dpMnz7dWSh5++232bx5Mz/88EOhgsLo0aNxOBwAfP755yxcuJCJEyfy9NNPO/u88MILzj4llZubyx133MGECRMKtb/55pt4e3s7Xz/00EM0aNCAf/zjHyQnJ1OnTh0AnnjiCRwOB7///ruzDeCNN94AwGQyce+99zJx4kROnDhBQEAAAGlpacyfP9858kRERERERORqGT16NFarlWXLllGvXj0AhgwZQuPGjXnuuedYsmQJALNnz6ZPnz783//9X7HHOX78OCtWrODtt9/mmWeecbaPGjWq7C9CRKQK09RbIiIV0PTp0wkPD+fGG28ECooHAwcOZMaMGdhsNgC+//57WrVqVWTUxdn+Z/uEhITwxBNPXLDPlXj00UeLtJ1fJMnOziY9PZ2OHTvicDj4448/gIJix2+//cb9999fqEjy13iGDBlCbm4u3333nbPt66+/Jj8/n3vvvfeK4xYRERERESkpm83G/Pnz6devn7NIAhAREcHdd9/NsmXLyMzMBCAwMJAtW7awa9euYo/l7e2Nh4cHixcv5tixY1clfhERUaFERKTCsdlszJgxgxtvvJHExER2797N7t27iY2NJSUlhYULFwKwZ88emjdvftFj7dmzh8aNG+PmVnoDDN3c3Khdu3aR9uTkZIYOHUpQUBC+vr6EhoZy/fXXA3DixAkA9u7dC3DJuJs0aUK7du0Krcsyffp0OnToQIMGDUrrUkRERERERC4pLS2NnJwcGjduXGRb06ZNsdvt7N+/H4BXXnmF48eP06hRI1q0aMGzzz7Lxo0bnf09PT158803+eWXXwgPD6dr16689dZbHDly5Kpdj4hIVaRCiYhIBbNo0SIOHz7MjBkzaNiwofPX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WJnE0E7RRoclIiIiZaUsntNerhI8px04cCCfffYZo0ePrjLPaX/99VciIiJK9Jz2fO+88w7/+te/+PDDD2nYsCHffvstt956K1u2bKFhw4a8++67zJo1i2+++YY6deqwf/9+9u/fDxTMHvTvf/+bGTNm0KxZM44cOcKff/55Wee9UlWzUGLNgddrluohzUDg5XT8xyHwuLy55+6//37efvttlixZwg033AAUDOcaMGAAAQEBBAQE8Mwzzzj7P/HEE8ybN49vvvnmsn4AFyxYwPbt25k3bx41axbk4/XXX6d3796F+o0ePdr556ioKJ555hlmzJjBc889h7e3N76+vri5uV10CNdXX33F6dOn+fzzz51z773//vvEx8fz5ptvOoeaVa9enffffx+LxUKTJk24+eabWbhw4UV/AKdOnUrv3r2d8+z17NmTTz/9lJdffhmADz74gICAAGbMmIG7e8HDnEaNGjn3f+211/j73//Ok08+6Wxr167dJfMnIiJSkeXb7Gw+mMmvh0z8PP0P1iUf53hO4W8HebiZaR0Z6CyMXFunOtU8q+bHRxG5emoGevN8r8aM+WkLb83bQVxMOLWr+xgdloiIiJSFMnhOe9lK8Jz23nvv5b333qsSz2nDw8OBK3tOe75//vOfPP/889x1111kZmbyxhtvsHjxYiZNmsQHH3xAcnIyDRs2pHPnzphMJueX3gGSk5OpUaMGcXFxuLu7U6dOncvKoyt0p1uONWnShI4dOzJ16lRuuOEGdu/ezdKlS3nllVcAsNlsvP7663zzzTccPHiQvLw8cnNz8fG5vJuIbdu2ERkZ6fzhA7juuuuK9Pv6669599132bNnDydPniQ/Px9/f/8SXcu2bdto1apVoQWKOnXqhN1uZ8eOHc5CSUxMDBaLxdknIiKCTZs2XfC4NpuNzz77jHfeecfZdu+99/LMM8/w0ksvYTab2bBhA126dHEWSc6XmprKoUOH6NatW4muR0REpKLJy7ez6eBxVp1ZX2T9vmOczM0HLEAaAD4eFtrUrU77qILCSKvIQLzcLRc9rohIWbgnti6z/jzE2qRj/GPmZj4b1s757U0RERGRq61Ro0ZV5jnt2UJJs2bNSvSc9nyZmZkcOnSITp06FWrv1KmTc2TI0KFD6d69O40bN6ZXr17ccsst9OjRA4A77riDSZMmUa9ePXr1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0W/068C/txymvNJG1+ZVjOrqb3Q5IiIiIiIiIiIiIiLXlZPFTI+Q5vQIac6U4eGcKavku8O51TNO9p3IJzGzEL+A+r8Ul4KSOjBzXARtfdzgRHyDXH9NRERERERERERERMQRbs4WhnZsydCOLQHILSpj48FM0vbvMriyK2sYC4TVcxaziftvaoOfq9GViIiIiIiIiIiIiIgYz8fDmdsiAwlpZnQlV6agREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mQpKBERERERERERERERkSZLQYmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlAiIiIiIiIiIiIiIiJNloISERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mQpKBERERERERERERERkSZLQYmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlAiIiIiIiIiIiIiIiJNloISERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwnowuoKzabDYD8/HxDXr+8vJzi4mLy8/OxWq2G1NCQqX+OUf8co/45Rv1zjPrnGPXPMeqfY4zu37mfe8/9HCxyJRozNWzqn2PUP8eof45R/xyj/jlG/XOceugYo/t3teOmRhOUFBQUABASEmJwJSIiIiIiN05BQQHe3t5GlyENgMZMIiIiItJUXWncZLI1kj9Bq6qq4sSJE3h6emIymW746+fn5xMSEsLRo0fx8vK64a/f0Kl/jlH/HKP+OUb9c4z65xj1zzHqn2OM7p/NZqOgoIBWrVphNmtFXbkyjZkaNvXPMeqfY9Q/x6h/jlH/HKP+OU49dIzR/bvacVOjmVFiNptp3bq10WXg5eWl/2AcoP45Rv1zjPrnGPXPMeqfY9Q/x6h/jjGyf5pJIrWhMVPjoP45Rv1zjPrnGPXPMeqfY9Q/x6mHjqnv4yb96ZmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlBSR1xcXJg5cyYuLi5Gl9IgqX+OUf8co/45Rv1zjPrnGPXPMeqfY9Q/kdrRfzOOUf8co/45Rv1zjPrnGPXPMeqf49RDxzSU/jWazdxFRERERERERERERERqSzNKRERERERERERERESkyVJQIiIiIiIiIiIiIiIiTZaCEhERERERERERERERabIUlIiIiIiIiIiIiIiISJOloKQW5s+fT2hoKK6urvTv35/t27f/6PWffPIJnTt3xtXVlaioKJYvX36DKq2fatO/RYsWYTKZahyurq43sNr6Y/369YwbN45WrVphMplYunTpFR8TGxtLr169cHFxITw8nEWLFl33Ouur2vYvNjb2oveeyWQiIyPjxhRcz8yZM4e+ffvi6emJv78/EyZMIDEx8YqP0/c/u2vpn77/nbdgwQK6deuGl5cXXl5eDBgwgK+//vpHH6P33nm17Z/eez/uT3/6EyaTiSeeeOJHr9N7UJo6jZkcozHTtdO4yTEaN107jZkcozGT4zRucozGTXWnoY+ZFJRcpY8//piYmBhmzpzJrl276N69O6NHjyYrK+uS12/evJl7772XX/7yl+zevZsJEyYwYcIE4uPjb3Dl9UNt+wfg5eVFenp69XHkyJEbWHH9UVRURPfu3Zk/f/5VXZ+amsrYsWMZPnw4e/bs4YknnuChhx7im2++uc6V1k+17d85iYmJNd5//v7+16nC+m3dunVMmTKFrVu3smrVKsrLyxk1ahRFRUWXfYy+/513Lf0Dff87p3Xr1vzpT39i586d7Nixg5tvvpnx48ezb9++S16v915Nte0f6L13Od999x1vvvkm3bp1+9Hr9B6Upk5jJsdozOQYjZsco3HTtdOYyTEaMzlO4ybHaNxUNxrFmMkmV6Vfv362KVOmVH9eWVlpa9WqlW3OnDmXvP6nP/2pbezYsTXO9e/f3/arX/3qutZZX9W2f++++67N29v7BlXXcAC2JUuW/Og1v//9720RERE1zt1zzz220aNHX8fKGoar6d/atWttgO3UqVM3pKaGJisrywbY1q1bd9lr9P3v8q6mf/r+9+NatGhhe/vtty/5Nb33ruzH+qf33qUVFBTYOnToYFu1apVt2LBhtmnTpl32Wr0HpanTmMkxGjPVHY2bHKNxk2M0ZnKMxkx1Q+Mmx2jcVDuNZcykGSVXoaysjJ07dzJixIjqc2azmREjRrBly5ZLPmbLli01rgcYPXr0Za9vzK6lfwCFhYW0bduWkJCQKya5cp7ee3WjR48eBAUFMXLkSDZt2mR0OfVGXl4eAD4+Ppe9Ru/By7ua/oG+/11KZWUlH330EUVFRQwYMOCS1+i9d3lX0z/Qe+9SpkyZwtixYy96b12K3oPSlGnM5BiNmW48vf/qhsZNF9OYyTEaMzlG4ybHaNx0bRrLmElByVXIycmhsrKSgICAGucDAgIuu/5mRkZGra5vzK6lf506deKdd97h888/Z/HixVRVVTFw4ECOHTt2I0pu0C733svPz+fMmTMGVdVwBAUFsXDhQj799FM+/fRTQkJCiI6OZteuXUaXZriqqiqeeOIJBg0aRGRk5GWv0/e/S7va/un7X01xcXE0a9YMFxcXHn30UZYsWULXrl0vea3eexerTf/03rvYRx99xK5du5gzZ85VXa/3oDRlGjM5RmOmG0/jJsdo3HRpGjM5RmOma6dxk2M0brp2jWnM5GR0ASKXMmDAgBrJ7cCBA+nSpQtvvvkmL730koGVSWPXqVMnOnXqVP35wIEDSU5O5tVXX+X99983sDLjTZkyhfj4eDZu3Gh0KQ3S1fZP3/9q6tSpE3v27CEvL4///e9/TJo0iXXr1l32h1apqTb903uvpqNHjzJt2jRWrVqlzRlFpF7S920xksZNl6Yxk2M0Zrp2Gjc5RuOma9PYxkwKSq6Cn58fFouFzMzMGuczMzMJDAy85GMCAwNrdX1jdi39+yGr1UrPnj1JSkq6HiU2Kpd773l5eeHm5mZQVQ1bv379mvwPulOnTuWrr75i/fr1tG7d+kev1fe/i9Wmfz/U1L//OTs7Ex4eDkDv3r357rvveO2113jzzTcvulbvvYvVpn8/1NTfezt37iQrK4tevXpVn6usrGT9+vX84x//oLS0FIvFUuMxeg9KU6Yxk2M0ZrrxNG6qe0193KQxk2M0ZnKMxk2O0bjp2jS2MZOW3roKzs7O9O7dm9WrV1efq6qqYvXq1Zddr27AgAE1rgdYtWrVj65v11hdS/9+qLKykri4OIKCgq5XmY2G3nt1b8+ePU32vWez2Zg6dSpLlixhzZo1tGvX7oqP0XvwvGvp3w/p+19NVVVVlJaWXvJreu9d2Y/174ea+nvvlltuIS4ujj179lQfffr04ec//zl79uy56Ad+0HtQmjaNmRyjMdONp/df3Wuq4yaNmRyjMdP1oXGTYzRuujqNbsxk7F7yDcdHH31kc3FxsS1atMi2f/9+2yOPPGJr3ry5LSMjw2az2WwTJ060Pf3009XXb9q0yebk5GT761//aktISLDNnDnTZrVabXFxcUbdgqFq279Zs2bZvvnmG1tycrJt586dtp/97Gc2V1dX2759+4y6BcMUFBTYdu/ebdu9e7cNsM2dO9e2e/du25EjR2w2m8329NNP2yZOnFh9fUpKis3d3d321FNP2RISEmzz58+3WSwW24oVK4y6BUPVtn+vvvqqbenSpbZDhw7Z4uLibNOmTbOZzWbbt99+a9QtGOqxxx6zeXt722JjY23p6enVR3FxcfU1+v53edfSP33/O+/pp5+2rVu3zpaammrbu3ev7emnn7aZTCbbypUrbTab3ntXUtv+6b13ZcOGDbNNmzat+nO9B0Vq0pjJMRozOUbjJsdo3HTtNGZyjMZMjtO4yTEaN9WthjxmUlBSC6+//rqtTZs2NmdnZ1u/fv1sW7durf7asGHDbJMmTapx/X//+19bx44dbc7OzraIiAjbsmXLbnDF9Utt+vfEE09UXxsQEGAbM2aMbdeuXQZUbby1a9fagIuOc/2aNGmSbdiwYRc9pkePHjZnZ2db+/btbe++++4Nr7u+qG3/XnnlFVtYWJjN1dXV5uPjY4uOjratWbPGmOLrgUv1DqjxntL3v8u7lv7p+995Dz74oK1t27Y2Z2dnW8uWLW233HJL9Q+rNpvee1dS2/7pvXdlP/yhX+9BkYtpzOQYjZmuncZNjtG46dppzOQYjZkcp3GTYzRuqlsNecxkstlstrqfpyIiIiIiIiIiIiIiIlL/aY8SERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mQpKBERERERERERERERkSZLQYmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlAiIiIiIiIiIiIiIiJNloISERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mT9P7WuLgMvviw8AAAAAElFTkSuQmCC","text/plain":["
"]},"metadata":{},"output_type":"display_data"}],"source":["fig = plt.figure(figsize = (20, 6))\n","plt.subplot(1, 2, 1)\n","plt.plot(epoch_tr_acc, label='Train Acc')\n","plt.plot(epoch_vl_acc, label='Validation Acc')\n","plt.title(\"Accuracy\")\n","plt.legend()\n","plt.grid()\n","\n","plt.subplot(1, 2, 2)\n","plt.plot(epoch_tr_loss, label='Train loss')\n","plt.plot(epoch_vl_loss, label='Validation loss')\n","plt.title(\"Loss\")\n","plt.legend()\n","plt.grid()\n","\n","plt.show()"]},{"cell_type":"markdown","metadata":{"execution":{},"id":"iUyaF-EbfjEH"},"source":["---\n","# What's Next?\n","\n","You can use this project template as a starting point to think about your own project. There are a lot of ways to continue, here we share with you some ideas you migth find useful:\n","\n","* **Work on the Preproccesing.** We used a very rudimentary way to tokenize tweets. But there are better ways to preprocess the data. Can you think of a suitable way to preprocess the data for this particular task? How does the performance of the model change when the data is processed correctly?\n","* **Work on the Model.** The RNN model proposed in this notebook is not optimized at all. You can work on finding a better architecture or better hyperparamenters. May be using bidirectonal LSTMs or increasing the number of stacked layers can improve the performance, feel free to try different approaches.\n","* **Work on the Embedding.** Our model learnt an embedding during the training on this Twitter corpus for a particular task. You can explore the representation of different words in this learned embedding. Also, you can try using different word embeddings. You can train them on this corpus or you can use an embedding trained on another corpus of data. How does the change of the embedding affect the model performance?\n","* **Try sentiment analysis on another dataset.** There are lots of available dataset to work with, we can help you find one that is interesting to you. Do you belive that a sentiment analysis model trained on some corpus (Twitter dataset) will perform well on another type of data (for example, youtube comments)?\n","\n"]}],"metadata":{"accelerator":"GPU","colab":{"provenance":[],"toc_visible":true},"kernel":{"display_name":"Python 3","language":"python","name":"python3"},"kernelspec":{"display_name":"Python 3","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.11.2"},"widgets":{"application/vnd.jupyter.widget-state+json":{"057e918ace004506aedc4e4b9942c3a8":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_9baa1a735c0646b89953bf4a7c7fc92c","placeholder":"​","style":"IPY_MODEL_0ac9711c8ece4c5397a8cd810713adfb","value":"Downloading readme: 100%"}},"0ac9711c8ece4c5397a8cd810713adfb":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"0bdc146792a64853ae06a9d185aa2b15":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"1cef38981af6457dbaeb393f9936a389":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_b0b5cfae51214c60bbca9a09b196c217","IPY_MODEL_5ee2a4b33be04c6db8ee4d7995c2376d","IPY_MODEL_403fffb635c2409ebeabc90063750ed3"],"layout":"IPY_MODEL_6279343019064572adedf34cfbd437fa"}},"1cf3ba0f756f4aa5ad1dcb675a791cfa":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"2475bd62a3224bacb38a6334d07d6a8c":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"252949e8784c4878a62eb2e30b1e3466":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"2715d00db77545f9aa5eace8a0eb2839":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"2c42e2fef6314c9e842a7e9641af3cab":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"2ead0216695e4227aef44552f4ec3cc9":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_a9a0f6ce71ed415c8c8513f68e34e162","max":1600000,"min":0,"orientation":"horizontal","style":"IPY_MODEL_7f638a6deacd42e88c031fa47797516b","value":1600000}},"325387f6b62d47b0b21bea61676cea72":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_a8d69769921241b8b1081e84f7770858","max":6837,"min":0,"orientation":"horizontal","style":"IPY_MODEL_d189f24b0e964d1a9fc86379bad38cca","value":6837}},"3610a2db297f4686bf9043f2b7ee55b5":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"39fa73efcbf54d8dad225d8380061dbf":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_0bdc146792a64853ae06a9d185aa2b15","placeholder":"​","style":"IPY_MODEL_768da964ffcd44fea1af09e81f5621f3","value":" 320000/320000 [00:06<00:00, 58691.43it/s]"}},"3d29947b5d2d4e2abc1355d900096642":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"3f7a8f56f15c434da70029366a37167a":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"40262cb3eefa45fcbe37aaafccb69f5f":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"403fffb635c2409ebeabc90063750ed3":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_2c42e2fef6314c9e842a7e9641af3cab","placeholder":"​","style":"IPY_MODEL_913d95e58aa94e4a8009768a23fbf304","value":" 498/498 [00:00<00:00, 7393.07 examples/s]"}},"48b812211db04284bfbbf02823fb879a":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_a1bd0616199e44538977ee2ea6049690","placeholder":"​","style":"IPY_MODEL_835fb9a91b34471fa6d61adf37616f52","value":" 1280000/1280000 [00:22<00:00, 77416.28it/s]"}},"49c5a3fbe87b491cb3f0f450a0af0659":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"510eeffb32694e7798f23e3931d7a943":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_49c5a3fbe87b491cb3f0f450a0af0659","placeholder":"​","style":"IPY_MODEL_252949e8784c4878a62eb2e30b1e3466","value":"Downloading data: 100%"}},"53843f49adda4bce8450fd91fa9fd587":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_849e39cc86f64e558ff94bf542a5121a","placeholder":"​","style":"IPY_MODEL_67b0b03c391c414bad5ea9fb3c947a2f","value":" 1600000/1600000 [01:18<00:00, 14710.70 examples/s]"}},"5455119809c74916acc50e1905903ded":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"55ba92cfe0724286ac1c2bbe6577e5c8":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"5ee2a4b33be04c6db8ee4d7995c2376d":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_f04df4daeb6049ab85d3d75b472ccf6e","max":498,"min":0,"orientation":"horizontal","style":"IPY_MODEL_fd0b3c53b66543cea0c396d8047445a8","value":498}},"5fa7ab2ab2004e5cb692199e2bd27d6b":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6279343019064572adedf34cfbd437fa":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"67a4fa49ca5349d58512a16a3742d401":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"67b0b03c391c414bad5ea9fb3c947a2f":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"6b6cc35257fe433e93736d02e898b6b8":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6b7286d74e0f4a0199dbfcaf3dd0d622":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"6d64402d9da74516ab4e1d46ae9f1ee3":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_5fa7ab2ab2004e5cb692199e2bd27d6b","max":4033,"min":0,"orientation":"horizontal","style":"IPY_MODEL_ab71bd2b452146829e973d6cf99f31ed","value":4033}},"6e6c5372ffe045c0b72587989567429e":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_b54b826314ea4b3a92eebd218c093fc1","placeholder":"​","style":"IPY_MODEL_8cd7be688b8c4818be48915db14a0792","value":"Generating train split: 100%"}},"768da964ffcd44fea1af09e81f5621f3":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"78d48ee2fb9f42089f475fcf5fc368c8":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_e0fc900d8b5940a6bd6a97e58adb4651","placeholder":"​","style":"IPY_MODEL_6b7286d74e0f4a0199dbfcaf3dd0d622","value":"100%"}},"7bcef602e7f441308472bc145b12dcd3":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7f638a6deacd42e88c031fa47797516b":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"835fb9a91b34471fa6d61adf37616f52":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"84485541f3a14c65a67d10a97b72bbad":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"849e39cc86f64e558ff94bf542a5121a":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"8cd7be688b8c4818be48915db14a0792":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"90908b6f69524a72860214ef8bd2d946":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"913d95e58aa94e4a8009768a23fbf304":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"942ce490d87347c789e229589b1b9c9f":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"96c2d7ee644a438982e1792b7ec0453c":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"97fb30a5a31742efa1d188b9361f9938":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"9a7140a6197945d5bac5c48b820dfb04":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"9b34daddb9cc48bba109e547177ec654":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9baa1a735c0646b89953bf4a7c7fc92c":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a1bd0616199e44538977ee2ea6049690":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a4bbd3df99cd4acab5e1b3ba5cd7c114":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a8b3dfaa2831416582d8eeef01451386":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_7bcef602e7f441308472bc145b12dcd3","max":81363704,"min":0,"orientation":"horizontal","style":"IPY_MODEL_97fb30a5a31742efa1d188b9361f9938","value":81363704}},"a8d69769921241b8b1081e84f7770858":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a9a0f6ce71ed415c8c8513f68e34e162":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ab71bd2b452146829e973d6cf99f31ed":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"afd671543846468abfe37669a72845c3":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_057e918ace004506aedc4e4b9942c3a8","IPY_MODEL_325387f6b62d47b0b21bea61676cea72","IPY_MODEL_ea1e3eb0e6ec4f8d82cf9b12cfe6e700"],"layout":"IPY_MODEL_96c2d7ee644a438982e1792b7ec0453c"}},"b0b5cfae51214c60bbca9a09b196c217":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_2715d00db77545f9aa5eace8a0eb2839","placeholder":"​","style":"IPY_MODEL_942ce490d87347c789e229589b1b9c9f","value":"Generating test split: 100%"}},"b0ca3012d0b84c5a9d7c1fc176251af7":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_a4bbd3df99cd4acab5e1b3ba5cd7c114","max":320000,"min":0,"orientation":"horizontal","style":"IPY_MODEL_9a7140a6197945d5bac5c48b820dfb04","value":320000}},"b54b826314ea4b3a92eebd218c093fc1":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"c29e06a72ac9401b8c41f4195021071e":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_3f7a8f56f15c434da70029366a37167a","max":1280000,"min":0,"orientation":"horizontal","style":"IPY_MODEL_3610a2db297f4686bf9043f2b7ee55b5","value":1280000}},"c432c4efcb794ce781fcb6f176f1b60d":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_510eeffb32694e7798f23e3931d7a943","IPY_MODEL_a8b3dfaa2831416582d8eeef01451386","IPY_MODEL_db1cdafaf36f4c339476f3221abc17b3"],"layout":"IPY_MODEL_ffd3778a96e046718828bbc5aa73f173"}},"d189f24b0e964d1a9fc86379bad38cca":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"d8de1a85076b453a92295e79110ba8fd":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_78d48ee2fb9f42089f475fcf5fc368c8","IPY_MODEL_b0ca3012d0b84c5a9d7c1fc176251af7","IPY_MODEL_39fa73efcbf54d8dad225d8380061dbf"],"layout":"IPY_MODEL_6b6cc35257fe433e93736d02e898b6b8"}},"d9ca809f7b1c49e595a05458251f3ab2":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_55ba92cfe0724286ac1c2bbe6577e5c8","placeholder":"​","style":"IPY_MODEL_67a4fa49ca5349d58512a16a3742d401","value":" 4.03k/4.03k [00:00<00:00, 114kB/s]"}},"db1cdafaf36f4c339476f3221abc17b3":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_9b34daddb9cc48bba109e547177ec654","placeholder":"​","style":"IPY_MODEL_fd2b5a6533794a2794579956c25247fb","value":" 81.4M/81.4M [00:06<00:00, 15.3MB/s]"}},"db432a2cd6244a7592fc9732f0ca4738":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"db9bf44dec914db793cc4f73751c272c":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"df7eba182d1b4c21bc21d157eac6b996":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_db432a2cd6244a7592fc9732f0ca4738","placeholder":"​","style":"IPY_MODEL_84485541f3a14c65a67d10a97b72bbad","value":"Downloading builder script: 100%"}},"e0fc900d8b5940a6bd6a97e58adb4651":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e1348a02ceeb4af19fbd63d52b7d843b":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_fbf51b14e6b34d0485ddf59c43d22c49","IPY_MODEL_c29e06a72ac9401b8c41f4195021071e","IPY_MODEL_48b812211db04284bfbbf02823fb879a"],"layout":"IPY_MODEL_5455119809c74916acc50e1905903ded"}},"ea1e3eb0e6ec4f8d82cf9b12cfe6e700":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_db9bf44dec914db793cc4f73751c272c","placeholder":"​","style":"IPY_MODEL_1cf3ba0f756f4aa5ad1dcb675a791cfa","value":" 6.84k/6.84k [00:00<00:00, 157kB/s]"}},"f04df4daeb6049ab85d3d75b472ccf6e":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f3a9667c8c994324a2409f227bd0a1e9":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_6e6c5372ffe045c0b72587989567429e","IPY_MODEL_2ead0216695e4227aef44552f4ec3cc9","IPY_MODEL_53843f49adda4bce8450fd91fa9fd587"],"layout":"IPY_MODEL_40262cb3eefa45fcbe37aaafccb69f5f"}},"fbb4191426bd485e8e965b6d432eecae":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_df7eba182d1b4c21bc21d157eac6b996","IPY_MODEL_6d64402d9da74516ab4e1d46ae9f1ee3","IPY_MODEL_d9ca809f7b1c49e595a05458251f3ab2"],"layout":"IPY_MODEL_90908b6f69524a72860214ef8bd2d946"}},"fbf51b14e6b34d0485ddf59c43d22c49":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_2475bd62a3224bacb38a6334d07d6a8c","placeholder":"​","style":"IPY_MODEL_3d29947b5d2d4e2abc1355d900096642","value":"100%"}},"fd0b3c53b66543cea0c396d8047445a8":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"fd2b5a6533794a2794579956c25247fb":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"ffd3778a96e046718828bbc5aa73f173":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}}}}},"nbformat":4,"nbformat_minor":0} +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "view-in-github" + }, + "source": [ + "\"Open   \"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "D_fgc45VfjDz" + }, + "source": [ + "# Twitter Sentiment Analysis\n", + "\n", + "**By Neuromatch Academy**\n", + "\n", + "__Content creators:__ Juan Manuel Rodriguez, Salomey Osei, Gonzalo Uribarri\n", + "\n", + "__Production editors:__ Amita Kapoor, Spiros Chavlis" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "axvz0SUsfjD0" + }, + "source": [ + "---\n", + "# Welcome to the NLP project template\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "2Vfm0ThbfjD1" + }, + "source": [ + "---\n", + "# Step 1: Questions and goals\n", + "\n", + "* Can we infer emotion from a tweet text?\n", + "* How words are distributed accross the dataset?\n", + "* Are words related to one kind of emotion?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "Vd1qdNW9fjD1" + }, + "source": [ + "---\n", + "# Step 2: Literature review\n", + "\n", + "[Original Dataset Paper](https://cs.stanford.edu/people/alecmgo/papers/TwitterDistantSupervision09.pdf)\n", + "\n", + "[Papers with code](https://paperswithcode.com/dataset/imdb-movie-reviews)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "oOYDQElpfjD2" + }, + "source": [ + "---\n", + "# Step 3: Load and explore the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "EZpxSExUfjD2", + "outputId": "19b01445-9b83-4a93-9cc2-7830ab0dcf5b" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.3/21.3 MB\u001b[0m \u001b[31m60.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m547.8/547.8 kB\u001b[0m \u001b[31m8.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m40.8/40.8 MB\u001b[0m \u001b[31m11.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m116.3/116.3 kB\u001b[0m \u001b[31m13.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m64.9/64.9 kB\u001b[0m \u001b[31m7.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m194.1/194.1 kB\u001b[0m \u001b[31m20.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.8/134.8 kB\u001b[0m \u001b[31m15.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "cudf-cu12 24.4.1 requires pyarrow<15.0.0a0,>=14.0.1, but you have pyarrow 16.1.0 which is incompatible.\n", + "google-colab 1.0.0 requires requests==2.31.0, but you have requests 2.32.3 which is incompatible.\n", + "ibis-framework 8.0.0 requires pyarrow<16,>=2, but you have pyarrow 16.1.0 which is incompatible.\u001b[0m\u001b[31m\n", + "\u001b[0m" + ] + } + ], + "source": [ + "# @title Install dependencies\n", + "!pip install pandas --quiet\n", + "!pip install torchtext --quiet\n", + "!pip install datasets --quiet" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DxqD3Tk5fjD3", + "outputId": "451d68c5-7894-4f93-9f54-bf0b7f482e20" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/torchtext/data/__init__.py:4: UserWarning: \n", + "/!\\ IMPORTANT WARNING ABOUT TORCHTEXT STATUS /!\\ \n", + "Torchtext is deprecated and the last released version will be 0.18 (this one). You can silence this warning by calling the following at the beginnign of your scripts: `import torchtext; torchtext.disable_torchtext_deprecation_warning()`\n", + " warnings.warn(torchtext._TORCHTEXT_DEPRECATION_MSG)\n" + ] + } + ], + "source": [ + "# We import some libraries to load the dataset\n", + "import os\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from datasets import load_dataset\n", + "\n", + "from collections import Counter\n", + "from tqdm.notebook import tqdm\n", + "\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.optim as optim\n", + "import torch.nn.functional as F\n", + "from torch.utils.data import TensorDataset, DataLoader\n", + "\n", + "import torchtext\n", + "from torchtext.data import get_tokenizer\n", + "\n", + "from sklearn.utils import shuffle\n", + "from sklearn.metrics import classification_report\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.feature_extraction.text import CountVectorizer" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "63Eg1SLbfjD4" + }, + "source": [ + "You can find the dataset we are going to use in [this website](http://help.sentiment140.com/for-students/)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 567, + "referenced_widgets": [ + "fbb4191426bd485e8e965b6d432eecae", + "df7eba182d1b4c21bc21d157eac6b996", + "6d64402d9da74516ab4e1d46ae9f1ee3", + "d9ca809f7b1c49e595a05458251f3ab2", + "90908b6f69524a72860214ef8bd2d946", + "db432a2cd6244a7592fc9732f0ca4738", + "84485541f3a14c65a67d10a97b72bbad", + "5fa7ab2ab2004e5cb692199e2bd27d6b", + "ab71bd2b452146829e973d6cf99f31ed", + "55ba92cfe0724286ac1c2bbe6577e5c8", + "67a4fa49ca5349d58512a16a3742d401", + "afd671543846468abfe37669a72845c3", + "057e918ace004506aedc4e4b9942c3a8", + "325387f6b62d47b0b21bea61676cea72", + "ea1e3eb0e6ec4f8d82cf9b12cfe6e700", + "96c2d7ee644a438982e1792b7ec0453c", + "9baa1a735c0646b89953bf4a7c7fc92c", + "0ac9711c8ece4c5397a8cd810713adfb", + "a8d69769921241b8b1081e84f7770858", + "d189f24b0e964d1a9fc86379bad38cca", + "db9bf44dec914db793cc4f73751c272c", + "1cf3ba0f756f4aa5ad1dcb675a791cfa", + "c432c4efcb794ce781fcb6f176f1b60d", + "510eeffb32694e7798f23e3931d7a943", + "a8b3dfaa2831416582d8eeef01451386", + "db1cdafaf36f4c339476f3221abc17b3", + "ffd3778a96e046718828bbc5aa73f173", + "49c5a3fbe87b491cb3f0f450a0af0659", + "252949e8784c4878a62eb2e30b1e3466", + "7bcef602e7f441308472bc145b12dcd3", + "97fb30a5a31742efa1d188b9361f9938", + "9b34daddb9cc48bba109e547177ec654", + "fd2b5a6533794a2794579956c25247fb", + "f3a9667c8c994324a2409f227bd0a1e9", + "6e6c5372ffe045c0b72587989567429e", + "2ead0216695e4227aef44552f4ec3cc9", + "53843f49adda4bce8450fd91fa9fd587", + "40262cb3eefa45fcbe37aaafccb69f5f", + "b54b826314ea4b3a92eebd218c093fc1", + "8cd7be688b8c4818be48915db14a0792", + "a9a0f6ce71ed415c8c8513f68e34e162", + "7f638a6deacd42e88c031fa47797516b", + "849e39cc86f64e558ff94bf542a5121a", + "67b0b03c391c414bad5ea9fb3c947a2f", + "1cef38981af6457dbaeb393f9936a389", + "b0b5cfae51214c60bbca9a09b196c217", + "5ee2a4b33be04c6db8ee4d7995c2376d", + "403fffb635c2409ebeabc90063750ed3", + "6279343019064572adedf34cfbd437fa", + "2715d00db77545f9aa5eace8a0eb2839", + "942ce490d87347c789e229589b1b9c9f", + "f04df4daeb6049ab85d3d75b472ccf6e", + "fd0b3c53b66543cea0c396d8047445a8", + "2c42e2fef6314c9e842a7e9641af3cab", + "913d95e58aa94e4a8009768a23fbf304" + ] + }, + "id": "3HLOsd3rfjD4", + "outputId": "7653fee1-a871-472b-a978-d8ec0250dc84" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_token.py:89: UserWarning: \n", + "The secret `HF_TOKEN` does not exist in your Colab secrets.\n", + "To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n", + "You will be able to reuse this secret in all of your notebooks.\n", + "Please note that authentication is recommended but still optional to access public models or datasets.\n", + " warnings.warn(\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Downloading builder script: 0%| | 0.00/4.03k [00:00\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
polarityuserdatequeryusertext
00_TheSpecialOne_Mon Apr 06 22:19:45 PDT 2009NO_QUERY_TheSpecialOne_@switchfoot http://twitpic.com/2y1zl - Awww, t...
10scotthamiltonMon Apr 06 22:19:49 PDT 2009NO_QUERYscotthamiltonis upset that he can't update his Facebook by ...
20mattycusMon Apr 06 22:19:53 PDT 2009NO_QUERYmattycus@Kenichan I dived many times for the ball. Man...
30ElleCTFMon Apr 06 22:19:57 PDT 2009NO_QUERYElleCTFmy whole body feels itchy and like its on fire
40KaroliMon Apr 06 22:19:57 PDT 2009NO_QUERYKaroli@nationwideclass no, it's not behaving at all....
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + " \n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "variable_name": "df" + } + }, + "metadata": {}, + "execution_count": 3 + } + ], + "source": [ + "# We load the dataset\n", + "\n", + "dataset = load_dataset(\"stanfordnlp/sentiment140\", trust_remote_code= True)\n", + "\n", + "train_data = dataset[\"train\"]\n", + "df = pd.DataFrame(train_data)\n", + "df = df.rename(columns={'sentiment': 'polarity'})\n", + "df = df[['polarity', 'user', 'date', 'query', 'user', 'text']]\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "fuKShcfjfjD4" + }, + "source": [ + "For this project we will use only the text and the polarity of the tweet. Notice that polarity is 0 for negative tweets and 4 for positive tweet." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "id": "GXHQOn6gfjD5" + }, + "outputs": [], + "source": [ + "X = df.text.values\n", + "\n", + "# Changes values from [0,4] to [0,1]\n", + "y = (df.polarity.values > 1).astype(int)\n", + "\n", + "\n", + "# Split the data into train and test\n", + "x_train_text, x_test_text, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42,stratify=y)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "7kr3TO_LfjD5" + }, + "source": [ + "The first thing we have to do before working on the models is to familiarize ourselves with the dataset. This is called Exploratory Data Analisys (EDA)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FsL-xY03fjD5", + "outputId": "655f0ef8-c177-4f42-c024-1d628241401a" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1: @paisleypaisley LOL why do i get ideas so far in advance? it's not even june yet! we need a third knitter to have our own summer group \n", + "0: worst headache ever \n", + "0: @ewaniesciuszko i am so sad i wont see you! I miss you already. and yeah! that's perfect; i come back the 18th!\n", + "1: doesn't know how to spell conked \n", + "0: "So we stand here now and no one knows us at all I won't get used to this I won't get used to being gone"...I miss home and everyone -a\n" + ] + } + ], + "source": [ + "for s, l in zip(x_train_text[:5], y_train[:5]):\n", + " print('{}: {}'.format(l, s))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "4cPGXSc-fjD5" + }, + "source": [ + "An interesting thing to analyze is the Word Distribution. In order to count the occurrences of each word, we should tokenize the sentences first." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "U1OugpZ0fjD5", + "outputId": "9e6cb4e3-8d8c-4db0-c113-bdd4fe87db5f" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Before Tokenize: worst headache ever \n", + "After Tokenize: ['worst', 'headache', 'ever']\n" + ] + } + ], + "source": [ + "tokenizer = get_tokenizer(\"basic_english\")\n", + "\n", + "print('Before Tokenize: ', x_train_text[1])\n", + "print('After Tokenize: ', tokenizer(x_train_text[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 81, + "referenced_widgets": [ + "e1348a02ceeb4af19fbd63d52b7d843b", + "fbf51b14e6b34d0485ddf59c43d22c49", + "c29e06a72ac9401b8c41f4195021071e", + "48b812211db04284bfbbf02823fb879a", + "5455119809c74916acc50e1905903ded", + "2475bd62a3224bacb38a6334d07d6a8c", + "3d29947b5d2d4e2abc1355d900096642", + "3f7a8f56f15c434da70029366a37167a", + "3610a2db297f4686bf9043f2b7ee55b5", + "a1bd0616199e44538977ee2ea6049690", + "835fb9a91b34471fa6d61adf37616f52", + "d8de1a85076b453a92295e79110ba8fd", + "78d48ee2fb9f42089f475fcf5fc368c8", + "b0ca3012d0b84c5a9d7c1fc176251af7", + "39fa73efcbf54d8dad225d8380061dbf", + "6b6cc35257fe433e93736d02e898b6b8", + "e0fc900d8b5940a6bd6a97e58adb4651", + "6b7286d74e0f4a0199dbfcaf3dd0d622", + "a4bbd3df99cd4acab5e1b3ba5cd7c114", + "9a7140a6197945d5bac5c48b820dfb04", + "0bdc146792a64853ae06a9d185aa2b15", + "768da964ffcd44fea1af09e81f5621f3" + ] + }, + "id": "7ZggzGCXfjD6", + "outputId": "ae19f8d6-224d-4224-d3a0-d00c659ec9b2" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + " 0%| | 0/1280000 [00:00" + ], + "image/png": "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qNGjR2v48OGaMmWK6uvrvZ8bY1RWVqYxY8Zo+PDhys7O1kcffWSx4sDU09OjpUuXaty4cRo+fLiuvfZaPfbYYz7vNWGundu1a5fy8/OVmJiokJCQc94N15c5PXXqlObNm6eoqCiNGjVKd999tzo6OvxX5MXeRxPsNm3aZCIiIszatWvN//7v/5oFCxaYUaNGmba2NtulBaycnByzbt06s3//ftPY2Ghuv/12M3bsWNPR0eHts3DhQpOcnGxqampMfX29+eY3v2luvPFGi1UHtj179piUlBQzdepUs2jRIm8783zpTp06Za6++mrzj//4j+add94xTU1N5tVXXzWHDh3y9lm5cqWJjo42W7duNb/73e/Md7/7XTNu3Djz6aefWqw88CxfvtyMHj3avPLKK+bw4cNmy5YtZuTIkeaJJ57w9mGundu+fbtZsmSJeeGFF4wk8+KLL/p83pc5ve2220xqaqp5++23zf/8z/+Y6667zsyZM8dvNQ75MDJ9+nRTVFTk3e/p6TGJiYmmoqLCYlXB5fjx40aSefPNN40xxpw+fdoMGzbMbNmyxdvngw8+MJJMXV2drTID1pkzZ8z1119vdu7cab71rW95wwjz7B8PP/ywuemmm877ucfjMQkJCebf/u3fvG2nT582LpfLPPvss4NRYtDIy8szd911l0/bHXfcYebNm2eMYa794athpC9z+v777xtJ5t133/X2+a//+i8TEhJijh496pe6hvRlmu7ubjU0NCg7O9vbFhoaquzsbNXV1VmsLLi0t7dLkmJiYiRJDQ0N+uyzz3zmfcKECRo7dizz3g9FRUXKy8vzmU+JefaXl156SRkZGfr+97+vuLg4paWlac2aNd7PDx8+rNbWVp95jo6OVmZmJvPs0I033qiamhodPHhQkvS73/1Ou3fvVm5uriTmeiD0ZU7r6uo0atQoZWRkePtkZ2crNDRU77zzjl/quCzf2jtYTp48qZ6eHu+vx/5ZfHy8PvzwQ0tVBRePx6P7779fM2bM8P7qbmtrqyIiIs55+WF8fLxaW1stVBm4Nm3apL179+rdd9895zPm2T+ampr0i1/8QiUlJXrkkUf07rvv6p//+Z8VERGhgoIC71z29vcI8+zM4sWL5Xa7NWHCBIWFhamnp0fLly/XvHnzJIm5HgB9mdPW1lbFxcX5fB4eHq6YmBi/zfuQDiMYeEVFRdq/f792795tu5Sg09LSokWLFmnnzp2KjIy0XU7Q8ng8ysjI0IoVKyRJaWlp2r9/v6qrq1VQUGC5uuDy3HPP6ZlnntHGjRv113/912psbNT999+vxMRE5jrIDenLNLGxsQoLCzvn6YK2tjYlJCRYqip4FBcX65VXXtEbb7yhq666ytuekJCg7u5unT592qc/8+5MQ0ODjh8/rhtuuEHh4eEKDw/Xm2++qZ///OcKDw9XfHw88+wHY8aM0aRJk3zaJk6cqObmZknyziV/j1y6hx56SIsXL9Y//MM/aMqUKbrzzjv1wAMPeF+8ylz7X1/mNCEhQcePH/f5/PPPP9epU6f8Nu9DOoxEREQoPT1dNTU13jaPx6OamhplZWVZrCywGWNUXFysF198Ua+//rrGjRvn83l6erqGDRvmM+8HDhxQc3Mz8+7ALbfcovfee0+NjY3eLSMjQ/PmzfP+N/N86WbMmHHOo+kHDx7U1VdfLUkaN26cEhISfObZ7XbrnXfeYZ4dOnv2rM+LViUpLCxMHo9HEnM9EPoyp1lZWTp9+rQaGhq8fV5//XV5PB5lZmb6pxC/3AYbwDZt2mRcLpdZv369ef/9982PfvQjM2rUKNPa2mq7tIB17733mujoaFNbW2uOHTvm3c6ePevts3DhQjN27Fjz+uuvm/r6epOVlWWysrIsVh0c/vJpGmOYZ3/Ys2ePCQ8PN8uXLzcfffSReeaZZ8yIESPMr3/9a2+flStXmlGjRpnf/OY35ve//73527/9Wx437YeCggKTlJTkfbT3hRdeMLGxsebHP/6xtw9z7dyZM2fMvn37zL59+4wkU1lZafbt22c+/vhjY0zf5vS2224zaWlp5p133jG7d+82119/PY/2+tt//Md/mLFjx5qIiAgzffp08/bbb9suKaBJ6nVbt26dt8+nn35q7rvvPnPllVeaESNGmL/7u78zx44ds1d0kPhqGGGe/ePll182kydPNi6Xy0yYMME89dRTPp97PB6zdOlSEx8fb1wul7nlllvMgQMHLFUbuNxut1m0aJEZO3asiYyMNNdcc41ZsmSJ6erq8vZhrp174403ev07uaCgwBjTtzn94x//aObMmWNGjhxpoqKiTGFhoTlz5ozfagwx5i9+2g4AAGCQDel7RgAAgH2EEQAAYBVhBAAAWEUYAQAAVhFGAACAVYQRAABgFWEEAABYRRgBAABWEUYAAIBVhBEAAGAVYQQAAFhFGAEAAFb9P4h3gyYUwy6PAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + } + ], + "source": [ + "plt.bar(range(100), [words[w] for w in sorted_words[:100]])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "o9IYA0cZfjD7" + }, + "source": [ + "It is very common to find this kind of distribution when analyzing corpus of text. This is referred to as the [zipf's law](https://en.wikipedia.org/wiki/Zipf%27s_law)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "5FQIOqoRfjD7" + }, + "source": [ + "Usually the number of words in the dictionary will be very large.\n", + "\n", + "Here are some thing we can do to reduce that number:\n", + "\n", + "* Remove puntuation.\n", + "* Remove stop-words.\n", + "* Steaming.\n", + "* Remove very uncommon words (the words that appears in fewer than N occations).\n", + "* Nothing: we can use a pretrain model that handles this kind of situations.\n", + "\n", + "\n", + "We used one of the simplest tokenizers availables. This tokenizer does not take into account many quirks of the language. Moreover, diferent languages have different quirks, so there is no \"universal\" tokenizers. There are many libraries that have \"better\" tokenizers:\n", + "\n", + "* [Spacy](https://spacy.io/): it can be accessed using: `get_tokenizer(\"spacy\")`. Spacy supports a wide range of languages.\n", + "* [Huggingface](https://huggingface.co/): it has many tokenizers for different laguages. [Doc](https://huggingface.co/transformers/main_classes/tokenizer.html)\n", + "* [NLTK](https://www.nltk.org/): it provides several tokenizers. One of them can be accessed using: `get_tokenizer(\"toktok\")`\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "_ul5MgYcfjD7" + }, + "source": [ + "---\n", + "# Step 4: choose toolkit\n", + "\n", + "Our goal is to train a model capable of estimating the sentiment of a tweet (positive or negative) by reading its content. To that end we will try 2 different approaches:\n", + "\n", + "* A logistic regression using sklearn. **NOTE**: it can probaly work better than an SVM model.\n", + "* A simple Embedding + RNN." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "GteI1PxTfjD7" + }, + "source": [ + "## Logistic regression\n", + "\n", + "We will represent our senteces using binary vectorization. This means that our data would be represented as a matrix of instances by word with a one if the word is in the instance, and zero otherwise. Sklean vectorizers can also do things such as stop-word removal and puntuation removal, you can read more about in [the documentation](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "id": "S_ei2qu8fjD7" + }, + "outputs": [], + "source": [ + "vectorizer = CountVectorizer(binary=True)\n", + "x_train_cv = vectorizer.fit_transform(x_train_text)\n", + "x_test_cv = vectorizer.transform(x_test_text)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "iK_zfqnLfjD7", + "outputId": "9b3f6db3-01bf-4246-b943-359620c717a2" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Before Vectorize: doesn't know how to spell conked \n" + ] + } + ], + "source": [ + "print('Before Vectorize: ', x_train_text[3])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "wKxY8e38fjD8", + "outputId": "19530135-070d-4259-d6a9-7ba06b519763" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "After Vectorize: \n", + " (0, 528584)\t1\n", + " (0, 165468)\t1\n", + " (0, 300381)\t1\n", + " (0, 242211)\t1\n", + " (0, 489893)\t1\n", + " (0, 134160)\t1\n" + ] + } + ], + "source": [ + "# Notice that the matriz is sparse\n", + "print('After Vectorize: ')\n", + "print(x_train_cv[3])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "QTPPEMd9fjD8" + }, + "source": [ + "Now we can train our model. You can check the documentation of this logistic regressor [here](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic#sklearn.linear_model.LogisticRegression)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 74 + }, + "id": "2vEPOQS6fjD8", + "outputId": "3be77fc0-76e6-40b8-8847-5f6e7c6c0ce0" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "LogisticRegression(solver='saga')" + ], + "text/html": [ + "
LogisticRegression(solver='saga')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ] + }, + "metadata": {}, + "execution_count": 14 + } + ], + "source": [ + "model = LogisticRegression(solver='saga')\n", + "model.fit(x_train_cv, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "37bUbqB6fjD8", + "outputId": "7eb9178d-6130-47d0-bdf4-ce4be164bc97" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.81 0.79 0.80 160000\n", + " 1 0.79 0.81 0.80 160000\n", + "\n", + " accuracy 0.80 320000\n", + " macro avg 0.80 0.80 0.80 320000\n", + "weighted avg 0.80 0.80 0.80 320000\n", + "\n" + ] + } + ], + "source": [ + "y_pred = model.predict(x_test_cv)\n", + "\n", + "print(classification_report(y_test, y_pred))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "161kDLhofjD8" + }, + "source": [ + "## Explainable AI\n", + "The best thing about logistic regresion is that it is simple, and we can get some explanations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "EILTmxzifjD9", + "outputId": "b7ce6853-7385-4a24-d4eb-e6d0843ca5d5" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "(1, 589260)\n", + "589260\n" + ] + } + ], + "source": [ + "print(model.coef_.shape)\n", + "print(len(vectorizer.vocabulary_))\n", + "\n", + "words_sk = list(vectorizer.vocabulary_.keys())\n", + "words_sk.sort(key=lambda w: model.coef_[0, vectorizer.vocabulary_[w]])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "NGjVPON6fjD9", + "outputId": "d40443bc-476d-4f5a-ce90-4b5b17e47933" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "roni: -3.8625952420933984\n", + "inaperfectworld: -3.5734321547933936\n", + "dontyouhate: -3.5002133484207576\n", + "xbllygbsn: -3.4126303898325787\n", + "anqju: -3.3363997631497493\n", + "sad: -3.200516823534637\n", + "pakcricket: -3.1949062976331675\n", + "condolences: -3.132503698316079\n", + "heartbreaking: -3.0665219866881297\n", + "saddest: -3.042020604188048\n", + "sadd: -3.029036146667248\n", + "heartbroken: -3.0287524416643463\n", + "boohoo: -3.0226033087262802\n", + "sadface: -2.991829110065316\n", + "rachelle_lefevr: -2.925076661509848\n", + "disappointing: -2.902522686643491\n", + "lvbu: -2.8947109582208865\n", + "saddens: -2.8855187276040715\n", + "bummed: -2.836500453805889\n", + "neda: -2.792917726280752\n" + ] + } + ], + "source": [ + "for w in words_sk[:20]:\n", + " print('{}: {}'.format(w, model.coef_[0, vectorizer.vocabulary_[w]]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "oxQ_jlNRfjD9", + "outputId": "363de58b-817a-4205-f019-2379d0d64e0d" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "iamsoannoyed: 2.8493838469077013\n", + "myfax: 2.7974330510971424\n", + "jennamadison: 2.5667217237933104\n", + "yeyy: 2.4780234846131646\n", + "tryout: 2.438315611477797\n", + "goldymom: 2.4374072779309204\n", + "wooohooo: 2.402957513257194\n", + "thesupergirl: 2.356525094856456\n", + "iammaxathotspot: 2.3116551216589682\n", + "londicreations: 2.3074264075299316\n", + "smilin: 2.2991796213822497\n", + "worries: 2.2899555142510084\n", + "sinfulsignorita: 2.27989578448778\n", + "finchensnail: 2.2642827277181063\n", + "smackthis: 2.237672991997692\n", + "kv: 2.2157591386122775\n", + "tojosan: 2.2117938132889696\n", + "russmarshalek: 2.20953890861265\n", + "traciknoppe: 2.1768232307222153\n", + "congratulations: 2.1715901103136876\n" + ] + } + ], + "source": [ + "for w in reversed(words_sk[-20:]):\n", + " print('{}: {}'.format(w, model.coef_[0, vectorizer.vocabulary_[w]]))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "9KSSAC3qfjD9" + }, + "source": [ + "What does this mean?\n", + "\n", + "Remember the `model.coef_` is the $W$ in:\n", + "\n", + "$$h(x)=\\sigma(WX + b)$$\n", + "\n", + "where the label 1 is a positive tweet and the label 0 is a negative tweet." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "oDHjTP2_fjD9" + }, + "source": [ + "## Recurrent Neural Network with Pytorch" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "TbgpKy95fjD9" + }, + "source": [ + "In the previous section we use a Bag-Of-Words approach to represent each of the tweets. That meas that we only consider how many times each of the words appear in each of the tweets, we didnt take into account the order of the words. But we know that the word order is very important and carries relevant information.\n", + "\n", + "In this section we will solve the same task, but this time we will implement a Recurrent Neural Network (RNN) instead of using a simple Logistic Regression.Unlike feedforward neural networks, RNNs have cyclic connections making them powerful for modeling sequences.\n", + "\n", + "Let's start by importing the relevant libraries.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "id": "7nmUJV99fjEB" + }, + "outputs": [], + "source": [ + "def set_device():\n", + " device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", + " if device != \"cuda\":\n", + " print(\"WARNING: For this notebook to perform best, \"\n", + " \"if possible, in the menu under `Runtime` -> \"\n", + " \"`Change runtime type.` select `GPU` \")\n", + " else:\n", + " print(\"GPU is enabled in this notebook.\")\n", + "\n", + " return device" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "chI-18LcfjEB", + "outputId": "7f633079-6548-48f3-802e-94bc9cfada93" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "GPU is enabled in this notebook.\n" + ] + } + ], + "source": [ + "# Set the device (check if gpu is available)\n", + "device = set_device()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "01UtIN7ofjEC" + }, + "source": [ + "First we will create a Dictionary (`word_to_idx`). This dictionary will map each Token (usually words) to an index (an integer number). We want to limit our dictionary to a certain number of tokens (`num_words_dict`), so we will include in our ditionary those with more occurrences." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "afus9SyUfjEC", + "outputId": "bb4eb869-e2f0-4ccd-f64c-e55908272345" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['.', 'i', '!', \"'\", 'to', 'the', ',', 'a', 'my', 'it']" + ] + }, + "metadata": {}, + "execution_count": 21 + } + ], + "source": [ + "# From previous section, we have a list with the most used tokens\n", + "sorted_words[:10]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "6vfQFjaufjEC" + }, + "source": [ + "Let's select only the most used." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "id": "tGLkxaGcfjEC" + }, + "outputs": [], + "source": [ + "num_words_dict = 30000\n", + "# We reserve two numbers for special tokens.\n", + "most_used_words = sorted_words[:num_words_dict-2]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "AzhQvekCfjEC" + }, + "source": [ + "We will add two extra Tokens to the dictionary, one for words outside the dictionary (`'UNK'`) and one for padding the sequences (`'PAD'`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "id": "73Wrb-lEfjEC" + }, + "outputs": [], + "source": [ + "# dictionary to go from words to idx\n", + "word_to_idx = {}\n", + "# dictionary to go from idx to words (just in case)\n", + "idx_to_word = {}\n", + "\n", + "\n", + "# We include the special tokens first\n", + "PAD_token = 0\n", + "UNK_token = 1\n", + "\n", + "word_to_idx['PAD'] = PAD_token\n", + "word_to_idx['UNK'] = UNK_token\n", + "\n", + "idx_to_word[PAD_token] = 'PAD'\n", + "idx_to_word[UNK_token] = 'UNK'\n", + "\n", + "# We popullate our dictionaries with the most used words\n", + "for num,word in enumerate(most_used_words):\n", + " word_to_idx[word] = num + 2\n", + " idx_to_word[num+2] = word" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "kMHVkEisfjEC" + }, + "source": [ + "Our goal now is to transform each tweet from a sequence of tokens to a sequence of indexes. These sequences of indexes will be the input to our pytorch model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "id": "tkCIu3PKfjED" + }, + "outputs": [], + "source": [ + "# A function to convert list of tokens to list of indexes\n", + "def tokens_to_idx(sentences_tokens,word_to_idx):\n", + " sentences_idx = []\n", + " for sent in sentences_tokens:\n", + " sent_idx = []\n", + " for word in sent:\n", + " if word in word_to_idx:\n", + " sent_idx.append(word_to_idx[word])\n", + " else:\n", + " sent_idx.append(word_to_idx['UNK'])\n", + " sentences_idx.append(sent_idx)\n", + " return sentences_idx" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "id": "aHru4vpzfjED" + }, + "outputs": [], + "source": [ + "x_train_idx = tokens_to_idx(x_train_token,word_to_idx)\n", + "x_test_idx = tokens_to_idx(x_test_token,word_to_idx)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Ofj3OD7zfjED", + "outputId": "b2788d03-dbfa-41d7-8231-5011206baa59" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Before converting: ['worst', 'headache', 'ever']\n", + "After converting: [721, 458, 237]\n" + ] + } + ], + "source": [ + "some_number = 1\n", + "print('Before converting: ', x_train_token[some_number])\n", + "print('After converting: ', x_train_idx[some_number])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "NcCicvb-fjED" + }, + "source": [ + "We need all the sequences to have the same length. To select an adequate sequence length, let's explore some statistics about the length of the tweets:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BSjhdyYUfjED", + "outputId": "82e49be9-7868-44ac-b496-c7a48da1efee" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Max tweet word length: 229\n", + "Mean tweet word length: 15.0\n", + "99% percent under: 37.0\n" + ] + } + ], + "source": [ + "tweet_lens = np.asarray([len(sentence) for sentence in x_train_idx])\n", + "print('Max tweet word length: ',tweet_lens.max())\n", + "print('Mean tweet word length: ',np.median(tweet_lens))\n", + "print('99% percent under: ',np.quantile(tweet_lens,0.99))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "t311WY6ZfjEE" + }, + "source": [ + "We cut the sequences which are larger than our chosen maximum length (`max_lenght`) and fill with zeros the ones that are shorter." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "id": "r4S8KTWLfjEE" + }, + "outputs": [], + "source": [ + " # We choose the max length\n", + " max_length = 40\n", + "\n", + "# A function to make all the sequence have the same lenght\n", + "# Note that the output is a Numpy matrix\n", + " def padding(sentences, seq_len):\n", + " features = np.zeros((len(sentences), seq_len),dtype=int)\n", + " for ii, tweet in enumerate(sentences):\n", + " len_tweet = len(tweet)\n", + " if len_tweet != 0:\n", + " if len_tweet <= seq_len:\n", + " # If its shorter, we fill with zeros (the padding Token index)\n", + " features[ii, -len(tweet):] = np.array(tweet)[:seq_len]\n", + " if len_tweet > seq_len:\n", + " # If its larger, we take the last 'seq_len' indexes\n", + " features[ii, :] = np.array(tweet)[-seq_len:]\n", + " return features" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "id": "Z-Cw-bBxfjEE" + }, + "outputs": [], + "source": [ + "# We convert our list of tokens into a numpy matrix\n", + "# where all instances have the same lenght\n", + "x_train_pad = padding(x_train_idx,max_length)\n", + "x_test_pad = padding(x_test_idx,max_length)\n", + "\n", + "# We convert our target list a numpy matrix\n", + "y_train_np = np.asarray(y_train)\n", + "y_test_np = np.asarray(y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8eC3YswlfjEE", + "outputId": "3bb0ea7f-518f-4545-9241-feb783f48122" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Before padding: [1, 3, 71, 24, 122, 3, 533, 74, 13, 4, 3, 102, 13, 209, 2, 12, 150, 4, 22, 5, 18, 667, 3, 138, 61, 7, 3296, 4]\n", + "After padding: [ 0 0 0 0 0 0 0 0 0 0 0 0 1 3\n", + " 71 24 122 3 533 74 13 4 3 102 13 209 2 12\n", + " 150 4 22 5 18 667 3 138 61 7 3296 4]\n" + ] + } + ], + "source": [ + "some_number = 2\n", + "print('Before padding: ', x_train_idx[some_number])\n", + "print('After padding: ', x_train_pad[some_number])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "SzDhnauUfjEE" + }, + "source": [ + "Now, let's convert the data to pytorch format.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "id": "--Yd22YWfjEF" + }, + "outputs": [], + "source": [ + "# create Tensor datasets\n", + "train_data = TensorDataset(torch.from_numpy(x_train_pad), torch.from_numpy(y_train_np))\n", + "valid_data = TensorDataset(torch.from_numpy(x_test_pad), torch.from_numpy(y_test_np))\n", + "\n", + "# Batch size (this is an important hyperparameter)\n", + "batch_size = 100\n", + "\n", + "# dataloaders\n", + "# make sure to SHUFFLE your data\n", + "train_loader = DataLoader(train_data, shuffle=True, batch_size=batch_size,drop_last = True)\n", + "valid_loader = DataLoader(valid_data, shuffle=True, batch_size=batch_size,drop_last = True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "jQ5qPOWTfjEF" + }, + "source": [ + "Each batch of data in our traning proccess will have the folllowing format:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "S1mqhk1hfjEF", + "outputId": "c97e7edd-695f-4336-a2e6-f6bed4852a63" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Sample input size: torch.Size([100, 40])\n", + "Sample input: \n", + " tensor([[ 0, 0, 0, ..., 32, 203, 86],\n", + " [ 0, 0, 0, ..., 1, 1, 4661],\n", + " [ 0, 0, 0, ..., 169, 43, 34],\n", + " ...,\n", + " [ 0, 0, 0, ..., 2, 2961, 4076],\n", + " [ 0, 0, 0, ..., 2319, 1325, 2],\n", + " [ 0, 0, 0, ..., 7, 253, 1]])\n", + "Sample input: \n", + " tensor([0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1,\n", + " 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0,\n", + " 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,\n", + " 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1,\n", + " 0, 1, 0, 1])\n" + ] + } + ], + "source": [ + "# Obtain one batch of training data\n", + "dataiter = iter(train_loader)\n", + "sample_x, sample_y = dataiter.__next__()\n", + "\n", + "print('Sample input size: ', sample_x.size()) # batch_size, seq_length\n", + "print('Sample input: \\n', sample_x)\n", + "print('Sample input: \\n', sample_y)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "jn0PzZdGfjEF" + }, + "source": [ + "Now, we will define the `SentimentRNN` class. Most of the model's class will be familiar to you, but there are two important layers we would like you to pay attention to:\n", + "\n", + "* Embedding Layer\n", + "> This layer is like a linear layer, but it makes it posible to use a sequence of inedexes as inputs (instead of a sequence of one-hot-encoded vectors). During training, the Embedding layer learns a linear transformation from the space of words (a vector space of dimension `num_words_dict`) into the a new, smaller, vector space of dimension `embedding_dim`. We suggest you to read this [thread](https://discuss.pytorch.org/t/how-does-nn-embedding-work/88518/3) and the [pytorch documentation](https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html) if you want to learn more about this particular kind of layers.\n", + "\n", + "\n", + "* LSTM layer\n", + "> This is one of the most used class of Recurrent Neural Networks. In Pytorch we can add several stacked layers in just one line of code. In our case, the number of layers added are decided with the parameter `no_layers`. If you want to learn more about LSTMs we strongly recommend you this [Colahs thread](https://colah.github.io/posts/2015-08-Understanding-LSTMs/) about them.\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "id": "vfzcowAxfjEF" + }, + "outputs": [], + "source": [ + "class SentimentRNN(nn.Module):\n", + " def __init__(self,no_layers,vocab_size,hidden_dim,embedding_dim,drop_prob=0.1):\n", + " super(SentimentRNN,self).__init__()\n", + "\n", + " self.output_dim = output_dim\n", + " self.hidden_dim = hidden_dim\n", + " self.no_layers = no_layers\n", + " self.vocab_size = vocab_size\n", + " self.drop_prob = drop_prob\n", + "\n", + " # Embedding Layer\n", + " self.embedding = nn.Embedding(vocab_size, embedding_dim)\n", + "\n", + " # LSTM Layers\n", + " self.lstm = nn.LSTM(input_size=embedding_dim,hidden_size=self.hidden_dim,\n", + " num_layers=no_layers, batch_first=True,\n", + " dropout=self.drop_prob)\n", + "\n", + " # Dropout layer\n", + " self.dropout = nn.Dropout(drop_prob)\n", + "\n", + " # Linear and Sigmoid layer\n", + " self.fc = nn.Linear(self.hidden_dim, output_dim)\n", + " self.sig = nn.Sigmoid()\n", + "\n", + " def forward(self,x,hidden):\n", + " batch_size = x.size(0)\n", + "\n", + " # Embedding out\n", + " embeds = self.embedding(x)\n", + " #Shape: [batch_size x max_length x embedding_dim]\n", + "\n", + " # LSTM out\n", + " lstm_out, hidden = self.lstm(embeds, hidden)\n", + " # Shape: [batch_size x max_length x hidden_dim]\n", + "\n", + " # Select the activation of the last Hidden Layer\n", + " lstm_out = lstm_out[:,-1,:].contiguous()\n", + " # Shape: [batch_size x hidden_dim]\n", + "\n", + " ## You can instead average the activations across all the times\n", + " # lstm_out = torch.mean(lstm_out, 1).contiguous()\n", + "\n", + " # Dropout and Fully connected layer\n", + " out = self.dropout(lstm_out)\n", + " out = self.fc(out)\n", + "\n", + " # Sigmoid function\n", + " sig_out = self.sig(out)\n", + "\n", + " # return last sigmoid output and hidden state\n", + " return sig_out, hidden\n", + "\n", + " def init_hidden(self, batch_size):\n", + " ''' Initializes hidden state '''\n", + " # Create two new tensors with sizes n_layers x batch_size x hidden_dim,\n", + " # initialized to zero, for hidden state and cell state of LSTM\n", + " h0 = torch.zeros((self.no_layers,batch_size,self.hidden_dim)).to(device)\n", + " c0 = torch.zeros((self.no_layers,batch_size,self.hidden_dim)).to(device)\n", + " hidden = (h0,c0)\n", + " return hidden" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "YfrLPa9mfjEF" + }, + "source": [ + "We choose the parameters of the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "id": "rOm-xoFkfjEG" + }, + "outputs": [], + "source": [ + "# Parameters of our network\n", + "\n", + "# Size of our vocabulary\n", + "vocab_size = num_words_dict\n", + "\n", + "# Embedding dimension\n", + "embedding_dim = 32\n", + "\n", + "# Number of stacked LSTM layers\n", + "no_layers = 2\n", + "\n", + "# Dimension of the hidden layer in LSTMs\n", + "hidden_dim = 64\n", + "\n", + "# Dropout parameter for regularization\n", + "output_dim = 1\n", + "\n", + "# Dropout parameter for regularization\n", + "drop_prob = 0.25" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "xapxpe7ufjEG", + "outputId": "51c90159-7d2b-4fc4-f34a-98e9901d40e4" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "SentimentRNN(\n", + " (embedding): Embedding(30000, 32)\n", + " (lstm): LSTM(32, 64, num_layers=2, batch_first=True, dropout=0.25)\n", + " (dropout): Dropout(p=0.25, inplace=False)\n", + " (fc): Linear(in_features=64, out_features=1, bias=True)\n", + " (sig): Sigmoid()\n", + ")\n" + ] + } + ], + "source": [ + "# Let's define our model\n", + "model = SentimentRNN(no_layers, vocab_size, hidden_dim,\n", + " embedding_dim, drop_prob=drop_prob)\n", + "# Moving to gpu\n", + "model.to(device)\n", + "print(model)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "GEvTs3uwfjEG", + "outputId": "2e15f6df-2aa8-4665-b2da-7363d2bfa09e" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Total Number of parameters: 1018433\n" + ] + } + ], + "source": [ + "# How many trainable parameters does our model have?\n", + "model_parameters = filter(lambda p: p.requires_grad, model.parameters())\n", + "params = sum([np.prod(p.size()) for p in model_parameters])\n", + "print('Total Number of parameters: ',params)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "Pc2OC5GDfjEG" + }, + "source": [ + "We choose the losses and the optimizer for the training procces." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "id": "iBWjPADUfjEG" + }, + "outputs": [], + "source": [ + "# loss and optimization functions\n", + "lr = 0.001\n", + "\n", + "# Binary crossentropy is a good loss function for a binary classification problem\n", + "criterion = nn.BCELoss()\n", + "\n", + "# We choose an Adam optimizer\n", + "optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n", + "\n", + "# function to predict accuracy\n", + "def acc(pred,label):\n", + " pred = torch.round(pred.squeeze())\n", + " return torch.sum(pred == label.squeeze()).item()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "OZgMwOe2fjEG" + }, + "source": [ + "We are ready to train our model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3B6YhEocfjEH", + "outputId": "76276a1f-7775-4b98-aab0-0e199aa133e4" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1\n", + "train_loss : 0.4366412344621494 val_loss : 0.3881208170717582\n", + "train_accuracy : 79.485546875 val_accuracy : 82.475\n", + "Validation loss decreased (inf --> 0.388121). Saving model ...\n", + "==================================================\n", + "Epoch 2\n", + "train_loss : 0.3760281792609021 val_loss : 0.3713956154882908\n", + "train_accuracy : 83.186328125 val_accuracy : 83.4575\n", + "Validation loss decreased (0.388121 --> 0.371396). Saving model ...\n", + "==================================================\n", + "Epoch 3\n", + "train_loss : 0.3574051411205437 val_loss : 0.36425656544510276\n", + "train_accuracy : 84.19953125 val_accuracy : 83.80375\n", + "Validation loss decreased (0.371396 --> 0.364257). Saving model ...\n", + "==================================================\n", + "Epoch 4\n", + "train_loss : 0.344456663565943 val_loss : 0.3613302929420024\n", + "train_accuracy : 84.89265625 val_accuracy : 84.00874999999999\n", + "Validation loss decreased (0.364257 --> 0.361330). Saving model ...\n", + "==================================================\n", + "Epoch 5\n", + "train_loss : 0.33407817618339325 val_loss : 0.3601334386831149\n", + "train_accuracy : 85.444921875 val_accuracy : 84.03625\n", + "Validation loss decreased (0.361330 --> 0.360133). Saving model ...\n", + "==================================================\n" + ] + } + ], + "source": [ + "# Number of training Epochs\n", + "epochs = 5\n", + "\n", + "# Maximum absolute value accepted for the gradeint\n", + "clip = 5\n", + "\n", + "# Initial Loss value (assumed big)\n", + "valid_loss_min = np.Inf\n", + "\n", + "# Lists to follow the evolution of the loss and accuracy\n", + "epoch_tr_loss,epoch_vl_loss = [],[]\n", + "epoch_tr_acc,epoch_vl_acc = [],[]\n", + "\n", + "# Train for a number of Epochs\n", + "for epoch in range(epochs):\n", + " train_losses = []\n", + " train_acc = 0.0\n", + " model.train()\n", + "\n", + " for inputs, labels in train_loader:\n", + "\n", + " # Initialize hidden state\n", + " h = model.init_hidden(batch_size)\n", + " # Creating new variables for the hidden state\n", + " h = tuple([each.data.to(device) for each in h])\n", + "\n", + " # Move batch inputs and labels to gpu\n", + " inputs, labels = inputs.to(device), labels.to(device)\n", + "\n", + " # Set gradient to zero\n", + " model.zero_grad()\n", + "\n", + " # Compute model output\n", + " output,h = model(inputs,h)\n", + "\n", + " # Calculate the loss and perform backprop\n", + " loss = criterion(output.squeeze(), labels.float())\n", + " loss.backward()\n", + " train_losses.append(loss.item())\n", + "\n", + " # calculating accuracy\n", + " accuracy = acc(output,labels)\n", + " train_acc += accuracy\n", + "\n", + " #`clip_grad_norm` helps prevent the exploding gradient problem in RNNs / LSTMs.\n", + " nn.utils.clip_grad_norm_(model.parameters(), clip)\n", + " optimizer.step()\n", + "\n", + "\n", + " # Evaluate on the validation set for this epoch\n", + " val_losses = []\n", + " val_acc = 0.0\n", + " model.eval()\n", + " for inputs, labels in valid_loader:\n", + "\n", + " # Initialize hidden state\n", + " val_h = model.init_hidden(batch_size)\n", + " val_h = tuple([each.data.to(device) for each in val_h])\n", + "\n", + " # Move batch inputs and labels to gpu\n", + " inputs, labels = inputs.to(device), labels.to(device)\n", + "\n", + " # Compute model output\n", + " output, val_h = model(inputs, val_h)\n", + "\n", + " # Compute Loss\n", + " val_loss = criterion(output.squeeze(), labels.float())\n", + "\n", + " val_losses.append(val_loss.item())\n", + "\n", + " accuracy = acc(output,labels)\n", + " val_acc += accuracy\n", + "\n", + " epoch_train_loss = np.mean(train_losses)\n", + " epoch_val_loss = np.mean(val_losses)\n", + " epoch_train_acc = train_acc/len(train_loader.dataset)\n", + " epoch_val_acc = val_acc/len(valid_loader.dataset)\n", + " epoch_tr_loss.append(epoch_train_loss)\n", + " epoch_vl_loss.append(epoch_val_loss)\n", + " epoch_tr_acc.append(epoch_train_acc)\n", + " epoch_vl_acc.append(epoch_val_acc)\n", + " print(f'Epoch {epoch+1}')\n", + " print(f'train_loss : {epoch_train_loss} val_loss : {epoch_val_loss}')\n", + " print(f'train_accuracy : {epoch_train_acc*100} val_accuracy : {epoch_val_acc*100}')\n", + " if epoch_val_loss <= valid_loss_min:\n", + " print('Validation loss decreased ({:.6f} --> {:.6f}). Saving model ...'.format(valid_loss_min,epoch_val_loss))\n", + " # torch.save(model.state_dict(), '../working/state_dict.pt')\n", + " valid_loss_min = epoch_val_loss\n", + " print(25*'==')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {}, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 364 + }, + "id": "ttJazP-nfjEH", + "outputId": "992bed02-611e-4614-c60f-77223d5b801a" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAABkoAAAIQCAYAAADO7zKKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADxbklEQVR4nOzdd3xUVfrH8c/MpJNGKgECCZ1QlRKkWQhVIyAqooKg2HFV1sYKIipi2WWxrfhTEAsuVhQXBAII0psivSeEmkKAhASSycz8/ggMxIQSJuGmfN+vFy+Yc8+997kPE5h7nznnmBwOhwMREREREREREREREZEqyGx0ACIiIiIiIiIiIiIiIkZRoURERERERERERERERKosFUpERERERERERERERKTKUqFERERERERERERERESqLBVKRERERERERERERESkylKhREREREREREREREREqiwVSkREREREREREREREpMpSoURERERERERERERERKosFUpERERERERERERERKTKUqFERERERERERERERESqLBVKREQqsP/85z+YTCZiY2ONDkVERERERKTSmjZtGiaTiXXr1hkdioiIlAEVSkREKrDp06cTFRXFmjVr2L17t9HhiIiIiIiIiIiIVDgqlIiIVFCJiYmsWLGCiRMnEhoayvTp040OqVjZ2dlGhyAiIiIiIiIiInJBKpSIiFRQ06dPp3r16tx8883cfvvtxRZKjh8/ztNPP01UVBSenp7Url2bIUOGkJ6e7uxz+vRpXn75ZRo1aoSXlxcRERHcdttt7NmzB4DFixdjMplYvHhxoWMnJSVhMpmYNm2as23o0KH4+vqyZ88e+vTpg5+fH/fccw8AS5cu5Y477qBOnTp4enoSGRnJ008/zalTp4rEvX37du68805CQ0Px9vamcePGvPjiiwD8+uuvmEwmZs6cWWS/r776CpPJxMqVK0ucTxEREREREVf88ccf9O7dG39/f3x9fenWrRurVq0q1MdqtTJu3DgaNmyIl5cXwcHBdO7cmYSEBGefI0eOMGzYMGrXro2npycRERH07duXpKSkq3xFIiJVh5vRAYiIyJWZPn06t912Gx4eHgwaNIgPP/yQtWvX0q5dOwBOnjxJly5d2LZtG/fffz/XXnst6enpzJo1iwMHDhASEoLNZuOWW25h4cKF3HXXXTz55JNkZWWRkJDA5s2bqV+/fonjys/Pp2fPnnTu3Jl//vOf+Pj4APDtt9+Sk5PDo48+SnBwMGvWrOG9997jwIEDfPvtt879N27cSJcuXXB3d+ehhx4iKiqKPXv28PPPPzN+/HhuuOEGIiMjmT59Ov379y+Sk/r163Pddde5kFkREREREZGS2bJlC126dMHf35/nnnsOd3d3PvroI2644QaWLFniXFfy5ZdfZsKECQwfPpz27duTmZnJunXr+P333+nevTsAAwYMYMuWLTzxxBNERUWRmppKQkICycnJREVFGXiVIiKVlwolIiIV0Pr169m+fTvvvfceAJ07d6Z27dpMnz7dWSh5++232bx5Mz/88EOhgsLo0aNxOBwAfP755yxcuJCJEyfy9NNPO/u88MILzj4llZubyx133MGECRMKtb/55pt4e3s7Xz/00EM0aNCAf/zjHyQnJ1OnTh0AnnjiCRwOB7///ruzDeCNN94AwGQyce+99zJx4kROnDhBQEAAAGlpacyfP9858kRERERERORqGT16NFarlWXLllGvXj0AhgwZQuPGjXnuuedYsmQJALNnz6ZPnz783//9X7HHOX78OCtWrODtt9/mmWeecbaPGjWq7C9CRKQK09RbIiIV0PTp0wkPD+fGG28ECooHAwcOZMaMGdhsNgC+//57WrVqVWTUxdn+Z/uEhITwxBNPXLDPlXj00UeLtJ1fJMnOziY9PZ2OHTvicDj4448/gIJix2+//cb9999fqEjy13iGDBlCbm4u3333nbPt66+/Jj8/n3vvvfeK4xYRERERESkpm83G/Pnz6devn7NIAhAREcHdd9/NsmXLyMzMBCAwMJAtW7awa9euYo/l7e2Nh4cHixcv5tixY1clfhERUaFERKTCsdlszJgxgxtvvJHExER2797N7t27iY2NJSUlhYULFwKwZ88emjdvftFj7dmzh8aNG+PmVnoDDN3c3Khdu3aR9uTkZIYOHUpQUBC+vr6EhoZy/fXXA3DixAkA9u7dC3DJuJs0aUK7du0Krcsyffp0OnToQIMGDUrrUkRERERERC4pLS2NnJwcGjduXGRb06ZNsdvt7N+/H4BXXnmF48eP06hRI1q0aMGzzz7Lxo0bnf09PT158803+eWXXwgPD6dr16689dZbHDly5Kpdj4hIVaRCiYhIBbNo0SIOHz7MjBkzaNiwofPX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WJnE0E7RRoclIiIiZaUsntNerhI8px04cCCfffYZo0ePrjLPaX/99VciIiJK9Jz2fO+88w7/+te/+PDDD2nYsCHffvstt956K1u2bKFhw4a8++67zJo1i2+++YY6deqwf/9+9u/fDxTMHvTvf/+bGTNm0KxZM44cOcKff/55Wee9UlWzUGLNgddrluohzUDg5XT8xyHwuLy55+6//37efvttlixZwg033AAUDOcaMGAAAQEBBAQE8Mwzzzj7P/HEE8ybN49vvvnmsn4AFyxYwPbt25k3bx41axbk4/XXX6d3796F+o0ePdr556ioKJ555hlmzJjBc889h7e3N76+vri5uV10CNdXX33F6dOn+fzzz51z773//vvEx8fz5ptvOoeaVa9enffffx+LxUKTJk24+eabWbhw4UV/AKdOnUrv3r2d8+z17NmTTz/9lJdffhmADz74gICAAGbMmIG7e8HDnEaNGjn3f+211/j73//Ok08+6Wxr167dJfMnIiJSkeXb7Gw+mMmvh0z8PP0P1iUf53hO4W8HebiZaR0Z6CyMXFunOtU8q+bHRxG5emoGevN8r8aM+WkLb83bQVxMOLWr+xgdloiIiJSFMnhOe9lK8Jz23nvv5b333qsSz2nDw8OBK3tOe75//vOfPP/889x1111kZmbyxhtvsHjxYiZNmsQHH3xAcnIyDRs2pHPnzphMJueX3gGSk5OpUaMGcXFxuLu7U6dOncvKoyt0p1uONWnShI4dOzJ16lRuuOEGdu/ezdKlS3nllVcAsNlsvP7663zzzTccPHiQvLw8cnNz8fG5vJuIbdu2ERkZ6fzhA7juuuuK9Pv6669599132bNnDydPniQ/Px9/f/8SXcu2bdto1apVoQWKOnXqhN1uZ8eOHc5CSUxMDBaLxdknIiKCTZs2XfC4NpuNzz77jHfeecfZdu+99/LMM8/w0ksvYTab2bBhA126dHEWSc6XmprKoUOH6NatW4muR0REpKLJy7ez6eBxVp1ZX2T9vmOczM0HLEAaAD4eFtrUrU77qILCSKvIQLzcLRc9rohIWbgnti6z/jzE2qRj/GPmZj4b1s757U0RERGRq61Ro0ZV5jnt2UJJs2bNSvSc9nyZmZkcOnSITp06FWrv1KmTc2TI0KFD6d69O40bN6ZXr17ccsst9OjRA4A77riDSZMmUa9ePXr16kWfPn2Ij4/Hza3syhlVs1Di7lNQMSxFdrudzKws/P38MF9q6q0SeOCBB3jiiSf44IMP+PTTT6lfvz7XX389AG+//TbvvPMOkyZNokWLFlSrVo2nnnqKvLw8Vy6lkJUrV3LPPfcwbtw4evbs6RyZ8a9//avUznG+vxYzTCYTdrv9gv3nzZvHwYMHiyzebrPZWLhwId27d8fb+8Lzo19sm4iISEV2Ks/GH8nHnNNo/Z58jNz8wv+n+nm5Ucc7j5vbN+a6+qE0rxWAu0VL2ImI8cxmE28MaEnvd5by2840Zv5xkNuurW10WCIiIlLayuA5bYnOXQLDhg3jySef1HPaUnLttdeSmJjIL7/8woIFC7jzzjuJi4vju+++IzIykh07drBgwQISEhJ47LHHnDMvFfdl+NJQNQslJtNlD6u6bHY7uNsKjnuxQkkJ3XnnnTz55JN89dVXfP755zz66KPOb1ItX76cvn37cu+9954Jwc7OnTuJiYm5rGM3bdqU/fv3c/jwYSIiIgBYtWpVoT4rVqygbt26vPjii862ffv2Ferj4eGBzWa75LmmTZtGdna2s1q5fPlyzGYzjRs3vqx4izNlyhTuuuuuQvEBjB8/nilTptC9e3datmzJZ599htVqLfKD5OfnR1RUFAsXLuTGG2+84jhERESMlnXayrp9x1hzpjCy8cBxrLbCiyAHV/Og/ZlptNpHB1E/2Jt5c3+hT+foMvuwKSJypeqH+vJkt4a8PW8Hr/xvK10bhRLi62l0WCIiIlKayuI5bRm58847efrpp/Wc9jL4+/tTs2ZNli9fTpcuXZzty5cvLzSFlr+/PwMHDmTgwIHcfvvt9OrVi4yMDIKCgvD29iY+Pp74+Hgef/xxmjRpwqZNm7j22mtLJca/qpqFkgrE19eXgQMHMmrUKDIzMxk6dKhzW8OGDfnuu+9YsWIF1atXZ+LEiaSkpFz2D2BcXByNGjXivvvu4+233yYzM7NIwaFhw4YkJyczY8YM2rVrx+zZs5k5c2ahPlFRUSQmJrJhwwZq166Nn58fnp6Fb2Duuecexo4dy3333cfLL79MWloaTzzxBIMHDyY8PPyKqpFpaWn8/PPPzJo1i+bNmxfaNmTIEPr3709GRgYjRozgvffe46677mLUqFEEBASwatUq2rdvT+PGjXn55Zd55JFHCAsLo3fv3mRlZbF8+XKeeOKJEsckIiJytRzLzmNNUoazMLLl0Anshesi1PD3IrZeQVEkNjqY+qHVCk1dY7VaEREpzx7qWo//bTzMtsOZjPt5K+8NusbokERERKSKqirPaUvLs88+y9ixY4mOjqZBgwZ89913bNiwgenTpwMwceJEIiIiuOaaazCbzXz77bfUqFGDwMBApk2bhs1mIzY2Fh8fH7788ku8vb0LrWNS2jS3QgXwwAMPcOzYMXr27FlonrrRo0dz7bXX0rNnT2644QZq1KhBv379Lvu4ZrOZmTNncurUKdq3b8/w4cMZP358oT633norTz/9NCNGjKB169asWLGCMWPGFOozYMAAevXqxY033khoaCj//e9/i5zLx8eHefPmkZGRQbt27bj99tvp1q0b77//fsmScZ6zCw4Vt75It27d8Pb25ssvvyQ4OJhFixZx8uRJrr/+etq0acPHH3/s/Obsfffdx6RJk/jPf/5Ds2bNuOWWW9i1a9cVxyUiIlIWUjNP8/Ofhxjz42Z6/vs3rnk1gYe/WM+UZYlsOlhQJKkb7MMdbWrz9u0tWfrcjawcdRPv3HUN98TWpUGYr+b3F5EKx91i5s0BLTCb4Oc/D7FwW4rRIYmIiEgVpue0l+9vf/sbI0eO5Nlnn6VTp07MmzePWbNm0bBhQ6Bgpp+33nqLtm3b0q5dO5KSkpgzZw5ms5nAwEA+/vhjOnXqRMuWLVmwYAE///wzwcHBpRrj+UwOh8Nx6W7lX2ZmJgEBAZw4caLIAjanT58mMTGR6OhovLy8yuT8drudzMxM/P39L75GiRSrouTvaryXroTVamXOnDn06dNHU6dcAeXPNcqfa5Q/11Tm/O3PyHGOFlmTlEFienaRPg3DfAtGi9QLpn1UEDUCSvZ/U2XO39VgdP4u9vlXpDhGv2dc+Zl5fc42/u+3vUQEeDH/6a74eVW9f7OM/jenolP+XKP8uUb5c43y55rylr/y+mztYirKc8vy6mrk72Lvq8v9DKypt0REREQM5nA42Juefa4wkpjBweOnCvUxmSAmwt85jVa7qOoEa65+Eakino5rxLwtR9h3NIc3527ntX4tjA5JRERERCoRFUpERERErjK73cGOlCxnUWR1YgbpJ3ML9XEzm2hRO4DY6GBio4O4tm51AryN/waYiIgRvD0sTLitBXd/vJovVyUT37ImsfXKbuoFEREREalarqhQ8sEHH/D2229z5MgRWrVqxXvvvVdotfq/mjRpEh9++CHJycmEhIRw++23M2HCBOcwmJdffplx48YV2qdx48Zs3779SsITERERKVfybXa2HMp0FkXWJmVw4lThhdQ93MxcExlIbL2Cwsg1dQLx8dB3WkREzupYP4S72kUyY+1+Rv2wiTlPdsHL3WJ0WCIiIiJSCZT47vvrr79m5MiRTJ48mdjYWCZNmkTPnj3ZsWMHYWFhRfp/9dVXvPDCC0ydOpWOHTuyc+dOhg4dislkYuLEic5+zZo1Y8GCBecCc9ODAREREamYcvNtbDxwwlkYWZ+UQXaerVCfah4W2kQFERsdRPvoIFrWDsDTTQ/8REQuZlSfpizansre9GzeXbiL53o1MTokEREREakESlyNmDhxIg8++CDDhg0DYPLkycyePZupU6fywgsvFOm/YsUKOnXqxN133w1AVFQUgwYNYvXq1YUDcXOjRo0aV3INIiIiIobKycvnj+TjrE7MYE3iUf5IPk5uvr1QnwBvd9qdVxhpVtMfN4sWAhQRKYkAb3de6ducR75cz0e/7eXmlhE0qxlgdFgiIiIiUsGVqFCSl5fH+vXrGTVqlLPNbDYTFxfHypUri92nY8eOfPnll6xZs4b27duzd+9e5syZw+DBgwv127VrFzVr1sTLy4vrrruOCRMmUKdOnSu4pAtzOBylejypevQeEhERgMzTVtYnHWNV4lHWJGaw6cAJ8u2F/48I8fUgNjqY9mcKI43D/TCbTQZFLCJSefRqXoPezWvwy+YjPP/9Rn58rJMKzyIiIhWM3W6/dCeRy1Qa76cSFUrS09Ox2WyEh4cXag8PD7/geiJ333036enpdO7cGYfDQX5+Po888gj/+Mc/nH1iY2OZNm0ajRs35vDhw4wbN44uXbqwefNm/Pz8ij1ubm4uubnnFj3NzMwEwGq1YrVai90nLS2N4OBgTKbSf0jhcDjIy8vj1KlTZXL8yq4i5M/hcHD06FHn6wu9z4xwNpbyFFNFovy5RvlzjfLnmquVv4zsPNbtO8aapGOsTTrG9iNZ/KUuQkSAF+2jqtMuqjrt6lYnOsSn0P9pNls+Nhvlit5/rjE6f/p7k6psXN9mLN+dzuaDmUxZlsjD19c3OiQRERG5DB4eHpjNZg4dOkRoaCgeHh7l9lngWXa7nby8PE6fPo3ZrC9nlFRZ5u/sM+W0tDTMZjMeHh5XfKwyXwhk8eLFvP766/znP/8hNjaW3bt38+STT/Lqq68yZswYAHr37u3s37JlS2JjY6lbty7ffPMNDzzwQLHHnTBhQpEF4AHmz5+Pj49PkXYPDw+CgoJIS0srpSuTqig/P5+MjAx27txpdCjFSkhIMDqECk35c43y5xrlzzWlnb8TebAn08TuTBN7Mk0cOVX0g3uol4P6/md++TkI9joJnITU/WxPheK/QlI+6f3nGqPyl5OTY8h5RcqDMD8vRt8Sw3PfbWRiwk56NqtBVEg1o8MSERGRSzCbzURHR3P48GEOHTpkdDiXxeFwcOrUKby9vct9Uac8uhr58/HxoU6dOi4VYkpUKAkJCcFisZCSklKoPSUl5YLri4wZM4bBgwczfPhwAFq0aEF2djYPPfQQL774YrHBBwYG0qhRI3bv3n3BWEaNGsXIkSOdrzMzM4mMjKRHjx74+/sXu4/NZiM/P79Mpk/Kz89nxYoVdOzYUQvRX4GKkD+TyYSbmxsWS/lbaNdqtZKQkED37t1xd3c3OpwKR/lzjfLnGuXPNaWRP4fDwYHjp1ibdG7ESHLGqSL9GoX5FowWiapO27qBhPt7uRq+4fT+c43R+Ts7olqkqrqjTW1mbTjEst3pvPDDRv77YAc9vBAREakAPDw8qFOnDvn5+djK27D7YlitVn777Te6du2q+6YrUNb5s1gsuLm5ufw5sERPpD08PGjTpg0LFy6kX79+QMHQmYULFzJixIhi98nJySlSDDn7oPlCBYuTJ0+yZ8+eIuuYnM/T0xNPT88i7e7u7hdMeFm+ka1WK/n5+fj6+uoH5goof6XjYu9/uTTlzzXKn2uUP9eUJH8Oh4M9admsScxg9Zk1Rg6fOF2oj9kEzWoGONcXaRcVRFC1Kx/CW97p/ecao/KnvzOp6kwmE6/3b0HPSb+xam8GM9buZ1D70l3nUkRERMqGyWSqMPchFouF/Px8vLy8KkS85U1FyV+Jv7o/cuRI7rvvPtq2bUv79u2ZNGkS2dnZDBs2DIAhQ4ZQq1YtJkyYAEB8fDwTJ07kmmuucU69NWbMGOLj450Fk2eeeYb4+Hjq1q3LoUOHGDt2LBaLhUGDBpXipYqIiEhVZLM72HEky1kUWZOYwdHsvEJ93C0mWtYOdBZG2tatjp9X+f0AJyIiBeoE+/D3Ho14bfY2Xp+zjZuahFWKEX8iIiIicnWVuFAycOBA0tLSeOmllzhy5AitW7dm7ty5zgXek5OTC40gGT16NCaTidGjR3Pw4EFCQ0OJj49n/Pjxzj4HDhxg0KBBHD16lNDQUDp37syqVasIDQ0thUsUERGRqsRqs7P54AlnUWRtUgaZp/ML9fF0M3Ntneq0jw4iNjqIa+pUx9uj/E2tKCIilzasUzQ//3mIPw+cYMyPm/locBtNwSUiIiIiJXJFi0GMGDHiglNtLV68uPAJ3NwYO3YsY8eOveDxZsyYcSVhiIiIiGC1w5qkDH5PzmRNUgbr9x0jJ6/wPLe+nm60qVtQGOlQL4jmtQLwdFNhRESkMrCYTbwxoCXx7y1j/tYUftl8hD4tIowOS0REREQqkPK5araIiIjIRSQfzWHBthQSth5hbaKF/NXrCm0P9HGnXVTBaJHY6GCaRvjhZjFf4GgiIlLRNY3w59Eb6vPeot289NMWOtYPJtCn8q4tJSIiIiKlS4USERERKffsdgd/HjjOgm0pLNiayo6UrPO2mgj19aB9vWA6RAfRPjqYhmG+mM2adkVEpCoZcVMD5mw6zJ60bMbP3sbbd7QyOiQRERERqSBUKBEREZFy6VSejeW70wuKI9tSST+Z69xmMZtoHxXEjY1D4PAWht7WHQ8PfXNYRKQq83Sz8NbtLbl98kq+XX+AW1vXpEtDrXspIiIiIpemQomIiIiUG2lZuSzankLC1lSW7U7jtNXu3Obn6cb1jUPpHhPODY3CCPBxx2q1MmfOFi3aKyIiALSpG8SQDnX5bOU+Rv2wiflPd8XHQ7e9IiIiInJx+sQoIiIihnE4HOxOPUnCthQWbE3hj/3HcTjOba8V6E33mHDimobTPjoIDzetMyIiIhf3bK8mJGxN4cCxU/xr/k7G3BJjdEgiIiIiUs6pUCIiIiJXVb7NztqkY2em1Eph39GcQttb1Q4grmk4cTHhNKnhp9EiIiJSIr6eboy/rQXDPl3Lp8sTiW9Vk9aRgUaHJSIiIiLlmAolIiIiUuayTlv5bWfBeiOLtqdy4pTVuc3DzUyn+sHExYTTrUk4NQK8DIxUREQqgxsbh9GvdU1+3HCI57/byM9PdNaoRBERERG5IBVKREREpEwcPH6KhdtSSNiawqq9R7Hazs2pFVTNg5uahBHXNJwuDUOo5qmPJCIiUrpeim/Gb7vS2ZGSxeQle/hbt4ZGhyQiIiIi5ZSeSoiIiEipcDgcbD6Y6VxvZOvhzELb64VWo3tMON2bhnNNnepYzJpSS0REyk5QNQ/Gxsfw5IwNvL9oN72b16BhuJ/RYYmIiIhIOaRCiYiIiFyx3HwbK/YcZcHWFBZuS+VI5mnnNrMJ2tYNIi4mjG5Nw6kf6mtgpCIiUhXd2qomP204xKLtqTz//Ua+faSjCvUiIiIiUoQKJSIiIlIiGdl5/Lo9lQXbUvhtZxrZeTbnNh8PC9c3CiWuaTg3NgkjqJqHgZGKiEhVZzKZeK1fc3r8+zd+Tz7OFyuTGNop2uiwRERERKScUaFERERELmlv2kkWbEthwdZU1u3LwH5uuRHC/T2JaxpO95hwOtQLxsvdYlygIiIif1Ez0JvnezVmzE9beGveDuJiwqld3cfosERERESkHFGhRERERIqw2R38kXyMhK0pJGxLYW9adqHtMRH+xJ1Zb6R5LX9MJk1jIiIi5dc9sXWZ9ech1iYd48WZm5k2rJ3+7xIRERERJxVKREREBIDs3HyW7kpnwbYUFm1PJSM7z7nN3WKiQ71guseE061pOLUCvQ2MVEREpGTMZhMTbmtJn3eWsmRnGj9uOEj/a2obHZaIiIiIlBMqlIiIiFRhKZmnz0yplcLyPUfJy7c7twV4u3NTkzDimobTtVEIfl7uBkYqIiLimgZhvvytWwP+OX8nr/y8la4NQwn29TQ6LBEREREpB1QoERERqUIcDgfbDmcVFEe2pbDxwIlC2+sE+dA9Jpy4puG0jaqOu8VsUKQiIiKl7+Hr6/O/jYfZfiSLcT9v5d1B1xgdkoiIiIiUAyqUiIiIVHJ5+XbWJGawYFsKCVtTOHj8lHObyQTXRAY61xtpEOarOdtFRKTScreYeev2lvT7YDmz/jxE39Y16dY03OiwRERERMRgKpSIiIhUQidyrCzemUrC1hSW7EgjKzffuc3L3UznBqH0iAnnxiZhhPpp2hEREak6WtYOZHiXevzfb3sZ/eNm2kcHaXpJERERkSpOhRIREZFKIvloDgln1htZk5SBze5wbgvx9SSuacF6I50ahODtYTEwUhEREWM9HdeIeVuOsO9oDm/O3c5r/VoYHZKIiIiIGEiFEhERkQrKbnfw54HjZxZjT2VHSlah7Y3D/YiLKSiOtKodiNmsKbVEREQAvD0sTOjfgrs/Wc2Xq5K5tVUt2kcHGR2WiIiIiBhEhRIREZEK5FSejeW7088sxp5K+slc5zaL2UT7qCDneiN1gn0MjFRERKR869gghIFtI/l63X5e+H4jc57sgpe7RlyKiIiIVEUqlIiIiJRzaVm5LNqeQsLWVJbtTuO01e7c5ufpxvWNQ+keE84NjcII8NEc6yIiIpfrHzc35dcdqexNz+a9Rbt4tmcTo0MSEREREQOoUCIiIlLOOBwOdqeedK438sf+4zjOLTdCrUBvuseEE9c0nPbRQXi4mY0LVkREpAIL8Hbnlb7NeeTL9Uxespc+LSJoVjPA6LBERERE5CpToURERKQcyLfZWZd89MyUWinsO5pTaHur2gHENQ0nLiacJjX8MJm03oiIiEhp6NW8Br2b1+CXzUd4/vuN/PhYJ9ws+hKCiIiISFWiQomIiIhBsk5bWbT1CJ/vMvPShsWcOJXv3ObhZqZT/WDiYsLp1iScGgFeBkYqIiJSuY3r24zlu9PZfDCTKcsSefj6+kaHJCIiIiJXkQolIiIiV9HB46dYuC2FhK0prNp7FKvNAZiBfIKqeXBTkzDimobTpWEI1Tz137SIiMjVEObnxeibY3ju+41MTNhJz2Y1iAqpZnRYIiIiInKVaDyxiIhIGXI4HGw6cIKJCTvp885SOr2xiJd+2sLSXelYbQ7qhfjQraadGcPbsfbFOP55Ryt6Na+hIomISCXwwQcfEBUVhZeXF7GxsaxZs+ay9psxYwYmk4l+/fo526xWK88//zwtWrSgWrVq1KxZkyFDhnDo0KEyir7quaNtbTo1CCY3386oHzbhOH+BMBERERGp1PQURkREpJTl5ttYsecoC7amsHBbKkcyTzu3mU3Qtm4QcTFhdGsaTp1AT+bMmUObutWxmLXuiIhIZfH1118zcuRIJk+eTGxsLJMmTaJnz57s2LGDsLCwC+6XlJTEM888Q5cuXQq15+Tk8PvvvzNmzBhatWrFsWPHePLJJ7n11ltZt25dWV9OlWAymZjQvyU9Ji1h5d6jfL12P3e1r2N0WCIiIiJyFahQIiIiUgoysvP4dXsqC7al8NvONLLzbM5tPh4Wrm8USlzTcG5sEkZQNQ/nNqvVakS4IiJSxiZOnMiDDz7IsGHDAJg8eTKzZ89m6tSpvPDCC8XuY7PZuOeeexg3bhxLly7l+PHjzm0BAQEkJCQU6v/+++/Tvn17kpOTqVNHD/RLQ51gH57p0ZjXZm9j/Jxt3NgkjHB/rRMmIiIiUtmpUCIiInKF9qadZMG2FBZsTWXdvgzs583QEe7vSVzTcLrHhNOhXjBe7hbjAhURkasqLy+P9evXM2rUKGeb2WwmLi6OlStXXnC/V155hbCwMB544AGWLl16yfOcOHECk8lEYGBgsdtzc3PJzc11vs7MzAQKivRGFOrPnrO8f0ng3va1mbXhIBsPZjJ65iY+GNQKk8n4UZ8VJX/llfLnGuXPNcqfa5Q/1yh/rlMOXWN0/i73vCqUiIiIXCab3cEfycdI2JpCwrYU9qZlF9oeE+FPXEw43ZuG07yWf7l4qCIiIldfeno6NpuN8PDwQu3h4eFs37692H2WLVvGlClT2LBhw2Wd4/Tp0zz//PMMGjQIf3//YvtMmDCBcePGFWmfP38+Pj4+l3WesvDXkTHlUa9g2HzIQsK2VCZ8OZfWweVnvZKKkL/yTPlzjfLnGuXPNcqfa5Q/1ymHrjEqfzk5OZfVT4USERGRi8jOzWfprnQWbEth0fZUMrLznNvcLSY61Aume0w43ZqGUyvQ28BIRUSkosrKymLw4MF8/PHHhISEXLK/1WrlzjvvxOFw8OGHH16w36hRoxg5cqTzdWZmJpGRkfTo0eOCxZWyZLVaSUhIoHv37ri7u1/185fUyeq7+c+Svfx8yJvHBnQi0MfYmCta/sob5c81yp9rlD/XKH+uUf5cpxy6xuj8nR1VfSkqlIiIiPxFSubpM1NqpbB8z1Hy8u3ObQHe7tzUJIy4puF0bRSCn5c+JImISGEhISFYLBZSUlIKtaekpFCjRo0i/ffs2UNSUhLx8fHONru94P8eNzc3duzYQf369YFzRZJ9+/axaNGiixY8PD098fT0LNLu7u5u6E2+0ee/XE92b8S8rSnsScvmrfm7ePuOVkaHBFSc/JVXyp9rlD/XKH+uUf5co/y5Tjl0jVH5u9xzqlAiIiJVnsPhYNvhrILiyLYUNh44UWh7nSAfuseEE9c0nLZR1XG3mA2KVEREKgIPDw/atGnDwoUL6devH1BQ+Fi4cCEjRowo0r9JkyZs2rSpUNvo0aPJysrinXfeITIyEjhXJNm1axe//vorwcHBZX4tVZmnm4U3B7Tkjo9W8u36A/RtXYvODS894kdEREREKh4VSkREpErKy7ezJjGDBdtSSNiawsHjp5zbTCa4JjLQud5IgzBfrTciIiIlMnLkSO677z7atm1L+/btmTRpEtnZ2QwbNgyAIUOGUKtWLSZMmICXlxfNmzcvtP/ZBdrPtlutVm6//XZ+//13/ve//2Gz2Thy5AgAQUFBeHh4XL2Lq0LaRgUxuENdPl+5j1EzNzLvqa74eOg2WkRERKSy0Sc8ERGpMk7kWFm8M5WErSks2ZFGVm6+c5uXu5nODULpERPOjU3CCPUrOlWJiIjI5Ro4cCBpaWm89NJLHDlyhNatWzN37lznAu/JycmYzZc/QvHgwYPMmjULgNatWxfa9uuvv3LDDTeUVujyF8/1asKCrSnszzjFxPk7GX1LjNEhiYiIiEgpU6FEREQqteSjOSScWW9kTVIGNrvDuS3E15O4pgXrjXRqEIK3h8XASEVEpLIZMWJEsVNtASxevPii+06bNq3Q66ioKBwOR/GdpUz5erox/rYWDPt0LVOXJ3JLq5q0jgw0OiwRERERKUUqlIiISKVitzv488DxM4uxp7IjJavQ9sbhfsTFFBRHWtUOxGzWlFoiIiJycTc2DqNf65r8uOEQz3+3kZ+f6IyHm9YsExEREaksVCgREZEK71SejeW7088sxp5K+slc5zaL2UT7qCDneiN1gn0MjFREREQqqpfim/HbrnR2pGQxecke/tatodEhiYiIiEgpUaFEREQqpLSsXBZtTyFhayrLdqdx2mp3bvPzdOP6xqF0jwnnhkZhBPi4GxipiIiIVAZB1TwYGx/DkzM28P6i3fRpUYMGYX5GhyUiIiIipUCFEhERqRAcDge7U0+SsC2FhK0pbNh/nPOnaq8V6E33mHDimobTPjpI02GIiIhIqbu1VU1+/OMgv+5I4/nvN/Htw9dpGk8RERGRSkCFEhERKbfybXbWJh07M6VWCvuO5hTa3qp2AHFNw4mLCadJDT9MJj2oEBERkbJjMpl4rX8Lekxcwvp9x/hi1T7u6xhldFgiIiIi4iIVSkREpFzJOm1lyc40FmxN4dcdaZw4ZXVu83Az06l+MHEx4XRrEk6NAC8DIxUREZGqqFagNy/0bsKYn7bw1tztdGsaRu3qWgNNREREpCJToURERAx38PgpFp6ZUmvV3qNYbefm1Aqq5sFNTcKIaxpOl4YhVPPUf10iIiJirHti6zLrz0OsTTrGizM3M21YO41sFREREanA9LRJRESuOofDweaDmSRsS2HB1hS2Hs4stL1eaDW6x4TTvWk419SpjkVzf4uIiEg5YjabmHBbS/q8s5QlO9P4ccNB+l9T2+iwREREROQKqVAiIiJXRW6+jRV7jrJgawoLt6VyJPO0c5vZBG3rBhEXE0a3puHUD/U1MFIRERGRS2sQ5svfujXgn/N38srPW+naMJRgX0+jwxIRERGRK6BCiYiIlJmM7Dx+3Z7Kgm0p/LYzjew8m3Obj4eF6xuFEtc0nBubhBFUzcPASEVERERK7uHr6/O/jYfZfiSLcT9v5d1B1xgdkoiIiIhcARVKRESkVO1NO8mCbSks2JrKun0Z2M8tN0K4vydxTcPpHhNOh3rBeLlbjAtURERExEXuFjNv3d6Sfh8sZ9afh+h3TU1uahJudFgiIiIiUkIqlIiIiEtsdgd7MuHNeTtZtCONvWnZhbbHRPgTd2a9kea1/LXQqYiIiFQqLWsHMrxLPf7vt728OHMz858Ows/L3eiwRERERKQEVCgREZErkpGdx/RV+/h8ZRJpJ92AJADcLSY61Aume0w43ZqGUyvQ29A4RURERMra03GNmLflCPuO5vDW3B282q+50SGJiIiISAmoUCIiIiWyO/UkU5cn8v36A+Tm2wHwsTjo3rwmPZpF0LVRiL5FKSIiIlWKt4eFCf1bcPcnq/li1T7iW9WkfXSQ0WGJiIiIyGVSoURERC7J4XCwcu9RpixNZOH2VGd781r+DLuuLqb9fxB/Swvc3VUgERERkaqpY4MQBraN5Ot1+3nh+43MebKL1mMTERERqSBUKBERkQvKy7fzv42H+GRpIlsPZwJgMkG3JuE82CWa9tFB5OfnM+fgHwZHKiIiImK8f/RpyqIdqexNz+a9Rbt4tmcTo0MSERERkcugQomIiBRxPCeP6auT+WxFEqlZuQB4uZu5o00kwzpFUS/U1+AIRURERMqfAB93Xu3bjEe+/J2Pluzl5hY1ianpb3RYIiIiInIJKpSIiIhTYno2ny5P5Nt1BzhltQEQ5ufJfR2juLt9HapX8zA4QhEREZHyrVfzCHo1q8HcLUd4/vuNzHysI24Ws9FhiYiIiMhFqFAiIlLFORwO1iRm8MmyRBZsS8HhKGhvGuHP8M7RxLeqiYebbu5FRERELtcrfZuxYk86mw6eYOryRB7qWt/okERERETkIlQoERGpoqw2O3M2HWbKskQ2HjjhbL+pSRjDO0dzXf1gTCaTgRGKiIiIVExh/l6MvjmG577fyL/m76RHTA2iQqoZHZaIiIiIXIAKJSIiVcyJU1ZmrElm2ookDp84DYCnm5nbrq3NA52jaRCm9UdEREREXHVH29r89OdBlu8+yqgfNvHVg7H6EoqIiIhIOaVCiYhIFZF8NIepyxP5Zt1+cvIK1h8J8fVgyHVR3BNbh2BfT4MjFBEREak8TCYTE/q3pMekJazce5Sv1+7nrvZ1jA5LRERERIqhQomISCXmcDj4PfkYnyxNZN6WI9jPrD/SONyPB7pEc2urmni5W4wNUkRERKSSqhPsw9+7N2b8nG2Mn7ONG5uEEe7vZXRYIiIiIvIXV1Qo+eCDD3j77bc5cuQIrVq14r333qN9+/YX7D9p0iQ+/PBDkpOTCQkJ4fbbb2fChAl4eRX9gPjGG28watQonnzySSZNmnQl4YmIVHn5Njtztxzhk6WJbNh/3NnetVEowztH06VhiKZ+EJGKwW4Hhw3stjO/55/5s/28tvN/t5e8rz3/AvtfvK8530qjw9shJxYCahidKREpp4Z1iuLnjYfYeOAEL/20mY8GtzU6JBERERH5ixIXSr7++mtGjhzJ5MmTiY2NZdKkSfTs2ZMdO3YQFhZWpP9XX33FCy+8wNSpU+nYsSM7d+5k6NChmEwmJk6cWKjv2rVr+eijj2jZsuWVX5GISBWWddrK12v38+nyJA4ePwWAh8VM/2tqcX/naBrX8DM4QpEqwuEo5mG9rZiH/n9tv8y+hR7sX+IB/0Ue+pvzrTQ9tBPzorWA4+IFghIc91yf/AvsX8y1FXs8m9F/kxdlAZoC1pxnVCgRkQtys5h5c0BL4t9bxrwtKfyy6TC9W0QYHZaIiIiInKfEhZKJEyfy4IMPMmzYMAAmT57M7NmzmTp1Ki+88EKR/itWrKBTp07cfffdAERFRTFo0CBWr15dqN/Jkye55557+Pjjj3nttdeu5FpERKqsA8dymLY8iRlr93MyNx+AoGoeDO5Ql3s71CXUT+uPSAXncEBuJpxMg+xUOJkCJ9MwZx6h+YHNmOctBZPjIg/iLzayoLi+lyponD+yoJi+OIzO2GWxAI0AUgwO5IqZwGwBk+W8383nXpvdirYV29et+P2dv5vPe32urx3Yt/8gtT1VhBaRi2sa4c+jN9TnvUW7GfPTFjrWDyHAx93osERERETkjBIVSvLy8li/fj2jRo1ytpnNZuLi4li5cmWx+3Ts2JEvv/ySNWvW0L59e/bu3cucOXMYPHhwoX6PP/44N998M3FxcZdVKMnNzSU3N9f5OjMzEwCr1YrVai3JZZWKs+c04tyVgfLnGuXPNRU5fxv2H+fTFfuYtzUV25kFSOqFVOP+TnXp2yrCuf5IWV5bRc5feVCl8+dwwOkTkJ2GKTv13O8nz70uaDvzuy23yCEsQH2AtKsdvGscF3qwf9GH+Wdem8w4Cj20L7q96EN+t2L3t2Mief8B6tSNxuzmfpHCQnExXKS4UKSw8NftFhzFXfdf475QweJsnAZPIWi1WtmYkEC4VwgY+PlTRCqGETc1YM6mw+xJy+a12Vt5+45WRockIiIiImeUqFCSnp6OzWYjPDy8UHt4eDjbt28vdp+7776b9PR0OnfujMPhID8/n0ceeYR//OMfzj4zZszg999/Z+3atZcdy4QJExg3blyR9vnz5+Pj43PZxyltCQkJhp27MlD+XKP8uaai5M/ugE0ZJn49bCYx69xDwkYBdm6McNAk8ATm1I0sSth4VeOqKPkrrypN/hwO3G0n8bJm4pl/As/8TDytZ38/jmd+Jl5nXnvkZ2Jx5Jfo8FazF7nuAeS6+ZPrFkCuuz/5Zm/sJgsOkxkH5oKH+JgKXp9pK/T7ZbWZcJgshdownWkvsq/l3D4XO+55xykXzg56qQ2bbUCpz3J19qB5pX3gcseon9+cnBxDzisiV8bTzcKbA1pyx0cr+Xb9Afq2rkXnhiFGhyUiIiIiXOFi7iWxePFiXn/9df7zn/8QGxvL7t27efLJJ3n11VcZM2YM+/fv58knnyQhIaHYxd0vZNSoUYwcOdL5OjMzk8jISHr06IG/v39ZXMpFWa1WEhIS6N69O+7uGkJdUsqfa5Q/11SU/J3Mzef73w8ybWUyB44VrD/ibjER3zKCodfVpWmEMVO/VJT8lVcVIn8OO+RknDe6I/XcKI/sNDiZem4ESE46JnvJih8OT3+oFoqjWihUCzvzeygO3zD4Sxvu3ngCZyeTqxD5K8eUP9cYnb+zI6pFpOJoGxXE4A51+XzlPkbN3Mi8p7ri41Hmt+UiIiIicgkl+kQWEhKCxWIhJaXwRNYpKSnUqFH8ApZjxoxh8ODBDB8+HIAWLVqQnZ3NQw89xIsvvsj69etJTU3l2muvde5js9n47bffeP/998nNzcVisRQ5rqenJ56eRefcd3d3N/RG3+jzV3TKn2uUP9eU1/wdOn6Kz1Yk8dWaZLJOFzyADvRx597Yugy5ri5h/pdfZC5L5TV/FcVVz5/dBjlH4WTqmTU/zq79cabgcTL13Lbs9JIvqu0VCL5hUC0MfEPP/e4bXritWigm94L3sCuTKOn95xrlzzVG5U9/ZyIV03O9mrBgawr7M04xcf5ORt8SY3RIIiIiIlVeiQolHh4etGnThoULF9KvXz8A7HY7CxcuZMSIEcXuk5OTg9lceIqJs4UPh8NBt27d2LRpU6Htw4YNo0mTJjz//PPFFklERKqCjQeO88nSRGZvOlx4/ZHO0Qy4tjbeHvr3Uf7Clg856RcvfmSnFSyEnnO0YKRISXgHnSl+hBZTBAkvVPzAzaNsrlFERKSC8/V0Y3z/FgybtpapyxOJb1WTVpGBRoclIiIiUqWVeIzvyJEjue+++2jbti3t27dn0qRJZGdnM2zYMACGDBlCrVq1mDBhAgDx8fFMnDiRa665xjn11pgxY4iPj8diseDn50fz5s0LnaNatWoEBwcXaRcRqexsdgcLt6XwybJE1iRmONuvqxfM8C7R3Ng4DLPZ2MWL5SqzWQtGdJxMOa/YcYEiSM5Rzi08cTlM4BN8keJH2Lm2aiFg0bfXRURESsONTcLo27omP204xPPfb2TWiM54uJWTNaxEREREqqASF0oGDhxIWloaL730EkeOHKF169bMnTvXucB7cnJyoREko0ePxmQyMXr0aA4ePEhoaCjx8fGMHz++9K5CRKSCy8nL57v1B5i6LJGkowWL87qZTcS3qskDnaNpXivA4AilVOXnFRQ3slMxHT9EnaNLMC/fCaeOFi1+nMq49PHOZzKDT8hfih8XGAHiEwwWzYsuIiJihJduiWHprnS2H8nioyV7eKJbQ6NDEhEREamyrujpyIgRIy441dbixYsLn8DNjbFjxzJ27NjLPv5fjyEiUlmlZJ7msxVJTF+dzIlTVgD8vdy4p0Nd7rsuihoB5WP9EbkM+bmFR3ucTPnLyI/zRoCcPu7czQ24BiD5Isc2WQpGdDiLHRcZAeITDGZNyyYiIlLeBft6MjY+hidnbOC9Rbvp3aIGDcL8jA5LREREpErS10hFRAyw5dAJpixN5OeNh7DaCqZKqhvsw/2dorm9TW2qeeqf53LBeuov63tcpAiSe6Jkxza7QbVQHNVCSc2B0KhmmP3Ciy9+eAeBWdNxiIiIVDa3tqrJj38c5NcdaTz//Sa+ffg6TbMqIiIiYgA9iRMRuUrsdge/7kjlk6WJrNx71NnePiqIB7pEE9c0HItujMteXnbxxY/s1IICyPnFj7yskh3b7H7eaI/wwsWOQiNAwsArEMxm8q1WVs2ZQ58+fTC7aw0QERGRqsRkMvFa/xb0mLiE9fuO8cWqfdzXMcrosERERESqHBVKRETK2Kk8Gz/8cYApyxLZm5YNgMVs4uYWETzQOZpWkYHGBljRORyQd/IixY/Uwm3W7JId3+JZuNBxsemvvALBpGKXiIiIXL5agd4837sJL/20hbfmbicuJpxagd5GhyUiIiJSpahQIiJSRlKzTvPFyn18uWofx3IK1h/x83RjUGwd7usYpRvgi3E4IDezcLHjYkWQ/FMlO76bdzGjPcKLL354+qv4ISIiImXq3ti6zNpwiHX7jvHizE18OrQdJn3+EBEREblqVCgRESll249kMmVpIj9tOESezQ5A7ere3N8pmjvbReJbVdcfcTjg9Inzih0XKn6c+T3/dMmO716t+KmuihsB4uGr4oeIiIiUG2aziTcGtKTPO0tZvCONnzYcot81tYwOS0RERKTKqKJP60RESpfD4WDJzjSmLEtk6a50Z/u1dQJ5sEs9useE42appItx52bhe/ogpn3L4NTRixc/bHklO7aH33nFj0uMAPGoVjbXJyIiInIVNAjz5W/dGvDP+TsZ9/MWujQMIdjX0+iwRERERKoEFUpERFxw2mrjxz8OMmVZIrtSTwJgNkHv5hHc3zmaNnWrGxxhKbHlw/F9cHQ3pO+Co7sgfTcc3YX7yRS6AWy7zGN5Blx+8cNd05OJiIhI1fHw9fX538bDbD+Sxbift/LuoGuMDklERESkSlChRETkCqSfzOXLVfv4YuU+jmYXjJLw9XRjYLtIhnaMIjLIx+AIr1BOxnmFkF3nCiMZe8FuveBueZZquAfWxOQbXnwR5Oz0V9VCwd3rKl6QiIiISMXhbjHz1u0t6ffBcmb9eYh+19TkpibhRoclIiIiUumpUCIiUgK7UrKYsiyRH/44SF5+wfojNQO8GNYpmoHtI/H3cjc4wsuQnwfHEouMDCF9F5zKuPB+bt4Q3ABCGkBwQwhpCMENsAZE8cvCpfTp0wd39wpw/SIiIiLlWMvagTzQOZqPlyby4szNzH86CL+K8BlTREREpAJToURE5BIcDgfLdqfzydJEluxMc7a3qh3A8C716N28Rvlbf8ThKFgn5K8jQ47ugmP7wGG78L4BkWcKIg3PFETOFEb8a4G5mOu0XnikiYiIiIiU3MjujZm3JYXkjBzemruDV/s1NzokERERkUpNhRIRkQvIzbcxa8MhpixLZPuRLABMJugRE86DXerRpm51TCaTsUFaT8HRPUVHhhzdDbmZF97Pw7f4YkhwfS2KLiIiImIwbw8LE25rwT2frOaLVfu4tXVNWtfyMzosERERkUpLhRIRkb/IyM5j+qp9fLZyH+kncwHw8bBwZ9tIhnWKom7wVS4kOByQebDoyJD03XBiP+Aofj+TGQLrFJomy1kY8atRUPURERERkXKpU4MQBraN5Ot1+3n++43MerSD0SGJiIiIVFoqlIiInLEnLZvPV+/n+/UHyD2z/kgNfy+GdopiULs6BPiU8dzQuVlnCiHnjwzZVTBixJpz4f28AouODAlpCEH1wM2zbGMWERERkTLzjz5NWbQjlb1p2XywZC9NjA5IREREpJJSoUREqjSHw8GqvRn833YzW1Yud7Y3r+XP8M71uLllBO6luf6I3QbHk/8yMuTMSJGswxfez+wG1aOLjgwJaQg+wRodIiIiIlIJBfi482rfZjzy5e98vDSJkVqqRERERKRMqFAiIlVSXr6d/208xCdLE9l6OBMwYzJBtybhDO8STWx0kGvrj5w6VnRkSPpuyNgLttwL71cttOjIkOCGUL0uWMp4RIuIiIiIlDu9mkfQq1kN5m45wn/3WBhms+Ouj4UiIiIipUqFEhGpUo7n5DF9dTKfrUgiNaugYOHlbqZtUD4v3dWFRhGBl38wmxWOJRUdGZK+C3LSL7yfxbNg0fS/jgwJbgDeJTi/iIiIiFQJr/Rtxoo96ezPzmfaymQevbGh0SGJiIiIVCoqlIhIlZCYns2nyxP5dt0BTlltAIT5eXJfxyjuuDaClYsXEB1SzCLtDgdkpxcdGXJ0V0GRxJ5/4ZP61Sw6MiSkAQREgtlSNhcqIiIiIpVOmL8XL/RqxD9+3Mo7i3bTp2VN6gYX89lVRERERK6ICiUiUmk5HA7WJGbwybJEFmxLweEoaG8a4c/wztHEt6qJh5sZq9WK2Z4HqdvgRGLhkSFHd8HpExc+ibtP8SNDghuAp+/VuVARERERqfRuv7YWny7azK5MGPXDJqYPj3VtqlgRERERcVKhREQqHavNzpxNh5myLJGNB84VOW5qHMqjbarR1jcd09F5sKCgGOKWvotbju/D9KfjAkc0QWBk4ULI2cKIf00tpC4iIiIiZc5kMnFXfTtvb3ZjxZ6jfLNuPwPb1TE6LBEREZFKQYUSEak0TpyyMmNNMjOWb8c7K4l6psPEuR+ha/Bxmrin4HV4L/xwssh+Z8scDk9/TOdPkXW2MBJUD9y9r+7FiIiIiIj8RYgXPNWtAW/M3clrs7dxQ+Mwwv29jA5LREREpMJToUREKia7HTIPQPouMpK3snvbH+Sn7uQWDvGw6Sh4ntf3+Hl/Nlmget1Co0Pyq9djwR/76HbrXbh7eFzlCxERERERuXz3dajDnM0pbDxwgpd+2sxHg9saHZKIiIhIhadCiYiUb6czCy+gfmb9EMfRPZjyTwEQBLSHc0NDAId3UPGjQ6pHg1vhYojDaiV383FNoSUiIiIi5Z6bxcybA1oS/94y5m1J4ZdNh+ndIsLosEREREQqNBVKRMR4tnw4vq/wAupnCyMnU4rdxQTkOSzsc9RgryMCa/X6NGx6DY2aXYMppBEmn6Crew0iIiIiIldJ0wh/Hrm+Pu//upuXZm2hY/0QAnzcjQ5LREREpMJSoURErp6cjPMKIbvOFUYy9oLdeuH9fMPJr16fXbYIElL9+CMnlL2OCFLN4dx6TR3u7xxN4xp+V+86REREREQMNuKmBszZfJi9admMn7OVt25vZXRIIiIiIhWWCiUiUrry8+BYYtGRIem74FTGhfdz84LgBgW/zpsy66ClFlPXZfD12v2czM0HIKiaB4M71OXeDnUJ9fO88DFFRERERCopL3cLbw5oyR2TV/LNugP0bV2LTg1CjA5LREREpEJSoURESs7hgJOpRUeGHN0Fx/aBw3bhff1rF14z5GxhxL82mM3Obn8kH+OTJYn8smk9dkdBW/3QagzvUo/+19TCy91SxhcpIiIiIlK+tYsKYsh1dfl85T5G/bCJuU91wcdDt/kiIiIiJaVPUCJyYdZTcHRPsYupk5t54f08fIuMDCG4IQTXB49qF9zNZncwf8sRPlmWyPp9x5ztnRuE8ECXaK5vGIrZrAXXRURERETOeq5XExZsTSE5I4eJ83cy+pYYo0MSERERqXBUKBGp6hwOyDxYdGRI+m44sR9wFL+fyQyBdYqODAluCH41wHT5BY2Tufl8u24/U5cnsj/jFADuFhO3tqrFA52jianpXwoXKiIiIiJS+fh6ujG+fwuGTVvL1OWJxLeqSavIQKPDEhEREalQVCgRqSpyTxYzMmRXwYgRa86F9/MKLDoyJKQhVI8Gdy+XQjp0/BSfrUjiqzXJZJ0uWH8k0Mede2PrMuS6uoT5u3Z8EREREZGq4MYmYfRtXZOfNhzi+e83MmtEZzzczJfeUUREREQAFUpEKhe7DTIO/GVkyJmRIlmHL7yf2Q2qR/2lGNKooCDiE1yi0SGXY+OB43yyNJHZmw5jO7MASb2QatzfOZoB19bG20Prj4iIiIiIlMRLt8Tw2840th/J4qMle3iiW0OjQxIRERGpMFQoEanIHA5IWopl/WfcuHslbhsfBFvuhfv7hBSdJiukYUGRxOJepqHa7A4Wbkvhk2WJrEnMcLZ3qBfE8M71uKlJmNYfERERERG5QsG+noyNb8ZTX2/gvUW76d2iBg3C/IwOS0RERKRCUKFEpCKynoJN38LqjyBlM2bAuYqHxQOC6heeJuvsSBHv6lc91Jy8fL5bf4CpyxJJOlowxZeb2UR8q5o80Dma5rUCrnpMIiIiIiKVUcH0Wwf5dUcaL3y/iW8evk5fRhIRERG5DCqUiFQkJw7C2k9g/TQ4dWZUhrsPthYDWXM8iLa9BuEeUg/Mxk9dlZJ5ms9WJDF9dTInTlkB8Pdy4+7YugztGEWNAK0/IiIiIiJSmkwmE6/1b0GPiUtYt+8YX67ex5DroowOS0RERKTcU6FEpLxzOGD/Glj9IWydBQ5bQXtgHWj/EFxzL3Y3X1LnzCmYQsvgIsmWQyeYsjSRnzcewmorWH+kbrAP93eK5vY2tanmqX92RERERETKSq1Ab57v3YSXftrCm79sp1vTcGoFehsdloiIiEi5pieWIuVVfi5smQmrJ8OhP861R3WB2IehcZ9zRRGr1ZgYz7DbHfy6I5VPliaycu9RZ3v7qCAe6BJNXNNwLBryLyIiIiJyVdwbW5dZGw6xbt8xXpy5iU+HtsNk0udxERERkQtRoUSkvDmZCuumwtopkJ1a0GbxhJZ3QOwjUKOFsfGd51SejR/+OMCUZYnsTcsGwGI2cXOLCB7oHE2ryEBjAxQRERERqYLMZhNvDGhJn3eWsnhHGj9tOES/a2oZHZaIiIhIuaVCiUh5cegPWDUZtvwAtryCNr8IaDcc2gyFaiGGhne+1KzTfLFyH1+u2sexnILRLH6ebgyKrcN9HaM0tF9ERERExGANwnx54qYG/CthJ+N+3kKXhiEE+3oaHZaIiIhIuWQ2OgCRKs2WD5t/gCk94f9ugI0zCooktdvDgCnw1Cbo+ky5KZJsP5LJs9/+Sec3fuW9Rbs5lmOldnVvXrolhpX/6MY/+jRVkURERETkjA8++ICoqCi8vLyIjY1lzZo1l7XfjBkzMJlM9OvXr1C7w+HgpZdeIiIiAm9vb+Li4ti1a1cZRC6VxcPX16dJDT+O5Vh55X9bjQ5HREREpNzSiBIRI+RkwPppsPYTyDxY0GZ2h2b9ocMjUKuNoeGdz+FwsGRnGlOWJbJ0V7qz/do6gTzYpR7dY8Jxs6jmKiIiInK+r7/+mpEjRzJ58mRiY2OZNGkSPXv2ZMeOHYSFhV1wv6SkJJ555hm6dOlSZNtbb73Fu+++y2effUZ0dDRjxoyhZ8+ebN26FS8vr7K8HKmgPNzMvDmgJf3/s5yfNhyib+ua3NQk3OiwRERERModFUpErqaULQWLs2/8BvJPF7RVC4W29xf88qthbHznOW218eMfB5myLJFdqScBMJugd/MI7u8cTZu61Q2OUERERKT8mjhxIg8++CDDhg0DYPLkycyePZupU6fywgsvFLuPzWbjnnvuYdy4cSxdupTjx487tzkcDiZNmsTo0aPp27cvAJ9//jnh4eH8+OOP3HXXXWV+TVIxtYoM5IHO0Xy8NJHRMzcz7+kg/LzcjQ5LREREpFxRoUSkrNltsHNuQYEk8bdz7TVaQodHofkAcCs/cwWnn8x1rj9yNLtgrRRfTzcGtotkaMcoIoN8DI5QREREpHzLy8tj/fr1jBo1ytlmNpuJi4tj5cqVF9zvlVdeISwsjAceeIClS5cW2paYmMiRI0eIi4tztgUEBBAbG8vKlSuLLZTk5uaSm5vrfJ2ZmQmA1WrFarVe8fVdqbPnNOLclYEr+XvihnrM3XyE/cdO8cacbbwc37S0wyv39P5zjfLnGuXPNcqfa5Q/1ymHrjE6f5d7XhVKRMrK6RPwx5ew5v/gWFJBm8kCTW+B2EehTgcwmQwN8Xy7UrKYsiyRH/44SF6+HYCaAV4M6xTNwPaR+OtbZyIiIiKXJT09HZvNRnh44SmOwsPD2b59e7H7LFu2jClTprBhw4Zitx85csR5jL8e8+y2v5owYQLjxo0r0j5//nx8fIz78ktCQoJh564MrjR/8REm/nPMwvQ1+wnOTqS+fykHVkHo/eca5c81yp9rlD/XKH+uUw5dY1T+cnJyLqufCiUipS19F6z+CDZ8BdbsgjavQGgzFNoNh8BII6MrxOFwsGx3Op8sTWTJzjRne6vaAQzvUo/ezWto/RERERGRMpaVlcXgwYP5+OOPCQkJKbXjjho1ipEjRzpfZ2ZmEhkZSY8ePfD3v/pPya1WKwkJCXTv3h13d30Jp6RczV8fIHXmFr77/SD/S/Fn1oDr8HS3lH6g5ZTef65R/lyj/LlG+XON8uc65dA1Rufv7KjqS1GhRKQ02O2wZ1HB9Fq7z6uOhjYtWJy9xZ3gUX6mrMrNtzFrwyGmLEtk+5EsoGBwS4+YcB7sUo82datjKkejXUREREQqkpCQECwWCykpKYXaU1JSqFGj6Jp0e/bsISkpifj4eGeb3V4wwtfNzY0dO3Y490tJSSEiIqLQMVu3bl1sHJ6ennh6Fp3i1d3d3dCbfKPPX9G5kr8xtzRjya509qbnMHnpPp7p2biUoyv/9P5zjfLnGuXPNcqfa5Q/1ymHrjEqf5d7ThVKRFyRexL+/G/BCJKju840mqBRr4ICSfT15Wp6rYzsPKav2sdnK/eRfrJgvmofDwt3to1kWKco6gZXMzhCERERkYrPw8ODNm3asHDhQvr16wcUFD4WLlzIiBEjivRv0qQJmzZtKtQ2evRosrKyeOedd4iMjMTd3Z0aNWqwcOFCZ2EkMzOT1atX8+ijj5b1JUklEeDjziu3NuPR6b8zeckebm4ZQdOIKjoHl4iIiMh5VCgRuRLHkmDNx/D7F5B7oqDN0x+uuRfaPwhB9QwN7692p55k6vJEvl9/gNwz64/U8PdiaKcoBrWrQ4CPquEiIiIipWnkyJHcd999tG3blvbt2zNp0iSys7MZNmwYAEOGDKFWrVpMmDABLy8vmjdvXmj/wMBAgELtTz31FK+99hoNGzYkOjqaMWPGULNmTWcxRuRy9G4RQa9mNZi75QjPf7+RHx7tqOl2RUREpMpToUTkcjkckLQUVk2GHXMAR0F7UH2IfQRaDwJPP0NDPJ/D4WDl3qNMWZrIwu2pzvbmtfwZ3rkeN7eMwF03RCIiIiJlYuDAgaSlpfHSSy9x5MgRWrduzdy5c52LsScnJ2M2l+yz2HPPPUd2djYPPfQQx48fp3PnzsydOxcvL6+yuASpxF7p24wVe9LZeOAEny5P4sGu5euLXiIiIiJXmwolIpdiPQWbvi2YXitl87n2+jdB7KPQIA5KeJNblvLy7fxv4yE+WZrI1sMFixWZTNCtSTjDu0QTGx2k9UdEREREroIRI0YUO9UWwOLFiy+677Rp04q0mUwmXnnlFV555ZVSiE6qsjB/L168uSnPf7+JfyXsoEezcE3DKyIiIlWaCiUiF3LiIKz9BNZPg1MZBW3uPtBqEMQ+DKHla+HDbCtMXrKXL1bvJzWrYP0RL3czd7QpWH+kXqivwRGKiIiIiEh5cWfbSH7acIgVe44y6odNTB8eqy9UiYiISJWlQonI+RwO2L8GVn8IW2eBw1bQHlgH2j9UsAaJd3VjY/yL3Hwbb/yyg+m/W8iz7wYg1M+ToR2juLt9HapX8zA4QhERERERKW9MJhMTbmtBz0m/sWLPUb5Zt5+B7eoYHZaIiIiIIVQoEQHIz4UtM2H1ZDj0x7n2qC4Fo0ca9wGzxbj4LuKDX/fw6Yp9gIkm4b482LU+t7SKwNOtfMYrIiIiIiLlQ93gaozs3ojX52zntdnbuLFxGGH+WvNGREREqh4VSqRqO5kK66bC2imQfWbBc4sntLyjYIH2Gi2Mje8S9qadZPLiPQDcVc/GK0Ovw8NDI0hEREREROTy3N8pmp//PMymgyd46actTB7cxuiQRERERK46FUqkajr0B6yaDFt+AFteQZtfBLQbDm2GQrUQQ8O7HA6Hg5d+2kKezU7XhsF0CE7RnMIiIiIiIlIibhYzbw5oya3vL2PuliPM3XyYXs0jjA5LRERE5KpSoUSqDls+bJsFqz+C/avOtdduXzC9VkxfsLgbF18JzfrzEMt2p+PpZualW5qyZVWK0SGJiIiIiEgFFFPTn0eur8/7v+5mzE9buK5eCAE+FefeSERERMRVKpRI5ZeTAeunwdpPIPNgQZvZHZr1hw6PQK2KN7Q887SV12ZvA2DEjQ2oG+TDFoNjEhERERGRimvETQ2Ys/kwe9OyGT9nK2/d3srokERERESuGhVKpPJK2VKwOPvGbyD/dEFbtVBoe3/BL78axsbngn/N20FaVi71Qqvx0PX1wGE3OiQREREREanAvNwtvDmgJXdMXsk36w7Qt3UtOjUo/1MSi4iIiJQGFUqkcrHbYOfcggJJ4m/n2mu0hA6PQvMB4OZpXHylYNOBE3yxah8Ar/VtjqebBatVhRIREREREXFNu6ggBneoyxer9jHqh03Me6or3h4Wo8MSERERKXMqlEjlcPoE/PElrPk/OJZU0GayQNNbIPZRqNMBKsFC5za7gxd/3ITdAX1b16SjvuElIiIiIiKl6LlejVmwLYXkjBwmJuzgxZtjjA5JREREpMypUCIVW/qugsXZN3wF1uyCNq9AaDMU2g2HwEgjoyt1X63ex8YDJ/DzcuPFm5saHY6IiIiIiFQyfl7ujO/fnPunrWPKskRuaVmTVpGBRoclIiIiUqbMV7LTBx98QFRUFF5eXsTGxrJmzZqL9p80aRKNGzfG29ubyMhInn76aU6fPu3c/uGHH9KyZUv8/f3x9/fnuuuu45dffrmS0KQqsNth1wL48nZ4vy2s/bigSBLaFG6ZBCO3Qfdxla5Ikpp1mrfm7gDg2Z6NCfPzMjgiERERERGpjG5qEk7f1jWxO+D57zditWmqXxEREancSjyi5Ouvv2bkyJFMnjyZ2NhYJk2aRM+ePdmxYwdhYWFF+n/11Ve88MILTJ06lY4dO7Jz506GDh2KyWRi4sSJANSuXZs33niDhg0b4nA4+Oyzz+jbty9//PEHzZo1c/0qpXLIPQl//rdgBMnRXWcaTdCoF3R4BKKvrxTTa13I+NnbyMrNp2XtAO6JrWt0OCIiIiIiUom9dEsMv+1MY/uRLD5asocRNzU0OiQRERGRMlPiESUTJ07kwQcfZNiwYcTExDB58mR8fHyYOnVqsf1XrFhBp06duPvuu4mKiqJHjx4MGjSo0CiU+Ph4+vTpQ8OGDWnUqBHjx4/H19eXVatWXfmVSeVxLAnmvQgTY2DOMwVFEg8/6PAYPLEe7p4B9W6o1EWS5bvT+WnDIcwmGN+vBRZz5b1WERERERExXrCvJ2PjC764+O7C3exOzTI4IhEREZGyU6JCSV5eHuvXrycuLu7cAcxm4uLiWLlyZbH7dOzYkfXr1zsLI3v37mXOnDn06dOn2P42m40ZM2aQnZ3NddddV5LwpDJxOCDxN/jv3fBOa1j5PuSegKD60Pst+Ps26DUBgusbHWmZy823MebHzQAM7lCXFrUDDI5IRERERESqgr6ta3JD41DybHZe+H4TdrvD6JBEREREykSJpt5KT0/HZrMRHh5eqD08PJzt27cXu8/dd99Neno6nTt3xuFwkJ+fzyOPPMI//vGPQv02bdrEddddx+nTp/H19WXmzJnExMRcMJbc3Fxyc3OdrzMzMwGwWq1YrdaSXFapOHtOI85dGTjzl5OJaecsLGs/xpS6xbndXu9G7O0ewlG/G5jMZ3cyItSr7sPFe9mbnk2orwdP3lSv2PeY3n+uUf5co/y5RvlzjfLnGuXPNUbnT39vIlLWTCYT4/u3oMfEJazbd4wvV+9jyHVRRoclIiIiUupKvEZJSS1evJjXX3+d//znP8TGxrJ7926efPJJXn31VcaMGePs17hxYzZs2MCJEyf47rvvuO+++1iyZMkFiyUTJkxg3LhxRdrnz5+Pj49PmV3PpSQkJBh27orMKy+DpukLsbz7GG62kwDkmz3YH9SZvaHdOelVC3ZaYedcgyO9utJPwwcbLICJ3hGnWLro4u8vvf9co/y5RvlzjfLnGuXPNcqfa4zKX05OjiHnFZGqpVagN8/1asLYWVt485ftdGsaTq1Ab6PDEhERESlVJSqUhISEYLFYSElJKdSekpJCjRo1it1nzJgxDB48mOHDhwPQokULsrOzeeihh3jxxRcxmwtGB3h4eNCgQQMA2rRpw9q1a3nnnXf46KOPij3uqFGjGDlypPN1ZmYmkZGR9OjRA39//5JcVqmwWq0kJCTQvXt33N3dr/r5KySHA9PBtZjXfIRp+/8wOWwFzQGR2Ns+gKPVvdT2DqS2wWEaxeFwMPyL37E6jtKxXhCjB7fBdIF1WPT+c43y5xrlzzXKn2uUP9cof64xOn9nR1SLiJS1wR3q8vOfh1i37xijZ25i6tB2F7w3EREREamISlQo8fDwoE2bNixcuJB+/foBYLfbWbhwISNGjCh2n5ycHGcx5CyLxQIUPAi+ELvdXmhqrb/y9PTE09OzSLu7u7uhN/pGn79CyM+FLTNh9WQ49IezOd23CYE9R+HWLB6L2YLFwBDLgzmbDvPbrqN4WMy81r8FHh4el9xH7z/XKH+uUf5co/y5RvlzjfLnGqPyp78zEblazGYTbwxoSZ93lvLrjjRm/XmIvq1rGR2WiIiISKkp8dRbI0eO5L777qNt27a0b9+eSZMmkZ2dzbBhwwAYMmQItWrVYsKECQDEx8czceJErrnmGufUW2PGjCE+Pt5ZMBk1ahS9e/emTp06ZGVl8dVXX7F48WLmzZtXipcqhjuZCuumwtopkJ1a0GbxhJZ3YL32AZb/vp8+TfqAuaqXSOBkbj6v/LwVgEduqE+9UF+DIxIRERERkaqsQZgvT9zUgH8l7OTlWVvo3CCEYN+iX14UERERqYhKXCgZOHAgaWlpvPTSSxw5coTWrVszd+5c5wLvycnJhUaQjB49GpPJxOjRozl48CChoaHEx8czfvx4Z5/U1FSGDBnC4cOHCQgIoGXLlsybN4/u3buXwiWK4Q79Aasmw5YfwJZX0OYXAe0egDbDoFrImYXZ9xsaZnny74SdHMk8Td1gHx67ob7R4YiIiIiIiPDw9fWZvekw249k8cr/tvLOXdcYHZKIiIhIqbiixdxHjBhxwam2Fi9eXPgEbm6MHTuWsWPHXvB4U6ZMuZIwpDyz5cO2WbD6I9i/6lx77XYQ+wjE9AWLposoztZDmUxbkQTAK32b4+WuETYiIiIiImI8Dzczbw5oSf//LOenDYfo27omNzUJNzosEREREZddUaFE5IJyMmD9NFj7CWQeLGgzu0Oz/gUFktptDA2vvLPbHbz44yZsdgc3t4jg+kahRockIiIiIiLi1CoykPs7RfPJskRGz9zM/JHB+Hrq0YKIiIhUbPo0I6UjZUvB4uwbv4H80wVtPiHQ9v6CKbb8ahgbXwUxY+1+/kg+TjUPC2NuiTE6HBERERERkSJG9mjEvK1H2J9xirfmbueVvs2NDklERETEJSqUyJWz22Dn3IICSeJv59prtIQOj0Kz28Ddy7j4Kpj0k7m8OXc7AH/v0ZgaAcqdiIiIiIiUPz4ebrxxW0vu+WQ1X6zax62tatI2KsjosERERESumAolUnKnT8AfX8Ka/4NjSQVtJjM0jYfYR6FOBzCZDA2xIpowZzsnTlmJifBnyHV1jQ5HRERERETkgjo1COHOtrX5Zt0Bnv9+I7P/1kXrK4qIiEiFpUKJXL70XQWLs2/4CqzZBW1egdDmPmj3IARGGhpeRbZ671G+//0AJhOM798cN4vZ6JBEREREREQu6sU+Mfy6I409adm8v2g3z/RsbHRIIiIiIldEhRK5OLsd9iwqmF5rd8K59tCmEPswtBwIHj7GxVcJ5OXbGf3jZgAGta/DNXWqGxyRiIiIiIjIpQX4uPPKrc14dPrvTF6yh5tbRtA0wt/osERERERKTIUSKV7uSfjzvwUjSI7uOtNogka9oMMjEH29ptcqJVOWJbIr9STB1Tx4vmcTo8MRERERERG5bL1bRNCzWTjztqTw/Pcb+eHRjhohLyIiIhWOCiVS2LEkWPMx/P4F5J4oaPPwg2sHQ7vhEFzf0PAqm/0ZObyzcCcA/+jTlAAfd4MjEhERERERKZlX+jZnxZ6jbDxwgk+XJ/Fg13pGhyQiIiJSIiqUCDgckLQUVk2GHXMAR0F7UP2C6bVa3w2efoaGWFmN+3kLp612YqODuO3aWkaHIyIiIiIiUmLh/l682KcpL/ywiX8l7KBHs3DqBlczOiwRERGRy6ZCSVVmPQWbvi2YXitl87n2+jdB7KPQIA7MGjJdVuZvOcKCbam4W0yM798ck6YyExERERGRCmpgu0h+2nCIlXuPMuqHTUwfHqt7HBEREakwVCipik4chLWfwPppcCqjoM3dB1oNKhhBEtrY0PCqgpy8fMb9vBWAB7vUo0GYRuyIiIiIiEjFZTKZeGNAC3pO+o0Ve47y7boD3Nku0uiwRERERC6LCiVVhcMB+9fA6g9h6yxw2AraA+pA+wcL1iDxrm5sjFXIOwt3cfD4KWpX9+aJmxoaHY6IiIiIiIjL6gZXY2T3Rrw+Zzuvzt7KDY1DCfP3MjosERERkUtSoaSyy8+FLTNh9WQ49Me59rqdocMj0LgPmC3GxVcF7TiSxZSliQCMu7UZ3h7Kv4iIiIiIVA73d4rm5z8Ps+ngCV76aQuTB7cxOiQRERGRS1KhpLI6mQrrpsLaKZCdWtBm8YSWd0D7hyGipbHxVVF2u4PRP24i3+6gR0w43ZqGGx2SiIiIiIhIqXGzmHlzQEtufX8Zc7ccYe7mw/RqHmF0WCIiIiIXpUJJZXPoD1g1Gbb8ALa8gja/CGj3ALQZBtVCjI2vivvu9wOsTTqGt7uFsbc2MzocERERERGRUhdT05+Hr6/HB7/uYcxPW7iuXggBPu5GhyUiIiJyQSqUVAa2fNg2C1Z/BPtXnWuv3Q5iH4GYvmDRh1KjHcvOY8KcbQA83b0htQK9DY5IRERERESkbDxxU0N+2XyEvWnZvD5nG2/erlkNREREpPxSoaQiy8mA9dNg7SeQebCgzewOzfoXFEhqay7Y8uTNuds5lmOlcbgfwzpFGx2OiIiIiIhImfFyt/DmgJbcMXklX6/bT9/WNenYQDMciIiISPmkQklFlLKlYHH2jd9A/umCNp8QaHt/wRRbfjWMjU+KWL8vgxlr9wMwvn9z3C1mgyMSEREREREpW+2ighjcoS5frNrHCz9sYt5TXfH2sBgdloiIiEgRKpRUFHYb7JxbUCBJ/O1ce42W0OFRaHYbuHsZF59ckNVm58WZmwG4s21t2kYFGRyRiIiIiIgBUrdisZ02Ogq5yp7r1ZgF21JIzshhYsIOXrw5xuiQRERERIpQoaS8O30C/vgS1vwfHEsqaDOZoWk8xD4KdTqAyWRoiHJx05Ynsf1IFoE+7rzQu6nR4YiIiIiIXH12O27f3UfPzBTMXr9Dh4chqJ7RUclV4Oflzvj+zbl/2jqmLEvklpY1aRUZaHRYIiIiIoWoUFJepe8qWJx9w1dgzS5o8wqENvdBuwchMNLQ8OTyHDp+in8v2AnAqN5NCKrmYXBEIiIiIiIGyDoEJhPuthxYMxnWfASNekLsw1DvRn35q5K7qUk4t7aqyaw/D/H89xv5+YnOmo5YREREyhUVSsoTux32LCqYXmt3wrn20KYFNxAtB4KHj3HxSYm98vNWcvJstK1bnTvaqLglIiIiIlVUQG3yH1nFuhlvEmv6E/OeBQVTC++cCyGNoP1D0GoQePoaHamUkbHxMSzdlcb2I1l8tGQPI25qaHRIIiIiIk76Ckd5kHsS1nwMH7SH6QPOFElM0Kg3DPkJHlsJbYepSFLB/Lo9lblbjmAxm3itf3PMZn1LTkRERESqMJOZ1IBW2O6aASPWQ+wj4OEH6TthzjMwsSnMHQVH9xgdqZSBYF9PxsY3A+DdhbvZnXrS4IhEREREzlGhxEjHkmDeizAxpuDG4Oiu/2/vzsOjKs83jn9nJpOVJJCELIRAIGFNwr7IHpRFQQS1v1ptEbFqVWjRtLYuIKJYahfEWgSrVaxotVbBBUQQCPsimyQQAlkgLFkJZCX7/P4YCERACBM4We7PdZ0r5uTMzHMex5g3d973tQ8Ubnocfr0T7vsI2kdrGnoDdKaskue/sG/g/svB7egc6GVwRSIiIiIi9YhfONz2CsTsh9v+Ar7hUJoPW9+A13vDBz+FpNX2WffSaIzv0YroTi0pq6zimc/2UlVlM7okEREREUBLb914Nhsc3gBbF0LicuDsD4Y+YfbltXrcBy6ehpYojpu/NomjuWdo5e3KtFs0pVxERERE5JJcvaD/I9D3IUhZY9+n8dBKOPSN/fDtYF+Wq8e9Gic1AiaTiZfvjGLU3HV8d/gUH2w7wsQBoUaXJSIiIqKg5IYpPwNxn9h/8M+MP38+7Gbo/xiEjwCzJvg0BklZBby53r5cwPPjIvBw0X9mIiIiIiI/ymy2j4nCR9iX3tr+Fuz5wD7r/uunYPWL0PPn9tDEN8zoasUBwc3d+P2tnZn5xT7+9PUBbu4SQHBzN6PLEhERkSZOv5m/3vKOw7ez7MtrffFre0hidYc+v4Qp22HiEug4SiFJI2Gz2Zi+NJ7yShs3d/ZndESA0SWJiIiIiDQsvmFw25/sy3KN+at9VklZAWxbCK/3gsU/gUPfalmuBmziTW3p3bYFRWWVTF8Sh82mJbhERETEWPpT9+vBZoOj22HbAtj/Bdgq7ee920C/h6HXRHBrYWyNcl0s3XOcrSm5uFrNzLojApP2lxERERERuTYunvbxU59fQspa2P5POPgNJK2yH+eWL+5+r30JL2kwzGYTr9wdxZjXNrI2MZsvvj/B+B7BRpclIiIiTZiCkjpkrirHFPdf2PEWnNh9/gttB8NNj0KnMWC2GFegXFd5xeW8vCwBgF/f3IEQH3eDKxIRERERaQTMZgi/xX7kpsD2t2H3+5CbDF//Hla/ZN/rsd8j9k3ipUEI9/dk6s3hzF11kFlf7mdIh5b4eDgbXZaIiIg0UVrvqS4UZmFe/2dG7ovB6YvH7SGJxQV6/gJ+tQEmL4Mu4xSSNHJ/WXmAnMIywv2b8fCQ9kaXIyIiIiLS+Pi0h1v/CDEJMPZv4NfJvizX9jfhH71h8d1wcKWW5WogHh0WRudAT3KLynjxy31GlyMiIiJNmIKSurDpNSwb/oxrRR62ZoFw83T7errj50NQN6Orkxtgz9HTfLAtDYCXxkfi7KT/tERERERErhuXZtD3IZiyDSYuhY63ASZI+hY+/D97aLJ1AZTkGV2p/AhnJzOv3N0NswmW7jnB2sQso0sSERGRJkq/za0LfR+iqnU/doQ+TsXU3TD0KfDwM7oquUEqKqt4bkkcNhvc1TOYAWG+RpckIiIiItI0mEwQNhzu+wh+sxsGTAUXb/sSXSuehrldYdnvIPug0ZXKZXQPac6Dg9oB8NxncRSWVhhckYiIiDRFCkrqgk87Kict53iLm8BiNboaucHe33qEfSfy8XJ14tmxXYwuR0RERESkafJpB6Nfts/uHzsXWnaGskL47i2Y3xfev9O+GbyW5ap3YkZ1JMTHjRN5Jfx5xQGjyxEREZEmSEGJiAMy80v420r7X6f94bbO+DVzMbgiEREREZEmzqUZ9P0lPL4V7v8cOo0FTJC8Bj78KbzeC7a8oWW56hF3Zyfm3Glftvr9rUfYcTjX4IpERESkqVFQIuKAl77aT2FpBT1CmnNv3zZGlyMiIiIiIueYTNA+Gu79EKbtgYG/BldvOJUK3zwDf+sCy34L2YlGVyrA4A5+/F/v1ths8IdP91JSXml0SSIiItKEKCgRuUYbDmXz1d50zCaYPSESs9lkdEkiIiIiInIpLUJh1GyISYDb50HLLlBeBN+9DfP7wb8nQOLXUKVfzhtp+tiu+DVzITm7iPlrk4wuR0RERJoQBSUi16CkvJIZS+MBmDQwlMhgb4MrEhERERGRK3L2gD6T4fEtMOlL6Hw7mMyQshb+8zP7slyb/wFnThtdaZPk7W7lpfERACyITSYhPd/gikRERKSpUFAicg0WxCZz+GQxAV4uxIzsaHQ5IiIiIiJSGyYTtBsKP/sAfrMHBv4GXJvDqcOw8jmY2wW+ehKytLH4jXZbVBCjIwKoqLLxh0/3UlFZZXRJIiIi0gQoKBGppdScIhbEJgMw4/aueLpaDa5IRERERESuWYu2MOol+7Jc414D/wgoL4Yd78Ab/eG9O+DAci3LdQO9OD4ST1cn9h7L491Nh40uR0RERJoABSUitWCz2Xj+83jKKqsY2rElY6OCjC5JRERERETqgrM79H4AHtsEk76CLuPsy3KlroOP7oW/94TNr8OZU0ZX2ugFeLny3JguAPxtVSJHThYZXJGIiIg0dgpKRGrhq73pbDiUg7OTmRfviMBk0gbuIiIiIiKNiskE7YbAPYth2vcw6AlwawGnj8DK6TC3K3z5BGQlGF1po3ZP3xAGtPelpLyKZz6Lw2azGV2SiIiINGIKSkSuUkFJOS99tR+AKdHhhPp5GFyRiIiIiIhcV83bwMhZ8OR+uON1CIi0L8u181144yZ4bxwkfKVlua4Dk8nEnLuicHEyszn5JJ/sOGZ0SSIiItKIKSgRuUp/W3mQrIJS2vl58Gh0e6PLERERERGRG8XZHXrdD49uhAeWQ5c7zi7LtR4+/jn8vQdseg2Kc42utFEJ9fMgZmRHAGYv209WfonBFYmIiEhjpaBE5CrEH8/j31sOA/DS+EhcnCzGFiQiIiIiIjeeyQShg+Ce92HaXhj8JLj5wOk0WPW8fVmuL34DmfuMrrTR+OXgdkQFe5NfUsHML9RXERERuT4UlIhcQWWVjeeWxFFlg3HdWzG4g5/RJYmIiIiIiNGah8CIFyBmP9zxDwiIgoozsOs9WDAQFt0O+7+AygqjK23QnCxmXrm7G05mE1/HZ7AiPt3okkRERKQRUlAicgUfbk/j+2N5eLo4MWNsF6PLERERERGR+sTqBr0mwqMbYPLX0HUCmCxweAP8d6J9Wa6N87QslwO6tvLiV8Psyx/P+HwfecXlBlckIiIijY2CEpEfkV1Qyp9XHADgd6M74e/lanBFIiIiIiJSL5lM0HYg/PQ9eGIvDPmtfVmuvKPw7UyY2wU+nwoZcUZX2iD9+uYOtG/pQXZBKX9cnmB0OSIiItLIKCgR+RF/XJ5AQUkFUcHe/OKmtkaXIyIiIiIiDYF3a7jleYhJgPFvQGA3qCiB3e/DwsHw7ljY/7mW5aoFV6uFP93VDYCPdxxlc1KOwRWJiIhIY6KgROQyNifnsGT3cUwmePnOSCxmk9EliYiIiIhIQ2J1hZ4/h1+thwe/gYg77ctyHdkI/70fXusOG+ZC0UmjK20Q+rXz4Rc3tQHg6c/iOFNWaXBFIiIi0lgoKBG5hNKKSqYvjQfgF/3b0q11c2MLEhEREZEGZf78+YSGhuLq6kr//v3Zvn37Za/97LPP6NOnD82bN8fDw4MePXrw/vvv17imsLCQqVOn0rp1a9zc3OjatSsLFy683rchdcVkgjY3wf8tgifiYMjvwN0P8o/B6lnwalf4fAqk7zW60nrvD7d2JsjblbTcYl799qDR5YiIiEgjoaBE5BLeWp9CSnYRfs1c+N3oTkaXIyIiIiINyMcff0xMTAwzZ85k165ddO/endGjR5OVlXXJ6318fHjuuefYsmULe/fuZfLkyUyePJlvvvmm+pqYmBhWrFjB4sWLSUhI4IknnmDq1Kl88cUXN+q2pK54B8MtM+DJfTBhAQR1P7ss12J4cwi8cxvsW6JluS7D09XKy3dGAvD2hhT2HjttbEEiIiLSKCgoEfmBtJPFvL4mCYAZt3fB281qcEUiIiIi0pDMnTuXhx9+mMmTJ1fP/HB3d+edd9655PXR0dHceeeddOnShbCwMKZNm0a3bt3YuHFj9TWbN29m0qRJREdHExoayiOPPEL37t1/dKaK1HNWV+hxHzyyDh5cCZF3g9kJ0jbDJw/Aa91gw9+0LNcl3Nw5gDu6t6LKBr//317KK6uMLklEREQaOCejCxCpT2w2GzO/iKe0oopB4b7c0b2V0SWJiIiISANSVlbGzp07eeaZZ6rPmc1mRowYwZYtW674eJvNxpo1a0hMTOSVV16pPj9w4EC++OILHnzwQVq1akVsbCwHDx7k1VdfvexzlZaWUlpaWv15fn4+AOXl5ZSXl1/L7Tnk3Gsa8dr1XlAvGP8m3PwC5l2LMO96D1P+cVj9IrbYV7BF3E1FzwcA9e+cZ2/ryIZD2RzIKOCNNYd4PLr9j16v959j1D/HqH+OUf8co/45Tj10jNH9u9rXVVAicoFv9mWwNjEbZ4uZF8dHYjJpA3cRERERuXo5OTlUVlYSEBBQ43xAQAAHDhy47OPy8vIIDg6mtLQUi8XCG2+8wciRI6u//vrrr/PII4/QunVrnJycMJvNvPXWWwwdOvSyzzlnzhxmzZp10fmVK1fi7u5+DXdXN1atWmXYazcM3TF3eIVWp7fTPnslLYpTMe39ELe9HzLYoyP7Tm0jvXlvbCYN58e2MrE4ycLf1xzC7eQBAtyu/Bi9/xyj/jlG/XOM+ucY9c9x6qFjjOpfcXHxVV2nn6xEziosrWDWl/sB+NWw9oS1bGZwRSIiIiLSVHh6erJnzx4KCwtZvXo1MTExtG/fnujoaMAelGzdupUvvviCtm3bsn79eqZMmUKrVq0YMWLEJZ/zmWeeISYmpvrz/Px8QkJCGDVqFF5eXjfitmooLy9n1apVjBw5EqtVy9te2XiwzabixE7M3/0TU8IX+BYdxLfoIDbPIKp6Taaq5/3g4Wd0oYa5zWbj6Pu7WXcoh5Wn/Pjgzr6YzZf+Yze9/xyj/jlG/XOM+ucY9c9x6qFjjO7fuVnVV6KgROSseasOkp5XQhsfd6YMDze6HBERERFpgPz8/LBYLGRmZtY4n5mZSWBg4GUfZzabCQ+3/wzao0cPEhISmDNnDtHR0Zw5c4Znn32WJUuWMHbsWAC6devGnj17+Otf/3rZoMTFxQUXF5eLzlutVkMH+Ua/foMTOgBCB1Cem0byf2fQqWAzpoJ0LOv+iGXjXyHyJ9D/EWjV0+hKDfHyXVGMenU9O46c5r+7TjBxQOiPXq/3n2PUP8eof45R/xyj/jlOPXSMUf272tfUZu4iQEJ6Pu9uPgzArPERuFotxhYkIiIiIg2Ss7MzvXv3ZvXq1dXnqqqqWL16NQMGDLjq56mqqqreX+TcniJmc83hm8VioapKm1g3GZ5BJAbdRcXU3XDnP6FVL6gsg+8/hH9Gw79GQdz/oLJprZ/euoU7f7i1MwB/+voAJ06fMbgiERERaYgUlEiTV1Vl47klcVRW2RgTFcjwTv5GlyQiIiIiDVhMTAxvvfUW7733HgkJCTz22GMUFRUxefJkAO6///4am73PmTOHVatWkZKSQkJCAn/72994//33+cUvfgGAl5cXw4YN46mnniI2NpbU1FQWLVrEv//9b+68805D7lEM5OQC3e+BR9bCQ6sh6qdgtsLRbfDpL2FeFKz7CxRmG13pDTPxprb0btuCorJKpi+Nx2azGV2SiIiINDBaekuavP/uOMqutNN4OFt4/vYIo8sRERERkQbunnvuITs7m+eff56MjAx69OjBihUrqjd4T0tLqzE7pKioiMcff5xjx47h5uZG586dWbx4Mffcc0/1NR999BHPPPMMP//5z8nNzaVt27a8/PLLPProozf8/qQead3HfoyaDTvfhe/+BQXpsHY2rP8zRN4N/R6B4F5GV3pdmc0mXrk7ijGvbWTNgSy++P4E43sEG12WiIiINCAKSqRJyy0q408rDgDw5MiOBHq7GlyRiIiIiDQGU6dOZerUqZf8WmxsbI3PZ8+ezezZs3/0+QIDA3n33XfrqjxpbDwDIPppGBwD+z+HbQvh+A74/j/2o3Vf6P8odLkDnJyNrva6CPf3ZOrN4cxddZBZX+5nSIeW+Hg0znsVERGRundNS2/Nnz+f0NBQXF1d6d+/P9u3b//R6+fNm0enTp1wc3MjJCSEJ598kpKSkuqvz5kzh759++Lp6Ym/vz8TJkwgMTHxWkoTqZU5yxM4XVxOlyAvHhgYanQ5IiIiIiIi187JGbr9Hzy8Gh5aA93usS/Ldey7s8tyRULsK1CYZXSl18Wjw8LoFOBJblEZL365z+hyREREpAGpdVDy8ccfExMTw8yZM9m1axfdu3dn9OjRZGVd+getDz/8kKeffpqZM2eSkJDAv/71Lz7++GOeffbZ6mvWrVvHlClT2Lp1K6tWraK8vJxRo0ZRVFR07XcmcgXbU3P5ZOcxAGZPiMTJoi17RERERESkkWjdG+76Jzy5D6KfhWaBUJgJsX+EuV3hs0fg2E6jq6xTzk5mXvlJN8wmWLrnBGsTG2cgJCIiInWv1r8Znjt3Lg8//DCTJ0+ma9euLFy4EHd3d955551LXr9582YGDRrEfffdR2hoKKNGjeLee++tMQtlxYoVPPDAA0RERNC9e3cWLVpEWloaO3c2rh/apP4or6xi+tI4AO7tF0Lvti0MrkhEREREROQ68AyA6D/AE3Fw97+gdT+oKoe9H8PbN8Nbt8De/0JFmdGV1okeIc2ZPKgdAM99FkdhaYXBFYmIiEhDUKs9SsrKyti5cyfPPPNM9Tmz2cyIESPYsmXLJR8zcOBAFi9ezPbt2+nXrx8pKSksX76ciRMnXvZ18vLyAPDx8bnsNaWlpZSWllZ/np+fD0B5eTnl5eW1ua06ce41jXjtxuBG9++fG1I5mFlIC3crMbeEN/h/b3r/OUb9c4z65xj1zzHqn2PUP8cY3T/9exORWnFyhqif2I/ju2D7PyH+U/teJp/tgJXTofdk6DMZPAONrtYhvx3VkZX7Mziae4a/rDjArPGRRpckIiIi9VytgpKcnBwqKysJCAiocT4gIIADBw5c8jH33XcfOTk5DB48GJvNRkVFBY8++miNpbcuVFVVxRNPPMGgQYOIjLz8DzNz5sxh1qxZF51fuXIl7u7utbirurVq1SrDXrsxuBH9yy2F1/ZYABNjgkrYHNt4/p3p/ecY9c8x6p9j1D/HqH+OUf8cY1T/iouLDXldEWkEgnvBnQth5EuwcxF89zYUZsC6P8GGv0HEBPvm7637GF3pNXF3dmLOnd34xb+28e+tR7ijRyu6tfI0uiwRERGpx2oVlFyL2NhY/vjHP/LGG2/Qv39/kpKSmDZtGi+99BIzZsy46PopU6YQHx/Pxo0bf/R5n3nmGWJiYqo/z8/PJyQkhFGjRuHl5VXn93El5eXlrFq1ipEjR2K1Wm/46zd0N7J/j32wm7KqbPqGtmDmpD6YTKbr+no3gt5/jlH/HKP+OUb9c4z65xj1zzFG9+/cjGoRkWvWrCUMewoGPwEJX8C2N+HoNoj7xH606mUPTCImgJOL0dXWyuAOfvxf79Z8svMYv//fXj5/7CajSxIREZF6rFZBiZ+fHxaLhczMzBrnMzMzCQy89NTcGTNmMHHiRB566CEAoqKiKCoq4pFHHuG5557DbD6/TcrUqVP56quvWL9+Pa1bt/7RWlxcXHBxufgHNavVauhA3+jXb+iud/9W7c/k2wPZOJlNvHxnFM7OztfttYyg959j1D/HqH+OUf8co/45Rv1zjFH9078zEakzFitE3m0/TuyGbf+E+P/BiV2w5BFY+Rz0edB+NKBluaaP7craxGySs4t4Y10qnYwuSEREROqtWm3m7uzsTO/evVm9enX1uaqqKlavXs2AAQMu+Zji4uIaYQiAxWIBwGazVX+cOnUqS5YsYc2aNbRr165WNyFyNYrLKnjhi30APDSkPR0DNPVaRERERESkhlY94c4F8OR+uHk6eLaComxY9wq8GgH/+yUc3Q5nx/P1mbe7lRfHRwD2fSqPFxlckIiIiNRbtQpKAGJiYnjrrbd47733SEhI4LHHHqOoqIjJkycDcP/999fY7H3cuHEsWLCAjz76iNTUVFatWsWMGTMYN25cdWAyZcoUFi9ezIcffoinpycZGRlkZGRw5syZOrpNEfj76iSOnz5DcHM3fnNLuNHliIiIiIiI1F/NWsLQp+CJvfCTd6HNAKiqsM80+ddIeGs47PkPVJQaXemPui0ykFFdA6iosvGfZAsnC+t3vSIiImKMWu9Rcs8995Cdnc3zzz9PRkYGPXr0YMWKFdUbvKelpdWYQTJ9+nRMJhPTp0/n+PHjtGzZknHjxvHyyy9XX7NgwQIAoqOja7zWu+++ywMPPHANtyVS08HMAt7ekALArDsicHe+7tvziIiIiIiINHwWK0TeZT/Sv7cvyxX3iX2JrqWPwqoZ0PsB+7JcXq2MrvYiJpOJlyZEsiXlJEeLKhj2tw3c268NDw9tT3BzN6PLExERkXrimn5bPHXqVKZOnXrJr8XGxtZ8AScnZs6cycyZMy/7fLYGMGVXGi6bzcb0pfFUVNkY2TWAEV0DjC5JRERERESk4QnqDhPmw8hZsOs9+O5fkH8c1v8FNr4KXe6wb/4e0g9MJqOrrRbg5crbE3vx+/9s40hhFYs2H2bx1iPc2TOYR6PDCGvZzOgSRURExGC1XnpLpKH5dNdxtqfm4ma18MIdEUaXIyIiIiIi0rB5+MGQ38K0vfB/70GbgfZlufZ9Bu+Mgn8Ogz0fQnmJ0ZVW69WmOU9GVvLeA70ZGOZLRZWNT3YeY8TcdUz5YBfxx/OMLlFEREQMpKBEGrXTxWX8cXkCANNGdNDUahERERERkbpicYKICfDg1/CrDdDzF+Dkal+ia+lj8GpXWP0S5J8wulLAPsllYJgvHz58E0seH8jIrgHYbLAsLp3bX9/IA+9uZ3tqrtFlioiIiAEUlEij9sqKA+QWldExoBm/HNzO6HJEREREREQap6BuMH4+PLkfbpkJXq2h+CRs+Cu8GgmfPABHtkA9WXq7Z5sWvHV/H755YigTerTCbILYxGx++uYW/m/hZtYmZmmZcBERkSZEQYk0WjuPnOI/248CMHtCFFaL3u4iIiIiIiLXlYcvDImBad/DT/8NbQeDrRL2LYF3b4U3h8LuxfVmWa5OgZ7M+1lP1v4umvv6t8HZYua7w6eY/O533P76RpbtTaeySoGJiIhIY6ffHEujVFFZxfSl8QD8X+/W9GvnY3BFIiIiIiIiTYjFCbqOh8nL4NGN0Ot++7JcGXvh8yn2Zbm+nQV5x4yuFIC2vh788c4oNvxhOA8PaYe7s4V9J/KZ8uEuRs5dx393HKWsosroMkVEROQ6UVAijdKizYdJSM+nubuVZ8Z0MbocERERERGRpiswCu54HWISYMQs8A6xL8u1cS7M6wb/vR+ObK4Xy3IFeLny3NiubPrDzUy7pQPeblZScor4/f/2Ev2XtSzalMqZskqjyxQREZE6pqBEGp30vDO8uuogAE/f2hkfD2eDKxIRERERERHcfWDwE/CbPXDPYggdYl+Wa//n8O5tsHAI7Hofys8YXSktPJx5cmRHNj19M8+O6UxLTxdO5JXwwpf7GfzKGuavTSK/pNzoMkVERKSOKCiRRuelr/ZTVFZJrzbN+WmfEKPLERERERERkQtZnKDLOHjgK3hsM/SaBE5ukBkHX0yFuV3h2xfg9FGjK6WZixOPDA1jw++H8/KdkYT4uHGyqIy/fJPIoDlr+Ms3B8gpLDW6TBEREXGQghJpVNYmZrE8LgOL2cTLd0ZhNpuMLklEREREREQuJyAC7vg7xOyHkS+Cdxs4kwsbX4XXusHHE+HwRsOX5XK1Wvh5/7as/W008+7pQceAZhSUVjB/bTKDX1nDC1/s48Rp42fCiIiIyLVRUCKNRkl5JTM/3wfA5IGhdAnyMrgiERERERERuSruPjBoGkzbA/d8AO2Ggq0KEr6ARWNh4WDY+R6UFRtappPFzISewayYNpR/TuxN99belJRXsWjzYYb+eS1PffI9ydmFhtYoIiIitaegRBqN+WuTSMstJtDLlSdGdjS6HBEREREREaktswW63A6TvoTHtkDvyWeX5YqHL38Dr3aFVc/D6TRjyzSbGBURyNIpg/jgof4MDPOlosrGJzuPMWLuOqZ8sIv443mG1igiIiJXT0GJNArJ2YUsXJcMwAt3dKWZi5PBFYmIiIiIiIhDArrCuHnw2wQYNRuat4Ezp2DTa/Bad/jo55C6wdBluUwmE4PC/fjw4Zv47PGBjOgSgM0Gy+LSuf31jTzw7na+O5xrWH0iIiJydRSUSINns9mYsTSe8kobwzu1ZHREoNEliYiIiIiISF1xawEDfw2/2QM/+w+0G2ZfluvAV/De7bBgIOxcZPiyXL3atODtSX1Y8cQQxvdohdkEsYnZ/N/CLfx04RZiE7OwGbzXioiIiFyaghJp8L74/gSbk0/i4mRm1h2RmEzawF1ERERERKTRMVug8xiY9AU8vhX6PAhWd8jaD19Og7ldYOUMOHXE0DI7B3rx2s96svZ30dzbrw3OFjPbD+fywLvfcfvrG1kel05llQITERGR+kRBiTRoeWfKeemr/QD8+uZw2vi6G1yRiIiIiIiIXHf+XeD2VyFmP4x6GVqEQslp2Px3+HsP+7JcKesMXZarra8Hc+6KYsMfhvPwkHa4O1vYdyKfxz/YxchX1/HJjqOUV1YZVp+IiIicp6BEGrS/fpNITmEZ7Vt68PDQ9kaXIyIiIiIiIjeSWwsYOBV+vQvu/QjaDz+/LNe/74A3BsCOd6CsyLASA7xceW5sVzb94Wam3dIBbzcrKdlFPPW/vUT/JZZFm1I5U1ZpWH0iIiKioEQasO+PnmbxNvuU6tnjI3FxshhckYiIiIiIiBjCbIFOt8H9S2HKduj7EFg9IDsBvnoSp9e7EXX035ji/gsZcVBRdsNLbOHhzJMjO7Lp6Zt5dkxnWnq6cPz0GV74cj+DX1nD/LVJ5JeU3/C6REREBJyMLkDkWlRW2Zi+NB6bDe7sGczAcD+jSxIREREREZH6oGUnGPs3uHkG7PkQtr+J6dRh2pd8C198a7/GbLVfFxAJAREQGAkBUdCs5XUvr5mLE48MDeP+AaH8b+cxFq5L5tipM/zlm0QWxiZz/8C2TB7UDr9mLte9FhEREbFTUCIN0uKtR4g7noeXqxPPjulidDkiIiIiIiJS37g1hwGPQ/9HqTjwNWlr3iHUrRBzVgKU5kFmvP24ULMAe3ASEAmBUfaPfh3AYq3z8lytFn5xU1t+1jeEL/ee4I21yRzKKmT+2mT+tTGVn/VtwyND29OquVudv7aIiIjUpKBEGpys/BL++k0iAE/dap+uLCIiIiIiInJJZjO2DqOIO1RByJgxmJ2cIO8oZMSfD0sy4iE3BQoz7UfymvOPtzifnX0SdXbmSYT9nz1866Q8J4uZO3u2Znz3YFYlZPLG2iS+P5bHos2H+WDbEe7sGcyjw8Jo37JZnbyeiIiIXExBiTQ4Ly1LoKC0gu6tvbmvXxujyxEREREREZGGxGSC5m3sR+cx58+XFkJWQs3wJHMflBXY9zXJiIPvL3gez6ALlu46O/vENxws1/arFrPZxOiIQEZ1DWBT0kneiE1ic/JJ/rvjGJ/sPMaYqCAejw4jopW3Y/cvIiIiF1FQIg3KhkPZfPn9CcwmePnOKCxmk9EliYiIiIiISGPg0gxC+tqPc6qqIC/t/OyTjDh7eHIqFQrS7UfSqvPXW1zAv/MPZp9EgrvPVZdhMpkY3MGPwR382JV2ijfWJvNtQibL9qazbG86wzu15PHh4fQNvfrnFBERkR+noEQajJLySp7/fB8A9w8IJTJYf0UjIiIiIiIi15HZDC1C7UeX28+fLy2AzP2QeTY4OTf7pLwI0r+3HxfyCr5443jfMDBbfvTle7VpwduT+nAgI58Fscl8+f0J1iZmszYxm36hPjw+PIxhHVtiMumPCEVERByhoEQajDfXpZCaU4S/pwsxozoaXY6IiIiIiIg0VS6e0Ka//TinqgpOH75g9snZj6ePQP5x+3Hom/PXO7mCf5eaG8cHRNg3of+BzoFevPaznsSM7MjCdSl8uvMY2w/nsv3dXCJaeTFleDijIwK16oKIiMg1UlAiDcLhnCLmxyYBMOP2rni5Wg2uSEREREREROQCZjP4tLcfXe84f74k7+zskwsClKz9UF4MJ3bbjwt5h5wNTy7YON6nHZgttPX1YM5dUUy7pQNvb0jhg21p7DuRz+Mf7KJ9Sw8eGxbGhJ7BWC3mG3vvIiIiDZyCEqn3bDYbMz6Pp6yiiiEd/Li9W5DRJYmIiIiIiIhcHVdvaDvAfpxTVQm5qT/YOD4e8o6ePw5+ff56qzv4d63eOD4wIJLpIyKYMjycdzcfZtGmVFKyi3jqf3uZ9+0hHhnannv6huBq/fGlvURERMROQYnUe8vi0tlwKAdnJzMvjo/U2qsiIiIiIiLSsJkt4BduPyImnD9/5rR9r5MLN44/N/vk+A77cYEWzdsQExDF1EFdiT3tz4JEN/acbs7ML/bx+ppDPDi4Hb+4qa1WZRAREbkCBSVSrxWUlPPil/sBeGxYGO38PAyuSEREREREROQ6cWsOoYPsxzlVlXAy+Qcbx8fb9zw5nQan03BOXMYoYBRQ7uHOAVsIe0tak7CqDY/Htqdvv8H8YmgEvs1cDLoxERGR+k1BidRrc1cdJKuglFBfdx6LDjO6HBEREREREZEby2yBlh3tR+Td588X514w+yTeHqRkHcBaWUwUiUQ5JZ6/djukbfMnq0UXgjv3xattT/syXs3b2vdWERERaeIUlEi9FX88j/c2HwbgxfGRWltVRERERERE5Bx3H2g3xH6cU1kBJ5Oql+6yZe6j9Nj3uJZk0caUBaezYOs62Hr2emfPsxvGR5zdPD4KArqCs1ZzEBGRpkVBidRLlVU2nlsaT5UNbu8WxNCOLY0uSURERERERKR+sziBf2f7EfUTTIArYCvKIX7XJnZ/twn3Uwl0MR0h3HQcl7ICOLrVflQzgU87CIiEwCj7R99OYLMZdFMiIiLXn4ISqZf+sz2N74+eppmLEzNu72p0OSIiIiIiIiINlsnDj6gh44kaMp6dR07xamwSsQknaG9Kp4vpCKP9chjULAPv/EQozITcFPuR8AUAVmCMxR3LyW4Q1O3sLJQo8O8Czu7G3pyIiEgdUFAi9U52QSl/XnEAgN+O6kiAl6vBFYmIiIiIiIg0Dr3btuDtSX1JSM9nQWwyX+4N4fMsIAv6tfPhiVEtGOB+AlPW+Y3jbdmJWCuLLz37xDfs7OyTc0t3RYB3azCZjLpFERGRWlNQIvXOnOUJ5JdUENHKi4k3tTW6HBEREREREZFGp0uQF3+/tycxIzvy5vpk/rfzGNtTc7kvNZfIYC+mRP+E0TdNxWw2UVFSxMal7zCkow9O2fvPbyBfnGPfE+VkEuxfev7JXZtfEJ5E2P/ZvwtY3Yy6XRERkR+loETqlW2puXy2+zgmE7x8ZxROFrPRJYmIiIiIiIg0WqF+Hsy5qxvTbunI2xtS+GBbGvHH83nsg12EtfTgsehwxkS0JN+tDbaoMWC1nn9wQSZkxp2debLPHqDkHISS03Bko/04x2QG3w41N44PjATPIM0+ERERwykokXqjogpmfpkAwM/7t6FHSHNjCxIRERERERFpIgK9XZl+e1ceHx7Oos2HWbQpleTsIn73yffMXenKgBYmbi6vxHphUOIZYD/CR5w/V1EK2QfswUlG/Pkg5Uwu5CTaj32fnb/ezedseHJ24/iACGjZGaxahltERG4cBSVSb6xNN5GcXYRfM2eeGt3Z6HJEREREREREmhwfD2diRnbk4SHt+HBbGm9tSOVEXgmf5lmI/dsGfjmkHb+4qS1ertZLP4GTCwR1tx/n2GxQkHF2ya44+8fMfZBzyB6gHN5gP84xWcCv4wVLd52dfdIsQLNPRETkulBQIvXC0VPFfHPUvszWc2O74O12mR+4REREREREROS683S18qthYUwaGMpH24/w95X7OVlUxp9XJLIgNplJA0KZPCgU32YuV34ykwm8guxHh5Hnz5eXQHZCzaW7MuLsS3dlJ9iPuE/OX+/ud+nZJ07OdX7/IiLStCgoEcPZbDZe/OoA5TYTN7VrwYQewUaXJCIiIiIiIiKAq9XCz/uF4JUVR2XrHry54TBJWYX8Y20Sb29M4d5+bXh4SHtaNb+GjdqtrtCqp/04x2aD/ONnl+6KO79xfG6yffP41HX24xyzE/h1qrlxfGAUNPN3/OZFRKTJUFAihvtmXyaxB3OwmGy8MK4rJk2jFREREREREalXLGYY16MVd/duw8r9mbwRm8TeY3m8u+kwi7ce4a6erXk0Oox2fh6OvZDJBN6t7UfH0efPlxVfYvZJPJTmQdY++3EhD/+LN4736wgWrWAhIiIXU1AihioqrWDWl/YfZm5uZSOspYM/UImIiIiIiIjIdWM2m7g1MpDREQFsTMrhjbXJbEk5ycc7jvLJzqOMiQri8ehwurbyqtsXdnaH4N724xybDfKOXrxxfG4KFGVBShakrL2geKt9qa7AyPNLdwVGgYdf3dYqIiINjoISMdRrqw+RnldC6xZujAouMLocEREREREREbkKJpOJIR1aMqRDS3YeOcWC2CS+Tcjiq73pfLU3nZs7+/N4dBh9Qn2uZxHQvI396HTb+fNlRZCVUHPj+Mx9UJpvD1My42o+T7PAizeO9+0AFv3aTESkqdB3fDHMgYx8/rUxFYCZt3emOOk7gysSERERERERkdrq3bYFb0/qS0J6Pgtik/lq7wnWHMhizYEs+rXzYcrwcIZ28LtxS207e0DrPvbjHJsNTh+5YOmus7NPTqVCYQYkZUDSt+evt7hAy041N44PjAL36xj8iIiIYRSUiCGqqmw8tySeyiobt0YEEt2xJcuTjK5KRERERERERK5VlyAv/n5vT2JGduTN9cn8b+cxtqfmsj11O5HBXkyJDmd0RCBmswF7k5pM0CLUfnS5/fz50oKas08y4iFrP5QVQsZe+3Ehz1YXbxzvE6bZJyIiDZy+i4shPtl5lJ1HTuHubOH5cV2NLkdERERERERE6kionwdz7urGb27pwNsbUvlwWxrxx/N57INdhLX04LHocMb3aIXVYja6VHDxhJB+9uOcqio4ffjs7JOzM1Ay4uwzUgpO2I9DK89f7+R6wd4nUec3kXdrccNvR0REro2CErnhcovKmPP1AQCeHNGRVs3dKC8vN7gqEREREREREalLQd5uzLi9K1OGh7NoUyqLNh8mObuI333yPa+uOsivhrXnp31CcLVajC61JrMZfNrbj653nD9fkn922a74mrNPyoshfY/9uJBXawiMxOzXheDcM5hSPcCzJbj5gLuvfYN6ERGpFxSUyA33p68TOF1cTudATx4YFGp0OSIiIiIiIiJyHfl4OBMzqhMPD23PB9vSeHtDKsdPn+H5z/fx99WH+OXg9vzipjZ4ulqNLvXHuXpB2wH245yqSjh1uObSXZn7IC8N8o9B/jEsB1fQB+DIwprP5+R6NjTxsc8+cT8boFSf+8FHdx9w8bYHOSIiUqcUlMgNteNwLv/dcQyAl++MrB/TbEVERERERETkuvN0tfLosDAeGBjKJzuPsTA2meOnz/DKigO8EZvEAwNDeWBgKL7NXIwu9eqZLeAbZj8iJpw/f+b02dkn+6hK/57cpO/wdTNhOnMKinOhqhwqSs4v5XW1TGZ7qFIdnpwLVlpcIlg5+zW3FuDkXNd3LiLSqCgokRumvLKK55bEA/CzviH0butjcEUiIiIiIiIicqO5Wi1MvKktP+sbwpffn+CN2GSSsgp5fU0Sb21I4d5+bXhkaHuCvN2MLvXauTWH0EEQOojK8nI2LV/OmDFjsFqtYLPZN4svPmkPTc7kQvGpsx9z7efP/fOFXysrBFvV2cedhJO1qMfZ84IwxffyM1YuPOfsASbT9eqQiEi9oqBEbph3NqaSmFmAj4czf7i1s9HliIiIiIiIiIiBrBYzd/VqzYQewazcn8n8tUnEHc/j3U2HWbz1CHf1bM2j0WG08/MwutS6ZTLZN5F38YQWoVf/uIrSC8KTS3y85NdOATYoK7Afp9Ou/vUszj8IVlpcesbKhedcm2tpMBFpkBSUyA1x/PQZ5n17CICnb+tMCw9N+RQRERERERERMJtN3BoZyOiIADYm5TB/bRJbU3L5eMdRPtl5lDFRQTweHU7XVl5Gl2osJxfwCrIfV6uqEkryLhOsnKwZqFR/7SRUltmPwgz7cdVMFwcql5uxcuFHpwa03JqINEoKSuSGmPXFPs6UV9I3tAU/6dXa6HJEREREREREpJ4xmUwM6dCSIR1asvNILm+sTWb1gSy+2pvOV3vTubmzP1OGh2kp79owW86HFFfLZoOyoqucsXLB18oKAJv93Jnc2tXp3OzivVbOzlgxu3gTnHsEU7IreLY8/zXnZloaTETqjIISue5WJ2Sycn8mTmYTsydEYTbrf2IiIiIiIiIicnm92/rwrwd82H8inwXrklm29wRrDmSx5kAW/dv5MGV4OEM6+GHSL8rrnskELs3sR/M2V/+4ijL7zJQaIcoV9mE5c8q+70pZof3Iu3hpMAvQB+DIwppfMFt/MDulxY/sv3JuY/vm9vBIROQHFJTIdXWmrJKZX+wD4JdD2tEp0NPgikRERERERESkoejayovX7+3Jb0d25M31yfxv5zG2peayLXU7UcHeTBkexqiugfqjzPrAyRk8A+zH1aqqgtK8mst//WAz+6qik5w8egg/dxOmc0FMRQlUlUNhpv24aiZw9b4gRLkwWLl4Nkv116yutW6HiDQsCkrkunp9zSGOnTpDcHM3pt3SwehyRERERERERKQBCvXzYM5d3fjNLR14e0MqH25LI+54Ho8u3kVYSw8ejw7njh6tsFq0kXiDYjbbZ4K4tbjsJZXl5WxevpwxY8ZgtVrtJ8uKLzNz5dRl9mE5ZQ9ksEHJaftBytXXaXX/8b1WqoOVC8IWFy8tDSbSgCgokevmUGYB/1xv/5/OzHFdcXfW201ERERERERErl2Qtxszbu/KlOHhLNqUyqLNh0nOLuK3n3zP3FUH+dWw9vy0TwiuVi2v1Kg5u9sP71rsg1tZccHSYCcvs+fKqYu/ZquE8mL7kX/s6l/P7HR+ObAay4NdajbL2Y9uLcCi35+JGEH/5cl1YbPZmL40nooqGyO6+DMqItDokkRERERERESkkfDxcCZmVCceHtqeD7al8faGVI6fPsPzn+/j76sP8cvB7fnFTW3wdLUaXarUFxYnaNbSflwtmw1K86+wmf0l9mEpL4aqCijKth+14ep98YyV6mClxaVns1jdavcaInIRBSVyXXy26zjbUnNxtZqZOS7C6HJEREREREREpBHydLXy6LAwHhgYyic7jrJwXQrHT5/hlRUHWBCbxKSBoUwe1A4fD2ejS5WGyHR2TxNXb/Bpd/WPKy/5kZkrpy7ah4Xi3LPLgQElefbjVOrVv56T2yX2WrHPWDG7eBNyMg1TQjm4eICTCzi52j9aLvjnCz9arFo2TJocBSVS504Xl/HH5QkA/OaWDoT4uBtckYiIiIiIiIg0Zq5WCxMHhPKzfm34Ys8J3ohNIjm7iNfXJPH2hlTu7deGh4e2I8hbf3kvN4DVFaytwKvV1T+mssIellxx5soP9mGpKoeKM5B/3H78gAXoBZD2z9rdwyUDFJeLzzm5XHC4XiKIOff5hV9zvsy1F76Wfm0tN9Y1vePmz5/PX/7yFzIyMujevTuvv/46/fr1u+z18+bNY8GCBaSlpeHn58dPfvIT5syZg6urKwDr16/nL3/5Czt37iQ9PZ0lS5YwYcKEa7ohMd6fv0nkZFEZHfyb8dDg9kaXIyIiIiIiIiJNhNVi5u7erbmzZzAr92cwf20yccfzeGdTKu9vPczdvVrzq2FhtPPzMLpUkZosTuDhZz+uls0GpQUXz1i5YDP7qqIcso8m0bKFJ+bKMqgohYoS+8fKC/65oqTmc1eUnD2XV6e3edVMlsuHKk6uYPnh+ToMbc6FQmazMfcuhqh1UPLxxx8TExPDwoUL6d+/P/PmzWP06NEkJibi7+9/0fUffvghTz/9NO+88w4DBw7k4MGDPPDAA5hMJubOnQtAUVER3bt358EHH+Suu+5y/K7EMLvSTvGf7WkAzJ4QibOTvqGIiIiISNNTmz8u++yzz/jjH/9IUlIS5eXldOjQgd/+9rdMnDixxnUJCQn84Q9/YN26dVRUVNC1a1c+/fRT2rRpcyNuSUSkQTGbTdwaGcToiEA2HMrhjdgktqbk8tF3R/nvjqOM7daKx6PD6BLkZXSpItfOZAJXL/vRIvSSl1SWl7N1+XLGjBmD2foje/bYbFBZdjYgKasZoJz7WFl68bmK0guOkh9cf5nnudzzV5VfUE8llBfZD6OYreDkipOTCyPLq3A68sKlQ5WLgpgLA5krBT0/MjvH4qwl0G6gWgclc+fO5eGHH2by5MkALFy4kGXLlvHOO+/w9NNPX3T95s2bGTRoEPfddx8AoaGh3HvvvWzbtq36mttuu43bbrvtWu9B6omKyiqeWxKPzQZ392pN//a+RpckIiIiInLD1faPy3x8fHjuuefo3Lkzzs7OfPXVV0yePBl/f39Gjx4NQHJyMoMHD+aXv/wls2bNwsvLi3379lXP0hcRkUszmUwM7diSoR1bsvNILm+sTWb1gSy+/P4EX35/gps7+zNleBi92/oYXaqIsUym87+kN0pV1cWzXC4brlw4K6auwpszYKu6oJ5yKCvHVFaAO0Bu7o3vyZX2k7nqGTc/DGOucsZNE1oCrVZ3WlZWxs6dO3nmmWeqz5nNZkaMGMGWLVsu+ZiBAweyePFitm/fTr9+/UhJSWH58uUX/XWUNHzvbTlCQno+3m5Wnh3T2ehyREREREQMUds/LouOjq7x+bRp03jvvffYuHFjdVDy3HPPMWbMGP785z9XXxcWFnb9bkJEpBHq3daHfz3gw/4T+SxYl8yyvSdYcyCLNQey6N/OhynDwxnSwQ+T/oJbxBhmM5jdwGrgXkKVFRfNoikvKWLTutUM7t8HJyrqdhbNVS+BZhCT+Spnz1zunCtmkxP++WeAMcbdx1WoVVCSk5NDZWUlAQEBNc4HBARw4MCBSz7mvvvuIycnh8GDB2Oz2aioqODRRx/l2WefvfaqgdLSUkpLS6s/z8/PB6C8vJzy8vLLPey6OfeaRrx2fZCRX8LclYkA/G5kB7xczLXqRVPvn6PUP8eof45R/xyj/jlG/XOM+ucYo/unf2/107X8cdmFbDYba9asITExkVdeeQWAqqoqli1bxu9//3tGjx7N7t27adeuHc8888yP7u2oMVPjov45Rv1zTGPrX4eWbsz9SSS/Gd6OtzYcZsmeE2xLzWVb6nYiW3nx6NB2jOzij9lcN4FJY+vfjab+OUb9uwZmF3B2AWf70nzlruXkuadQFtgL248tX1YXqpdAu3i2jKmiFCovCF0u+LqpxvUXPqbk/PP98DE1Qp0LHlNjCbQqKC+2H9fIArTyGVLvx00mm81mu9onPXHiBMHBwWzevJkBAwZUn//973/PunXraiyndU5sbCw/+9nPmD17Nv379ycpKYlp06bx8MMPM2PGjIsLMpmuajP3F154gVmzZl10/sMPP8Td3f1qb0nqyLsHzew5aSa0mY1pkZXU0c8SIiIiInIZxcXF3HfffeTl5eHlpfXV64trGTMB5OXlERwcTGlpKRaLhTfeeIMHH3wQgIyMDIKCgnB3d2f27NkMHz6cFStW8Oyzz7J27VqGDRt2yefUmElE5OqcLoU16Wa2ZJooq7L/QiPAzcaI4Cp6+9qwaPtVEWlKbFWYbRVYqsox28rPfizDXFWBxVaOuar8oo/nrzv/8cKv5zbrSJrvpX9mvd6udtxUqxklfn5+WCwWMjMza5zPzMwkMDDwko+ZMWMGEydO5KGHHgIgKiqKoqIiHnnkEZ577jnM5mv7v80zzzxDTExM9ef5+fmEhIQwatQoQwaK5eXlrFq1ipEjR2K93sliPbPhUA57tuzCYjbx9/sH0CXIs9bP0ZT7VxfUP8eof45R/xyj/jlG/XOM+ucYo/t3bnaANA6enp7s2bOHwsJCVq9eTUxMDO3btyc6OpqqKvta2ePHj+fJJ58EoEePHmzevJmFCxdeNijRmKlxUf8co/45pin07z7gZFEZ/96Sxvvb0sg8U8EHSRZic1x5eHAod/cKxtVquabnbgr9u57UP8eof45TDx1TXl7OngYwbqpVUOLs7Ezv3r1ZvXp19YyPqqoqVq9ezdSpUy/5mOLi4ovCEIvF/j+WWkxmuYiLiwsuLhdvLmS1Wg19wxr9+jdaSXkls5bZl117YGAo3do4tvlZU+tfXVP/HKP+OUb9c4z65xj1zzHqn2OM6p/+ndVP1/LHZWBfnis8PBywhyAJCQnMmTOH6Oho/Pz8cHJyomvXrjUe06VLFzZu3HjZ59SYqXFS/xyj/jmmsfcvsLmV39/WhceGh7N4axr/2pjK8dMlvPDVAf4Rm8pDQ9rx8/5t8HS9th409v5db+qfY9Q/x6mHjqnv46ZaT+eIiYnhrbfe4r333iMhIYHHHnuMoqKi6o0K77///hrr8Y4bN44FCxbw0UcfkZqayqpVq5gxYwbjxo2rDkwKCwvZs2cPe/bsASA1NZU9e/aQlpZW2/LkBntjbRJHThYT6OXKkyM7Gl2OiIiIiIihLvzjsnPO/XHZhUtxXUlVVVX1/iLOzs707duXxMTEGtccPHiQtm3b1k3hIiJSzdPVymPRYWz8w3BeGh9BcHM3cgpL+dPXBxj0pzXMXZlIblGZ0WWKiEgdqtWMEoB77rmH7Oxsnn/+eTIyMujRowcrVqyo3uA9LS2txgyS6dOnYzKZmD59OsePH6dly5aMGzeOl19+ufqaHTt2MHz48OrPz00PnzRpEosWLbrWe5PrLCW7kIXrUgB4flxXmrnU+u0kIiIiItLoxMTEMGnSJPr06UO/fv2YN2/eRX9cFhwczJw5cwCYM2cOffr0ISwsjNLSUpYvX87777/PggULqp/zqaee4p577mHo0KHVe5R8+eWXxMbGGnGLIiJNgqvVwsQBofysXxu+2HOCN2KTSM4u4u9rknhrQyr39mvDw0PbEeTtZnSpIiLioGv6zfbUqVMvu9TWD39Qd3JyYubMmcycOfOyzxcdHe3QMlxy49lsNmZ8Hk9ZZRXDOrbktsjLLyMgIiIiItKU1PaPy4qKinj88cc5duwYbm5udO7cmcWLF3PPPfdUX3PnnXeycOFC5syZw29+8xs6derEp59+yuDBg2/4/YmINDVWi5m7e7fmzp7BrNyfwfy1ycQdz+OdTam8v/Uwd/dqzaPDwgj18zC6VBERuUaaAiDX5IvvT7Ap6SQuTmZeHB+ByWQyuiQRERERkXqjNn9cNnv2bGbPnn3F53zwwQd58MEH66I8ERG5BmaziVsjgxgdEciGQznMX5vEttRcPvruKP/dcZSx3VrxeHQYXYK8jC5VRERqSUGJ1Fp+STmzlyUAMHV4OG199RcTIiIiIiIiItI0mEwmhnZsydCOLdlxOJc3YpNZcyCLL78/wZffn+CWzv48Pjyc3m1bGF2qiIhcJQUlUmt/+yaR7IJS2rf04JFh7Y0uR0RERERERETEEH1CfXjnAR/2nchjQWwyy+PSWX0gi9UHsripvQ9ThofTv6230WWKiMgVKCiRWtl77DT/3noEgNnjI3FxshhckYiIiIiIiIiIsSJaefOP+3qRmlPEm+uS+XTXMbam5LI1ZTtRwV708TAxoqIKq9XoSkVE5FLMV75ExK6yysZzS+Kx2WB8j1YMDPczuiQRERERERERkXqjnZ8Hf7q7G+t/P5wHB7XD1Wom7ng+7x60cNMrscT8dw+rEzIprag0ulQREbmAZpTIVftg2xHijufh6erEc2O7GF2OiIiIiIiIiEi9FOTtxvPjujJleBhvb0jmg80p5JdU8Nmu43y26zierk6M7BLAmKggBnfww9WqFTtERIykoESuSlZBCX9ZkQjAU6M74e/panBFIiIiIiIiIiL1m28zF2JGdKBj6SECIgawMiGb5XHpZBWU8tnu43y2+zjNXJwY0cWfMVFBDO3YUqGJiIgBFJTIVXl5WQIFpRV0a+3Nz/u3NbocEREREREREZEGw2yCvqEtGNjBn+dv78rOtFMs25vOivgMMvJLWLrnBEv3nKCZixO3dPHntsggojspNBERuVEUlMgVbUrK4fM9JzCb4OUJUVjMJqNLEhERERERERFpkMxmE31Dfegb6sPzt3dl99FTLNubwdfx6aTnlfD5nhN8vucEHs4Wbu4SwNioQIZ19MfNWaGJiMj1oqBEflRpRSUzlsYDMPGmtkS19ja4IhERERERERGRxsFsNtG7rQ+92/owfWwXdh89zddx6Xwdn8Hx02f48vsTfPn9CdydLQzv7M/YqCCGd1JoIiJS1xSUyI96c10KKTlFtPR04bejOxldjoiIiIiIiIhIo2QPTVrQu20LnhvbhT1HT7M8Lp3lcfbQZNnedJbtTcfNauHmzv7cFhXIzZ39cXfWr/dERByl76RyWUdOFvGPtUkATB/bBS9Xq8EViYiIiIiIiIg0fiaTiZ5tWtCzTQueHdOFvcfyWB6XzrK4dI6dOsOys//sajUzvJN9I/ibO/vj4aJf9YmIXAt995RLstlsPP/5PsoqqhgU7ssd3VsZXZKIiIiIiIiISJNjMpnoHtKc7iHNefq2zsQdz2N5XAbL49JJyy3m6/gMvo7PwMXJTHSnloyJCuKWLgE0U2giInLV9B1TLunr+AzWHczG2WLmpfGRmEzawF1ERERERERExEgmk4lurZvTrXVz/nBrJ/adyGdZXDrL49I5crKYb/Zl8s2+TJydzER3PBea+OOpVUJERH6UghK5SGFpBbO+3AfAo9FhtG/ZzOCKRERERERERETkQiaTichgbyKDvfn96E7sT8+v3tMkNaeIlfszWbnfHpoM7dCSMVGBjOgaoKXVRUQuQUGJXGTuyoNk5pfS1tedx6PDjC5HRERERERERER+hMlkIqKVNxGtvPndqE4cyCio3tMkJbuIbxMy+TYhE2eLmSEd/BgTFcSIrgF4uyk0EREBBSXyA/tO5LFocyoAL46PxNVqMbgiERERERERERG5WiaTiS5BXnQJ8iJmZEcSMwuq9zRJyipk9YEsVh/IwmoxMTjcHpqM6hqIt7tCExFpuhSUSLWqKhvTl8ZTZYOxUUEM69jS6JJEREREREREROQamUwmOgd60TnQHpoczCxg2V77niaHsgpZm5jN2sRsnrXEMSjcjzGRQYyKCKC5u7PRpYuI3FAKSqTaR98dZXfaaTycLcy4vavR5YiIiIiIiIiISB3qGOBJx5GePDmyI4cumGmSmFlAbGI2sYnZPLvExMBwP8ZGBTKqayAtPBSaiEjjp6BEAMgpLOWVFQcAiBnViUBvV4MrEhERERERERGR66VDgCfTAjyZNqIDSVmFfH12T5MDGQWsP5jN+oPZPLsknoFhvoyJCmJ0RCA+Ck1EpJFSUCIAzFl+gLwz5XQN8mLSgLZGlyMiIiIiIiIiIjdIuH8zfn1LB359SwdSsgvPbgSfQUJ6PhsO5bDhUA7Tl8YzoL0vt0UFcmtEIL7NXIwuW0SkzigoEbamnOTTXccwmeDlOyNxspiNLklERERERERERAzQvmUzpt7cgak3dyA1p4jlcfY9TfadyGdjUg4bk3KYsTSem9rbZ5rcGhmIn0ITEWngFJQ0cWUVVUxfGg/Avf3a0LNNC4MrEhERERERERGR+qCdnwdThoczZXg4h3OK+DrevqdJ3PE8NiefZHPySZ7/PJ5+7XwYGxXE6MhA/D21nLuINDwKSpq4tzemkJRViK+HM38Y3dnockREREREREREpB4K9fPgsegwHosOI+1kMcvj7TNN9h7LY2tKLltTcnn+i330C/VhTFQQt0UG4u+l0EREGgYFJU3Y0dxi/r76EADPjumCt7vV4IpERERERERERKS+a+PrzqPDwnh0WBhHc4v5Ot6+p8n3R0+zLTWXbam5vPDlPvq29WFMVCC3RgYR6K3QRETqLwUlTdisL/dRUl5F/3Y+3NUr2OhyRERERERERESkgQnxceeRoWE8MjSMY6eKWRGfwbK4dHannWb74Vy2H87lhS/306dtC/tMk6hAgrzdjC5bRKQGBSVN1Mp9GXybkIXVYuLlOyMxmUxGlyQiIiIiIiIiIg1Y6xbuPDSkPQ8Nac/x02f4+uxG8LvSTrPjyCl2HDnFi1/tp1eb5oyJCmJMVBCtmis0ERHjKShpgopKK3jhi30APDykPeH+ngZXJCIiIiIiIiIijUlwc7fq0CQ97wxfx9k3gt9x5BS70k6zK+00s5cl0LNNc8ZGBXFrZCCtW7gbXbaINFEKSpqgv68+xIm8Elq3cOPXN3cwuhwREREREREREWnEgrzdeHBwOx4c3I6MvBK+jk/n67gMvjuSy+600+w+G5p0D2nO2KhAbosMIsRHoYmI3DgKSpqYxIwC/rUxFYBZd0Tg5mwxuCIREREREREREWkqAr1dmTyoHZMHtSMzv4QV8faZJtsP5/L90dN8f/Q0f1x+gG6tvRkTFcSoLn5GlywiTYCCkiakqsrG9KVxVFTZGNU1gFu6BBhdkoiIiIiIiIiINFEBXq5MGhjKpIGhZBWU8M3ZjeC3p+ay91gee4/l8aevIcTDwtFmqYzrEUxbXw+jyxaRRkhBSRPyv13H+O7wKdysFmbeEWF0OSIiIiIiIiIiIgD4e7oycUAoEweEkl1Qyjf77DNNtqac5GiRib+uOsRfVx0iopUXY6KCGBsVRKifQhMRqRsKSpqIU0VlzFmeAMCTIzsQ3NzN4IpEREREREREREQu1tLThV/c1JZf3NSWjFOFzP1kDcdMLdmWeop9J/LZdyKfv3yTSJcgL8ZGBTImKoj2LZsZXbaINGAKSpqIP319gFPF5XQK8GTyoHZGlyMiIiIiIiIiInJFvs1cGBRgY8yYPuSXVrFyfybL49LZnHyShPR8EtLz+evKg3QO9GRsVBC3RQUR7q/QRERqR0FJE7DjcC4f7zgKwMt3RmK1mA2uSEREREREREREpHZ8m7lwb7823NuvDaeKyli5P4NlcRlsTsrhQEYBBzIK+Nuqg3QK8GRMVBBjogLpEOBpdNki0gAoKGnkyiurmL40HoCf9mlNn1AfgysSERERERERERFxTAsPZ+7p24Z7+rbhdHEZK/dlsjw+nY2HckjMLCAxs4BXvz1IB/9m9j1NugXRUaGJiFyGgpJGbtGmwxzIKKC5u5Wnb+tidDkiIiIiIiIiIiJ1qrm7Mz/tG8JP+4aQV1zOyv32jeA3JuVwKKuQ11Yf4rXVhwj3b8aYyEDGdAuiU4AnJpPJ6NJFpJ5QUNKInTh9hle/PQjAM7d1xsfD2eCKRERERERERERErh9vdyv/1yeE/+sTQt6Zcr49u6fJhkM5JGUV8vc1Sfx9TRLtW3rY9zSJDKJLkEITkaZOQUkj9uKX+ykuq6RP2xb8X+8Qo8sRERERERERERG5YbzdrNzduzV3925Nfsm50CSD9QezScku4vU1Sby+Jol2fh6MiQpkTFQQXYO8FJqINEEKShqpNQcyWbEvA4vZxOw7IzGb9Q1eRERERERERESaJi9XK3f1as1dvVpTUFLO6oQslsWls+5gNqk5Rcxfm8z8tcmE+rpzW1QQY6OCiGil0ESkqVBQ0gidKavk+c/3AfDLwe3oHOhlcEUiIiIiIiIiIiL1g6erlQk9g5nQM5iCknLWHMhieVw6sYnZHD5ZzILYZBbEJtPGx50xUUGMiQokKthboYlII6agpBH6x9pDHDt1hlberky7pYPR5YiIiIiIiIiIiNRLnq5WxvcIZnyPYApLK1hzIIuv49JZm5hFWm4xC9cls3BdMiE+boyJDGJMVBDdWis0EWlsFJQ0MklZBfxzfQoAz4+LwMNF/4pFRERERERERESupJmLE3d0b8Ud3VtRVFrB2kT7TJM1B7I4mnuGN9en8Ob6FIKbu1XvadIjpLlCE5FGQL9Fb0RsNhvTl8ZTXmnj5s7+jI4IMLokERERERERERGRBsfDxYnbu7Xi9m6tKC6rIDYxm2Vx6axJyOL46TO8tSGVtzakEtzcjdsiA7ktKoieIc21T7BIA6WgpBFZuuc4W1NycbWamXVHhNJsERERERERERERB7k7O53dqySIM2WVrDuYxbK4DFYnZHL89Bne3pjK2xtTCfJ25bbIIMZ2C6RnSAuFJiINiIKSRiKvuJzZXyUA8OubOxDi425wRSIiIiIiIiIiIo2Lm7OFWyODuDUyiJLySmITs/k6Pp1v92eSnlfCO5tSeWdTKoFertwaGcjYbkH0bqPQRKS+U1DSSPz5mwOcLCoj3L8ZDw9pb3Q5IiIiIiIiIiIijZqr1cKtkYHcGhlISXkl6w9mszwunW8TssjIL2HR5sMs2nwYf08Xbou072nSJ9QHi0ITkXpHQUkjsOfoaT7cngbAS+MjcXYyG1yRiIiIiIiIiIhI0+FqtTAqIpBREfbQZOOhHJbHpbNqfyZZBaW8t+UI7205QssLQpO+Ck1E6g0FJQ1cRWUVzy2Jw2aDu3oGMyDM1+iSREREREREREREmixXq4URXQMY0TWA0gp7aLLsbGiSXVDKv7cc4d9bjuDXzIVbIwMYExVE/3a+Ck1EDKSgpIF7f+sR9p3Ix8vViWfHdjG6HBERERERERERETnLxcnCLV0CuKVLAGUVVWxKsocmK/dlkFNYyuKtaSzemoZfM2dGRQQyNiqI/u18cLJoxRiRG0lBSQOWmV/C31YeBOAPt3XGr5mLwRWJiIiIiIiIiIjIpTg7mRne2Z/hnf0puzOKzcn25bm+2ZdJTmEZH25L48Ntafh6nA9Nbmqv0ETkRlBQ0oC9+NV+Cksr6BHSnHv7tjG6HBEREREREREREbkKzk5mojv5E93Jn5fvrGJz8kmW703nm/0ZnCwq4z/b0/jP9jRauFsZHWHf02RAmC9WhSYi14WCkgZq/cFslu1Nx2yC2RMiMWsNQxERERERERERkQbHajEzrGNLhnVsyezKSLamnKyeaZJbVMZH3x3lo++O0tzdyqiu9j1NBoX7KTQRqUMKShqgkvJKnv88HoBJA0OJDPY2uCIRERERERERERFxlNViZkiHlgzp0JKXxlexLTWXZXHpfBNvn2ny3x3H+O+OY3i7nQ1NugUxKMwPZyeFJiKOUFDSAC2ITebwyWICvFyIGdnR6HJERERERERERESkjjlZzAwK92NQuB8v3hHB9nOhyb4McgrL+GTnMT7ZeQwvVydGdg1kbLdABoe3VGgicg0UlDQwqTlFLIhNBmDG7V3xdLUaXJGIiIiIiIiIiIhcT04WMwPD/RgY7seL4yPZnprL8rh0vo7PIKewlE93HePTXcfwdHViZBf78lxDOvqhyETk6igoaUBsNhvPfx5PWWUVQzu2ZGxUkNEliYiIiIiIiIiIyA1kMZsYEObLgDBfXrgjgh2Hz4cmWQWlfLb7OJ/tPo6nixPDO7XEv9TEsNIKmlv1B9cil6OgpAH5cm86Gw7l4Oxk5sU7IjCZtIG7iIiIiIiIiIhIU2Uxm+jf3pf+7X2ZOS6CHUdOnQ1N0snML+WLvemAhUV/XEuvNi0YFO7H4A6+dGvdXJvBi1xAQUkDkV9Szktf7QdgSnQ4oX4eBlckIiIiIiIiIiIi9YXZbKJfOx/6tfPh+du7sivtFF9+f5wvdx0htxS2H85l++FcXv0Wmrk4cVN7H3twEu5HuH8z/VG2NGkKShqIuSsPkl1QSjs/Dx6Nbm90OSIiIiIiIiIiIlJPmc0m+oT60D3Yk16kEHlTNNsO57EpKYdNyTmcLi7n24Qsvk3IAsDf06V64/hB4b4EebsZfAciN9Y1za+aP38+oaGhuLq60r9/f7Zv3/6j18+bN49OnTrh5uZGSEgITz75JCUlJQ49Z1MSfzyPf285DMBL4yNxcbIYW5CIiIiIiIiIiIg0GG183Lmvfxvm/7wXu6aP5KtfD+bp2zozpIMfLk5msgpKWbL7OL/75HsGzFnDLX+LZebn8azcl0F+SbnR5Ytcd7WeUfLxxx8TExPDwoUL6d+/P/PmzWP06NEkJibi7+9/0fUffvghTz/9NO+88w4DBw7k4MGDPPDAA5hMJubOnXtNz9mUVFbZeG5JHFU2GNe9FYM7+BldkoiIiIiIiIiIiDRQZrOJyGBvIoO9eXRYGCXllew6coqNSTlsSsph7/E8krOLSM4u4r0tRzCboHtIcwafnXHSs01z/SG3NDq1Dkrmzp3Lww8/zOTJkwFYuHAhy5Yt45133uHpp5++6PrNmzczaNAg7rvvPgBCQ0O599572bZt2zU/Z1Py4fY0vj+Wh6eLEzPGdjG6HBEREREREREREWlEXK0WBob7MTDc/gfaecXlbEnJORucnCQ1p4jdaafZnXaa19ck4Wa10K+dT3Vw0jnQE7NZ+5tIw1aroKSsrIydO3fyzDPPVJ8zm82MGDGCLVu2XPIxAwcOZPHixWzfvp1+/fqRkpLC8uXLmThx4jU/J0BpaSmlpaXVn+fn5wNQXl5OefmNnw527jXr8rWzC0r584oDADw5IpwWbhZD7u1GuB79a0rUP8eof45R/xyj/jlG/XOM+ucYo/unf28iIiIicj14u1u5NTKIWyODADh++ox9b5OzR05hGesOZrPuYDYAvh7ODAz3Y3C4L4PC/Wjdwt3I8kWuSa2CkpycHCorKwkICKhxPiAggAMHDlzyMffddx85OTkMHjwYm81GRUUFjz76KM8+++w1PyfAnDlzmDVr1kXnV65cibu7cf8xrlq1qs6e69+HzBSUmAnxsNHiZDzLl8fX2XPXV3XZv6ZI/XOM+ucY9c8x6p9j1D/HqH+OMap/xcXFhryuiIiIiDQtwc3d+GmfEH7aJwSbzUZiZgEbD9lDk22puZwsKuPL70/w5fcnAAj1da/eGH5Ae19aeDgbfAciV1brpbdqKzY2lj/+8Y+88cYb9O/fn6SkJKZNm8ZLL73EjBkzrvl5n3nmGWJiYqo/z8/PJyQkhFGjRuHl5VUXpddKeXk5q1atYuTIkVitVoefb0vKSXZu2YnJBK9NvImoYO86qLL+quv+NTXqn2PUP8eof45R/xyj/jlG/XOM0f07N6NaRERERORGMZlMdA70onOgFw8NaU9ZRRV7jp6u3t9kz9HTHD5ZzOGTaXywLQ2TCSJbeTMo3I/B4X70CW2Bq1X7m0j9U6ugxM/PD4vFQmZmZo3zmZmZBAYGXvIxM2bMYOLEiTz00EMAREVFUVRUxCOPPMJzzz13Tc8J4OLigouLy0XnrVaroQP9unj90opKXvjKPpvmF/3b0iu06WzgbvS/v4ZO/XOM+ucY9c8x6p9j1D/HqH+OMap/+ncmIiIiIkZzdjLTr50P/dr5EDOyIwUl5WxLya0OTg5lFRJ3PI+443ksXJeMs5OZvqEtqoOTiFbeWLS/idQDtQpKnJ2d6d27N6tXr2bChAkAVFVVsXr1aqZOnXrJxxQXF2M2m2ucs1jsqaHNZrum52zs3lqfQkp2EX7NXPjd6E5GlyMiIiIiIiIiIiJyRZ6uVkZ0DWBEV/s2C5n5JWxOzmHjoZNsTMomM7+UTUkn2ZR0kj+TiLeblYFhvtXBSVtfd0wmBSdy49V66a2YmBgmTZpEnz596NevH/PmzaOoqIjJkycDcP/99xMcHMycOXMAGDduHHPnzqVnz57VS2/NmDGDcePGVQcmV3rOpiTtZDGvr0kCYMbtXfB2018KioiIiIiIiIiISMMT4OXKnT1bc2fP1thsNpKzi9iUlMPGpBy2Jp8k70w5X8dn8HV8BmDfD2VwuB+DOvgxMMwXv2YXrygkcj3UOii55557yM7O5vnnnycjI4MePXqwYsWK6s3Y09LSaswgmT59OiaTienTp3P8+HFatmzJuHHjePnll6/6OZsKm83G81/EU1pRxaBwX+7o3srokkREREREREREREQcZjKZCPdvRrh/MyYNDKWisoq9x/PYdMgenOxKO8Xx02f4eMdRPt5xFIAuQV4MDrfPOOnXzgd35+u+5bY0Udf0zpo6depll8WKjY2t+QJOTsycOZOZM2de83M2FSviM4hNzMbZYubF8ZGaZiYiIiIiIiIiIiKNkpPFTK82LejVpgW/vqUDxWUVbE/NPTvj5CQJ6fnVx1sbUrFaTPRs08I+4yTcj+6tvXGymK/8QiJXQRFcPVFYWsGsL/cD8Kth7Qlr2czgikRERERERERERERuDHdnJ6I7+RPdyR+AnMJSNiefrJ5xcvz0Gban5rI9NZe5qw7i6eJE//a+DA73ZXAHP8JaNtMfnss1U+RWT8xbdZCM/BLa+LgzZXi40eWIiIiIiIiD5s+fT2hoKK6urvTv35/t27df9trPPvuMPn360Lx5czw8POjRowfvv//+Za9/9NFHMZlMzJs37zpULiIiImI8v2Yu3NG9Fa/8pBsb/zCc2N9FM3tCJGOiAvF2s1JQWsG3CZm88OV+Rsxdz01zVhPz3z18tusYmfklRpcvDYxmlNQD+0/k8+7mwwDMGh+Bq9VibEEiIiIiIuKQjz/+mJiYGBYuXEj//v2ZN28eo0ePJjExEX9//4uu9/Hx4bnnnqNz5844Ozvz1VdfMXnyZPz9/Rk9enSNa5csWcLWrVtp1Up7GoqIiEjTYDKZCPXzINTPg1/c1JbKKhv7T+SzMSmHTUk5bD+cS2Z+KZ/tOs5nu44D0MG/GYPC/Rgc7kf/9j54uloNvgupzxSUGKyqysb0pXFUVtm4LTKQ4Z0uHjSJiIiIiEjDMnfuXB5++GEmT54MwMKFC1m2bBnvvPMOTz/99EXXR0dH1/h82rRpvPfee2zcuLFGUHL8+HF+/etf88033zB27Njreg8iIiIi9ZXFbCKqtTdRrb15LDqMkvJKdh45VR2cxB3P41BWIYeyClm0+TAWs4keIc0ZFO7HoDBferZpgbOTFluS8xSUGOzjHUfZlXYaD2cLz4/ranQ5IiIiIiLioLKyMnbu3MkzzzxTfc5sNjNixAi2bNlyxcfbbDbWrFlDYmIir7zySvX5qqoqJk6cyFNPPUVERMQVn6e0tJTS0tLqz/Pz8wEoLy+nvLy8NrdUJ869phGv3Riof45R/xyj/jlG/XOM+ueYptI/C9CvrTf92noTc0sYp4vL2Zqay+bkk2xOzuVIbjE7j5xi55FT/H31IdydLfRt24KBYT4MDPOlU8Dl9zdpKj28Xozu39W+roISA50sLOVPXx8A4MmRHQnydjO4IhERERERcVROTg6VlZUEBATUOB8QEMCBAwcu+7i8vDyCg4MpLS3FYrHwxhtvMHLkyOqvv/LKKzg5OfGb3/zmquqYM2cOs2bNuuj8ypUrcXd3v8q7qXurVq0y7LUbA/XPMeqfY9Q/x6h/jlH/HNNU+3eTE9zUCU6WwME8U/VRWFbJukM5rDuUA0Azq42OXjY6NbfR0duGj8vFz9VUe1hXjOpfcXHxVV2noMRAc74+QN6ZcroEefHAwFCjyxEREREREQN5enqyZ88eCgsLWb16NTExMbRv357o6Gh27tzJa6+9xq5duy77144/9MwzzxATE1P9eX5+PiEhIYwaNQovL6/rdRuXVV5ezqpVqxg5ciRWq9YIry31zzHqn2PUP8eof45R/xyj/l2sqsrGwazC6tkm2w/nUlhexa6TJnadtF8T6utun23S3pfeIZ5s3xirHl4jo9+D52ZVX4mCEoNsT83lfzuPATB7QiROFq2JJyIiIiLSGPj5+WGxWMjMzKxxPjMzk8DAwMs+zmw2Ex4eDkCPHj1ISEhgzpw5REdHs2HDBrKysmjTpk319ZWVlfz2t79l3rx5HD58+KLnc3FxwcXl4j+HtFqthg7yjX79hk79c4z65xj1zzHqn2PUP8eofzVFhfgQFeLDr6KhrKKK3Wmn2JSUw8akHL4/lsfhk8UcPlnMh9uPYTZBa3cLCdbDDO3oT6+2LXC1Woy+hQbHqPfg1b6mghIDlFVUMX1pHAD39guhd9sWBlckIiIiIiJ1xdnZmd69e7N69WomTJgA2PcXWb16NVOnTr3q56mqqqreY2TixImMGDGixtdHjx7NxIkTqzeMFxEREZHac3Yy07+9L/3b+xIzqhP5JeVsS8mtDk6SsgpJKzKxcH0qC9en4uJkpl87HwaF+zE43I+uQV6YzVc341fqLwUlBvjXxlQOZhbi4+HMH27tbHQ5IiIiIiJSx2JiYpg0aRJ9+vShX79+zJs3j6KioupQ4/777yc4OJg5c+YA9v1E+vTpQ1hYGKWlpSxfvpz333+fBQsWAODr64uvr2+N17BarQQGBtKpU6cbe3MiIiIijZiXq5WRXQMY2dW+39zRkwUsXLKWIo/WbE7JJauglA2Hcthwdn+T5u5WBoX5VQcnbXyN2wtOrp2Ckhvs2Kli/r76EADPjulCc3dngysSEREREZG6ds8995Cdnc3zzz9PRkYGPXr0YMWKFdUbvKelpWE2n19+t6ioiMcff5xjx47h5uZG586dWbx4Mffcc49RtyAiIiIiQKCXK/1a2hgzJgonJyeSsgrZmJTDpqQctqbkcrq4nGVx6SyLSwegdQs3Bofbg5OBYb74NrvEzvBS7ygoucFe+GI/Z8or6dfOh7t7BRtdjoiIiIiIXCdTp0697FJbsbGxNT6fPXs2s2fPrtXzX2pfEhERERG5fkwmEx0CPOkQ4MnkQe0or6xi77G86mW6dqed4tipM3z03VE++u4oAF2DvBjcwR6c9Av1wc1Z+5vURwpKbqBV+zP5NiETJ7OJ2RMiMZm0dp2IiIiIiIiIiIhIQ2S1mOndtgW927bgN7d0oKi0gu2Hc9l0yB6cHMgoYH96PvvT8/nn+hScLWZ6tW1ePeMkKtgbJ4v5yi8k152CkhukuKyCF77YB8BDQ9rTMcDT4IpEREREREREREREpK54uDgxvJM/wzv5A5BdUMrmZPsyXRsP5XAir4StKblsTcnlrysP4unqxID2vtUzTtr7eeiP6w2ioOQG+fvqJI6fPkNwczd+c0u40eWIiIiIiIiIiIiIyHXU0tOF8T2CGd8jGJvNxuGTxfb9TQ7lsDk5h/ySClbuz2Tl/kwAgrxdGRTux6BwXwaF+eHv5WrwHTQdCkpugMSMAt7ekALAC3dE4O6stouIiIiIiIiIiIg0FSaTiXZ+HrTz82DiTW2prLIRfzyPjUn20OS7w6dIzyvhfzuP8b+dxwDoGNCMQeF+DA73o397X5q56PfK14s6e53ZbDZmLI2nosrGyK4BjOwaYHRJIiIiIiIiIiIiImIgi9lE95DmdA9pzpTh4ZSUV7Lj8Cn7jJOkHOJP5HEws5CDmYW8u+kwTmYTPUKa24OTDn70CGmOVfub1BkFJdfZ/3YeY/vhXNysFl64I8LockRERERERERERESknnG1WhjcwR6CAJwqKmNLysnq4OTIyWJ2HDnFjiOneG31ITycLfRv71s946RjQDPtb+IABSXX0amiMuZ8fQCAaSM6ENzczeCKRERERERERERERKS+a+HhzJioIMZEBQFwNLfYvil8Ug6bk0+SW1TGmgNZrDmQBYBfMxcGh/ue3ePEj1b6XXStKCi5jv78zQFyi8roGNCMXw5uZ3Q5IiIiIiIiIiIiItIAhfi487N+bfhZvzZUVdlIyMg/G5ycZHvqSXIKS1m65wRL95wAoH1LDwafDU1uau+Lt5vV4Duo3xSUXCc7j+Tyn+1HAZg9IUrrxYmIiIiIiIiIiIiIw8xmExGtvIlo5c0jQ8Morahk15HTbE62zzj5/uhpUrKLSMku4t9bjmA2QbfWzRkc7sfAcF96t22Bi5PF6NuoVxSUXAcVlVU8tyQegJ/0bk2/dj4GVyQiIiIiIiIiIiIijZGLk4UBYb4MCPPlt6M6kXemnG0pJ6uX6krOLmLP0dPsOXqaf6xNwtVqpm+oT/WMk65BXpjNTXt/EwUl18GizYc5kFFAc3crz9zW2ehyRERERERERERERKSJ8HazMioikFERgQCk551hU9L54CS7oJQNh3LYcCgHgBbuVgae3RR+cLgfIT7uRpZvCAUldSw9r4RXVx0E4OlbO+PbzMXgikRERERERERERESkqQryduMnvVvzk96tsdlsHMoqZOOhHDYl5bA15SSnistZtjedZXvTAWjj486gs6HJgDBffDycDb6D609BSR17efkBisoq6dWmOT/tE2J0OSIiIiIiIiIiIiIiAJhMJjoGeNIxwJMHB7ejvLKK74+eZmOSPTjZnXaatNxi0ran8Z/taZhMENHKqzo46Rvqg6u18e1voqCkDu0/ZeKbA1lYzCZevjOqya/rJiIiIiIiIiIiIiL1l9Vipk+oD31CfXhiREcKSyv4LjW3Ojg5kFFA/PF84o/n8+a6FJydzPRp24JBZ/c3iQr2xtIIfg+uoKSOlJRX8r9UMwCTB4bSJcjL4IpERERERERERERERK5eMxcnhnf2Z3hnfwCyCkrYknySjYfs+5uk55WwOfkkm5NP8pdvEvFydWJAmG/1xvDt/DwwmRpecKKgpI68sS6Fk6UmArxceGJkR6PLERERERERERERERFxiL+nK+N7BDO+RzA2m43UnKLqTeE3J58kv6SCb/Zl8s2+TABaebval+nq4MfAMD+au5oNvoOro6CkDiRlFfL2xsMAzBjTmWYuaquIiIiIiIiIiIiINB4mk4n2LZvRvmUzJg4IpaKyivgT+fbg5FAOO4+c4kReCZ/sPMYnO48B0CmgGZ1cTIwxuPYr0W/068C/txymvNJG1+ZVjOrqb3Q5IiIiIiIiIiIiIiLXlZPFTI+Q5vQIac6U4eGcKavku8O51TNO9p3IJzGzEL+A+r8Ul4KSOjBzXARtfdzgRHyDXH9NRERERERERERERMQRbs4WhnZsydCOLQHILSpj48FM0vbvMriyK2sYC4TVcxaziftvaoOfq9GViIiIiIiIiIiIiIgYz8fDmdsiAwlpZnQlV6agREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mQpKBERERERERERERERkSZLQYmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlAiIiIiIiIiIiIiIiJNloISERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mQpKBERERERERERERERkSZLQYmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlAiIiIiIiIiIiIiIiJNloISERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwnowuoKzabDYD8/HxDXr+8vJzi4mLy8/OxWq2G1NCQqX+OUf8co/45Rv1zjPrnGPXPMeqfY4zu37mfe8/9HCxyJRozNWzqn2PUP8eof45R/xyj/jlG/XOceugYo/t3teOmRhOUFBQUABASEmJwJSIiIiIiN05BQQHe3t5GlyENgMZMIiIiItJUXWncZLI1kj9Bq6qq4sSJE3h6emIymW746+fn5xMSEsLRo0fx8vK64a/f0Kl/jlH/HKP+OUb9c4z65xj1zzHqn2OM7p/NZqOgoIBWrVphNmtFXbkyjZkaNvXPMeqfY9Q/x6h/jlH/HKP+OU49dIzR/bvacVOjmVFiNptp3bq10WXg5eWl/2AcoP45Rv1zjPrnGPXPMeqfY9Q/x6h/jjGyf5pJIrWhMVPjoP45Rv1zjPrnGPXPMeqfY9Q/x6mHjqnv4yb96ZmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlBSR1xcXJg5cyYuLi5Gl9IgqX+OUf8co/45Rv1zjPrnGPXPMeqfY9Q/kdrRfzOOUf8co/45Rv1zjPrnGPXPMeqf49RDxzSU/jWazdxFRERERERERERERERqSzNKRERERERERERERESkyVJQIiIiIiIiIiIiIiIiTZaCEhERERERERERERERabIUlIiIiIiIiIiIiIiISJOloKQW5s+fT2hoKK6urvTv35/t27f/6PWffPIJnTt3xtXVlaioKJYvX36DKq2fatO/RYsWYTKZahyurq43sNr6Y/369YwbN45WrVphMplYunTpFR8TGxtLr169cHFxITw8nEWLFl33Ouur2vYvNjb2oveeyWQiIyPjxhRcz8yZM4e+ffvi6emJv78/EyZMIDEx8YqP0/c/u2vpn77/nbdgwQK6deuGl5cXXl5eDBgwgK+//vpHH6P33nm17Z/eez/uT3/6EyaTiSeeeOJHr9N7UJo6jZkcozHTtdO4yTEaN107jZkcozGT4zRucozGTXWnoY+ZFJRcpY8//piYmBhmzpzJrl276N69O6NHjyYrK+uS12/evJl7772XX/7yl+zevZsJEyYwYcIE4uPjb3Dl9UNt+wfg5eVFenp69XHkyJEbWHH9UVRURPfu3Zk/f/5VXZ+amsrYsWMZPnw4e/bs4YknnuChhx7im2++uc6V1k+17d85iYmJNd5//v7+16nC+m3dunVMmTKFrVu3smrVKsrLyxk1ahRFRUWXfYy+/513Lf0Dff87p3Xr1vzpT39i586d7Nixg5tvvpnx48ezb9++S16v915Nte0f6L13Od999x1vvvkm3bp1+9Hr9B6Upk5jJsdozOQYjZsco3HTtdOYyTEaMzlO4ybHaNxUNxrFmMkmV6Vfv362KVOmVH9eWVlpa9WqlW3OnDmXvP6nP/2pbezYsTXO9e/f3/arX/3qutZZX9W2f++++67N29v7BlXXcAC2JUuW/Og1v//9720RERE1zt1zzz220aNHX8fKGoar6d/atWttgO3UqVM3pKaGJisrywbY1q1bd9lr9P3v8q6mf/r+9+NatGhhe/vtty/5Nb33ruzH+qf33qUVFBTYOnToYFu1apVt2LBhtmnTpl32Wr0HpanTmMkxGjPVHY2bHKNxk2M0ZnKMxkx1Q+Mmx2jcVDuNZcykGSVXoaysjJ07dzJixIjqc2azmREjRrBly5ZLPmbLli01rgcYPXr0Za9vzK6lfwCFhYW0bduWkJCQKya5cp7ee3WjR48eBAUFMXLkSDZt2mR0OfVGXl4eAD4+Ppe9Ru/By7ua/oG+/11KZWUlH330EUVFRQwYMOCS1+i9d3lX0z/Qe+9SpkyZwtixYy96b12K3oPSlGnM5BiNmW48vf/qhsZNF9OYyTEaMzlG4ybHaNx0bRrLmElByVXIycmhsrKSgICAGucDAgIuu/5mRkZGra5vzK6lf506deKdd97h888/Z/HixVRVVTFw4ECOHTt2I0pu0C733svPz+fMmTMGVdVwBAUFsXDhQj799FM+/fRTQkJCiI6OZteuXUaXZriqqiqeeOIJBg0aRGRk5GWv0/e/S7va/un7X01xcXE0a9YMFxcXHn30UZYsWULXrl0vea3eexerTf/03rvYRx99xK5du5gzZ85VXa/3oDRlGjM5RmOmG0/jJsdo3HRpGjM5RmOma6dxk2M0brp2jWnM5GR0ASKXMmDAgBrJ7cCBA+nSpQtvvvkmL730koGVSWPXqVMnOnXqVP35wIEDSU5O5tVXX+X99983sDLjTZkyhfj4eDZu3Gh0KQ3S1fZP3/9q6tSpE3v27CEvL4///e9/TJo0iXXr1l32h1apqTb903uvpqNHjzJt2jRWrVqlzRlFpF7S920xksZNl6Yxk2M0Zrp2Gjc5RuOma9PYxkwKSq6Cn58fFouFzMzMGuczMzMJDAy85GMCAwNrdX1jdi39+yGr1UrPnj1JSkq6HiU2Kpd773l5eeHm5mZQVQ1bv379mvwPulOnTuWrr75i/fr1tG7d+kev1fe/i9Wmfz/U1L//OTs7Ex4eDkDv3r357rvveO2113jzzTcvulbvvYvVpn8/1NTfezt37iQrK4tevXpVn6usrGT9+vX84x//oLS0FIvFUuMxeg9KU6Yxk2M0ZrrxNG6qe0193KQxk2M0ZnKMxk2O0bjp2jS2MZOW3roKzs7O9O7dm9WrV1efq6qqYvXq1Zddr27AgAE1rgdYtWrVj65v11hdS/9+qLKykri4OIKCgq5XmY2G3nt1b8+ePU32vWez2Zg6dSpLlixhzZo1tGvX7oqP0XvwvGvp3w/p+19NVVVVlJaWXvJreu9d2Y/174ea+nvvlltuIS4ujj179lQfffr04ec//zl79uy56Ad+0HtQmjaNmRyjMdONp/df3Wuq4yaNmRyjMdP1oXGTYzRuujqNbsxk7F7yDcdHH31kc3FxsS1atMi2f/9+2yOPPGJr3ry5LSMjw2az2WwTJ060Pf3009XXb9q0yebk5GT761//aktISLDNnDnTZrVabXFxcUbdgqFq279Zs2bZvvnmG1tycrJt586dtp/97Gc2V1dX2759+4y6BcMUFBTYdu/ebdu9e7cNsM2dO9e2e/du25EjR2w2m8329NNP2yZOnFh9fUpKis3d3d321FNP2RISEmzz58+3WSwW24oVK4y6BUPVtn+vvvqqbenSpbZDhw7Z4uLibNOmTbOZzWbbt99+a9QtGOqxxx6zeXt722JjY23p6enVR3FxcfU1+v53edfSP33/O+/pp5+2rVu3zpaammrbu3ev7emnn7aZTCbbypUrbTab3ntXUtv+6b13ZcOGDbNNmzat+nO9B0Vq0pjJMRozOUbjJsdo3HTtNGZyjMZMjtO4yTEaN9WthjxmUlBSC6+//rqtTZs2NmdnZ1u/fv1sW7durf7asGHDbJMmTapx/X//+19bx44dbc7OzraIiAjbsmXLbnDF9Utt+vfEE09UXxsQEGAbM2aMbdeuXQZUbby1a9fagIuOc/2aNGmSbdiwYRc9pkePHjZnZ2db+/btbe++++4Nr7u+qG3/XnnlFVtYWJjN1dXV5uPjY4uOjratWbPGmOLrgUv1DqjxntL3v8u7lv7p+995Dz74oK1t27Y2Z2dnW8uWLW233HJL9Q+rNpvee1dS2/7pvXdlP/yhX+9BkYtpzOQYjZmuncZNjtG46dppzOQYjZkcp3GTYzRuqlsNecxkstlstrqfpyIiIiIiIiIiIiIiIlL/aY8SERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mQpKBERERERERERERERkSZLQYmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlAiIiIiIiIiIiIiIiJNloISERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mT9P7WuLgMvviw8AAAAAElFTkSuQmCC\n" + }, + "metadata": {} + } + ], + "source": [ + "fig = plt.figure(figsize = (20, 6))\n", + "plt.subplot(1, 2, 1)\n", + "plt.plot(epoch_tr_acc, label='Train Acc')\n", + "plt.plot(epoch_vl_acc, label='Validation Acc')\n", + "plt.title(\"Accuracy\")\n", + "plt.legend()\n", + "plt.grid()\n", + "\n", + "plt.subplot(1, 2, 2)\n", + "plt.plot(epoch_tr_loss, label='Train loss')\n", + "plt.plot(epoch_vl_loss, label='Validation loss')\n", + "plt.title(\"Loss\")\n", + "plt.legend()\n", + "plt.grid()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {}, + "id": "iUyaF-EbfjEH" + }, + "source": [ + "---\n", + "# What's Next?\n", + "\n", + "You can use this project template as a starting point to think about your own project. There are a lot of ways to continue, here we share with you some ideas you migth find useful:\n", + "\n", + "* **Work on the Preproccesing.** We used a very rudimentary way to tokenize tweets. But there are better ways to preprocess the data. Can you think of a suitable way to preprocess the data for this particular task? How does the performance of the model change when the data is processed correctly?\n", + "* **Work on the Model.** The RNN model proposed in this notebook is not optimized at all. You can work on finding a better architecture or better hyperparamenters. May be using bidirectonal LSTMs or increasing the number of stacked layers can improve the performance, feel free to try different approaches.\n", + "* **Work on the Embedding.** Our model learnt an embedding during the training on this Twitter corpus for a particular task. You can explore the representation of different words in this learned embedding. Also, you can try using different word embeddings. You can train them on this corpus or you can use an embedding trained on another corpus of data. How does the change of the embedding affect the model performance?\n", + "* **Try sentiment analysis on another dataset.** There are lots of available dataset to work with, we can help you find one that is interesting to you. Do you belive that a sentiment analysis model trained on some corpus (Twitter dataset) will perform well on another type of data (for example, youtube comments)?\n", + "\n" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "provenance": [] + }, + "kernel": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "kernelspec": { + "display_name": "Python 3", + "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.11.2" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "fbb4191426bd485e8e965b6d432eecae": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_df7eba182d1b4c21bc21d157eac6b996", + "IPY_MODEL_6d64402d9da74516ab4e1d46ae9f1ee3", + "IPY_MODEL_d9ca809f7b1c49e595a05458251f3ab2" + ], + "layout": "IPY_MODEL_90908b6f69524a72860214ef8bd2d946" + } + }, + "df7eba182d1b4c21bc21d157eac6b996": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_db432a2cd6244a7592fc9732f0ca4738", + "placeholder": "​", + "style": "IPY_MODEL_84485541f3a14c65a67d10a97b72bbad", + "value": "Downloading builder script: 100%" + } + }, + "6d64402d9da74516ab4e1d46ae9f1ee3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5fa7ab2ab2004e5cb692199e2bd27d6b", + "max": 4033, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ab71bd2b452146829e973d6cf99f31ed", + "value": 4033 + } + }, + "d9ca809f7b1c49e595a05458251f3ab2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_55ba92cfe0724286ac1c2bbe6577e5c8", + "placeholder": "​", + "style": "IPY_MODEL_67a4fa49ca5349d58512a16a3742d401", + "value": " 4.03k/4.03k [00:00<00:00, 114kB/s]" + } + }, + "90908b6f69524a72860214ef8bd2d946": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "db432a2cd6244a7592fc9732f0ca4738": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "84485541f3a14c65a67d10a97b72bbad": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5fa7ab2ab2004e5cb692199e2bd27d6b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ab71bd2b452146829e973d6cf99f31ed": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "55ba92cfe0724286ac1c2bbe6577e5c8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "67a4fa49ca5349d58512a16a3742d401": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "afd671543846468abfe37669a72845c3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_057e918ace004506aedc4e4b9942c3a8", + "IPY_MODEL_325387f6b62d47b0b21bea61676cea72", + "IPY_MODEL_ea1e3eb0e6ec4f8d82cf9b12cfe6e700" + ], + "layout": "IPY_MODEL_96c2d7ee644a438982e1792b7ec0453c" + } + }, + "057e918ace004506aedc4e4b9942c3a8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9baa1a735c0646b89953bf4a7c7fc92c", + "placeholder": "​", + "style": "IPY_MODEL_0ac9711c8ece4c5397a8cd810713adfb", + "value": "Downloading readme: 100%" + } + }, + "325387f6b62d47b0b21bea61676cea72": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a8d69769921241b8b1081e84f7770858", + "max": 6837, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d189f24b0e964d1a9fc86379bad38cca", + "value": 6837 + } + }, + "ea1e3eb0e6ec4f8d82cf9b12cfe6e700": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_db9bf44dec914db793cc4f73751c272c", + "placeholder": "​", + "style": "IPY_MODEL_1cf3ba0f756f4aa5ad1dcb675a791cfa", + "value": " 6.84k/6.84k [00:00<00:00, 157kB/s]" + } + }, + "96c2d7ee644a438982e1792b7ec0453c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9baa1a735c0646b89953bf4a7c7fc92c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0ac9711c8ece4c5397a8cd810713adfb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a8d69769921241b8b1081e84f7770858": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d189f24b0e964d1a9fc86379bad38cca": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "db9bf44dec914db793cc4f73751c272c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1cf3ba0f756f4aa5ad1dcb675a791cfa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c432c4efcb794ce781fcb6f176f1b60d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_510eeffb32694e7798f23e3931d7a943", + "IPY_MODEL_a8b3dfaa2831416582d8eeef01451386", + "IPY_MODEL_db1cdafaf36f4c339476f3221abc17b3" + ], + "layout": "IPY_MODEL_ffd3778a96e046718828bbc5aa73f173" + } + }, + "510eeffb32694e7798f23e3931d7a943": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_49c5a3fbe87b491cb3f0f450a0af0659", + "placeholder": "​", + "style": "IPY_MODEL_252949e8784c4878a62eb2e30b1e3466", + "value": "Downloading data: 100%" + } + }, + "a8b3dfaa2831416582d8eeef01451386": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7bcef602e7f441308472bc145b12dcd3", + "max": 81363704, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_97fb30a5a31742efa1d188b9361f9938", + "value": 81363704 + } + }, + "db1cdafaf36f4c339476f3221abc17b3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9b34daddb9cc48bba109e547177ec654", + "placeholder": "​", + "style": "IPY_MODEL_fd2b5a6533794a2794579956c25247fb", + "value": " 81.4M/81.4M [00:06<00:00, 15.3MB/s]" + } + }, + "ffd3778a96e046718828bbc5aa73f173": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "49c5a3fbe87b491cb3f0f450a0af0659": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "252949e8784c4878a62eb2e30b1e3466": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7bcef602e7f441308472bc145b12dcd3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "97fb30a5a31742efa1d188b9361f9938": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "9b34daddb9cc48bba109e547177ec654": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fd2b5a6533794a2794579956c25247fb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f3a9667c8c994324a2409f227bd0a1e9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6e6c5372ffe045c0b72587989567429e", + "IPY_MODEL_2ead0216695e4227aef44552f4ec3cc9", + "IPY_MODEL_53843f49adda4bce8450fd91fa9fd587" + ], + "layout": "IPY_MODEL_40262cb3eefa45fcbe37aaafccb69f5f" + } + }, + "6e6c5372ffe045c0b72587989567429e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b54b826314ea4b3a92eebd218c093fc1", + "placeholder": "​", + "style": "IPY_MODEL_8cd7be688b8c4818be48915db14a0792", + "value": "Generating train split: 100%" + } + }, + "2ead0216695e4227aef44552f4ec3cc9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a9a0f6ce71ed415c8c8513f68e34e162", + "max": 1600000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7f638a6deacd42e88c031fa47797516b", + "value": 1600000 + } + }, + "53843f49adda4bce8450fd91fa9fd587": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_849e39cc86f64e558ff94bf542a5121a", + "placeholder": "​", + "style": "IPY_MODEL_67b0b03c391c414bad5ea9fb3c947a2f", + "value": " 1600000/1600000 [01:18<00:00, 14710.70 examples/s]" + } + }, + "40262cb3eefa45fcbe37aaafccb69f5f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b54b826314ea4b3a92eebd218c093fc1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8cd7be688b8c4818be48915db14a0792": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a9a0f6ce71ed415c8c8513f68e34e162": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7f638a6deacd42e88c031fa47797516b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "849e39cc86f64e558ff94bf542a5121a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "67b0b03c391c414bad5ea9fb3c947a2f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1cef38981af6457dbaeb393f9936a389": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_b0b5cfae51214c60bbca9a09b196c217", + "IPY_MODEL_5ee2a4b33be04c6db8ee4d7995c2376d", + "IPY_MODEL_403fffb635c2409ebeabc90063750ed3" + ], + "layout": "IPY_MODEL_6279343019064572adedf34cfbd437fa" + } + }, + "b0b5cfae51214c60bbca9a09b196c217": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2715d00db77545f9aa5eace8a0eb2839", + "placeholder": "​", + "style": "IPY_MODEL_942ce490d87347c789e229589b1b9c9f", + "value": "Generating test split: 100%" + } + }, + "5ee2a4b33be04c6db8ee4d7995c2376d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f04df4daeb6049ab85d3d75b472ccf6e", + "max": 498, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_fd0b3c53b66543cea0c396d8047445a8", + "value": 498 + } + }, + "403fffb635c2409ebeabc90063750ed3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2c42e2fef6314c9e842a7e9641af3cab", + "placeholder": "​", + "style": "IPY_MODEL_913d95e58aa94e4a8009768a23fbf304", + "value": " 498/498 [00:00<00:00, 7393.07 examples/s]" + } + }, + "6279343019064572adedf34cfbd437fa": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2715d00db77545f9aa5eace8a0eb2839": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "942ce490d87347c789e229589b1b9c9f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f04df4daeb6049ab85d3d75b472ccf6e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fd0b3c53b66543cea0c396d8047445a8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "2c42e2fef6314c9e842a7e9641af3cab": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "913d95e58aa94e4a8009768a23fbf304": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e1348a02ceeb4af19fbd63d52b7d843b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_fbf51b14e6b34d0485ddf59c43d22c49", + "IPY_MODEL_c29e06a72ac9401b8c41f4195021071e", + "IPY_MODEL_48b812211db04284bfbbf02823fb879a" + ], + "layout": "IPY_MODEL_5455119809c74916acc50e1905903ded" + } + }, + "fbf51b14e6b34d0485ddf59c43d22c49": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2475bd62a3224bacb38a6334d07d6a8c", + "placeholder": "​", + "style": "IPY_MODEL_3d29947b5d2d4e2abc1355d900096642", + "value": "100%" + } + }, + "c29e06a72ac9401b8c41f4195021071e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3f7a8f56f15c434da70029366a37167a", + "max": 1280000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_3610a2db297f4686bf9043f2b7ee55b5", + "value": 1280000 + } + }, + "48b812211db04284bfbbf02823fb879a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a1bd0616199e44538977ee2ea6049690", + "placeholder": "​", + "style": "IPY_MODEL_835fb9a91b34471fa6d61adf37616f52", + "value": " 1280000/1280000 [00:22<00:00, 77416.28it/s]" + } + }, + "5455119809c74916acc50e1905903ded": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2475bd62a3224bacb38a6334d07d6a8c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3d29947b5d2d4e2abc1355d900096642": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3f7a8f56f15c434da70029366a37167a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3610a2db297f4686bf9043f2b7ee55b5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a1bd0616199e44538977ee2ea6049690": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "835fb9a91b34471fa6d61adf37616f52": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d8de1a85076b453a92295e79110ba8fd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_78d48ee2fb9f42089f475fcf5fc368c8", + "IPY_MODEL_b0ca3012d0b84c5a9d7c1fc176251af7", + "IPY_MODEL_39fa73efcbf54d8dad225d8380061dbf" + ], + "layout": "IPY_MODEL_6b6cc35257fe433e93736d02e898b6b8" + } + }, + "78d48ee2fb9f42089f475fcf5fc368c8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e0fc900d8b5940a6bd6a97e58adb4651", + "placeholder": "​", + "style": "IPY_MODEL_6b7286d74e0f4a0199dbfcaf3dd0d622", + "value": "100%" + } + }, + "b0ca3012d0b84c5a9d7c1fc176251af7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a4bbd3df99cd4acab5e1b3ba5cd7c114", + "max": 320000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9a7140a6197945d5bac5c48b820dfb04", + "value": 320000 + } + }, + "39fa73efcbf54d8dad225d8380061dbf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0bdc146792a64853ae06a9d185aa2b15", + "placeholder": "​", + "style": "IPY_MODEL_768da964ffcd44fea1af09e81f5621f3", + "value": " 320000/320000 [00:06<00:00, 58691.43it/s]" + } + }, + "6b6cc35257fe433e93736d02e898b6b8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e0fc900d8b5940a6bd6a97e58adb4651": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6b7286d74e0f4a0199dbfcaf3dd0d622": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a4bbd3df99cd4acab5e1b3ba5cd7c114": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9a7140a6197945d5bac5c48b820dfb04": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "0bdc146792a64853ae06a9d185aa2b15": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "768da964ffcd44fea1af09e81f5621f3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file From 6a02a9df36b49445964f0dbb9dfda74b8eed4cb4 Mon Sep 17 00:00:00 2001 From: dalia-nasr Date: Sun, 7 Jul 2024 11:40:43 +0300 Subject: [PATCH 07/12] reverted edit and replaced cells with required changes --- .../sentiment_analysis.ipynb | 6301 +++++------------ 1 file changed, 1666 insertions(+), 4635 deletions(-) diff --git a/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb b/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb index eb393529a..87c305bde 100644 --- a/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb +++ b/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb @@ -1,4640 +1,1671 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "view-in-github" - }, - "source": [ - "\"Open   \"Open" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "D_fgc45VfjDz" - }, - "source": [ - "# Twitter Sentiment Analysis\n", - "\n", - "**By Neuromatch Academy**\n", - "\n", - "__Content creators:__ Juan Manuel Rodriguez, Salomey Osei, Gonzalo Uribarri\n", - "\n", - "__Production editors:__ Amita Kapoor, Spiros Chavlis" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "axvz0SUsfjD0" - }, - "source": [ - "---\n", - "# Welcome to the NLP project template\n", - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "2Vfm0ThbfjD1" - }, - "source": [ - "---\n", - "# Step 1: Questions and goals\n", - "\n", - "* Can we infer emotion from a tweet text?\n", - "* How words are distributed accross the dataset?\n", - "* Are words related to one kind of emotion?" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "Vd1qdNW9fjD1" - }, - "source": [ - "---\n", - "# Step 2: Literature review\n", - "\n", - "[Original Dataset Paper](https://cs.stanford.edu/people/alecmgo/papers/TwitterDistantSupervision09.pdf)\n", - "\n", - "[Papers with code](https://paperswithcode.com/dataset/imdb-movie-reviews)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "oOYDQElpfjD2" - }, - "source": [ - "---\n", - "# Step 3: Load and explore the dataset" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "EZpxSExUfjD2", - "outputId": "19b01445-9b83-4a93-9cc2-7830ab0dcf5b" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.3/21.3 MB\u001b[0m \u001b[31m60.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m547.8/547.8 kB\u001b[0m \u001b[31m8.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m40.8/40.8 MB\u001b[0m \u001b[31m11.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m116.3/116.3 kB\u001b[0m \u001b[31m13.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m64.9/64.9 kB\u001b[0m \u001b[31m7.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m194.1/194.1 kB\u001b[0m \u001b[31m20.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.8/134.8 kB\u001b[0m \u001b[31m15.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "cudf-cu12 24.4.1 requires pyarrow<15.0.0a0,>=14.0.1, but you have pyarrow 16.1.0 which is incompatible.\n", - "google-colab 1.0.0 requires requests==2.31.0, but you have requests 2.32.3 which is incompatible.\n", - "ibis-framework 8.0.0 requires pyarrow<16,>=2, but you have pyarrow 16.1.0 which is incompatible.\u001b[0m\u001b[31m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "# @title Install dependencies\n", - "!pip install pandas --quiet\n", - "!pip install torchtext --quiet\n", - "!pip install datasets --quiet" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "DxqD3Tk5fjD3", - "outputId": "451d68c5-7894-4f93-9f54-bf0b7f482e20" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/torchtext/data/__init__.py:4: UserWarning: \n", - "/!\\ IMPORTANT WARNING ABOUT TORCHTEXT STATUS /!\\ \n", - "Torchtext is deprecated and the last released version will be 0.18 (this one). You can silence this warning by calling the following at the beginnign of your scripts: `import torchtext; torchtext.disable_torchtext_deprecation_warning()`\n", - " warnings.warn(torchtext._TORCHTEXT_DEPRECATION_MSG)\n" - ] - } - ], - "source": [ - "# We import some libraries to load the dataset\n", - "import os\n", - "import numpy as np\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "\n", - "from datasets import load_dataset\n", - "\n", - "from collections import Counter\n", - "from tqdm.notebook import tqdm\n", - "\n", - "import torch\n", - "import torch.nn as nn\n", - "import torch.optim as optim\n", - "import torch.nn.functional as F\n", - "from torch.utils.data import TensorDataset, DataLoader\n", - "\n", - "import torchtext\n", - "from torchtext.data import get_tokenizer\n", - "\n", - "from sklearn.utils import shuffle\n", - "from sklearn.metrics import classification_report\n", - "from sklearn.linear_model import LogisticRegression\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.feature_extraction.text import CountVectorizer" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "63Eg1SLbfjD4" - }, - "source": [ - "You can find the dataset we are going to use in [this website](http://help.sentiment140.com/for-students/)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/", - "height": 567, - "referenced_widgets": [ - "fbb4191426bd485e8e965b6d432eecae", - "df7eba182d1b4c21bc21d157eac6b996", - "6d64402d9da74516ab4e1d46ae9f1ee3", - "d9ca809f7b1c49e595a05458251f3ab2", - "90908b6f69524a72860214ef8bd2d946", - "db432a2cd6244a7592fc9732f0ca4738", - "84485541f3a14c65a67d10a97b72bbad", - "5fa7ab2ab2004e5cb692199e2bd27d6b", - "ab71bd2b452146829e973d6cf99f31ed", - "55ba92cfe0724286ac1c2bbe6577e5c8", - "67a4fa49ca5349d58512a16a3742d401", - "afd671543846468abfe37669a72845c3", - "057e918ace004506aedc4e4b9942c3a8", - "325387f6b62d47b0b21bea61676cea72", - "ea1e3eb0e6ec4f8d82cf9b12cfe6e700", - "96c2d7ee644a438982e1792b7ec0453c", - "9baa1a735c0646b89953bf4a7c7fc92c", - "0ac9711c8ece4c5397a8cd810713adfb", - "a8d69769921241b8b1081e84f7770858", - "d189f24b0e964d1a9fc86379bad38cca", - "db9bf44dec914db793cc4f73751c272c", - "1cf3ba0f756f4aa5ad1dcb675a791cfa", - "c432c4efcb794ce781fcb6f176f1b60d", - "510eeffb32694e7798f23e3931d7a943", - "a8b3dfaa2831416582d8eeef01451386", - "db1cdafaf36f4c339476f3221abc17b3", - "ffd3778a96e046718828bbc5aa73f173", - "49c5a3fbe87b491cb3f0f450a0af0659", - "252949e8784c4878a62eb2e30b1e3466", - "7bcef602e7f441308472bc145b12dcd3", - "97fb30a5a31742efa1d188b9361f9938", - "9b34daddb9cc48bba109e547177ec654", - "fd2b5a6533794a2794579956c25247fb", - "f3a9667c8c994324a2409f227bd0a1e9", - "6e6c5372ffe045c0b72587989567429e", - "2ead0216695e4227aef44552f4ec3cc9", - "53843f49adda4bce8450fd91fa9fd587", - "40262cb3eefa45fcbe37aaafccb69f5f", - "b54b826314ea4b3a92eebd218c093fc1", - "8cd7be688b8c4818be48915db14a0792", - "a9a0f6ce71ed415c8c8513f68e34e162", - "7f638a6deacd42e88c031fa47797516b", - "849e39cc86f64e558ff94bf542a5121a", - "67b0b03c391c414bad5ea9fb3c947a2f", - "1cef38981af6457dbaeb393f9936a389", - "b0b5cfae51214c60bbca9a09b196c217", - "5ee2a4b33be04c6db8ee4d7995c2376d", - "403fffb635c2409ebeabc90063750ed3", - "6279343019064572adedf34cfbd437fa", - "2715d00db77545f9aa5eace8a0eb2839", - "942ce490d87347c789e229589b1b9c9f", - "f04df4daeb6049ab85d3d75b472ccf6e", - "fd0b3c53b66543cea0c396d8047445a8", - "2c42e2fef6314c9e842a7e9641af3cab", - "913d95e58aa94e4a8009768a23fbf304" - ] - }, - "id": "3HLOsd3rfjD4", - "outputId": "7653fee1-a871-472b-a978-d8ec0250dc84" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_token.py:89: UserWarning: \n", - "The secret `HF_TOKEN` does not exist in your Colab secrets.\n", - "To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n", - "You will be able to reuse this secret in all of your notebooks.\n", - "Please note that authentication is recommended but still optional to access public models or datasets.\n", - " warnings.warn(\n" - ] - }, - { - "output_type": "display_data", - "data": { - "text/plain": [ - "Downloading builder script: 0%| | 0.00/4.03k [00:00\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
polarityuserdatequeryusertext
00_TheSpecialOne_Mon Apr 06 22:19:45 PDT 2009NO_QUERY_TheSpecialOne_@switchfoot http://twitpic.com/2y1zl - Awww, t...
10scotthamiltonMon Apr 06 22:19:49 PDT 2009NO_QUERYscotthamiltonis upset that he can't update his Facebook by ...
20mattycusMon Apr 06 22:19:53 PDT 2009NO_QUERYmattycus@Kenichan I dived many times for the ball. Man...
30ElleCTFMon Apr 06 22:19:57 PDT 2009NO_QUERYElleCTFmy whole body feels itchy and like its on fire
40KaroliMon Apr 06 22:19:57 PDT 2009NO_QUERYKaroli@nationwideclass no, it's not behaving at all....
\n", - "
\n", - "
\n", - "\n", - "
\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "
\n", - "\n", - "\n", - "
\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "
\n", - "\n", - "
\n", - " \n" - ], - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "dataframe", - "variable_name": "df" - } - }, - "metadata": {}, - "execution_count": 3 - } - ], - "source": [ - "# We load the dataset\n", - "\n", - "dataset = load_dataset(\"stanfordnlp/sentiment140\", trust_remote_code= True)\n", - "\n", - "train_data = dataset[\"train\"]\n", - "df = pd.DataFrame(train_data)\n", - "df = df.rename(columns={'sentiment': 'polarity'})\n", - "df = df[['polarity', 'user', 'date', 'query', 'user', 'text']]\n", - "df.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "fuKShcfjfjD4" - }, - "source": [ - "For this project we will use only the text and the polarity of the tweet. Notice that polarity is 0 for negative tweets and 4 for positive tweet." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "id": "GXHQOn6gfjD5" - }, - "outputs": [], - "source": [ - "X = df.text.values\n", - "\n", - "# Changes values from [0,4] to [0,1]\n", - "y = (df.polarity.values > 1).astype(int)\n", - "\n", - "\n", - "# Split the data into train and test\n", - "x_train_text, x_test_text, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42,stratify=y)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "7kr3TO_LfjD5" - }, - "source": [ - "The first thing we have to do before working on the models is to familiarize ourselves with the dataset. This is called Exploratory Data Analisys (EDA)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "FsL-xY03fjD5", - "outputId": "655f0ef8-c177-4f42-c024-1d628241401a" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "1: @paisleypaisley LOL why do i get ideas so far in advance? it's not even june yet! we need a third knitter to have our own summer group \n", - "0: worst headache ever \n", - "0: @ewaniesciuszko i am so sad i wont see you! I miss you already. and yeah! that's perfect; i come back the 18th!\n", - "1: doesn't know how to spell conked \n", - "0: "So we stand here now and no one knows us at all I won't get used to this I won't get used to being gone"...I miss home and everyone -a\n" - ] - } - ], - "source": [ - "for s, l in zip(x_train_text[:5], y_train[:5]):\n", - " print('{}: {}'.format(l, s))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "4cPGXSc-fjD5" - }, - "source": [ - "An interesting thing to analyze is the Word Distribution. In order to count the occurrences of each word, we should tokenize the sentences first." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "U1OugpZ0fjD5", - "outputId": "9e6cb4e3-8d8c-4db0-c113-bdd4fe87db5f" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Before Tokenize: worst headache ever \n", - "After Tokenize: ['worst', 'headache', 'ever']\n" - ] - } - ], - "source": [ - "tokenizer = get_tokenizer(\"basic_english\")\n", - "\n", - "print('Before Tokenize: ', x_train_text[1])\n", - "print('After Tokenize: ', tokenizer(x_train_text[1]))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/", - "height": 81, - "referenced_widgets": [ - "e1348a02ceeb4af19fbd63d52b7d843b", - "fbf51b14e6b34d0485ddf59c43d22c49", - "c29e06a72ac9401b8c41f4195021071e", - "48b812211db04284bfbbf02823fb879a", - "5455119809c74916acc50e1905903ded", - "2475bd62a3224bacb38a6334d07d6a8c", - "3d29947b5d2d4e2abc1355d900096642", - "3f7a8f56f15c434da70029366a37167a", - "3610a2db297f4686bf9043f2b7ee55b5", - "a1bd0616199e44538977ee2ea6049690", - "835fb9a91b34471fa6d61adf37616f52", - "d8de1a85076b453a92295e79110ba8fd", - "78d48ee2fb9f42089f475fcf5fc368c8", - "b0ca3012d0b84c5a9d7c1fc176251af7", - "39fa73efcbf54d8dad225d8380061dbf", - "6b6cc35257fe433e93736d02e898b6b8", - "e0fc900d8b5940a6bd6a97e58adb4651", - "6b7286d74e0f4a0199dbfcaf3dd0d622", - "a4bbd3df99cd4acab5e1b3ba5cd7c114", - "9a7140a6197945d5bac5c48b820dfb04", - "0bdc146792a64853ae06a9d185aa2b15", - "768da964ffcd44fea1af09e81f5621f3" - ] - }, - "id": "7ZggzGCXfjD6", - "outputId": "ae19f8d6-224d-4224-d3a0-d00c659ec9b2" - }, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - " 0%| | 0/1280000 [00:00" - ], - "image/png": "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qNGjR2v48OGaMmWK6uvrvZ8bY1RWVqYxY8Zo+PDhys7O1kcffWSx4sDU09OjpUuXaty4cRo+fLiuvfZaPfbYYz7vNWGundu1a5fy8/OVmJiokJCQc94N15c5PXXqlObNm6eoqCiNGjVKd999tzo6OvxX5MXeRxPsNm3aZCIiIszatWvN//7v/5oFCxaYUaNGmba2NtulBaycnByzbt06s3//ftPY2Ghuv/12M3bsWNPR0eHts3DhQpOcnGxqampMfX29+eY3v2luvPFGi1UHtj179piUlBQzdepUs2jRIm8783zpTp06Za6++mrzj//4j+add94xTU1N5tVXXzWHDh3y9lm5cqWJjo42W7duNb/73e/Md7/7XTNu3Djz6aefWqw88CxfvtyMHj3avPLKK+bw4cNmy5YtZuTIkeaJJ57w9mGundu+fbtZsmSJeeGFF4wk8+KLL/p83pc5ve2220xqaqp5++23zf/8z/+Y6667zsyZM8dvNQ75MDJ9+nRTVFTk3e/p6TGJiYmmoqLCYlXB5fjx40aSefPNN40xxpw+fdoMGzbMbNmyxdvngw8+MJJMXV2drTID1pkzZ8z1119vdu7cab71rW95wwjz7B8PP/ywuemmm877ucfjMQkJCebf/u3fvG2nT582LpfLPPvss4NRYtDIy8szd911l0/bHXfcYebNm2eMYa794athpC9z+v777xtJ5t133/X2+a//+i8TEhJijh496pe6hvRlmu7ubjU0NCg7O9vbFhoaquzsbNXV1VmsLLi0t7dLkmJiYiRJDQ0N+uyzz3zmfcKECRo7dizz3g9FRUXKy8vzmU+JefaXl156SRkZGfr+97+vuLg4paWlac2aNd7PDx8+rNbWVp95jo6OVmZmJvPs0I033qiamhodPHhQkvS73/1Ou3fvVm5uriTmeiD0ZU7r6uo0atQoZWRkePtkZ2crNDRU77zzjl/quCzf2jtYTp48qZ6eHu+vx/5ZfHy8PvzwQ0tVBRePx6P7779fM2bM8P7qbmtrqyIiIs55+WF8fLxaW1stVBm4Nm3apL179+rdd9895zPm2T+ampr0i1/8QiUlJXrkkUf07rvv6p//+Z8VERGhgoIC71z29vcI8+zM4sWL5Xa7NWHCBIWFhamnp0fLly/XvHnzJIm5HgB9mdPW1lbFxcX5fB4eHq6YmBi/zfuQDiMYeEVFRdq/f792795tu5Sg09LSokWLFmnnzp2KjIy0XU7Q8ng8ysjI0IoVKyRJaWlp2r9/v6qrq1VQUGC5uuDy3HPP6ZlnntHGjRv113/912psbNT999+vxMRE5jrIDenLNLGxsQoLCzvn6YK2tjYlJCRYqip4FBcX65VXXtEbb7yhq666ytuekJCg7u5unT592qc/8+5MQ0ODjh8/rhtuuEHh4eEKDw/Xm2++qZ///OcKDw9XfHw88+wHY8aM0aRJk3zaJk6cqObmZknyziV/j1y6hx56SIsXL9Y//MM/aMqUKbrzzjv1wAMPeF+8ylz7X1/mNCEhQcePH/f5/PPPP9epU6f8Nu9DOoxEREQoPT1dNTU13jaPx6OamhplZWVZrCywGWNUXFysF198Ua+//rrGjRvn83l6erqGDRvmM+8HDhxQc3Mz8+7ALbfcovfee0+NjY3eLSMjQ/PmzfP+N/N86WbMmHHOo+kHDx7U1VdfLUkaN26cEhISfObZ7XbrnXfeYZ4dOnv2rM+LViUpLCxMHo9HEnM9EPoyp1lZWTp9+rQaGhq8fV5//XV5PB5lZmb6pxC/3AYbwDZt2mRcLpdZv369ef/9982PfvQjM2rUKNPa2mq7tIB17733mujoaFNbW2uOHTvm3c6ePevts3DhQjN27Fjz+uuvm/r6epOVlWWysrIsVh0c/vJpGmOYZ3/Ys2ePCQ8PN8uXLzcfffSReeaZZ8yIESPMr3/9a2+flStXmlGjRpnf/OY35ve//73527/9Wx437YeCggKTlJTkfbT3hRdeMLGxsebHP/6xtw9z7dyZM2fMvn37zL59+4wkU1lZafbt22c+/vhjY0zf5vS2224zaWlp5p133jG7d+82119/PY/2+tt//Md/mLFjx5qIiAgzffp08/bbb9suKaBJ6nVbt26dt8+nn35q7rvvPnPllVeaESNGmL/7u78zx44ds1d0kPhqGGGe/ePll182kydPNi6Xy0yYMME89dRTPp97PB6zdOlSEx8fb1wul7nlllvMgQMHLFUbuNxut1m0aJEZO3asiYyMNNdcc41ZsmSJ6erq8vZhrp174403ev07uaCgwBjTtzn94x//aObMmWNGjhxpoqKiTGFhoTlz5ozfagwx5i9+2g4AAGCQDel7RgAAgH2EEQAAYBVhBAAAWEUYAQAAVhFGAACAVYQRAABgFWEEAABYRRgBAABWEUYAAIBVhBEAAGAVYQQAAFhFGAEAAFb9P4h3gyYUwy6PAAAAAElFTkSuQmCC\n" - }, - "metadata": {} - } - ], - "source": [ - "plt.bar(range(100), [words[w] for w in sorted_words[:100]])\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "o9IYA0cZfjD7" - }, - "source": [ - "It is very common to find this kind of distribution when analyzing corpus of text. This is referred to as the [zipf's law](https://en.wikipedia.org/wiki/Zipf%27s_law)." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "5FQIOqoRfjD7" - }, - "source": [ - "Usually the number of words in the dictionary will be very large.\n", - "\n", - "Here are some thing we can do to reduce that number:\n", - "\n", - "* Remove puntuation.\n", - "* Remove stop-words.\n", - "* Steaming.\n", - "* Remove very uncommon words (the words that appears in fewer than N occations).\n", - "* Nothing: we can use a pretrain model that handles this kind of situations.\n", - "\n", - "\n", - "We used one of the simplest tokenizers availables. This tokenizer does not take into account many quirks of the language. Moreover, diferent languages have different quirks, so there is no \"universal\" tokenizers. There are many libraries that have \"better\" tokenizers:\n", - "\n", - "* [Spacy](https://spacy.io/): it can be accessed using: `get_tokenizer(\"spacy\")`. Spacy supports a wide range of languages.\n", - "* [Huggingface](https://huggingface.co/): it has many tokenizers for different laguages. [Doc](https://huggingface.co/transformers/main_classes/tokenizer.html)\n", - "* [NLTK](https://www.nltk.org/): it provides several tokenizers. One of them can be accessed using: `get_tokenizer(\"toktok\")`\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "_ul5MgYcfjD7" - }, - "source": [ - "---\n", - "# Step 4: choose toolkit\n", - "\n", - "Our goal is to train a model capable of estimating the sentiment of a tweet (positive or negative) by reading its content. To that end we will try 2 different approaches:\n", - "\n", - "* A logistic regression using sklearn. **NOTE**: it can probaly work better than an SVM model.\n", - "* A simple Embedding + RNN." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "GteI1PxTfjD7" - }, - "source": [ - "## Logistic regression\n", - "\n", - "We will represent our senteces using binary vectorization. This means that our data would be represented as a matrix of instances by word with a one if the word is in the instance, and zero otherwise. Sklean vectorizers can also do things such as stop-word removal and puntuation removal, you can read more about in [the documentation](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "id": "S_ei2qu8fjD7" - }, - "outputs": [], - "source": [ - "vectorizer = CountVectorizer(binary=True)\n", - "x_train_cv = vectorizer.fit_transform(x_train_text)\n", - "x_test_cv = vectorizer.transform(x_test_text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "iK_zfqnLfjD7", - "outputId": "9b3f6db3-01bf-4246-b943-359620c717a2" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Before Vectorize: doesn't know how to spell conked \n" - ] - } - ], - "source": [ - "print('Before Vectorize: ', x_train_text[3])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "wKxY8e38fjD8", - "outputId": "19530135-070d-4259-d6a9-7ba06b519763" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "After Vectorize: \n", - " (0, 528584)\t1\n", - " (0, 165468)\t1\n", - " (0, 300381)\t1\n", - " (0, 242211)\t1\n", - " (0, 489893)\t1\n", - " (0, 134160)\t1\n" - ] - } - ], - "source": [ - "# Notice that the matriz is sparse\n", - "print('After Vectorize: ')\n", - "print(x_train_cv[3])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "QTPPEMd9fjD8" - }, - "source": [ - "Now we can train our model. You can check the documentation of this logistic regressor [here](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic#sklearn.linear_model.LogisticRegression)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/", - "height": 74 - }, - "id": "2vEPOQS6fjD8", - "outputId": "3be77fc0-76e6-40b8-8847-5f6e7c6c0ce0" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "LogisticRegression(solver='saga')" - ], - "text/html": [ - "
LogisticRegression(solver='saga')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" - ] - }, - "metadata": {}, - "execution_count": 14 - } - ], - "source": [ - "model = LogisticRegression(solver='saga')\n", - "model.fit(x_train_cv, y_train)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "37bUbqB6fjD8", - "outputId": "7eb9178d-6130-47d0-bdf4-ce4be164bc97" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - " precision recall f1-score support\n", - "\n", - " 0 0.81 0.79 0.80 160000\n", - " 1 0.79 0.81 0.80 160000\n", - "\n", - " accuracy 0.80 320000\n", - " macro avg 0.80 0.80 0.80 320000\n", - "weighted avg 0.80 0.80 0.80 320000\n", - "\n" - ] - } - ], - "source": [ - "y_pred = model.predict(x_test_cv)\n", - "\n", - "print(classification_report(y_test, y_pred))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "161kDLhofjD8" - }, - "source": [ - "## Explainable AI\n", - "The best thing about logistic regresion is that it is simple, and we can get some explanations." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "EILTmxzifjD9", - "outputId": "b7ce6853-7385-4a24-d4eb-e6d0843ca5d5" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "(1, 589260)\n", - "589260\n" - ] - } - ], - "source": [ - "print(model.coef_.shape)\n", - "print(len(vectorizer.vocabulary_))\n", - "\n", - "words_sk = list(vectorizer.vocabulary_.keys())\n", - "words_sk.sort(key=lambda w: model.coef_[0, vectorizer.vocabulary_[w]])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "NGjVPON6fjD9", - "outputId": "d40443bc-476d-4f5a-ce90-4b5b17e47933" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "roni: -3.8625952420933984\n", - "inaperfectworld: -3.5734321547933936\n", - "dontyouhate: -3.5002133484207576\n", - "xbllygbsn: -3.4126303898325787\n", - "anqju: -3.3363997631497493\n", - "sad: -3.200516823534637\n", - "pakcricket: -3.1949062976331675\n", - "condolences: -3.132503698316079\n", - "heartbreaking: -3.0665219866881297\n", - "saddest: -3.042020604188048\n", - "sadd: -3.029036146667248\n", - "heartbroken: -3.0287524416643463\n", - "boohoo: -3.0226033087262802\n", - "sadface: -2.991829110065316\n", - "rachelle_lefevr: -2.925076661509848\n", - "disappointing: -2.902522686643491\n", - "lvbu: -2.8947109582208865\n", - "saddens: -2.8855187276040715\n", - "bummed: -2.836500453805889\n", - "neda: -2.792917726280752\n" - ] - } - ], - "source": [ - "for w in words_sk[:20]:\n", - " print('{}: {}'.format(w, model.coef_[0, vectorizer.vocabulary_[w]]))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "oxQ_jlNRfjD9", - "outputId": "363de58b-817a-4205-f019-2379d0d64e0d" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "iamsoannoyed: 2.8493838469077013\n", - "myfax: 2.7974330510971424\n", - "jennamadison: 2.5667217237933104\n", - "yeyy: 2.4780234846131646\n", - "tryout: 2.438315611477797\n", - "goldymom: 2.4374072779309204\n", - "wooohooo: 2.402957513257194\n", - "thesupergirl: 2.356525094856456\n", - "iammaxathotspot: 2.3116551216589682\n", - "londicreations: 2.3074264075299316\n", - "smilin: 2.2991796213822497\n", - "worries: 2.2899555142510084\n", - "sinfulsignorita: 2.27989578448778\n", - "finchensnail: 2.2642827277181063\n", - "smackthis: 2.237672991997692\n", - "kv: 2.2157591386122775\n", - "tojosan: 2.2117938132889696\n", - "russmarshalek: 2.20953890861265\n", - "traciknoppe: 2.1768232307222153\n", - "congratulations: 2.1715901103136876\n" - ] - } - ], - "source": [ - "for w in reversed(words_sk[-20:]):\n", - " print('{}: {}'.format(w, model.coef_[0, vectorizer.vocabulary_[w]]))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "9KSSAC3qfjD9" - }, - "source": [ - "What does this mean?\n", - "\n", - "Remember the `model.coef_` is the $W$ in:\n", - "\n", - "$$h(x)=\\sigma(WX + b)$$\n", - "\n", - "where the label 1 is a positive tweet and the label 0 is a negative tweet." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "oDHjTP2_fjD9" - }, - "source": [ - "## Recurrent Neural Network with Pytorch" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "TbgpKy95fjD9" - }, - "source": [ - "In the previous section we use a Bag-Of-Words approach to represent each of the tweets. That meas that we only consider how many times each of the words appear in each of the tweets, we didnt take into account the order of the words. But we know that the word order is very important and carries relevant information.\n", - "\n", - "In this section we will solve the same task, but this time we will implement a Recurrent Neural Network (RNN) instead of using a simple Logistic Regression.Unlike feedforward neural networks, RNNs have cyclic connections making them powerful for modeling sequences.\n", - "\n", - "Let's start by importing the relevant libraries.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "id": "7nmUJV99fjEB" - }, - "outputs": [], - "source": [ - "def set_device():\n", - " device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", - " if device != \"cuda\":\n", - " print(\"WARNING: For this notebook to perform best, \"\n", - " \"if possible, in the menu under `Runtime` -> \"\n", - " \"`Change runtime type.` select `GPU` \")\n", - " else:\n", - " print(\"GPU is enabled in this notebook.\")\n", - "\n", - " return device" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "chI-18LcfjEB", - "outputId": "7f633079-6548-48f3-802e-94bc9cfada93" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "GPU is enabled in this notebook.\n" - ] - } - ], - "source": [ - "# Set the device (check if gpu is available)\n", - "device = set_device()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "01UtIN7ofjEC" - }, - "source": [ - "First we will create a Dictionary (`word_to_idx`). This dictionary will map each Token (usually words) to an index (an integer number). We want to limit our dictionary to a certain number of tokens (`num_words_dict`), so we will include in our ditionary those with more occurrences." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "afus9SyUfjEC", - "outputId": "bb4eb869-e2f0-4ccd-f64c-e55908272345" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "['.', 'i', '!', \"'\", 'to', 'the', ',', 'a', 'my', 'it']" - ] - }, - "metadata": {}, - "execution_count": 21 - } - ], - "source": [ - "# From previous section, we have a list with the most used tokens\n", - "sorted_words[:10]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "6vfQFjaufjEC" - }, - "source": [ - "Let's select only the most used." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "id": "tGLkxaGcfjEC" - }, - "outputs": [], - "source": [ - "num_words_dict = 30000\n", - "# We reserve two numbers for special tokens.\n", - "most_used_words = sorted_words[:num_words_dict-2]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "AzhQvekCfjEC" - }, - "source": [ - "We will add two extra Tokens to the dictionary, one for words outside the dictionary (`'UNK'`) and one for padding the sequences (`'PAD'`)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "id": "73Wrb-lEfjEC" - }, - "outputs": [], - "source": [ - "# dictionary to go from words to idx\n", - "word_to_idx = {}\n", - "# dictionary to go from idx to words (just in case)\n", - "idx_to_word = {}\n", - "\n", - "\n", - "# We include the special tokens first\n", - "PAD_token = 0\n", - "UNK_token = 1\n", - "\n", - "word_to_idx['PAD'] = PAD_token\n", - "word_to_idx['UNK'] = UNK_token\n", - "\n", - "idx_to_word[PAD_token] = 'PAD'\n", - "idx_to_word[UNK_token] = 'UNK'\n", - "\n", - "# We popullate our dictionaries with the most used words\n", - "for num,word in enumerate(most_used_words):\n", - " word_to_idx[word] = num + 2\n", - " idx_to_word[num+2] = word" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "kMHVkEisfjEC" - }, - "source": [ - "Our goal now is to transform each tweet from a sequence of tokens to a sequence of indexes. These sequences of indexes will be the input to our pytorch model." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "id": "tkCIu3PKfjED" - }, - "outputs": [], - "source": [ - "# A function to convert list of tokens to list of indexes\n", - "def tokens_to_idx(sentences_tokens,word_to_idx):\n", - " sentences_idx = []\n", - " for sent in sentences_tokens:\n", - " sent_idx = []\n", - " for word in sent:\n", - " if word in word_to_idx:\n", - " sent_idx.append(word_to_idx[word])\n", - " else:\n", - " sent_idx.append(word_to_idx['UNK'])\n", - " sentences_idx.append(sent_idx)\n", - " return sentences_idx" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "id": "aHru4vpzfjED" - }, - "outputs": [], - "source": [ - "x_train_idx = tokens_to_idx(x_train_token,word_to_idx)\n", - "x_test_idx = tokens_to_idx(x_test_token,word_to_idx)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "Ofj3OD7zfjED", - "outputId": "b2788d03-dbfa-41d7-8231-5011206baa59" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Before converting: ['worst', 'headache', 'ever']\n", - "After converting: [721, 458, 237]\n" - ] - } - ], - "source": [ - "some_number = 1\n", - "print('Before converting: ', x_train_token[some_number])\n", - "print('After converting: ', x_train_idx[some_number])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "NcCicvb-fjED" - }, - "source": [ - "We need all the sequences to have the same length. To select an adequate sequence length, let's explore some statistics about the length of the tweets:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "BSjhdyYUfjED", - "outputId": "82e49be9-7868-44ac-b496-c7a48da1efee" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Max tweet word length: 229\n", - "Mean tweet word length: 15.0\n", - "99% percent under: 37.0\n" - ] - } - ], - "source": [ - "tweet_lens = np.asarray([len(sentence) for sentence in x_train_idx])\n", - "print('Max tweet word length: ',tweet_lens.max())\n", - "print('Mean tweet word length: ',np.median(tweet_lens))\n", - "print('99% percent under: ',np.quantile(tweet_lens,0.99))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "t311WY6ZfjEE" - }, - "source": [ - "We cut the sequences which are larger than our chosen maximum length (`max_lenght`) and fill with zeros the ones that are shorter." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "id": "r4S8KTWLfjEE" - }, - "outputs": [], - "source": [ - " # We choose the max length\n", - " max_length = 40\n", - "\n", - "# A function to make all the sequence have the same lenght\n", - "# Note that the output is a Numpy matrix\n", - " def padding(sentences, seq_len):\n", - " features = np.zeros((len(sentences), seq_len),dtype=int)\n", - " for ii, tweet in enumerate(sentences):\n", - " len_tweet = len(tweet)\n", - " if len_tweet != 0:\n", - " if len_tweet <= seq_len:\n", - " # If its shorter, we fill with zeros (the padding Token index)\n", - " features[ii, -len(tweet):] = np.array(tweet)[:seq_len]\n", - " if len_tweet > seq_len:\n", - " # If its larger, we take the last 'seq_len' indexes\n", - " features[ii, :] = np.array(tweet)[-seq_len:]\n", - " return features" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "id": "Z-Cw-bBxfjEE" - }, - "outputs": [], - "source": [ - "# We convert our list of tokens into a numpy matrix\n", - "# where all instances have the same lenght\n", - "x_train_pad = padding(x_train_idx,max_length)\n", - "x_test_pad = padding(x_test_idx,max_length)\n", - "\n", - "# We convert our target list a numpy matrix\n", - "y_train_np = np.asarray(y_train)\n", - "y_test_np = np.asarray(y_test)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "8eC3YswlfjEE", - "outputId": "3bb0ea7f-518f-4545-9241-feb783f48122" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Before padding: [1, 3, 71, 24, 122, 3, 533, 74, 13, 4, 3, 102, 13, 209, 2, 12, 150, 4, 22, 5, 18, 667, 3, 138, 61, 7, 3296, 4]\n", - "After padding: [ 0 0 0 0 0 0 0 0 0 0 0 0 1 3\n", - " 71 24 122 3 533 74 13 4 3 102 13 209 2 12\n", - " 150 4 22 5 18 667 3 138 61 7 3296 4]\n" - ] - } - ], - "source": [ - "some_number = 2\n", - "print('Before padding: ', x_train_idx[some_number])\n", - "print('After padding: ', x_train_pad[some_number])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "SzDhnauUfjEE" - }, - "source": [ - "Now, let's convert the data to pytorch format.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "id": "--Yd22YWfjEF" - }, - "outputs": [], - "source": [ - "# create Tensor datasets\n", - "train_data = TensorDataset(torch.from_numpy(x_train_pad), torch.from_numpy(y_train_np))\n", - "valid_data = TensorDataset(torch.from_numpy(x_test_pad), torch.from_numpy(y_test_np))\n", - "\n", - "# Batch size (this is an important hyperparameter)\n", - "batch_size = 100\n", - "\n", - "# dataloaders\n", - "# make sure to SHUFFLE your data\n", - "train_loader = DataLoader(train_data, shuffle=True, batch_size=batch_size,drop_last = True)\n", - "valid_loader = DataLoader(valid_data, shuffle=True, batch_size=batch_size,drop_last = True)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "jQ5qPOWTfjEF" - }, - "source": [ - "Each batch of data in our traning proccess will have the folllowing format:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "S1mqhk1hfjEF", - "outputId": "c97e7edd-695f-4336-a2e6-f6bed4852a63" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Sample input size: torch.Size([100, 40])\n", - "Sample input: \n", - " tensor([[ 0, 0, 0, ..., 32, 203, 86],\n", - " [ 0, 0, 0, ..., 1, 1, 4661],\n", - " [ 0, 0, 0, ..., 169, 43, 34],\n", - " ...,\n", - " [ 0, 0, 0, ..., 2, 2961, 4076],\n", - " [ 0, 0, 0, ..., 2319, 1325, 2],\n", - " [ 0, 0, 0, ..., 7, 253, 1]])\n", - "Sample input: \n", - " tensor([0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1,\n", - " 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0,\n", - " 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,\n", - " 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1,\n", - " 0, 1, 0, 1])\n" - ] - } - ], - "source": [ - "# Obtain one batch of training data\n", - "dataiter = iter(train_loader)\n", - "sample_x, sample_y = dataiter.__next__()\n", - "\n", - "print('Sample input size: ', sample_x.size()) # batch_size, seq_length\n", - "print('Sample input: \\n', sample_x)\n", - "print('Sample input: \\n', sample_y)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "jn0PzZdGfjEF" - }, - "source": [ - "Now, we will define the `SentimentRNN` class. Most of the model's class will be familiar to you, but there are two important layers we would like you to pay attention to:\n", - "\n", - "* Embedding Layer\n", - "> This layer is like a linear layer, but it makes it posible to use a sequence of inedexes as inputs (instead of a sequence of one-hot-encoded vectors). During training, the Embedding layer learns a linear transformation from the space of words (a vector space of dimension `num_words_dict`) into the a new, smaller, vector space of dimension `embedding_dim`. We suggest you to read this [thread](https://discuss.pytorch.org/t/how-does-nn-embedding-work/88518/3) and the [pytorch documentation](https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html) if you want to learn more about this particular kind of layers.\n", - "\n", - "\n", - "* LSTM layer\n", - "> This is one of the most used class of Recurrent Neural Networks. In Pytorch we can add several stacked layers in just one line of code. In our case, the number of layers added are decided with the parameter `no_layers`. If you want to learn more about LSTMs we strongly recommend you this [Colahs thread](https://colah.github.io/posts/2015-08-Understanding-LSTMs/) about them.\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "id": "vfzcowAxfjEF" - }, - "outputs": [], - "source": [ - "class SentimentRNN(nn.Module):\n", - " def __init__(self,no_layers,vocab_size,hidden_dim,embedding_dim,drop_prob=0.1):\n", - " super(SentimentRNN,self).__init__()\n", - "\n", - " self.output_dim = output_dim\n", - " self.hidden_dim = hidden_dim\n", - " self.no_layers = no_layers\n", - " self.vocab_size = vocab_size\n", - " self.drop_prob = drop_prob\n", - "\n", - " # Embedding Layer\n", - " self.embedding = nn.Embedding(vocab_size, embedding_dim)\n", - "\n", - " # LSTM Layers\n", - " self.lstm = nn.LSTM(input_size=embedding_dim,hidden_size=self.hidden_dim,\n", - " num_layers=no_layers, batch_first=True,\n", - " dropout=self.drop_prob)\n", - "\n", - " # Dropout layer\n", - " self.dropout = nn.Dropout(drop_prob)\n", - "\n", - " # Linear and Sigmoid layer\n", - " self.fc = nn.Linear(self.hidden_dim, output_dim)\n", - " self.sig = nn.Sigmoid()\n", - "\n", - " def forward(self,x,hidden):\n", - " batch_size = x.size(0)\n", - "\n", - " # Embedding out\n", - " embeds = self.embedding(x)\n", - " #Shape: [batch_size x max_length x embedding_dim]\n", - "\n", - " # LSTM out\n", - " lstm_out, hidden = self.lstm(embeds, hidden)\n", - " # Shape: [batch_size x max_length x hidden_dim]\n", - "\n", - " # Select the activation of the last Hidden Layer\n", - " lstm_out = lstm_out[:,-1,:].contiguous()\n", - " # Shape: [batch_size x hidden_dim]\n", - "\n", - " ## You can instead average the activations across all the times\n", - " # lstm_out = torch.mean(lstm_out, 1).contiguous()\n", - "\n", - " # Dropout and Fully connected layer\n", - " out = self.dropout(lstm_out)\n", - " out = self.fc(out)\n", - "\n", - " # Sigmoid function\n", - " sig_out = self.sig(out)\n", - "\n", - " # return last sigmoid output and hidden state\n", - " return sig_out, hidden\n", - "\n", - " def init_hidden(self, batch_size):\n", - " ''' Initializes hidden state '''\n", - " # Create two new tensors with sizes n_layers x batch_size x hidden_dim,\n", - " # initialized to zero, for hidden state and cell state of LSTM\n", - " h0 = torch.zeros((self.no_layers,batch_size,self.hidden_dim)).to(device)\n", - " c0 = torch.zeros((self.no_layers,batch_size,self.hidden_dim)).to(device)\n", - " hidden = (h0,c0)\n", - " return hidden" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "YfrLPa9mfjEF" - }, - "source": [ - "We choose the parameters of the model." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "id": "rOm-xoFkfjEG" - }, - "outputs": [], - "source": [ - "# Parameters of our network\n", - "\n", - "# Size of our vocabulary\n", - "vocab_size = num_words_dict\n", - "\n", - "# Embedding dimension\n", - "embedding_dim = 32\n", - "\n", - "# Number of stacked LSTM layers\n", - "no_layers = 2\n", - "\n", - "# Dimension of the hidden layer in LSTMs\n", - "hidden_dim = 64\n", - "\n", - "# Dropout parameter for regularization\n", - "output_dim = 1\n", - "\n", - "# Dropout parameter for regularization\n", - "drop_prob = 0.25" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "xapxpe7ufjEG", - "outputId": "51c90159-7d2b-4fc4-f34a-98e9901d40e4" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "SentimentRNN(\n", - " (embedding): Embedding(30000, 32)\n", - " (lstm): LSTM(32, 64, num_layers=2, batch_first=True, dropout=0.25)\n", - " (dropout): Dropout(p=0.25, inplace=False)\n", - " (fc): Linear(in_features=64, out_features=1, bias=True)\n", - " (sig): Sigmoid()\n", - ")\n" - ] - } - ], - "source": [ - "# Let's define our model\n", - "model = SentimentRNN(no_layers, vocab_size, hidden_dim,\n", - " embedding_dim, drop_prob=drop_prob)\n", - "# Moving to gpu\n", - "model.to(device)\n", - "print(model)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "GEvTs3uwfjEG", - "outputId": "2e15f6df-2aa8-4665-b2da-7363d2bfa09e" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Total Number of parameters: 1018433\n" - ] - } - ], - "source": [ - "# How many trainable parameters does our model have?\n", - "model_parameters = filter(lambda p: p.requires_grad, model.parameters())\n", - "params = sum([np.prod(p.size()) for p in model_parameters])\n", - "print('Total Number of parameters: ',params)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "Pc2OC5GDfjEG" - }, - "source": [ - "We choose the losses and the optimizer for the training procces." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "id": "iBWjPADUfjEG" - }, - "outputs": [], - "source": [ - "# loss and optimization functions\n", - "lr = 0.001\n", - "\n", - "# Binary crossentropy is a good loss function for a binary classification problem\n", - "criterion = nn.BCELoss()\n", - "\n", - "# We choose an Adam optimizer\n", - "optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n", - "\n", - "# function to predict accuracy\n", - "def acc(pred,label):\n", - " pred = torch.round(pred.squeeze())\n", - " return torch.sum(pred == label.squeeze()).item()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "OZgMwOe2fjEG" - }, - "source": [ - "We are ready to train our model." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "3B6YhEocfjEH", - "outputId": "76276a1f-7775-4b98-aab0-0e199aa133e4" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Epoch 1\n", - "train_loss : 0.4366412344621494 val_loss : 0.3881208170717582\n", - "train_accuracy : 79.485546875 val_accuracy : 82.475\n", - "Validation loss decreased (inf --> 0.388121). Saving model ...\n", - "==================================================\n", - "Epoch 2\n", - "train_loss : 0.3760281792609021 val_loss : 0.3713956154882908\n", - "train_accuracy : 83.186328125 val_accuracy : 83.4575\n", - "Validation loss decreased (0.388121 --> 0.371396). Saving model ...\n", - "==================================================\n", - "Epoch 3\n", - "train_loss : 0.3574051411205437 val_loss : 0.36425656544510276\n", - "train_accuracy : 84.19953125 val_accuracy : 83.80375\n", - "Validation loss decreased (0.371396 --> 0.364257). Saving model ...\n", - "==================================================\n", - "Epoch 4\n", - "train_loss : 0.344456663565943 val_loss : 0.3613302929420024\n", - "train_accuracy : 84.89265625 val_accuracy : 84.00874999999999\n", - "Validation loss decreased (0.364257 --> 0.361330). Saving model ...\n", - "==================================================\n", - "Epoch 5\n", - "train_loss : 0.33407817618339325 val_loss : 0.3601334386831149\n", - "train_accuracy : 85.444921875 val_accuracy : 84.03625\n", - "Validation loss decreased (0.361330 --> 0.360133). Saving model ...\n", - "==================================================\n" - ] - } - ], - "source": [ - "# Number of training Epochs\n", - "epochs = 5\n", - "\n", - "# Maximum absolute value accepted for the gradeint\n", - "clip = 5\n", - "\n", - "# Initial Loss value (assumed big)\n", - "valid_loss_min = np.Inf\n", - "\n", - "# Lists to follow the evolution of the loss and accuracy\n", - "epoch_tr_loss,epoch_vl_loss = [],[]\n", - "epoch_tr_acc,epoch_vl_acc = [],[]\n", - "\n", - "# Train for a number of Epochs\n", - "for epoch in range(epochs):\n", - " train_losses = []\n", - " train_acc = 0.0\n", - " model.train()\n", - "\n", - " for inputs, labels in train_loader:\n", - "\n", - " # Initialize hidden state\n", - " h = model.init_hidden(batch_size)\n", - " # Creating new variables for the hidden state\n", - " h = tuple([each.data.to(device) for each in h])\n", - "\n", - " # Move batch inputs and labels to gpu\n", - " inputs, labels = inputs.to(device), labels.to(device)\n", - "\n", - " # Set gradient to zero\n", - " model.zero_grad()\n", - "\n", - " # Compute model output\n", - " output,h = model(inputs,h)\n", - "\n", - " # Calculate the loss and perform backprop\n", - " loss = criterion(output.squeeze(), labels.float())\n", - " loss.backward()\n", - " train_losses.append(loss.item())\n", - "\n", - " # calculating accuracy\n", - " accuracy = acc(output,labels)\n", - " train_acc += accuracy\n", - "\n", - " #`clip_grad_norm` helps prevent the exploding gradient problem in RNNs / LSTMs.\n", - " nn.utils.clip_grad_norm_(model.parameters(), clip)\n", - " optimizer.step()\n", - "\n", - "\n", - " # Evaluate on the validation set for this epoch\n", - " val_losses = []\n", - " val_acc = 0.0\n", - " model.eval()\n", - " for inputs, labels in valid_loader:\n", - "\n", - " # Initialize hidden state\n", - " val_h = model.init_hidden(batch_size)\n", - " val_h = tuple([each.data.to(device) for each in val_h])\n", - "\n", - " # Move batch inputs and labels to gpu\n", - " inputs, labels = inputs.to(device), labels.to(device)\n", - "\n", - " # Compute model output\n", - " output, val_h = model(inputs, val_h)\n", - "\n", - " # Compute Loss\n", - " val_loss = criterion(output.squeeze(), labels.float())\n", - "\n", - " val_losses.append(val_loss.item())\n", - "\n", - " accuracy = acc(output,labels)\n", - " val_acc += accuracy\n", - "\n", - " epoch_train_loss = np.mean(train_losses)\n", - " epoch_val_loss = np.mean(val_losses)\n", - " epoch_train_acc = train_acc/len(train_loader.dataset)\n", - " epoch_val_acc = val_acc/len(valid_loader.dataset)\n", - " epoch_tr_loss.append(epoch_train_loss)\n", - " epoch_vl_loss.append(epoch_val_loss)\n", - " epoch_tr_acc.append(epoch_train_acc)\n", - " epoch_vl_acc.append(epoch_val_acc)\n", - " print(f'Epoch {epoch+1}')\n", - " print(f'train_loss : {epoch_train_loss} val_loss : {epoch_val_loss}')\n", - " print(f'train_accuracy : {epoch_train_acc*100} val_accuracy : {epoch_val_acc*100}')\n", - " if epoch_val_loss <= valid_loss_min:\n", - " print('Validation loss decreased ({:.6f} --> {:.6f}). Saving model ...'.format(valid_loss_min,epoch_val_loss))\n", - " # torch.save(model.state_dict(), '../working/state_dict.pt')\n", - " valid_loss_min = epoch_val_loss\n", - " print(25*'==')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": {}, - "colab": { - "base_uri": "https://localhost:8080/", - "height": 364 - }, - "id": "ttJazP-nfjEH", - "outputId": "992bed02-611e-4614-c60f-77223d5b801a" - }, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAABkoAAAIQCAYAAADO7zKKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADxbklEQVR4nOzdd3xUVfrH8c/MpJNGKgECCZ1QlRKkWQhVIyAqooKg2HFV1sYKIipi2WWxrfhTEAsuVhQXBAII0psivSeEmkKAhASSycz8/ggMxIQSJuGmfN+vFy+Yc8+997kPE5h7nznnmBwOhwMREREREREREREREZEqyGx0ACIiIiIiIiIiIiIiIkZRoURERERERERERERERKosFUpERERERERERERERKTKUqFERERERERERERERESqLBVKRERERERERERERESkylKhREREREREREREREREqiwVSkREREREREREREREpMpSoURERERERERERERERKosFUpERERERERERERERKTKUqFERERERERERERERESqLBVKREQqsP/85z+YTCZiY2ONDkVERERERKTSmjZtGiaTiXXr1hkdioiIlAEVSkREKrDp06cTFRXFmjVr2L17t9HhiIiIiIiIiIiIVDgqlIiIVFCJiYmsWLGCiRMnEhoayvTp040OqVjZ2dlGhyAiIiIiIiIiInJBKpSIiFRQ06dPp3r16tx8883cfvvtxRZKjh8/ztNPP01UVBSenp7Url2bIUOGkJ6e7uxz+vRpXn75ZRo1aoSXlxcRERHcdttt7NmzB4DFixdjMplYvHhxoWMnJSVhMpmYNm2as23o0KH4+vqyZ88e+vTpg5+fH/fccw8AS5cu5Y477qBOnTp4enoSGRnJ008/zalTp4rEvX37du68805CQ0Px9vamcePGvPjiiwD8+uuvmEwmZs6cWWS/r776CpPJxMqVK0ucTxEREREREVf88ccf9O7dG39/f3x9fenWrRurVq0q1MdqtTJu3DgaNmyIl5cXwcHBdO7cmYSEBGefI0eOMGzYMGrXro2npycRERH07duXpKSkq3xFIiJVh5vRAYiIyJWZPn06t912Gx4eHgwaNIgPP/yQtWvX0q5dOwBOnjxJly5d2LZtG/fffz/XXnst6enpzJo1iwMHDhASEoLNZuOWW25h4cKF3HXXXTz55JNkZWWRkJDA5s2bqV+/fonjys/Pp2fPnnTu3Jl//vOf+Pj4APDtt9+Sk5PDo48+SnBwMGvWrOG9997jwIEDfPvtt879N27cSJcuXXB3d+ehhx4iKiqKPXv28PPPPzN+/HhuuOEGIiMjmT59Ov379y+Sk/r163Pddde5kFkREREREZGS2bJlC126dMHf35/nnnsOd3d3PvroI2644QaWLFniXFfy5ZdfZsKECQwfPpz27duTmZnJunXr+P333+nevTsAAwYMYMuWLTzxxBNERUWRmppKQkICycnJREVFGXiVIiKVlwolIiIV0Pr169m+fTvvvfceAJ07d6Z27dpMnz7dWSh5++232bx5Mz/88EOhgsLo0aNxOBwAfP755yxcuJCJEyfy9NNPO/u88MILzj4llZubyx133MGECRMKtb/55pt4e3s7Xz/00EM0aNCAf/zjHyQnJ1OnTh0AnnjiCRwOB7///ruzDeCNN94AwGQyce+99zJx4kROnDhBQEAAAGlpacyfP9858kRERERERORqGT16NFarlWXLllGvXj0AhgwZQuPGjXnuuedYsmQJALNnz6ZPnz783//9X7HHOX78OCtWrODtt9/mmWeecbaPGjWq7C9CRKQK09RbIiIV0PTp0wkPD+fGG28ECooHAwcOZMaMGdhsNgC+//57WrVqVWTUxdn+Z/uEhITwxBNPXLDPlXj00UeLtJ1fJMnOziY9PZ2OHTvicDj4448/gIJix2+//cb9999fqEjy13iGDBlCbm4u3333nbPt66+/Jj8/n3vvvfeK4xYRERERESkpm83G/Pnz6devn7NIAhAREcHdd9/NsmXLyMzMBCAwMJAtW7awa9euYo/l7e2Nh4cHixcv5tixY1clfhERUaFERKTCsdlszJgxgxtvvJHExER2797N7t27iY2NJSUlhYULFwKwZ88emjdvftFj7dmzh8aNG+PmVnoDDN3c3Khdu3aR9uTkZIYOHUpQUBC+vr6EhoZy/fXXA3DixAkA9u7dC3DJuJs0aUK7du0Krcsyffp0OnToQIMGDUrrUkRERERERC4pLS2NnJwcGjduXGRb06ZNsdvt7N+/H4BXXnmF48eP06hRI1q0aMGzzz7Lxo0bnf09PT158803+eWXXwgPD6dr16689dZbHDly5Kpdj4hIVaRCiYhIBbNo0SIOHz7MjBkzaNiwofPX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WJnE0E7RRoclIiIiZaUsntNerhI8px04cCCfffYZo0ePrjLPaX/99VciIiJK9Jz2fO+88w7/+te/+PDDD2nYsCHffvstt956K1u2bKFhw4a8++67zJo1i2+++YY6deqwf/9+9u/fDxTMHvTvf/+bGTNm0KxZM44cOcKff/55Wee9UlWzUGLNgddrluohzUDg5XT8xyHwuLy55+6//37efvttlixZwg033AAUDOcaMGAAAQEBBAQE8Mwzzzj7P/HEE8ybN49vvvnmsn4AFyxYwPbt25k3bx41axbk4/XXX6d3796F+o0ePdr556ioKJ555hlmzJjBc889h7e3N76+vri5uV10CNdXX33F6dOn+fzzz51z773//vvEx8fz5ptvOoeaVa9enffffx+LxUKTJk24+eabWbhw4UV/AKdOnUrv3r2d8+z17NmTTz/9lJdffhmADz74gICAAGbMmIG7e8HDnEaNGjn3f+211/j73//Ok08+6Wxr167dJfMnIiJSkeXb7Gw+mMmvh0z8PP0P1iUf53hO4W8HebiZaR0Z6CyMXFunOtU8q+bHRxG5emoGevN8r8aM+WkLb83bQVxMOLWr+xgdloiIiJSFMnhOe9lK8Jz23nvv5b333qsSz2nDw8OBK3tOe75//vOfPP/889x1111kZmbyxhtvsHjxYiZNmsQHH3xAcnIyDRs2pHPnzphMJueX3gGSk5OpUaMGcXFxuLu7U6dOncvKoyt0p1uONWnShI4dOzJ16lRuuOEGdu/ezdKlS3nllVcAsNlsvP7663zzzTccPHiQvLw8cnNz8fG5vJuIbdu2ERkZ6fzhA7juuuuK9Pv6669599132bNnDydPniQ/Px9/f/8SXcu2bdto1apVoQWKOnXqhN1uZ8eOHc5CSUxMDBaLxdknIiKCTZs2XfC4NpuNzz77jHfeecfZdu+99/LMM8/w0ksvYTab2bBhA126dHEWSc6XmprKoUOH6NatW4muR0REpKLJy7ez6eBxVp1ZX2T9vmOczM0HLEAaAD4eFtrUrU77qILCSKvIQLzcLRc9rohIWbgnti6z/jzE2qRj/GPmZj4b1s757U0RERGRq61Ro0ZV5jnt2UJJs2bNSvSc9nyZmZkcOnSITp06FWrv1KmTc2TI0KFD6d69O40bN6ZXr17ccsst9OjRA4A77riDSZMmUa9ePXr1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0W/068C/txymvNJG1+ZVjOrqb3Q5IiIiIiIiIiIiIiLXlZPFTI+Q5vQIac6U4eGcKavku8O51TNO9p3IJzGzEL+A+r8Ul4KSOjBzXARtfdzgRHyDXH9NRERERERERERERMQRbs4WhnZsydCOLQHILSpj48FM0vbvMriyK2sYC4TVcxaziftvaoOfq9GViIiIiIiIiIiIiIgYz8fDmdsiAwlpZnQlV6agREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mQpKBERERERERERERERkSZLQYmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlAiIiIiIiIiIiIiIiJNloISERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mQpKBERERERERERERERkSZLQYmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlAiIiIiIiIiIiIiIiJNloISERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwnowuoKzabDYD8/HxDXr+8vJzi4mLy8/OxWq2G1NCQqX+OUf8co/45Rv1zjPrnGPXPMeqfY4zu37mfe8/9HCxyJRozNWzqn2PUP8eof45R/xyj/jlG/XOceugYo/t3teOmRhOUFBQUABASEmJwJSIiIiIiN05BQQHe3t5GlyENgMZMIiIiItJUXWncZLI1kj9Bq6qq4sSJE3h6emIymW746+fn5xMSEsLRo0fx8vK64a/f0Kl/jlH/HKP+OUb9c4z65xj1zzHqn2OM7p/NZqOgoIBWrVphNmtFXbkyjZkaNvXPMeqfY9Q/x6h/jlH/HKP+OU49dIzR/bvacVOjmVFiNptp3bq10WXg5eWl/2AcoP45Rv1zjPrnGPXPMeqfY9Q/x6h/jjGyf5pJIrWhMVPjoP45Rv1zjPrnGPXPMeqfY9Q/x6mHjqnv4yb96ZmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlBSR1xcXJg5cyYuLi5Gl9IgqX+OUf8co/45Rv1zjPrnGPXPMeqfY9Q/kdrRfzOOUf8co/45Rv1zjPrnGPXPMeqf49RDxzSU/jWazdxFRERERERERERERERqSzNKRERERERERERERESkyVJQIiIiIiIiIiIiIiIiTZaCEhERERERERERERERabIUlIiIiIiIiIiIiIiISJOloKQW5s+fT2hoKK6urvTv35/t27f/6PWffPIJnTt3xtXVlaioKJYvX36DKq2fatO/RYsWYTKZahyurq43sNr6Y/369YwbN45WrVphMplYunTpFR8TGxtLr169cHFxITw8nEWLFl33Ouur2vYvNjb2oveeyWQiIyPjxhRcz8yZM4e+ffvi6emJv78/EyZMIDEx8YqP0/c/u2vpn77/nbdgwQK6deuGl5cXXl5eDBgwgK+//vpHH6P33nm17Z/eez/uT3/6EyaTiSeeeOJHr9N7UJo6jZkcozHTtdO4yTEaN107jZkcozGT4zRucozGTXWnoY+ZFJRcpY8//piYmBhmzpzJrl276N69O6NHjyYrK+uS12/evJl7772XX/7yl+zevZsJEyYwYcIE4uPjb3Dl9UNt+wfg5eVFenp69XHkyJEbWHH9UVRURPfu3Zk/f/5VXZ+amsrYsWMZPnw4e/bs4YknnuChhx7im2++uc6V1k+17d85iYmJNd5//v7+16nC+m3dunVMmTKFrVu3smrVKsrLyxk1ahRFRUWXfYy+/513Lf0Dff87p3Xr1vzpT39i586d7Nixg5tvvpnx48ezb9++S16v915Nte0f6L13Od999x1vvvkm3bp1+9Hr9B6Upk5jJsdozOQYjZsco3HTtdOYyTEaMzlO4ybHaNxUNxrFmMkmV6Vfv362KVOmVH9eWVlpa9WqlW3OnDmXvP6nP/2pbezYsTXO9e/f3/arX/3qutZZX9W2f++++67N29v7BlXXcAC2JUuW/Og1v//9720RERE1zt1zzz220aNHX8fKGoar6d/atWttgO3UqVM3pKaGJisrywbY1q1bd9lr9P3v8q6mf/r+9+NatGhhe/vtty/5Nb33ruzH+qf33qUVFBTYOnToYFu1apVt2LBhtmnTpl32Wr0HpanTmMkxGjPVHY2bHKNxk2M0ZnKMxkx1Q+Mmx2jcVDuNZcykGSVXoaysjJ07dzJixIjqc2azmREjRrBly5ZLPmbLli01rgcYPXr0Za9vzK6lfwCFhYW0bduWkJCQKya5cp7ee3WjR48eBAUFMXLkSDZt2mR0OfVGXl4eAD4+Ppe9Ru/By7ua/oG+/11KZWUlH330EUVFRQwYMOCS1+i9d3lX0z/Qe+9SpkyZwtixYy96b12K3oPSlGnM5BiNmW48vf/qhsZNF9OYyTEaMzlG4ybHaNx0bRrLmElByVXIycmhsrKSgICAGucDAgIuu/5mRkZGra5vzK6lf506deKdd97h888/Z/HixVRVVTFw4ECOHTt2I0pu0C733svPz+fMmTMGVdVwBAUFsXDhQj799FM+/fRTQkJCiI6OZteuXUaXZriqqiqeeOIJBg0aRGRk5GWv0/e/S7va/un7X01xcXE0a9YMFxcXHn30UZYsWULXrl0vea3eexerTf/03rvYRx99xK5du5gzZ85VXa/3oDRlGjM5RmOmG0/jJsdo3HRpGjM5RmOma6dxk2M0brp2jWnM5GR0ASKXMmDAgBrJ7cCBA+nSpQtvvvkmL730koGVSWPXqVMnOnXqVP35wIEDSU5O5tVXX+X99983sDLjTZkyhfj4eDZu3Gh0KQ3S1fZP3/9q6tSpE3v27CEvL4///e9/TJo0iXXr1l32h1apqTb903uvpqNHjzJt2jRWrVqlzRlFpF7S920xksZNl6Yxk2M0Zrp2Gjc5RuOma9PYxkwKSq6Cn58fFouFzMzMGuczMzMJDAy85GMCAwNrdX1jdi39+yGr1UrPnj1JSkq6HiU2Kpd773l5eeHm5mZQVQ1bv379mvwPulOnTuWrr75i/fr1tG7d+kev1fe/i9Wmfz/U1L//OTs7Ex4eDkDv3r357rvveO2113jzzTcvulbvvYvVpn8/1NTfezt37iQrK4tevXpVn6usrGT9+vX84x//oLS0FIvFUuMxeg9KU6Yxk2M0ZrrxNG6qe0193KQxk2M0ZnKMxk2O0bjp2jS2MZOW3roKzs7O9O7dm9WrV1efq6qqYvXq1Zddr27AgAE1rgdYtWrVj65v11hdS/9+qLKykri4OIKCgq5XmY2G3nt1b8+ePU32vWez2Zg6dSpLlixhzZo1tGvX7oqP0XvwvGvp3w/p+19NVVVVlJaWXvJreu9d2Y/174ea+nvvlltuIS4ujj179lQfffr04ec//zl79uy56Ad+0HtQmjaNmRyjMdONp/df3Wuq4yaNmRyjMdP1oXGTYzRuujqNbsxk7F7yDcdHH31kc3FxsS1atMi2f/9+2yOPPGJr3ry5LSMjw2az2WwTJ060Pf3009XXb9q0yebk5GT761//aktISLDNnDnTZrVabXFxcUbdgqFq279Zs2bZvvnmG1tycrJt586dtp/97Gc2V1dX2759+4y6BcMUFBTYdu/ebdu9e7cNsM2dO9e2e/du25EjR2w2m8329NNP2yZOnFh9fUpKis3d3d321FNP2RISEmzz58+3WSwW24oVK4y6BUPVtn+vvvqqbenSpbZDhw7Z4uLibNOmTbOZzWbbt99+a9QtGOqxxx6zeXt722JjY23p6enVR3FxcfU1+v53edfSP33/O+/pp5+2rVu3zpaammrbu3ev7emnn7aZTCbbypUrbTab3ntXUtv+6b13ZcOGDbNNmzat+nO9B0Vq0pjJMRozOUbjJsdo3HTtNGZyjMZMjtO4yTEaN9WthjxmUlBSC6+//rqtTZs2NmdnZ1u/fv1sW7durf7asGHDbJMmTapx/X//+19bx44dbc7OzraIiAjbsmXLbnDF9Utt+vfEE09UXxsQEGAbM2aMbdeuXQZUbby1a9fagIuOc/2aNGmSbdiwYRc9pkePHjZnZ2db+/btbe++++4Nr7u+qG3/XnnlFVtYWJjN1dXV5uPjY4uOjratWbPGmOLrgUv1DqjxntL3v8u7lv7p+995Dz74oK1t27Y2Z2dnW8uWLW233HJL9Q+rNpvee1dS2/7pvXdlP/yhX+9BkYtpzOQYjZmuncZNjtG46dppzOQYjZkcp3GTYzRuqlsNecxkstlstrqfpyIiIiIiIiIiIiIiIlL/aY8SERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mQpKBERERERERERERERkSZLQYmIiIiIiIiIiIiIiDRZCkpERERERERERERERKTJUlAiIiIiIiIiIiIiIiJNloISERERERERERERERFpshSUiIiIiIiIiIiIiIhIk6WgREREREREREREREREmiwFJSIiIiIiIiIiIiIi0mT9P7WuLgMvviw8AAAAAElFTkSuQmCC\n" - }, - "metadata": {} - } + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "execution": {}, + "id": "view-in-github" + }, + "source": [ + "\"Open   \"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "# Twitter Sentiment Analysis\n", + "\n", + "**By Neuromatch Academy**\n", + "\n", + "__Content creators:__ Juan Manuel Rodriguez, Salomey Osei, Gonzalo Uribarri\n", + "\n", + "__Production editors:__ Amita Kapoor, Spiros Chavlis" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "---\n", + "# Welcome to the NLP project template\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "---\n", + "# Step 1: Questions and goals\n", + "\n", + "* Can we infer emotion from a tweet text?\n", + "* How words are distributed accross the dataset?\n", + "* Are words related to one kind of emotion?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "---\n", + "# Step 2: Literature review\n", + "\n", + "[Original Dataset Paper](https://cs.stanford.edu/people/alecmgo/papers/TwitterDistantSupervision09.pdf)\n", + "\n", + "[Papers with code](https://paperswithcode.com/dataset/imdb-movie-reviews)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "---\n", + "# Step 3: Load and explore the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "execution": {} + }, + "outputs": [], + "source": [ + "# @title Install dependencies\n", + "!pip install pandas --quiet\n", + "!pip install torchtext --quiet\n", + "!pip install datasets --quiet" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "# We import some libraries to load the dataset\n", + "import os\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from collections import Counter\n", + "from tqdm.notebook import tqdm\n", + "\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.optim as optim\n", + "import torch.nn.functional as F\n", + "from torch.utils.data import TensorDataset, DataLoader\n", + "\n", + "import torchtext\n", + "from torchtext.data import get_tokenizer\n", + "\n", + "from sklearn.utils import shuffle\n", + "from sklearn.metrics import classification_report\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.feature_extraction.text import CountVectorizer" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "You can find the dataset we are going to use in [this website](https://huggingface.co/datasets/stanfordnlp/sentiment140)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "from datasets import load_dataset\n", + "\n", + "dataset = load_dataset(\"stanfordnlp/sentiment140\", trust_remote_code= True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
polarityiddatequeryusertext
001467810369Mon Apr 06 22:19:45 PDT 2009NO_QUERY_TheSpecialOne_@switchfoot http://twitpic.com/2y1zl - Awww, t...
101467810672Mon Apr 06 22:19:49 PDT 2009NO_QUERYscotthamiltonis upset that he can't update his Facebook by ...
201467810917Mon Apr 06 22:19:53 PDT 2009NO_QUERYmattycus@Kenichan I dived many times for the ball. Man...
301467811184Mon Apr 06 22:19:57 PDT 2009NO_QUERYElleCTFmy whole body feels itchy and like its on fire
401467811193Mon Apr 06 22:19:57 PDT 2009NO_QUERYKaroli@nationwideclass no, it's not behaving at all....
\n", + "
" ], - "source": [ - "fig = plt.figure(figsize = (20, 6))\n", - "plt.subplot(1, 2, 1)\n", - "plt.plot(epoch_tr_acc, label='Train Acc')\n", - "plt.plot(epoch_vl_acc, label='Validation Acc')\n", - "plt.title(\"Accuracy\")\n", - "plt.legend()\n", - "plt.grid()\n", - "\n", - "plt.subplot(1, 2, 2)\n", - "plt.plot(epoch_tr_loss, label='Train loss')\n", - "plt.plot(epoch_vl_loss, label='Validation loss')\n", - "plt.title(\"Loss\")\n", - "plt.legend()\n", - "plt.grid()\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": {}, - "id": "iUyaF-EbfjEH" - }, - "source": [ - "---\n", - "# What's Next?\n", - "\n", - "You can use this project template as a starting point to think about your own project. There are a lot of ways to continue, here we share with you some ideas you migth find useful:\n", - "\n", - "* **Work on the Preproccesing.** We used a very rudimentary way to tokenize tweets. But there are better ways to preprocess the data. Can you think of a suitable way to preprocess the data for this particular task? How does the performance of the model change when the data is processed correctly?\n", - "* **Work on the Model.** The RNN model proposed in this notebook is not optimized at all. You can work on finding a better architecture or better hyperparamenters. May be using bidirectonal LSTMs or increasing the number of stacked layers can improve the performance, feel free to try different approaches.\n", - "* **Work on the Embedding.** Our model learnt an embedding during the training on this Twitter corpus for a particular task. You can explore the representation of different words in this learned embedding. Also, you can try using different word embeddings. You can train them on this corpus or you can use an embedding trained on another corpus of data. How does the change of the embedding affect the model performance?\n", - "* **Try sentiment analysis on another dataset.** There are lots of available dataset to work with, we can help you find one that is interesting to you. Do you belive that a sentiment analysis model trained on some corpus (Twitter dataset) will perform well on another type of data (for example, youtube comments)?\n", - "\n" - ] + "text/plain": [ + " polarity ... text\n", + "0 0 ... @switchfoot http://twitpic.com/2y1zl - Awww, t...\n", + "1 0 ... is upset that he can't update his Facebook by ...\n", + "2 0 ... @Kenichan I dived many times for the ball. Man...\n", + "3 0 ... my whole body feels itchy and like its on fire \n", + "4 0 ... @nationwideclass no, it's not behaving at all....\n", + "\n", + "[5 rows x 6 columns]" + ] + }, + "execution_count": 4, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" } - ], - "metadata": { - "accelerator": "GPU", - "colab": { - "provenance": [] - }, - "kernel": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "kernelspec": { - "display_name": "Python 3", - "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.11.2" - }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "fbb4191426bd485e8e965b6d432eecae": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_df7eba182d1b4c21bc21d157eac6b996", - "IPY_MODEL_6d64402d9da74516ab4e1d46ae9f1ee3", - "IPY_MODEL_d9ca809f7b1c49e595a05458251f3ab2" - ], - "layout": "IPY_MODEL_90908b6f69524a72860214ef8bd2d946" - } - }, - "df7eba182d1b4c21bc21d157eac6b996": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_db432a2cd6244a7592fc9732f0ca4738", - "placeholder": "​", - "style": "IPY_MODEL_84485541f3a14c65a67d10a97b72bbad", - "value": "Downloading builder script: 100%" - } - }, - "6d64402d9da74516ab4e1d46ae9f1ee3": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_5fa7ab2ab2004e5cb692199e2bd27d6b", - "max": 4033, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_ab71bd2b452146829e973d6cf99f31ed", - "value": 4033 - } - }, - "d9ca809f7b1c49e595a05458251f3ab2": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_55ba92cfe0724286ac1c2bbe6577e5c8", - "placeholder": "​", - "style": "IPY_MODEL_67a4fa49ca5349d58512a16a3742d401", - "value": " 4.03k/4.03k [00:00<00:00, 114kB/s]" - } - }, - "90908b6f69524a72860214ef8bd2d946": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "db432a2cd6244a7592fc9732f0ca4738": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "84485541f3a14c65a67d10a97b72bbad": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "5fa7ab2ab2004e5cb692199e2bd27d6b": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "ab71bd2b452146829e973d6cf99f31ed": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "55ba92cfe0724286ac1c2bbe6577e5c8": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "67a4fa49ca5349d58512a16a3742d401": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "afd671543846468abfe37669a72845c3": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_057e918ace004506aedc4e4b9942c3a8", - "IPY_MODEL_325387f6b62d47b0b21bea61676cea72", - "IPY_MODEL_ea1e3eb0e6ec4f8d82cf9b12cfe6e700" - ], - "layout": "IPY_MODEL_96c2d7ee644a438982e1792b7ec0453c" - } - }, - "057e918ace004506aedc4e4b9942c3a8": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_9baa1a735c0646b89953bf4a7c7fc92c", - "placeholder": "​", - "style": "IPY_MODEL_0ac9711c8ece4c5397a8cd810713adfb", - "value": "Downloading readme: 100%" - } - }, - "325387f6b62d47b0b21bea61676cea72": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_a8d69769921241b8b1081e84f7770858", - "max": 6837, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_d189f24b0e964d1a9fc86379bad38cca", - "value": 6837 - } - }, - "ea1e3eb0e6ec4f8d82cf9b12cfe6e700": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_db9bf44dec914db793cc4f73751c272c", - "placeholder": "​", - "style": "IPY_MODEL_1cf3ba0f756f4aa5ad1dcb675a791cfa", - "value": " 6.84k/6.84k [00:00<00:00, 157kB/s]" - } - }, - "96c2d7ee644a438982e1792b7ec0453c": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "9baa1a735c0646b89953bf4a7c7fc92c": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "0ac9711c8ece4c5397a8cd810713adfb": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "a8d69769921241b8b1081e84f7770858": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "d189f24b0e964d1a9fc86379bad38cca": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "db9bf44dec914db793cc4f73751c272c": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "1cf3ba0f756f4aa5ad1dcb675a791cfa": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "c432c4efcb794ce781fcb6f176f1b60d": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_510eeffb32694e7798f23e3931d7a943", - "IPY_MODEL_a8b3dfaa2831416582d8eeef01451386", - "IPY_MODEL_db1cdafaf36f4c339476f3221abc17b3" - ], - "layout": "IPY_MODEL_ffd3778a96e046718828bbc5aa73f173" - } - }, - "510eeffb32694e7798f23e3931d7a943": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_49c5a3fbe87b491cb3f0f450a0af0659", - "placeholder": "​", - "style": "IPY_MODEL_252949e8784c4878a62eb2e30b1e3466", - "value": "Downloading data: 100%" - } - }, - "a8b3dfaa2831416582d8eeef01451386": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_7bcef602e7f441308472bc145b12dcd3", - "max": 81363704, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_97fb30a5a31742efa1d188b9361f9938", - "value": 81363704 - } - }, - "db1cdafaf36f4c339476f3221abc17b3": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_9b34daddb9cc48bba109e547177ec654", - "placeholder": "​", - "style": "IPY_MODEL_fd2b5a6533794a2794579956c25247fb", - "value": " 81.4M/81.4M [00:06<00:00, 15.3MB/s]" - } - }, - "ffd3778a96e046718828bbc5aa73f173": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "49c5a3fbe87b491cb3f0f450a0af0659": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "252949e8784c4878a62eb2e30b1e3466": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "7bcef602e7f441308472bc145b12dcd3": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "97fb30a5a31742efa1d188b9361f9938": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "9b34daddb9cc48bba109e547177ec654": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "fd2b5a6533794a2794579956c25247fb": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "f3a9667c8c994324a2409f227bd0a1e9": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_6e6c5372ffe045c0b72587989567429e", - "IPY_MODEL_2ead0216695e4227aef44552f4ec3cc9", - "IPY_MODEL_53843f49adda4bce8450fd91fa9fd587" - ], - "layout": "IPY_MODEL_40262cb3eefa45fcbe37aaafccb69f5f" - } - }, - "6e6c5372ffe045c0b72587989567429e": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_b54b826314ea4b3a92eebd218c093fc1", - "placeholder": "​", - "style": "IPY_MODEL_8cd7be688b8c4818be48915db14a0792", - "value": "Generating train split: 100%" - } - }, - "2ead0216695e4227aef44552f4ec3cc9": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_a9a0f6ce71ed415c8c8513f68e34e162", - "max": 1600000, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_7f638a6deacd42e88c031fa47797516b", - "value": 1600000 - } - }, - "53843f49adda4bce8450fd91fa9fd587": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_849e39cc86f64e558ff94bf542a5121a", - "placeholder": "​", - "style": "IPY_MODEL_67b0b03c391c414bad5ea9fb3c947a2f", - "value": " 1600000/1600000 [01:18<00:00, 14710.70 examples/s]" - } - }, - "40262cb3eefa45fcbe37aaafccb69f5f": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "b54b826314ea4b3a92eebd218c093fc1": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "8cd7be688b8c4818be48915db14a0792": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "a9a0f6ce71ed415c8c8513f68e34e162": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "7f638a6deacd42e88c031fa47797516b": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "849e39cc86f64e558ff94bf542a5121a": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "67b0b03c391c414bad5ea9fb3c947a2f": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "1cef38981af6457dbaeb393f9936a389": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_b0b5cfae51214c60bbca9a09b196c217", - "IPY_MODEL_5ee2a4b33be04c6db8ee4d7995c2376d", - "IPY_MODEL_403fffb635c2409ebeabc90063750ed3" - ], - "layout": "IPY_MODEL_6279343019064572adedf34cfbd437fa" - } - }, - "b0b5cfae51214c60bbca9a09b196c217": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_2715d00db77545f9aa5eace8a0eb2839", - "placeholder": "​", - "style": "IPY_MODEL_942ce490d87347c789e229589b1b9c9f", - "value": "Generating test split: 100%" - } - }, - "5ee2a4b33be04c6db8ee4d7995c2376d": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_f04df4daeb6049ab85d3d75b472ccf6e", - "max": 498, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_fd0b3c53b66543cea0c396d8047445a8", - "value": 498 - } - }, - "403fffb635c2409ebeabc90063750ed3": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_2c42e2fef6314c9e842a7e9641af3cab", - "placeholder": "​", - "style": "IPY_MODEL_913d95e58aa94e4a8009768a23fbf304", - "value": " 498/498 [00:00<00:00, 7393.07 examples/s]" - } - }, - "6279343019064572adedf34cfbd437fa": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "2715d00db77545f9aa5eace8a0eb2839": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "942ce490d87347c789e229589b1b9c9f": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "f04df4daeb6049ab85d3d75b472ccf6e": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "fd0b3c53b66543cea0c396d8047445a8": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "2c42e2fef6314c9e842a7e9641af3cab": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "913d95e58aa94e4a8009768a23fbf304": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "e1348a02ceeb4af19fbd63d52b7d843b": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_fbf51b14e6b34d0485ddf59c43d22c49", - "IPY_MODEL_c29e06a72ac9401b8c41f4195021071e", - "IPY_MODEL_48b812211db04284bfbbf02823fb879a" - ], - "layout": "IPY_MODEL_5455119809c74916acc50e1905903ded" - } - }, - "fbf51b14e6b34d0485ddf59c43d22c49": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_2475bd62a3224bacb38a6334d07d6a8c", - "placeholder": "​", - "style": "IPY_MODEL_3d29947b5d2d4e2abc1355d900096642", - "value": "100%" - } - }, - "c29e06a72ac9401b8c41f4195021071e": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_3f7a8f56f15c434da70029366a37167a", - "max": 1280000, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_3610a2db297f4686bf9043f2b7ee55b5", - "value": 1280000 - } - }, - "48b812211db04284bfbbf02823fb879a": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_a1bd0616199e44538977ee2ea6049690", - "placeholder": "​", - "style": "IPY_MODEL_835fb9a91b34471fa6d61adf37616f52", - "value": " 1280000/1280000 [00:22<00:00, 77416.28it/s]" - } - }, - "5455119809c74916acc50e1905903ded": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "2475bd62a3224bacb38a6334d07d6a8c": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "3d29947b5d2d4e2abc1355d900096642": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "3f7a8f56f15c434da70029366a37167a": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "3610a2db297f4686bf9043f2b7ee55b5": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "a1bd0616199e44538977ee2ea6049690": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "835fb9a91b34471fa6d61adf37616f52": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "d8de1a85076b453a92295e79110ba8fd": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_78d48ee2fb9f42089f475fcf5fc368c8", - "IPY_MODEL_b0ca3012d0b84c5a9d7c1fc176251af7", - "IPY_MODEL_39fa73efcbf54d8dad225d8380061dbf" - ], - "layout": "IPY_MODEL_6b6cc35257fe433e93736d02e898b6b8" - } - }, - "78d48ee2fb9f42089f475fcf5fc368c8": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_e0fc900d8b5940a6bd6a97e58adb4651", - "placeholder": "​", - "style": "IPY_MODEL_6b7286d74e0f4a0199dbfcaf3dd0d622", - "value": "100%" - } - }, - "b0ca3012d0b84c5a9d7c1fc176251af7": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_a4bbd3df99cd4acab5e1b3ba5cd7c114", - "max": 320000, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_9a7140a6197945d5bac5c48b820dfb04", - "value": 320000 - } - }, - "39fa73efcbf54d8dad225d8380061dbf": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_0bdc146792a64853ae06a9d185aa2b15", - "placeholder": "​", - "style": "IPY_MODEL_768da964ffcd44fea1af09e81f5621f3", - "value": " 320000/320000 [00:06<00:00, 58691.43it/s]" - } - }, - "6b6cc35257fe433e93736d02e898b6b8": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "e0fc900d8b5940a6bd6a97e58adb4651": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "6b7286d74e0f4a0199dbfcaf3dd0d622": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "a4bbd3df99cd4acab5e1b3ba5cd7c114": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "9a7140a6197945d5bac5c48b820dfb04": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "0bdc146792a64853ae06a9d185aa2b15": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "768da964ffcd44fea1af09e81f5621f3": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - } - } + ], + "source": [ + "# We load the dataset\n", + "train_data = dataset[\"train\"]\n", + "df = pd.DataFrame(train_data)\n", + "df = df.rename(columns={'sentiment': 'polarity'})\n", + "df = df[['polarity', 'user', 'date', 'query', 'user', 'text']]\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "For this project we will use only the text and the polarity of the tweet. Notice that polarity is 0 for negative tweets and 4 for positive tweet." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "X = df.text.values\n", + "\n", + "# Changes values from [0,4] to [0,1]\n", + "y = (df.polarity.values > 1).astype(int)\n", + "\n", + "\n", + "# Split the data into train and test\n", + "x_train_text, x_test_text, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42,stratify=y)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "The first thing we have to do before working on the models is to familiarize ourselves with the dataset. This is called Exploratory Data Analisys (EDA)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1: @paisleypaisley LOL why do i get ideas so far in advance? it's not even june yet! we need a third knitter to have our own summer group \n", + "0: worst headache ever \n", + "0: @ewaniesciuszko i am so sad i wont see you! I miss you already. and yeah! that's perfect; i come back the 18th!\n", + "1: doesn't know how to spell conked \n", + "0: "So we stand here now and no one knows us at all I won't get used to this I won't get used to being gone"...I miss home and everyone -a\n" + ] + } + ], + "source": [ + "for s, l in zip(x_train_text[:5], y_train[:5]):\n", + " print('{}: {}'.format(l, s))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "An interesting thing to analyze is the Word Distribution. In order to count the occurrences of each word, we should tokenize the sentences first." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Before Tokenize: worst headache ever \n", + "After Tokenize: ['worst', 'headache', 'ever']\n" + ] + } + ], + "source": [ + "tokenizer = get_tokenizer(\"basic_english\")\n", + "\n", + "print('Before Tokenize: ', x_train_text[1])\n", + "print('After Tokenize: ', tokenizer(x_train_text[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "499e7fb54aa048afb3cba78dd8d6bb0e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=1280000.0), HTML(value='')))" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fff9bd0ae74e46b0ad97ad980a834a58", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=320000.0), HTML(value='')))" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "x_train_token = [tokenizer(s) for s in tqdm(x_train_text)]\n", + "x_test_token = [tokenizer(s) for s in tqdm(x_test_text)]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "We can count the words occurences and see how many different words are present in our dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of different Tokens in our Dataset: 669284\n", + "['.', 'i', '!', \"'\", 'to', 'the', ',', 'a', 'my', 'it', 'and', 'you', '?', 'is', 'for', 'in', 's', 'of', 't', 'on', 'that', 'me', 'so', 'have', 'm', 'but', 'just', 'with', 'be', 'at', 'not', 'was', 'this', 'now', 'can', 'good', 'up', 'day', 'all', 'get', 'out', 'like', 'are', 'no', 'go', 'http', '-', 'today', 'do', 'too', 'your', 'work', 'going', 'love', 'we', 'got', 'what', 'lol', 'time', 'back', 'from', 'u', 'one', 'will', 'know', 'about', 'im', 'really', 'don', 'am', 'had', ')', 'see', 'some', 'there', 'its', '&', 'how', 'if', 'still', 'they', '"', 'night', '(', 'well', 'want', 'new', 'think', '2', 'home', 'thanks', 'll', 'oh', 'when', 'as', 'he', 'more', 'here', 'much', 'off']\n" + ] + } + ], + "source": [ + "words = Counter()\n", + "for s in x_train_token:\n", + " for w in s:\n", + " words[w] += 1\n", + "\n", + "sorted_words = list(words.keys())\n", + "sorted_words.sort(key=lambda w: words[w], reverse=True)\n", + "print(f\"Number of different Tokens in our Dataset: {len(sorted_words)}\")\n", + "print(sorted_words[:100])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "Now we can plot their distribution." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The 0.13970153178620734% most common words account for the 80.00532743602652% of the occurrences\n" + ] + } + ], + "source": [ + "count_occurences = sum(words.values())\n", + "\n", + "accumulated = 0\n", + "counter = 0\n", + "\n", + "while accumulated < count_occurences * 0.8:\n", + " accumulated += words[sorted_words[counter]]\n", + " counter += 1\n", + "\n", + "print(f\"The {counter * 100 / len(words)}% most common words \"\n", + " f\"account for the {accumulated * 100 / count_occurences}% of the occurrences\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light", + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.bar(range(100), [words[w] for w in sorted_words[:100]])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "It is very common to find this kind of distribution when analyzing corpus of text. This is referred to as the [zipf's law](https://en.wikipedia.org/wiki/Zipf%27s_law)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "Usually the number of words in the dictionary will be very large. \n", + "\n", + "Here are some thing we can do to reduce that number:\n", + "\n", + "* Remove puntuation.\n", + "* Remove stop-words.\n", + "* Steaming.\n", + "* Remove very uncommon words (the words that appears in fewer than N occations).\n", + "* Nothing: we can use a pretrain model that handles this kind of situations.\n", + "\n", + "\n", + "We used one of the simplest tokenizers availables. This tokenizer does not take into account many quirks of the language. Moreover, diferent languages have different quirks, so there is no \"universal\" tokenizers. There are many libraries that have \"better\" tokenizers:\n", + "\n", + "* [Spacy](https://spacy.io/): it can be accessed using: `get_tokenizer(\"spacy\")`. Spacy supports a wide range of languages.\n", + "* [Huggingface](https://huggingface.co/): it has many tokenizers for different laguages. [Doc](https://huggingface.co/transformers/main_classes/tokenizer.html)\n", + "* [NLTK](https://www.nltk.org/): it provides several tokenizers. One of them can be accessed using: `get_tokenizer(\"toktok\")`\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "---\n", + "# Step 4: choose toolkit\n", + "\n", + "Our goal is to train a model capable of estimating the sentiment of a tweet (positive or negative) by reading its content. To that end we will try 2 different approaches:\n", + "\n", + "* A logistic regression using sklearn. **NOTE**: it can probaly work better than an SVM model.\n", + "* A simple Embedding + RNN." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "## Logistic regression\n", + "\n", + "We will represent our senteces using binary vectorization. This means that our data would be represented as a matrix of instances by word with a one if the word is in the instance, and zero otherwise. Sklean vectorizers can also do things such as stop-word removal and puntuation removal, you can read more about in [the documentation](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "vectorizer = CountVectorizer(binary=True)\n", + "x_train_cv = vectorizer.fit_transform(x_train_text)\n", + "x_test_cv = vectorizer.transform(x_test_text)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Before Vectorize: doesn't know how to spell conked \n" + ] + } + ], + "source": [ + "print('Before Vectorize: ', x_train_text[3])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "After Vectorize: \n", + " (0, 528584)\t1\n", + " (0, 165468)\t1\n", + " (0, 300381)\t1\n", + " (0, 242211)\t1\n", + " (0, 489893)\t1\n", + " (0, 134160)\t1\n" + ] + } + ], + "source": [ + "# Notice that the matriz is sparse\n", + "print('After Vectorize: ')\n", + "print(x_train_cv[3])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "Now we can train our model. You can check the documentation of this logistic regressor [here](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic#sklearn.linear_model.LogisticRegression)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "data": { + "text/plain": [ + "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", + " intercept_scaling=1, l1_ratio=None, max_iter=100,\n", + " multi_class='auto', n_jobs=None, penalty='l2',\n", + " random_state=None, solver='saga', tol=0.0001, verbose=0,\n", + " warm_start=False)" + ] + }, + "execution_count": 15, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "model = LogisticRegression(solver='saga')\n", + "model.fit(x_train_cv, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.81 0.79 0.80 160000\n", + " 1 0.79 0.81 0.80 160000\n", + "\n", + " accuracy 0.80 320000\n", + " macro avg 0.80 0.80 0.80 320000\n", + "weighted avg 0.80 0.80 0.80 320000\n", + "\n" + ] + } + ], + "source": [ + "y_pred = model.predict(x_test_cv)\n", + "\n", + "print(classification_report(y_test, y_pred))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "## Explainable AI\n", + "The best thing about logistic regresion is that it is simple, and we can get some explanations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 589260)\n", + "589260\n" + ] + } + ], + "source": [ + "print(model.coef_.shape)\n", + "print(len(vectorizer.vocabulary_))\n", + "\n", + "words_sk = list(vectorizer.vocabulary_.keys())\n", + "words_sk.sort(key=lambda w: model.coef_[0, vectorizer.vocabulary_[w]])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "roni: -3.862597673594883\n", + "inaperfectworld: -3.5734362290886375\n", + "dontyouhate: -3.500197620227523\n", + "xbllygbsn: -3.412645372640648\n", + "anqju: -3.336405291553548\n", + "sad: -3.200522312464158\n", + "pakcricket: -3.1949158120163412\n", + "condolences: -3.132498019366488\n", + "heartbreaking: -3.066508733796654\n", + "saddest: -3.041999809733714\n", + "sadd: -3.029070563580306\n", + "heartbroken: -3.0287688233900174\n", + "boohoo: -3.022608649696793\n", + "sadface: -2.9918411285807234\n", + "rachelle_lefevr: -2.925057253107806\n", + "disappointing: -2.902524113779547\n", + "lvbu: -2.894705935001672\n", + "saddens: -2.8855127179984654\n", + "bummed: -2.83650014970307\n", + "neda: -2.792944556837498\n" + ] + } + ], + "source": [ + "for w in words_sk[:20]:\n", + " print('{}: {}'.format(w, model.coef_[0, vectorizer.vocabulary_[w]]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iamsoannoyed: 2.8494314732277672\n", + "myfax: 2.797451563471618\n", + "jennamadison: 2.5667257393706113\n", + "yeyy: 2.478028598852801\n", + "tryout: 2.4383315790116677\n", + "goldymom: 2.4374026022205535\n", + "wooohooo: 2.40297322137544\n", + "thesupergirl: 2.3565118467330004\n", + "iammaxathotspot: 2.311648368632618\n", + "londicreations: 2.3074490293400993\n", + "smilin: 2.2991891636718216\n", + "worries: 2.2899429774914717\n", + "sinfulsignorita: 2.2798963640981817\n", + "finchensnail: 2.264302079155878\n", + "smackthis: 2.2376679263761083\n", + "kv: 2.2158393907798413\n", + "tojosan: 2.211784259253832\n", + "russmarshalek: 2.2095374025599384\n", + "traciknoppe: 2.1768297770350835\n", + "congratulations: 2.171590496227557\n" + ] + } + ], + "source": [ + "for w in reversed(words_sk[-20:]):\n", + " print('{}: {}'.format(w, model.coef_[0, vectorizer.vocabulary_[w]]))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "What does this mean?\n", + "\n", + "Remember the `model.coef_` is the $W$ in:\n", + "\n", + "$$h(x)=\\sigma(WX + b)$$\n", + "\n", + "where the label 1 is a positive tweet and the label 0 is a negative tweet." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "## Recurrent Neural Network with Pytorch" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "In the previous section we use a Bag-Of-Words approach to represent each of the tweets. That meas that we only consider how many times each of the words appear in each of the tweets, we didnt take into account the order of the words. But we know that the word order is very important and carries relevant information.\n", + "\n", + "In this section we will solve the same task, but this time we will implement a Recurrent Neural Network (RNN) instead of using a simple Logistic Regression.Unlike feedforward neural networks, RNNs have cyclic connections making them powerful for modeling sequences.\n", + "\n", + "Let's start by importing the relevant libraries.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "def set_device():\n", + " device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", + " if device != \"cuda\":\n", + " print(\"WARNING: For this notebook to perform best, \"\n", + " \"if possible, in the menu under `Runtime` -> \"\n", + " \"`Change runtime type.` select `GPU` \")\n", + " else:\n", + " print(\"GPU is enabled in this notebook.\")\n", + "\n", + " return device" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "GPU is enabled in this notebook.\n" + ] + } + ], + "source": [ + "# Set the device (check if gpu is available)\n", + "device = set_device()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "First we will create a Dictionary (`word_to_idx`). This dictionary will map each Token (usually words) to an index (an integer number). We want to limit our dictionary to a certain number of tokens (`num_words_dict`), so we will include in our ditionary those with more occurrences." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['.', 'i', '!', \"'\", 'to', 'the', ',', 'a', 'my', 'it']" + ] + }, + "execution_count": 22, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "# From previous section, we have a list with the most used tokens\n", + "sorted_words[:10]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "Let's select only the most used." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "num_words_dict = 30000\n", + "# We reserve two numbers for special tokens.\n", + "most_used_words = sorted_words[:num_words_dict-2]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "We will add two extra Tokens to the dictionary, one for words outside the dictionary (`'UNK'`) and one for padding the sequences (`'PAD'`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "# dictionary to go from words to idx\n", + "word_to_idx = {}\n", + "# dictionary to go from idx to words (just in case)\n", + "idx_to_word = {}\n", + "\n", + "\n", + "# We include the special tokens first\n", + "PAD_token = 0\n", + "UNK_token = 1\n", + "\n", + "word_to_idx['PAD'] = PAD_token\n", + "word_to_idx['UNK'] = UNK_token\n", + "\n", + "idx_to_word[PAD_token] = 'PAD'\n", + "idx_to_word[UNK_token] = 'UNK'\n", + "\n", + "# We popullate our dictionaries with the most used words\n", + "for num,word in enumerate(most_used_words):\n", + " word_to_idx[word] = num + 2\n", + " idx_to_word[num+2] = word" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "Our goal now is to transform each tweet from a sequence of tokens to a sequence of indexes. These sequences of indexes will be the input to our pytorch model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "# A function to convert list of tokens to list of indexes\n", + "def tokens_to_idx(sentences_tokens,word_to_idx):\n", + " sentences_idx = []\n", + " for sent in sentences_tokens:\n", + " sent_idx = []\n", + " for word in sent:\n", + " if word in word_to_idx:\n", + " sent_idx.append(word_to_idx[word])\n", + " else:\n", + " sent_idx.append(word_to_idx['UNK'])\n", + " sentences_idx.append(sent_idx)\n", + " return sentences_idx" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "x_train_idx = tokens_to_idx(x_train_token,word_to_idx)\n", + "x_test_idx = tokens_to_idx(x_test_token,word_to_idx)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Before converting: ['worst', 'headache', 'ever']\n", + "After converting: [721, 458, 237]\n" + ] + } + ], + "source": [ + "some_number = 1\n", + "print('Before converting: ', x_train_token[some_number])\n", + "print('After converting: ', x_train_idx[some_number])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "We need all the sequences to have the same length. To select an adequate sequence length, let's explore some statistics about the length of the tweets:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Max tweet word length: 229\n", + "Mean tweet word length: 15.0\n", + "99% percent under: 37.0\n" + ] + } + ], + "source": [ + "tweet_lens = np.asarray([len(sentence) for sentence in x_train_idx])\n", + "print('Max tweet word length: ',tweet_lens.max())\n", + "print('Mean tweet word length: ',np.median(tweet_lens))\n", + "print('99% percent under: ',np.quantile(tweet_lens,0.99))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "We cut the sequences which are larger than our chosen maximum length (`max_lenght`) and fill with zeros the ones that are shorter." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + " # We choose the max length\n", + " max_length = 40\n", + "\n", + "# A function to make all the sequence have the same lenght\n", + "# Note that the output is a Numpy matrix\n", + " def padding(sentences, seq_len):\n", + " features = np.zeros((len(sentences), seq_len),dtype=int)\n", + " for ii, tweet in enumerate(sentences):\n", + " len_tweet = len(tweet)\n", + " if len_tweet != 0:\n", + " if len_tweet <= seq_len:\n", + " # If its shorter, we fill with zeros (the padding Token index)\n", + " features[ii, -len(tweet):] = np.array(tweet)[:seq_len]\n", + " if len_tweet > seq_len:\n", + " # If its larger, we take the last 'seq_len' indexes\n", + " features[ii, :] = np.array(tweet)[-seq_len:]\n", + " return features" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "# We convert our list of tokens into a numpy matrix\n", + "# where all instances have the same lenght\n", + "x_train_pad = padding(x_train_idx,max_length)\n", + "x_test_pad = padding(x_test_idx,max_length)\n", + "\n", + "# We convert our target list a numpy matrix\n", + "y_train_np = np.asarray(y_train)\n", + "y_test_np = np.asarray(y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Before padding: [1, 3, 71, 24, 122, 3, 533, 74, 13, 4, 3, 102, 13, 209, 2, 12, 150, 4, 22, 5, 18, 667, 3, 138, 61, 7, 3296, 4]\n", + "After padding: [ 0 0 0 0 0 0 0 0 0 0 0 0 1 3\n", + " 71 24 122 3 533 74 13 4 3 102 13 209 2 12\n", + " 150 4 22 5 18 667 3 138 61 7 3296 4]\n" + ] + } + ], + "source": [ + "some_number = 2\n", + "print('Before padding: ', x_train_idx[some_number])\n", + "print('After padding: ', x_train_pad[some_number])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "Now, let's convert the data to pytorch format.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "# create Tensor datasets\n", + "train_data = TensorDataset(torch.from_numpy(x_train_pad), torch.from_numpy(y_train_np))\n", + "valid_data = TensorDataset(torch.from_numpy(x_test_pad), torch.from_numpy(y_test_np))\n", + "\n", + "# Batch size (this is an important hyperparameter)\n", + "batch_size = 100\n", + "\n", + "# dataloaders\n", + "# make sure to SHUFFLE your data\n", + "train_loader = DataLoader(train_data, shuffle=True, batch_size=batch_size,drop_last = True)\n", + "valid_loader = DataLoader(valid_data, shuffle=True, batch_size=batch_size,drop_last = True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "Each batch of data in our traning proccess will have the folllowing format:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sample input size: torch.Size([100, 40])\n", + "Sample input: \n", + " tensor([[ 0, 0, 0, ..., 4, 4, 4],\n", + " [ 0, 0, 0, ..., 7447, 14027, 2],\n", + " [ 0, 0, 0, ..., 100, 22241, 4],\n", + " ...,\n", + " [ 0, 0, 0, ..., 2702, 4409, 2],\n", + " [ 0, 0, 0, ..., 162, 17, 1],\n", + " [ 0, 0, 0, ..., 67, 12904, 49]])\n", + "Sample input: \n", + " tensor([0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0,\n", + " 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1,\n", + " 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0,\n", + " 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0,\n", + " 0, 0, 1, 0])\n" + ] + } + ], + "source": [ + "# Obtain one batch of training data\n", + "dataiter = iter(train_loader)\n", + "sample_x, sample_y = dataiter.__next__()\n", + "\n", + "print('Sample input size: ', sample_x.size()) # batch_size, seq_length\n", + "print('Sample input: \\n', sample_x)\n", + "print('Sample input: \\n', sample_y)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "Now, we will define the `SentimentRNN` class. Most of the model's class will be familiar to you, but there are two important layers we would like you to pay attention to:\n", + "\n", + "* Embedding Layer\n", + "> This layer is like a linear layer, but it makes it posible to use a sequence of inedexes as inputs (instead of a sequence of one-hot-encoded vectors). During training, the Embedding layer learns a linear transformation from the space of words (a vector space of dimension `num_words_dict`) into the a new, smaller, vector space of dimension `embedding_dim`. We suggest you to read this [thread](https://discuss.pytorch.org/t/how-does-nn-embedding-work/88518/3) and the [pytorch documentation](https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html) if you want to learn more about this particular kind of layers.\n", + "\n", + "\n", + "* LSTM layer\n", + "> This is one of the most used class of Recurrent Neural Networks. In Pytorch we can add several stacked layers in just one line of code. In our case, the number of layers added are decided with the parameter `no_layers`. If you want to learn more about LSTMs we strongly recommend you this [Colahs thread](https://colah.github.io/posts/2015-08-Understanding-LSTMs/) about them.\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "class SentimentRNN(nn.Module):\n", + " def __init__(self,no_layers,vocab_size,hidden_dim,embedding_dim,drop_prob=0.1):\n", + " super(SentimentRNN,self).__init__()\n", + "\n", + " self.output_dim = output_dim\n", + " self.hidden_dim = hidden_dim\n", + " self.no_layers = no_layers\n", + " self.vocab_size = vocab_size\n", + " self.drop_prob = drop_prob\n", + "\n", + " # Embedding Layer\n", + " self.embedding = nn.Embedding(vocab_size, embedding_dim)\n", + "\n", + " # LSTM Layers\n", + " self.lstm = nn.LSTM(input_size=embedding_dim,hidden_size=self.hidden_dim,\n", + " num_layers=no_layers, batch_first=True,\n", + " dropout=self.drop_prob)\n", + "\n", + " # Dropout layer\n", + " self.dropout = nn.Dropout(drop_prob)\n", + "\n", + " # Linear and Sigmoid layer\n", + " self.fc = nn.Linear(self.hidden_dim, output_dim)\n", + " self.sig = nn.Sigmoid()\n", + "\n", + " def forward(self,x,hidden):\n", + " batch_size = x.size(0)\n", + "\n", + " # Embedding out\n", + " embeds = self.embedding(x)\n", + " #Shape: [batch_size x max_length x embedding_dim]\n", + "\n", + " # LSTM out\n", + " lstm_out, hidden = self.lstm(embeds, hidden)\n", + " # Shape: [batch_size x max_length x hidden_dim]\n", + "\n", + " # Select the activation of the last Hidden Layer\n", + " lstm_out = lstm_out[:,-1,:].contiguous()\n", + " # Shape: [batch_size x hidden_dim]\n", + "\n", + " ## You can instead average the activations across all the times\n", + " # lstm_out = torch.mean(lstm_out, 1).contiguous()\n", + "\n", + " # Dropout and Fully connected layer\n", + " out = self.dropout(lstm_out)\n", + " out = self.fc(out)\n", + "\n", + " # Sigmoid function\n", + " sig_out = self.sig(out)\n", + "\n", + " # return last sigmoid output and hidden state\n", + " return sig_out, hidden\n", + "\n", + " def init_hidden(self, batch_size):\n", + " ''' Initializes hidden state '''\n", + " # Create two new tensors with sizes n_layers x batch_size x hidden_dim,\n", + " # initialized to zero, for hidden state and cell state of LSTM\n", + " h0 = torch.zeros((self.no_layers,batch_size,self.hidden_dim)).to(device)\n", + " c0 = torch.zeros((self.no_layers,batch_size,self.hidden_dim)).to(device)\n", + " hidden = (h0,c0)\n", + " return hidden" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "We choose the parameters of the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "# Parameters of our network\n", + "\n", + "# Size of our vocabulary\n", + "vocab_size = num_words_dict\n", + "\n", + "# Embedding dimension\n", + "embedding_dim = 32\n", + "\n", + "# Number of stacked LSTM layers\n", + "no_layers = 2\n", + "\n", + "# Dimension of the hidden layer in LSTMs\n", + "hidden_dim = 64\n", + "\n", + "# Dropout parameter for regularization\n", + "output_dim = 1\n", + "\n", + "# Dropout parameter for regularization\n", + "drop_prob = 0.25" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SentimentRNN(\n", + " (embedding): Embedding(30000, 32)\n", + " (lstm): LSTM(32, 64, num_layers=2, batch_first=True, dropout=0.25)\n", + " (dropout): Dropout(p=0.25, inplace=False)\n", + " (fc): Linear(in_features=64, out_features=1, bias=True)\n", + " (sig): Sigmoid()\n", + ")\n" + ] + } + ], + "source": [ + "# Let's define our model\n", + "model = SentimentRNN(no_layers, vocab_size, hidden_dim,\n", + " embedding_dim, drop_prob=drop_prob)\n", + "# Moving to gpu\n", + "model.to(device)\n", + "print(model)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total Number of parameters: 1018433\n" + ] } + ], + "source": [ + "# How many trainable parameters does our model have?\n", + "model_parameters = filter(lambda p: p.requires_grad, model.parameters())\n", + "params = sum([np.prod(p.size()) for p in model_parameters])\n", + "print('Total Number of parameters: ',params)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "We choose the losses and the optimizer for the training procces." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [], + "source": [ + "# loss and optimization functions\n", + "lr = 0.001\n", + "\n", + "# Binary crossentropy is a good loss function for a binary classification problem\n", + "criterion = nn.BCELoss()\n", + "\n", + "# We choose an Adam optimizer\n", + "optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n", + "\n", + "# function to predict accuracy\n", + "def acc(pred,label):\n", + " pred = torch.round(pred.squeeze())\n", + " return torch.sum(pred == label.squeeze()).item()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "We are ready to train our model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1\n", + "train_loss : 0.4367361353733577 val_loss : 0.39174133955966683\n", + "train_accuracy : 79.530625 val_accuracy : 82.3628125\n", + "Validation loss decreased (inf --> 0.391741). Saving model ...\n", + "==================================================\n", + "Epoch 2\n", + "train_loss : 0.3765802335098851 val_loss : 0.3724124691961333\n", + "train_accuracy : 83.19140625 val_accuracy : 83.42031250000001\n", + "Validation loss decreased (0.391741 --> 0.372412). Saving model ...\n", + "==================================================\n", + "Epoch 3\n", + "train_loss : 0.35746844720793886 val_loss : 0.365050206175074\n", + "train_accuracy : 84.16882812499999 val_accuracy : 83.7440625\n", + "Validation loss decreased (0.372412 --> 0.365050). Saving model ...\n", + "==================================================\n", + "Epoch 4\n", + "train_loss : 0.34491546426317654 val_loss : 0.36467386982403693\n", + "train_accuracy : 84.879140625 val_accuracy : 83.77\n", + "Validation loss decreased (0.365050 --> 0.364674). Saving model ...\n", + "==================================================\n", + "Epoch 5\n", + "train_loss : 0.33429012800217606 val_loss : 0.36189084346871825\n", + "train_accuracy : 85.44296875 val_accuracy : 84.0221875\n", + "Validation loss decreased (0.364674 --> 0.361891). Saving model ...\n", + "==================================================\n" + ] + } + ], + "source": [ + "# Number of training Epochs\n", + "epochs = 5\n", + "\n", + "# Maximum absolute value accepted for the gradeint\n", + "clip = 5\n", + "\n", + "# Initial Loss value (assumed big)\n", + "valid_loss_min = np.Inf\n", + "\n", + "# Lists to follow the evolution of the loss and accuracy\n", + "epoch_tr_loss,epoch_vl_loss = [],[]\n", + "epoch_tr_acc,epoch_vl_acc = [],[]\n", + "\n", + "# Train for a number of Epochs\n", + "for epoch in range(epochs):\n", + " train_losses = []\n", + " train_acc = 0.0\n", + " model.train()\n", + "\n", + " for inputs, labels in train_loader:\n", + "\n", + " # Initialize hidden state\n", + " h = model.init_hidden(batch_size)\n", + " # Creating new variables for the hidden state\n", + " h = tuple([each.data.to(device) for each in h])\n", + "\n", + " # Move batch inputs and labels to gpu\n", + " inputs, labels = inputs.to(device), labels.to(device)\n", + "\n", + " # Set gradient to zero\n", + " model.zero_grad()\n", + "\n", + " # Compute model output\n", + " output,h = model(inputs,h)\n", + "\n", + " # Calculate the loss and perform backprop\n", + " loss = criterion(output.squeeze(), labels.float())\n", + " loss.backward()\n", + " train_losses.append(loss.item())\n", + "\n", + " # calculating accuracy\n", + " accuracy = acc(output,labels)\n", + " train_acc += accuracy\n", + "\n", + " #`clip_grad_norm` helps prevent the exploding gradient problem in RNNs / LSTMs.\n", + " nn.utils.clip_grad_norm_(model.parameters(), clip)\n", + " optimizer.step()\n", + "\n", + "\n", + " # Evaluate on the validation set for this epoch\n", + " val_losses = []\n", + " val_acc = 0.0\n", + " model.eval()\n", + " for inputs, labels in valid_loader:\n", + "\n", + " # Initialize hidden state\n", + " val_h = model.init_hidden(batch_size)\n", + " val_h = tuple([each.data.to(device) for each in val_h])\n", + "\n", + " # Move batch inputs and labels to gpu\n", + " inputs, labels = inputs.to(device), labels.to(device)\n", + "\n", + " # Compute model output\n", + " output, val_h = model(inputs, val_h)\n", + "\n", + " # Compute Loss\n", + " val_loss = criterion(output.squeeze(), labels.float())\n", + "\n", + " val_losses.append(val_loss.item())\n", + "\n", + " accuracy = acc(output,labels)\n", + " val_acc += accuracy\n", + "\n", + " epoch_train_loss = np.mean(train_losses)\n", + " epoch_val_loss = np.mean(val_losses)\n", + " epoch_train_acc = train_acc/len(train_loader.dataset)\n", + " epoch_val_acc = val_acc/len(valid_loader.dataset)\n", + " epoch_tr_loss.append(epoch_train_loss)\n", + " epoch_vl_loss.append(epoch_val_loss)\n", + " epoch_tr_acc.append(epoch_train_acc)\n", + " epoch_vl_acc.append(epoch_val_acc)\n", + " print(f'Epoch {epoch+1}')\n", + " print(f'train_loss : {epoch_train_loss} val_loss : {epoch_val_loss}')\n", + " print(f'train_accuracy : {epoch_train_acc*100} val_accuracy : {epoch_val_acc*100}')\n", + " if epoch_val_loss <= valid_loss_min:\n", + " print('Validation loss decreased ({:.6f} --> {:.6f}). Saving model ...'.format(valid_loss_min,epoch_val_loss))\n", + " # torch.save(model.state_dict(), '../working/state_dict.pt')\n", + " valid_loss_min = epoch_val_loss\n", + " print(25*'==')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": {} + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize = (20, 6))\n", + "plt.subplot(1, 2, 1)\n", + "plt.plot(epoch_tr_acc, label='Train Acc')\n", + "plt.plot(epoch_vl_acc, label='Validation Acc')\n", + "plt.title(\"Accuracy\")\n", + "plt.legend()\n", + "plt.grid()\n", + "\n", + "plt.subplot(1, 2, 2)\n", + "plt.plot(epoch_tr_loss, label='Train loss')\n", + "plt.plot(epoch_vl_loss, label='Validation loss')\n", + "plt.title(\"Loss\")\n", + "plt.legend()\n", + "plt.grid()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": {} + }, + "source": [ + "---\n", + "# What's Next?\n", + "\n", + "You can use this project template as a starting point to think about your own project. There are a lot of ways to continue, here we share with you some ideas you migth find useful:\n", + "\n", + "* **Work on the Preproccesing.** We used a very rudimentary way to tokenize tweets. But there are better ways to preprocess the data. Can you think of a suitable way to preprocess the data for this particular task? How does the performance of the model change when the data is processed correctly?\n", + "* **Work on the Model.** The RNN model proposed in this notebook is not optimized at all. You can work on finding a better architecture or better hyperparamenters. May be using bidirectonal LSTMs or increasing the number of stacked layers can improve the performance, feel free to try different approaches.\n", + "* **Work on the Embedding.** Our model learnt an embedding during the training on this Twitter corpus for a particular task. You can explore the representation of different words in this learned embedding. Also, you can try using different word embeddings. You can train them on this corpus or you can use an embedding trained on another corpus of data. How does the change of the embedding affect the model performance?\n", + "* **Try sentiment analysis on another dataset.** There are lots of available dataset to work with, we can help you find one that is interesting to you. Do you belive that a sentiment analysis model trained on some corpus (Twitter dataset) will perform well on another type of data (for example, youtube comments)?\n", + "\n" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "include_colab_link": true, + "name": "sentiment_analysis", + "provenance": [], + "toc_visible": true + }, + "kernel": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From d159bb5065981f035e2e3bf9444322d47fdcc16e Mon Sep 17 00:00:00 2001 From: Soan Kim <39689481+SoanKim@users.noreply.github.com> Date: Tue, 9 Jul 2024 01:40:18 +0900 Subject: [PATCH 08/12] Update lunar_lander.ipynb deleted duplicated minigrid installation --- projects/ReinforcementLearning/lunar_lander.ipynb | 1 - 1 file changed, 1 deletion(-) diff --git a/projects/ReinforcementLearning/lunar_lander.ipynb b/projects/ReinforcementLearning/lunar_lander.ipynb index 24a8e0d37..b02af964d 100644 --- a/projects/ReinforcementLearning/lunar_lander.ipynb +++ b/projects/ReinforcementLearning/lunar_lander.ipynb @@ -92,7 +92,6 @@ "!pip install pyvirtualdisplay --quiet\n", "!pip install pyglet --quiet\n", "!pip install pygame --quiet\n", - "!pip install minigrid --quiet\n", "!pip install -q gymnasium[box2d] --quiet\n", "!pip install 'minigrid<=2.1.1' --quiet\n", "!pip3 install box2d-py --quiet" From 3edc9188881fd43a197c245582c442862888cd7f Mon Sep 17 00:00:00 2001 From: Zoltan Date: Mon, 8 Jul 2024 17:01:52 -0400 Subject: [PATCH 09/12] Update notebook-pr.yaml ci:execute --- .github/workflows/notebook-pr.yaml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/workflows/notebook-pr.yaml b/.github/workflows/notebook-pr.yaml index 5d3a3f64c..b14d492da 100644 --- a/.github/workflows/notebook-pr.yaml +++ b/.github/workflows/notebook-pr.yaml @@ -15,7 +15,22 @@ jobs: runs-on: ubuntu-latest steps: - + - name: Free up disk space + uses: jlumbroso/free-disk-space@main + with: + # this might remove tools that are actually needed, + # if set to "true" but frees about 6 GB + tool-cache: false + + # all of these default to true, but feel free to set to + # "false" if necessary for your workflow + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: true + swap-storage: true + - name: Checkout uses: actions/checkout@v3 with: From 8fa1bd6412ef53d8e10a7a59720be896b8db73e8 Mon Sep 17 00:00:00 2001 From: Zoltan Date: Mon, 8 Jul 2024 17:16:32 -0400 Subject: [PATCH 10/12] Update requirements.txt ci:execute --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index ab36879c3..4b78c17c3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,3 +10,4 @@ torchvision pathlib xkcd decorator==5.0.9 +pyvirtualdisplay From 93cccbfb8aa2cb6089d3821193341190a6c16310 Mon Sep 17 00:00:00 2001 From: Zoltan Date: Mon, 8 Jul 2024 18:36:26 -0400 Subject: [PATCH 11/12] Update notebook-pr.yaml ci:execute --- .github/workflows/notebook-pr.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/notebook-pr.yaml b/.github/workflows/notebook-pr.yaml index b14d492da..5cbdfd03d 100644 --- a/.github/workflows/notebook-pr.yaml +++ b/.github/workflows/notebook-pr.yaml @@ -63,6 +63,7 @@ jobs: - name: Install dependencies if: "!contains(env.COMMIT_MESSAGE, 'skip ci') && contains(env.COMMIT_MESSAGE, 'ci:execute')" run: | + sudo apt-get update && sudo apt install xvfb -y python -m pip install --upgrade pip wheel pip install -r requirements.txt pip install jupyter_client==7.3.5 # downgrade jupyter-client to fix hangs From 942e35c5229f79ea2c6ae113731692eaff2b76b2 Mon Sep 17 00:00:00 2001 From: Zoltan Date: Mon, 8 Jul 2024 19:33:12 -0400 Subject: [PATCH 12/12] update reqs and use of np.inf ci:execute --- projects/NaturalLanguageProcessing/sentiment_analysis.ipynb | 2 +- requirements.txt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb b/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb index 87c305bde..70b008cb9 100644 --- a/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb +++ b/projects/NaturalLanguageProcessing/sentiment_analysis.ipynb @@ -1504,7 +1504,7 @@ "clip = 5\n", "\n", "# Initial Loss value (assumed big)\n", - "valid_loss_min = np.Inf\n", + "valid_loss_min = np.inf\n", "\n", "# Lists to follow the evolution of the loss and accuracy\n", "epoch_tr_loss,epoch_vl_loss = [],[]\n", diff --git a/requirements.txt b/requirements.txt index 4b78c17c3..b8d8390a9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,3 +11,5 @@ pathlib xkcd decorator==5.0.9 pyvirtualdisplay +tensorboard +moviepy