{ "cells": [ { "cell_type": "markdown", "source": [ "# Loading of Data" ], "metadata": { "id": "3O2gRML1CxuY" } }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ClXaJHz3skxq", "outputId": "620e7537-0423-4b59-c9fd-9146b2062a4a" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n" ] } ], "source": [ "# prompt: load the dataset from a Google Drive\n", "\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from google.colab import drive\n", "\n", "# Load the dataset from a Google Drive file\n", "drive.mount('/content/drive')\n", "data = pd.read_csv('/content/drive/MyDrive/Colab_Notebooks/Twitter_Analysis.csv')\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "y4xKC0BJVd-o", "outputId": "01958e58-4379-487a-c1ef-aabad115e6a6" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n" ] } ], "source": [ "from google.colab import drive\n", "drive.mount('/content/drive')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 707 }, "id": "EsspYImeyQeS", "outputId": "7c076ae0-2533-4439-c347-994aa7d50418" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Unnamed: 0 majority_target \\\n", "0 0 True \n", "1 1 True \n", "2 2 True \n", "3 3 True \n", "4 4 True \n", "\n", " statement BinaryNumTarget \\\n", "0 End of eviction moratorium means millions of A... 1.0 \n", "1 End of eviction moratorium means millions of A... 1.0 \n", "2 End of eviction moratorium means millions of A... 1.0 \n", "3 End of eviction moratorium means millions of A... 1.0 \n", "4 End of eviction moratorium means millions of A... 1.0 \n", "\n", " tweet followers_count \\\n", "0 @POTUS Biden Blunders - 6 Month Update\\n\\nInfl... 4262.0 \n", "1 @S0SickRick @Stairmaster_ @6d6f636869 Not as m... 1393.0 \n", "2 THE SUPREME COURT is siding with super rich pr... 9.0 \n", "3 @POTUS Biden Blunders\\n\\nBroken campaign promi... 4262.0 \n", "4 @OhComfy I agree. The confluence of events rig... 70.0 \n", "\n", " friends_count favourites_count statuses_count listed_count ... \\\n", "0 3619.0 34945.0 16423.0 44.0 ... \n", "1 1621.0 31436.0 37184.0 64.0 ... \n", "2 84.0 219.0 1184.0 0.0 ... \n", "3 3619.0 34945.0 16423.0 44.0 ... \n", "4 166.0 15282.0 2194.0 0.0 ... \n", "\n", " determiners conjunctions dots exclamation questions ampersand \\\n", "0 0 0 5 0 1 0 \n", "1 0 2 1 0 0 0 \n", "2 0 1 0 0 0 0 \n", "3 0 1 3 0 0 1 \n", "4 0 1 3 0 1 0 \n", "\n", " capitals digits long_word_freq short_word_freq \n", "0 33 3 5 19 \n", "1 14 0 2 34 \n", "2 3 0 4 10 \n", "3 6 8 1 30 \n", "4 11 3 2 19 \n", "\n", "[5 rows x 64 columns]" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0majority_targetstatementBinaryNumTargettweetfollowers_countfriends_countfavourites_countstatuses_countlisted_count...determinersconjunctionsdotsexclamationquestionsampersandcapitalsdigitslong_word_freqshort_word_freq
00TrueEnd of eviction moratorium means millions of A...1.0@POTUS Biden Blunders - 6 Month Update\\n\\nInfl...4262.03619.034945.016423.044.0...005010333519
11TrueEnd of eviction moratorium means millions of A...1.0@S0SickRick @Stairmaster_ @6d6f636869 Not as m...1393.01621.031436.037184.064.0...021000140234
22TrueEnd of eviction moratorium means millions of A...1.0THE SUPREME COURT is siding with super rich pr...9.084.0219.01184.00.0...01000030410
33TrueEnd of eviction moratorium means millions of A...1.0@POTUS Biden Blunders\\n\\nBroken campaign promi...4262.03619.034945.016423.044.0...01300168130
44TrueEnd of eviction moratorium means millions of A...1.0@OhComfy I agree. The confluence of events rig...70.0166.015282.02194.00.0...013010113219
\n", "

5 rows × 64 columns

\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": "data" } }, "metadata": {}, "execution_count": 3 } ], "source": [ "data.head()" ] }, { "cell_type": "markdown", "source": [ "# Pre-Processing" ], "metadata": { "id": "SyzmIOQqCaky" } }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "7VRJMRynmTB5", "outputId": "2cea5c6a-91a3-4d6b-e3c2-2309a9c9fc60" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Requirement already satisfied: pycaret in /usr/local/lib/python3.10/dist-packages (3.3.2)\n", "Requirement already satisfied: ipython>=5.5.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (7.34.0)\n", "Requirement already satisfied: ipywidgets>=7.6.5 in /usr/local/lib/python3.10/dist-packages (from pycaret) (7.7.1)\n", "Requirement already satisfied: tqdm>=4.62.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (4.66.4)\n", "Requirement already satisfied: numpy<1.27,>=1.21 in /usr/local/lib/python3.10/dist-packages (from pycaret) (1.25.2)\n", "Requirement already satisfied: pandas<2.2.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (2.0.3)\n", "Requirement already satisfied: jinja2>=3 in /usr/local/lib/python3.10/dist-packages (from pycaret) (3.1.4)\n", "Requirement already satisfied: scipy<=1.11.4,>=1.6.1 in /usr/local/lib/python3.10/dist-packages (from pycaret) (1.11.4)\n", "Requirement already satisfied: joblib<1.4,>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (1.3.2)\n", "Requirement already satisfied: scikit-learn>1.4.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (1.4.2)\n", "Requirement already satisfied: pyod>=1.1.3 in /usr/local/lib/python3.10/dist-packages (from pycaret) (2.0.0)\n", "Requirement already satisfied: imbalanced-learn>=0.12.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (0.12.3)\n", "Requirement already satisfied: category-encoders>=2.4.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (2.6.3)\n", "Requirement already satisfied: lightgbm>=3.0.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (4.1.0)\n", "Requirement already satisfied: numba>=0.55.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (0.58.1)\n", "Requirement already satisfied: requests>=2.27.1 in /usr/local/lib/python3.10/dist-packages (from pycaret) (2.31.0)\n", "Requirement already satisfied: psutil>=5.9.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (5.9.5)\n", "Requirement already satisfied: markupsafe>=2.0.1 in /usr/local/lib/python3.10/dist-packages (from pycaret) (2.1.5)\n", "Requirement already satisfied: importlib-metadata>=4.12.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (7.1.0)\n", "Requirement already satisfied: nbformat>=4.2.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (5.10.4)\n", "Requirement already satisfied: cloudpickle in /usr/local/lib/python3.10/dist-packages (from pycaret) (2.2.1)\n", "Requirement already satisfied: deprecation>=2.1.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (2.1.0)\n", "Requirement already satisfied: xxhash in /usr/local/lib/python3.10/dist-packages (from pycaret) (3.4.1)\n", "Requirement already satisfied: matplotlib<3.8.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (3.7.1)\n", "Requirement already satisfied: scikit-plot>=0.3.7 in /usr/local/lib/python3.10/dist-packages (from pycaret) (0.3.7)\n", "Requirement already satisfied: yellowbrick>=1.4 in /usr/local/lib/python3.10/dist-packages (from pycaret) (1.5)\n", "Requirement already satisfied: plotly>=5.14.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (5.15.0)\n", "Requirement already satisfied: kaleido>=0.2.1 in /usr/local/lib/python3.10/dist-packages (from pycaret) (0.2.1)\n", "Requirement already satisfied: schemdraw==0.15 in /usr/local/lib/python3.10/dist-packages (from pycaret) (0.15)\n", "Requirement already satisfied: plotly-resampler>=0.8.3.1 in /usr/local/lib/python3.10/dist-packages (from pycaret) (0.10.0)\n", "Requirement already satisfied: statsmodels>=0.12.1 in /usr/local/lib/python3.10/dist-packages (from pycaret) (0.14.2)\n", "Requirement already satisfied: sktime==0.26.0 in /usr/local/lib/python3.10/dist-packages (from pycaret) (0.26.0)\n", "Requirement already satisfied: tbats>=1.1.3 in /usr/local/lib/python3.10/dist-packages (from pycaret) (1.1.3)\n", "Requirement already satisfied: pmdarima>=2.0.4 in /usr/local/lib/python3.10/dist-packages (from pycaret) (2.0.4)\n", "Requirement already satisfied: wurlitzer in /usr/local/lib/python3.10/dist-packages (from pycaret) (3.1.1)\n", "Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from sktime==0.26.0->pycaret) (24.1)\n", "Requirement already satisfied: scikit-base<0.8.0 in /usr/local/lib/python3.10/dist-packages (from sktime==0.26.0->pycaret) (0.7.8)\n", "Requirement already satisfied: patsy>=0.5.1 in /usr/local/lib/python3.10/dist-packages (from category-encoders>=2.4.0->pycaret) (0.5.6)\n", "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from imbalanced-learn>=0.12.0->pycaret) (3.5.0)\n", "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.10/dist-packages (from importlib-metadata>=4.12.0->pycaret) (3.19.2)\n", "Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.10/dist-packages (from ipython>=5.5.0->pycaret) (67.7.2)\n", "Requirement already satisfied: jedi>=0.16 in /usr/local/lib/python3.10/dist-packages (from ipython>=5.5.0->pycaret) (0.19.1)\n", "Requirement already satisfied: decorator in /usr/local/lib/python3.10/dist-packages (from ipython>=5.5.0->pycaret) (4.4.2)\n", "Requirement already satisfied: pickleshare in /usr/local/lib/python3.10/dist-packages (from ipython>=5.5.0->pycaret) (0.7.5)\n", "Requirement already satisfied: traitlets>=4.2 in /usr/local/lib/python3.10/dist-packages (from ipython>=5.5.0->pycaret) (5.7.1)\n", "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from ipython>=5.5.0->pycaret) (3.0.47)\n", "Requirement already satisfied: pygments in /usr/local/lib/python3.10/dist-packages (from ipython>=5.5.0->pycaret) (2.16.1)\n", "Requirement already satisfied: backcall in /usr/local/lib/python3.10/dist-packages (from ipython>=5.5.0->pycaret) (0.2.0)\n", "Requirement already satisfied: matplotlib-inline in /usr/local/lib/python3.10/dist-packages (from ipython>=5.5.0->pycaret) (0.1.7)\n", "Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.10/dist-packages (from ipython>=5.5.0->pycaret) (4.9.0)\n", "Requirement already satisfied: ipykernel>=4.5.1 in /usr/local/lib/python3.10/dist-packages (from ipywidgets>=7.6.5->pycaret) (5.5.6)\n", "Requirement already satisfied: ipython-genutils~=0.2.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets>=7.6.5->pycaret) (0.2.0)\n", "Requirement already satisfied: widgetsnbextension~=3.6.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets>=7.6.5->pycaret) (3.6.6)\n", "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets>=7.6.5->pycaret) (3.0.11)\n", "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.8.0->pycaret) (1.2.1)\n", "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.8.0->pycaret) (0.12.1)\n", "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.8.0->pycaret) (4.53.0)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.8.0->pycaret) (1.4.5)\n", "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.8.0->pycaret) (9.4.0)\n", "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.8.0->pycaret) (3.1.2)\n", "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.8.0->pycaret) (2.8.2)\n", "Requirement already satisfied: fastjsonschema>=2.15 in /usr/local/lib/python3.10/dist-packages (from nbformat>=4.2.0->pycaret) (2.19.1)\n", "Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.10/dist-packages (from nbformat>=4.2.0->pycaret) (4.19.2)\n", "Requirement already satisfied: jupyter-core!=5.0.*,>=4.12 in /usr/local/lib/python3.10/dist-packages (from nbformat>=4.2.0->pycaret) (5.7.2)\n", "Requirement already satisfied: llvmlite<0.42,>=0.41.0dev0 in /usr/local/lib/python3.10/dist-packages (from numba>=0.55.0->pycaret) (0.41.1)\n", "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas<2.2.0->pycaret) (2023.4)\n", "Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas<2.2.0->pycaret) (2024.1)\n", "Requirement already satisfied: tenacity>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from plotly>=5.14.0->pycaret) (8.3.0)\n", "Requirement already satisfied: dash>=2.9.0 in /usr/local/lib/python3.10/dist-packages (from plotly-resampler>=0.8.3.1->pycaret) (2.17.1)\n", "Requirement already satisfied: orjson<4.0.0,>=3.8.0 in /usr/local/lib/python3.10/dist-packages (from plotly-resampler>=0.8.3.1->pycaret) (3.10.5)\n", "Requirement already satisfied: tsdownsample>=0.1.3 in /usr/local/lib/python3.10/dist-packages (from plotly-resampler>=0.8.3.1->pycaret) (0.1.3)\n", "Requirement already satisfied: Cython!=0.29.18,!=0.29.31,>=0.29 in /usr/local/lib/python3.10/dist-packages (from pmdarima>=2.0.4->pycaret) (3.0.10)\n", "Requirement already satisfied: urllib3 in /usr/local/lib/python3.10/dist-packages (from pmdarima>=2.0.4->pycaret) (2.0.7)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.27.1->pycaret) (3.3.2)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.27.1->pycaret) (3.7)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.27.1->pycaret) (2024.6.2)\n", "Requirement already satisfied: Flask<3.1,>=1.0.4 in /usr/local/lib/python3.10/dist-packages (from dash>=2.9.0->plotly-resampler>=0.8.3.1->pycaret) (2.2.5)\n", "Requirement already satisfied: Werkzeug<3.1 in /usr/local/lib/python3.10/dist-packages (from dash>=2.9.0->plotly-resampler>=0.8.3.1->pycaret) (3.0.3)\n", "Requirement already satisfied: dash-html-components==2.0.0 in /usr/local/lib/python3.10/dist-packages (from dash>=2.9.0->plotly-resampler>=0.8.3.1->pycaret) (2.0.0)\n", "Requirement already satisfied: dash-core-components==2.0.0 in /usr/local/lib/python3.10/dist-packages (from dash>=2.9.0->plotly-resampler>=0.8.3.1->pycaret) (2.0.0)\n", "Requirement already satisfied: dash-table==5.0.0 in /usr/local/lib/python3.10/dist-packages (from dash>=2.9.0->plotly-resampler>=0.8.3.1->pycaret) (5.0.0)\n", "Requirement already satisfied: typing-extensions>=4.1.1 in /usr/local/lib/python3.10/dist-packages (from dash>=2.9.0->plotly-resampler>=0.8.3.1->pycaret) (4.12.2)\n", "Requirement already satisfied: retrying in /usr/local/lib/python3.10/dist-packages (from dash>=2.9.0->plotly-resampler>=0.8.3.1->pycaret) (1.3.4)\n", "Requirement already satisfied: nest-asyncio in /usr/local/lib/python3.10/dist-packages (from dash>=2.9.0->plotly-resampler>=0.8.3.1->pycaret) (1.6.0)\n", "Requirement already satisfied: jupyter-client in /usr/local/lib/python3.10/dist-packages (from ipykernel>=4.5.1->ipywidgets>=7.6.5->pycaret) (6.1.12)\n", "Requirement already satisfied: tornado>=4.2 in /usr/local/lib/python3.10/dist-packages (from ipykernel>=4.5.1->ipywidgets>=7.6.5->pycaret) (6.3.3)\n", "Requirement already satisfied: parso<0.9.0,>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from jedi>=0.16->ipython>=5.5.0->pycaret) (0.8.4)\n", "Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat>=4.2.0->pycaret) (23.2.0)\n", "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat>=4.2.0->pycaret) (2023.12.1)\n", "Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat>=4.2.0->pycaret) (0.35.1)\n", "Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat>=4.2.0->pycaret) (0.18.1)\n", "Requirement already satisfied: platformdirs>=2.5 in /usr/local/lib/python3.10/dist-packages (from jupyter-core!=5.0.*,>=4.12->nbformat>=4.2.0->pycaret) (4.2.2)\n", "Requirement already satisfied: six in /usr/local/lib/python3.10/dist-packages (from patsy>=0.5.1->category-encoders>=2.4.0->pycaret) (1.16.0)\n", "Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.10/dist-packages (from pexpect>4.3->ipython>=5.5.0->pycaret) (0.7.0)\n", "Requirement already satisfied: wcwidth in /usr/local/lib/python3.10/dist-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=5.5.0->pycaret) (0.2.13)\n", "Requirement already satisfied: notebook>=4.4.1 in /usr/local/lib/python3.10/dist-packages (from widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (6.5.5)\n", "Requirement already satisfied: itsdangerous>=2.0 in /usr/local/lib/python3.10/dist-packages (from Flask<3.1,>=1.0.4->dash>=2.9.0->plotly-resampler>=0.8.3.1->pycaret) (2.2.0)\n", "Requirement already satisfied: click>=8.0 in /usr/local/lib/python3.10/dist-packages (from Flask<3.1,>=1.0.4->dash>=2.9.0->plotly-resampler>=0.8.3.1->pycaret) (8.1.7)\n", "Requirement already satisfied: pyzmq<25,>=17 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (24.0.1)\n", "Requirement already satisfied: argon2-cffi in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (23.1.0)\n", "Requirement already satisfied: nbconvert>=5 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (6.5.4)\n", "Requirement already satisfied: Send2Trash>=1.8.0 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (1.8.3)\n", "Requirement already satisfied: terminado>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (0.18.1)\n", "Requirement already satisfied: prometheus-client in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (0.20.0)\n", "Requirement already satisfied: nbclassic>=0.4.7 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (1.1.0)\n", "Requirement already satisfied: notebook-shim>=0.2.3 in /usr/local/lib/python3.10/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (0.2.4)\n", "Requirement already satisfied: lxml in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (4.9.4)\n", "Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (4.12.3)\n", "Requirement already satisfied: bleach in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (6.1.0)\n", "Requirement already satisfied: defusedxml in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (0.7.1)\n", "Requirement already satisfied: entrypoints>=0.2.2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (0.4)\n", "Requirement already satisfied: jupyterlab-pygments in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (0.3.0)\n", "Requirement already satisfied: mistune<2,>=0.8.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (0.8.4)\n", "Requirement already satisfied: nbclient>=0.5.0 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (0.10.0)\n", "Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (1.5.1)\n", "Requirement already satisfied: tinycss2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (1.3.0)\n", "Requirement already satisfied: argon2-cffi-bindings in /usr/local/lib/python3.10/dist-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (21.2.0)\n", "Requirement already satisfied: jupyter-server<3,>=1.8 in /usr/local/lib/python3.10/dist-packages (from notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (1.24.0)\n", "Requirement already satisfied: cffi>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (1.16.0)\n", "Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.10/dist-packages (from beautifulsoup4->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (2.5)\n", "Requirement already satisfied: webencodings in /usr/local/lib/python3.10/dist-packages (from bleach->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (0.5.1)\n", "Requirement already satisfied: pycparser in /usr/local/lib/python3.10/dist-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (2.22)\n", "Requirement already satisfied: anyio<4,>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (3.7.1)\n", "Requirement already satisfied: websocket-client in /usr/local/lib/python3.10/dist-packages (from jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (1.8.0)\n", "Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.10/dist-packages (from anyio<4,>=3.1.0->jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (1.3.1)\n", "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio<4,>=3.1.0->jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.5->pycaret) (1.2.1)\n" ] } ], "source": [ "!pip install pycaret" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "HIFgZcfWlC8F" }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import pycaret\n", "import transformers\n", "from transformers import AutoModel, BertTokenizerFast\n", "import matplotlib.pyplot as plt\n", "import sklearn\n", "import sklearn.metrics\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import classification_report\n", "import torch\n", "import torch.nn as nn\n", "import tensorflow as tf\n", "from tensorflow.keras.preprocessing.text import Tokenizer\n", "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", "# specify GPU\n", "device = torch.device(\"cuda\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 707 }, "id": "Fiqo7nAUm3I2", "outputId": "d5753cd8-4dac-4ecc-f53c-ffd5b9c04943" }, "outputs": [ { "data": { "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "data" }, "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0majority_targetstatementBinaryNumTargettweetfollowers_countfriends_countfavourites_countstatuses_countlisted_count...determinersconjunctionsdotsexclamationquestionsampersandcapitalsdigitslong_word_freqshort_word_freq
00TrueEnd of eviction moratorium means millions of A...1.0@POTUS Biden Blunders - 6 Month Update\\n\\nInfl...4262.03619.034945.016423.044.0...005010333519
11TrueEnd of eviction moratorium means millions of A...1.0@S0SickRick @Stairmaster_ @6d6f636869 Not as m...1393.01621.031436.037184.064.0...021000140234
22TrueEnd of eviction moratorium means millions of A...1.0THE SUPREME COURT is siding with super rich pr...9.084.0219.01184.00.0...01000030410
33TrueEnd of eviction moratorium means millions of A...1.0@POTUS Biden Blunders\\n\\nBroken campaign promi...4262.03619.034945.016423.044.0...01300168130
44TrueEnd of eviction moratorium means millions of A...1.0@OhComfy I agree. The confluence of events rig...70.0166.015282.02194.00.0...013010113219
\n", "

5 rows × 64 columns

\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": [ " Unnamed: 0 majority_target \\\n", "0 0 True \n", "1 1 True \n", "2 2 True \n", "3 3 True \n", "4 4 True \n", "\n", " statement BinaryNumTarget \\\n", "0 End of eviction moratorium means millions of A... 1.0 \n", "1 End of eviction moratorium means millions of A... 1.0 \n", "2 End of eviction moratorium means millions of A... 1.0 \n", "3 End of eviction moratorium means millions of A... 1.0 \n", "4 End of eviction moratorium means millions of A... 1.0 \n", "\n", " tweet followers_count \\\n", "0 @POTUS Biden Blunders - 6 Month Update\\n\\nInfl... 4262.0 \n", "1 @S0SickRick @Stairmaster_ @6d6f636869 Not as m... 1393.0 \n", "2 THE SUPREME COURT is siding with super rich pr... 9.0 \n", "3 @POTUS Biden Blunders\\n\\nBroken campaign promi... 4262.0 \n", "4 @OhComfy I agree. The confluence of events rig... 70.0 \n", "\n", " friends_count favourites_count statuses_count listed_count ... \\\n", "0 3619.0 34945.0 16423.0 44.0 ... \n", "1 1621.0 31436.0 37184.0 64.0 ... \n", "2 84.0 219.0 1184.0 0.0 ... \n", "3 3619.0 34945.0 16423.0 44.0 ... \n", "4 166.0 15282.0 2194.0 0.0 ... \n", "\n", " determiners conjunctions dots exclamation questions ampersand \\\n", "0 0 0 5 0 1 0 \n", "1 0 2 1 0 0 0 \n", "2 0 1 0 0 0 0 \n", "3 0 1 3 0 0 1 \n", "4 0 1 3 0 1 0 \n", "\n", " capitals digits long_word_freq short_word_freq \n", "0 33 3 5 19 \n", "1 14 0 2 34 \n", "2 3 0 4 10 \n", "3 6 8 1 30 \n", "4 11 3 2 19 \n", "\n", "[5 rows x 64 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# prompt: view the head of data\n", "\n", "data.head()\n", "\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 707 }, "id": "nPLgUP-NvLrW", "outputId": "557c7500-286f-465d-842e-adc214422f55" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Unnamed: 0 majority_target \\\n", "0 0 True \n", "1 1 True \n", "2 2 True \n", "3 3 True \n", "4 4 True \n", "\n", " statement BinaryNumTarget \\\n", "0 End of eviction moratorium means millions of A... 1.0 \n", "1 End of eviction moratorium means millions of A... 1.0 \n", "2 End of eviction moratorium means millions of A... 1.0 \n", "3 End of eviction moratorium means millions of A... 1.0 \n", "4 End of eviction moratorium means millions of A... 1.0 \n", "\n", " tweet followers_count \\\n", "0 @POTUS Biden Blunders - 6 Month Update\\n\\nInfl... 4262.0 \n", "1 @S0SickRick @Stairmaster_ @6d6f636869 Not as m... 1393.0 \n", "2 THE SUPREME COURT is siding with super rich pr... 9.0 \n", "3 @POTUS Biden Blunders\\n\\nBroken campaign promi... 4262.0 \n", "4 @OhComfy I agree. The confluence of events rig... 70.0 \n", "\n", " friends_count favourites_count statuses_count listed_count ... \\\n", "0 3619.0 34945.0 16423.0 44.0 ... \n", "1 1621.0 31436.0 37184.0 64.0 ... \n", "2 84.0 219.0 1184.0 0.0 ... \n", "3 3619.0 34945.0 16423.0 44.0 ... \n", "4 166.0 15282.0 2194.0 0.0 ... \n", "\n", " determiners conjunctions dots exclamation questions ampersand \\\n", "0 0 0 5 0 1 0 \n", "1 0 2 1 0 0 0 \n", "2 0 1 0 0 0 0 \n", "3 0 1 3 0 0 1 \n", "4 0 1 3 0 1 0 \n", "\n", " capitals digits long_word_freq short_word_freq \n", "0 33 3 5 19 \n", "1 14 0 2 34 \n", "2 3 0 4 10 \n", "3 6 8 1 30 \n", "4 11 3 2 19 \n", "\n", "[5 rows x 64 columns]" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0majority_targetstatementBinaryNumTargettweetfollowers_countfriends_countfavourites_countstatuses_countlisted_count...determinersconjunctionsdotsexclamationquestionsampersandcapitalsdigitslong_word_freqshort_word_freq
00TrueEnd of eviction moratorium means millions of A...1.0@POTUS Biden Blunders - 6 Month Update\\n\\nInfl...4262.03619.034945.016423.044.0...005010333519
11TrueEnd of eviction moratorium means millions of A...1.0@S0SickRick @Stairmaster_ @6d6f636869 Not as m...1393.01621.031436.037184.064.0...021000140234
22TrueEnd of eviction moratorium means millions of A...1.0THE SUPREME COURT is siding with super rich pr...9.084.0219.01184.00.0...01000030410
33TrueEnd of eviction moratorium means millions of A...1.0@POTUS Biden Blunders\\n\\nBroken campaign promi...4262.03619.034945.016423.044.0...01300168130
44TrueEnd of eviction moratorium means millions of A...1.0@OhComfy I agree. The confluence of events rig...70.0166.015282.02194.00.0...013010113219
\n", "

5 rows × 64 columns

\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": "data" } }, "metadata": {}, "execution_count": 6 } ], "source": [ "# prompt: remove url and make texts in a field in the dataset in lowercase\n", "\n", "import re\n", "\n", "# Remove URL\n", "data['tweet'] = data['tweet'].apply(lambda x: re.sub(r'http\\S+', ' ', x))\n", "\n", "data.head()\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 707 }, "id": "_mzfkkOQxKwO", "outputId": "233547d2-2b00-49ed-d476-e9e36de7f8a1" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Unnamed: 0 majority_target \\\n", "0 0 True \n", "1 1 True \n", "2 2 True \n", "3 3 True \n", "4 4 True \n", "\n", " statement BinaryNumTarget \\\n", "0 End of eviction moratorium means millions of A... 1.0 \n", "1 End of eviction moratorium means millions of A... 1.0 \n", "2 End of eviction moratorium means millions of A... 1.0 \n", "3 End of eviction moratorium means millions of A... 1.0 \n", "4 End of eviction moratorium means millions of A... 1.0 \n", "\n", " tweet followers_count \\\n", "0 @POTUS Biden Blunders - 6 Month Update\\n\\nInfl... 4262.0 \n", "1 @S0SickRick @Stairmaster_ @6d6f636869 Not as m... 1393.0 \n", "2 THE SUPREME COURT is siding with super rich pr... 9.0 \n", "3 @POTUS Biden Blunders\\n\\nBroken campaign promi... 4262.0 \n", "4 @OhComfy I agree. The confluence of events rig... 70.0 \n", "\n", " friends_count favourites_count statuses_count listed_count ... \\\n", "0 3619.0 34945.0 16423.0 44.0 ... \n", "1 1621.0 31436.0 37184.0 64.0 ... \n", "2 84.0 219.0 1184.0 0.0 ... \n", "3 3619.0 34945.0 16423.0 44.0 ... \n", "4 166.0 15282.0 2194.0 0.0 ... \n", "\n", " determiners conjunctions dots exclamation questions ampersand \\\n", "0 0 0 5 0 1 0 \n", "1 0 2 1 0 0 0 \n", "2 0 1 0 0 0 0 \n", "3 0 1 3 0 0 1 \n", "4 0 1 3 0 1 0 \n", "\n", " capitals digits long_word_freq short_word_freq \n", "0 33 3 5 19 \n", "1 14 0 2 34 \n", "2 3 0 4 10 \n", "3 6 8 1 30 \n", "4 11 3 2 19 \n", "\n", "[5 rows x 64 columns]" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0majority_targetstatementBinaryNumTargettweetfollowers_countfriends_countfavourites_countstatuses_countlisted_count...determinersconjunctionsdotsexclamationquestionsampersandcapitalsdigitslong_word_freqshort_word_freq
00TrueEnd of eviction moratorium means millions of A...1.0@POTUS Biden Blunders - 6 Month Update\\n\\nInfl...4262.03619.034945.016423.044.0...005010333519
11TrueEnd of eviction moratorium means millions of A...1.0@S0SickRick @Stairmaster_ @6d6f636869 Not as m...1393.01621.031436.037184.064.0...021000140234
22TrueEnd of eviction moratorium means millions of A...1.0THE SUPREME COURT is siding with super rich pr...9.084.0219.01184.00.0...01000030410
33TrueEnd of eviction moratorium means millions of A...1.0@POTUS Biden Blunders\\n\\nBroken campaign promi...4262.03619.034945.016423.044.0...01300168130
44TrueEnd of eviction moratorium means millions of A...1.0@OhComfy I agree. The confluence of events rig...70.0166.015282.02194.00.0...013010113219
\n", "

5 rows × 64 columns

\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": "data" } }, "metadata": {}, "execution_count": 7 } ], "source": [ "# prompt: split contractions in the tweet texts\n", "\n", "# Split contractions in the tweet texts\n", "data['tweet'] = data['tweet'].apply(lambda x: re.sub(r\"can't\", \"cannot\", x))\n", "data['tweet'] = data['tweet'].apply(lambda x: re.sub(r\"n't\", \"not\", x))\n", "data['tweet'] = data['tweet'].apply(lambda x: re.sub(r\"i'm\", \"i am\", x))\n", "data['tweet'] = data['tweet'].apply(lambda x: re.sub(r\"I'm\", \"I am\", x))\n", "data['tweet'] = data['tweet'].apply(lambda x: re.sub(r\"'re\", \"are\", x))\n", "data['tweet'] = data['tweet'].apply(lambda x: re.sub(r\"'s\", \"is\", x))\n", "data['tweet'] = data['tweet'].apply(lambda x: re.sub(r\"'d\", \"would\", x))\n", "data['tweet'] = data['tweet'].apply(lambda x: re.sub(r\"'ll\", \"will\", x))\n", "data['tweet'] = data['tweet'].apply(lambda x: re.sub(r\"'ve\", \"have\", x))\n", "\n", "data.head()\n" ] }, { "cell_type": "markdown", "source": [ "# Training-Testing-Validation Splitting" ], "metadata": { "id": "SWGvbwHsCJgR" } }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3P9DYEq3y6pR", "outputId": "9feb4243-a9a7-41bf-a84d-6d0c823e8c8e" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "59105 1.0\n", "111976 0.0\n", "31253 1.0\n", "118328 0.0\n", "62880 1.0\n", "Name: BinaryNumTarget, dtype: float64" ] }, "metadata": {}, "execution_count": 8 } ], "source": [ "# Train-Validation-Test set split into 70:15:15 ratio\n", "# Train-Temp split\n", "train_text, temp_text, train_labels, temp_labels = train_test_split(data['tweet'], data['BinaryNumTarget'],\n", " random_state=2018,\n", " test_size=0.3,\n", " stratify=data['majority_target'])\n", "# Validation-Test split\n", "\n", "val_text, test_text, val_labels, test_labels = train_test_split(temp_text, temp_labels,\n", " random_state=2018,\n", " test_size=0.5,\n", " stratify=temp_labels)\n", "temp_labels.head()" ] }, { "cell_type": "markdown", "source": [ "# Bert Model" ], "metadata": { "id": "9DQnsDAUB_2h" } }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 177, "referenced_widgets": [ "74b2c16b3dd94af3a6394c71fe9d1d98", "3467cbed80734b45befed3d8867652a6", "ef11cdc5dea344759f9b0f78939c14d4", "55b4b9ea6dd34aecb7213964c47e250b", "5dec5fbe4ae941a581cea79167270bf6", "3085ba25f51f49ae95930564e2d54a0f", "1b4ec4fc682b488caee3ac9ef0b197cd", "c3d27b7643194755979e3b231a7c7359", "13a985113cb040b79027ed3b59ecfb51", "8041895128094c65b1e65760067bb5bd", "f8465e5d2654402fbf9aa789ee39948c", "42778e0f00ee4099845365a4129a9b07", "ee8a393f6f7a43c0af95f13bb1d8d1b4", "46a9f330d01b43ec9323b0866ef1960e", "f5ff7383a64b435096ebc0654c063311", "7ed0cdc589ab4bccb301a7ac2a4cacc6", "f76cc9fee554462992ae333536ac3e78", "9bc6e00fb6dc450e8643dd97bd093b2a", "7f76440815a94593ae2d93a87b418dad", "8a992dca377b4736970d717dd9e41e49", "2b72f679299d4049864f1daea16b9a77", "5589161d795941edb2fdb804bfd815b5", "b58b34df1fac4232b1a392fadabe3446", "0efb7ee658794030b36ca44d79d4b236", "d1eeefd866074f50be6ffd9d6a199d24", "e78ef5b5c8f149dabfd4fb1445251a88", "494b1cb203cf441b8eff14b64371213e", "87ed154eea034d2180ccd5bab5229155", "d599ca19c22943d6aecfeb13fc16f5de", "a1ade1b5205b429894d5374b29490bb8", "f3f2ec20971140b99c3be6bdf21ffa43", "af52e94cb5c446ca972b7a7837293b03", "d26f83118504442b8e8bdd7e33d30b03", "88439fa69b2d4b41a20dffe1c3c62258", "a64be3a4ebe34c0085c256c5dcaa2a09", "64b358189e6a4c47a622846aeb0c7566", "e9feed4a39f64631b2dfe746a583a03c", "1f77f1a77fa4486a937b3a33c994e348", "237c63d8f3cd4794a61ab360fff10ac2", "506133fbc79541d2936f8efc78dd7dde", "30c34b5a4eef43cda64fb5568cb7dc4f", "073eb0f4e8f440acadeb1a326a96a178", "9258c3a11e4b4c4b98e433d44cea9554", "3c32d976a9314b0bb6d74d5cf2488134", "a7e453f3b0494ba7a7ddbd703468b377", "a2f8e2390258408899d6ead630fe2037", "8951cf1b3ef24ce6bb857f70929444e1", "f776aaf69f1c452daf5b441b85aac33e", "12cc0ac549734af28451abb30e1cda83", "4b50bdc9ce454a3f914452480613bfe9", "5cdd170770a04b72af140314eb64b505", "6b711f56c8d549d1b11790071647c7ad", "99c9a4bc768e40a582bd73b88f21eb96", "28e9d0f866a1405d94f8c9b2a2f18490", "385c6ece940b42c8b53bf9a42775a1d7" ] }, "id": "hYWm8E3H1b9g", "outputId": "a808bf13-a91d-4b76-dd8e-38db46f49020" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "config.json: 0%| | 0.00/570 [00:00" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAGyCAYAAAAFw9vDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABFHElEQVR4nO3de1yUdd7/8fegA3gaSA2QWyVWTcU8uylpqYmQsd22untbuWZmeWu4JZSWd+UBNw9sZlqYd2XqPlY7uB22PBOeUhGVJE3NzNzw3gRbT3iEEa7fH/641gk0RoYZ4Ho9Hw8eOd/rO9d8ro+jvvte1zVjMwzDEAAAgIX5+boAAAAAXyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAy6vt6wKqg+LiYv34449q0KCBbDabr8sBAADlYBiGzp49q/DwcPn5/cIakOFDERERhqRSP0888YRhGIZx8eJF44knnjAaNmxo1KtXzxg0aJCRm5vrso8ffvjBuPfee406deoYN998s/HMM88YTqfTZc6GDRuMzp07G/7+/kaLFi2MRYsWuVXn0aNHy6yTH3744Ycffvip+j9Hjx79xX/rfbpCtHPnThUVFZmPv/76a/Xv31+///3vJUmJiYlauXKlli9frqCgII0dO1aDBg3S1q1bJUlFRUWKj49XWFiYtm3bpmPHjunhhx+W3W7X9OnTJUlHjhxRfHy8Ro8eraVLlyo9PV2PPfaYmjRpori4uHLV2aBBA0nS0aNH5XA4KnTMTqdT69atU2xsrOx2e4X2BfrpafTT8+ipZ9FPz6rp/czPz1ezZs3Mf8evx6eB6Oabb3Z5PHPmTLVo0UK9e/fWmTNntHDhQi1btkx33323JGnRokVq27attm/frh49emjdunXav3+/Pv/8c4WGhqpTp06aNm2ann32WU2ZMkX+/v5asGCBIiMjNXv2bElS27ZttWXLFs2ZM6fcgajkNJnD4fBIIKpbt64cDkeNfPN5G/30LPrpefTUs+inZ1mln+W53KXKXENUWFiov/71r0pKSpLNZlNWVpacTqdiYmLMOW3atFHz5s2VkZGhHj16KCMjQ+3bt1doaKg5Jy4uTmPGjNG+ffvUuXNnZWRkuOyjZM64ceOuWUtBQYEKCgrMx/n5+ZKuvHGcTmeFjrPk+RXdD66gn55FPz2PnnoW/fSsmt5Pd46rygSiTz75RKdPn9YjjzwiScrNzZW/v7+Cg4Nd5oWGhio3N9ecc3UYKtlesu16c/Lz83Xx4kXVqVOnVC0zZszQ1KlTS42vW7dOdevWvaHj+7m0tDSP7AdX0E/Pop+eR089i356Vk3t54ULF8o9t8oEooULF2rAgAEKDw/3dSmaOHGikpKSzMcl5yBjY2M9csosLS1N/fv3r9HLk95CPz2LfnoePfUs+ulZNb2fJWd4yqNKBKIffvhBn3/+uT766CNzLCwsTIWFhTp9+rTLKlFeXp7CwsLMOTt27HDZV15enrmt5L8lY1fPcTgcZa4OSVJAQIACAgJKjdvtdo+9YTy5L9BPT6OfnkdPPYt+elZN7ac7x1QlPphx0aJFCgkJUXx8vDnWtWtX2e12paenm2MHDx5UTk6OoqOjJUnR0dHau3evjh8/bs5JS0uTw+FQVFSUOefqfZTMKdkHAACAzwNRcXGxFi1apOHDh6t27X8vWAUFBWnkyJFKSkrShg0blJWVpREjRig6Olo9evSQJMXGxioqKkrDhg3TV199pbVr1+qFF15QQkKCucIzevRoff/995owYYK++eYbzZ8/Xx988IESExN9crwAAKDq8fkps88//1w5OTl69NFHS22bM2eO/Pz8NHjwYBUUFCguLk7z5883t9eqVUsrVqzQmDFjFB0drXr16mn48OFKTk4250RGRmrlypVKTEzU3Llz1bRpU7399tvlvuUeAADUfD4PRLGxsTIMo8xtgYGBSk1NVWpq6jWfHxERoVWrVl33Nfr06aPdu3dXqE4AAFBz+fyUGQAAgK8RiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOX5/HOIAFjPZy1alBq77/BhH1QCAFewQgQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACzP54Hon//8p/7whz+oUaNGqlOnjtq3b69du3aZ2w3D0KRJk9SkSRPVqVNHMTExOnTokMs+Tp48qaFDh8rhcCg4OFgjR47UuXPnXObs2bNHd955pwIDA9WsWTOlpKR45fgAAEDV59NAdOrUKfXs2VN2u12rV6/W/v37NXv2bN10003mnJSUFM2bN08LFixQZmam6tWrp7i4OF26dMmcM3ToUO3bt09paWlasWKFNm/erFGjRpnb8/PzFRsbq4iICGVlZenPf/6zpkyZojfffNOrxwsAAKqm2r588VmzZqlZs2ZatGiRORYZGWn+2jAMvfrqq3rhhRc0cOBASdJf/vIXhYaG6pNPPtEDDzygAwcOaM2aNdq5c6e6desmSXrttdd077336uWXX1Z4eLiWLl2qwsJCvfPOO/L391e7du2UnZ2tV155xSU4AQAAa/LpCtGnn36qbt266fe//71CQkLUuXNnvfXWW+b2I0eOKDc3VzExMeZYUFCQunfvroyMDElSRkaGgoODzTAkSTExMfLz81NmZqY556677pK/v785Jy4uTgcPHtSpU6cq+zABAEAV59MVou+//15vvPGGkpKS9D//8z/auXOnnnzySfn7+2v48OHKzc2VJIWGhro8LzQ01NyWm5urkJAQl+21a9dWw4YNXeZcvfJ09T5zc3NdTtFJUkFBgQoKCszH+fn5kiSn0ymn01mhYy55fkX3gyvop2d5q59GQMA1X7um4T3qWfTTs2p6P905Lp8GouLiYnXr1k3Tp0+XJHXu3Flff/21FixYoOHDh/usrhkzZmjq1KmlxtetW6e6det65DXS0tI8sh9cQT89q9L7OWNGqaFVq1ZV7mv6GO9Rz6KfnlVT+3nhwoVyz/VpIGrSpImioqJcxtq2basPP/xQkhQWFiZJysvLU5MmTcw5eXl56tSpkznn+PHjLvu4fPmyTp48aT4/LCxMeXl5LnNKHpfMudrEiROVlJRkPs7Pz1ezZs0UGxsrh8NxI4dqcjqdSktLU//+/WW32yu0L9BPT/NWP1d37FhqbMBXX1Xa6/kS71HPop+eVdP7WXKGpzx8Goh69uypgwcPuox9++23ioiIkHTlAuuwsDClp6ebASg/P1+ZmZkaM2aMJCk6OlqnT59WVlaWunbtKklav369iouL1b17d3PO888/L6fTaf6Gp6WlqXXr1qVOl0lSQECAAspY0rfb7R57w3hyX6CfnlbZ/bRddUr66tesyXiPehb99Kya2k93jsmnF1UnJiZq+/btmj59ur777jstW7ZMb775phISEiRJNptN48aN05/+9Cd9+umn2rt3rx5++GGFh4fr/vvvl3RlRemee+7R448/rh07dmjr1q0aO3asHnjgAYWHh0uSHnroIfn7+2vkyJHat2+f3n//fc2dO9dlFQgAAFiXT1eIfv3rX+vjjz/WxIkTlZycrMjISL366qsaOnSoOWfChAk6f/68Ro0apdOnT6tXr15as2aNAgMDzTlLly7V2LFj1a9fP/n5+Wnw4MGaN2+euT0oKEjr1q1TQkKCunbtqsaNG2vSpEnccg8AACT5OBBJ0m9+8xv95je/ueZ2m82m5ORkJScnX3NOw4YNtWzZsuu+TocOHfTFF1/ccJ0AAKDm8vlXdwAAAPgagQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFieTwPRlClTZLPZXH7atGljbr906ZISEhLUqFEj1a9fX4MHD1ZeXp7LPnJychQfH6+6desqJCRE48eP1+XLl13mbNy4UV26dFFAQIBatmypxYsXe+PwAABANeHzFaJ27drp2LFj5s+WLVvMbYmJifrss8+0fPlybdq0ST/++KMGDRpkbi8qKlJ8fLwKCwu1bds2LVmyRIsXL9akSZPMOUeOHFF8fLz69u2r7OxsjRs3To899pjWrl3r1eMEAABVV22fF1C7tsLCwkqNnzlzRgsXLtSyZct09913S5IWLVqktm3bavv27erRo4fWrVun/fv36/PPP1doaKg6deqkadOm6dlnn9WUKVPk7++vBQsWKDIyUrNnz5YktW3bVlu2bNGcOXMUFxfn1WMFAABVk89XiA4dOqTw8HD96le/0tChQ5WTkyNJysrKktPpVExMjDm3TZs2at68uTIyMiRJGRkZat++vUJDQ805cXFxys/P1759+8w5V++jZE7JPgAAAHy6QtS9e3ctXrxYrVu31rFjxzR16lTdeeed+vrrr5Wbmyt/f38FBwe7PCc0NFS5ubmSpNzcXJcwVLK9ZNv15uTn5+vixYuqU6dOqboKCgpUUFBgPs7Pz5ckOZ1OOZ3OCh1zyfMruh9cQT89y1v9NAICrvnaNQ3vUc+in55V0/vpznH5NBANGDDA/HWHDh3UvXt3RURE6IMPPigzqHjLjBkzNHXq1FLj69atU926dT3yGmlpaR7ZD66gn55V6f2cMaPU0KpVqyr3NX2M96hn0U/Pqqn9vHDhQrnn+vwaoqsFBwfr1ltv1Xfffaf+/fursLBQp0+fdlklysvLM685CgsL044dO1z2UXIX2tVzfn5nWl5enhwOxzVD18SJE5WUlGQ+zs/PV7NmzRQbGyuHw1GhY3Q6nUpLS1P//v1lt9srtC/QT0/zVj9Xd+xYamzAV19V2uv5Eu9Rz6KfnlXT+1lyhqc8qlQgOnfunA4fPqxhw4apa9eustvtSk9P1+DBgyVJBw8eVE5OjqKjoyVJ0dHReumll3T8+HGFhIRIupJyHQ6HoqKizDk//z/PtLQ0cx9lCQgIUEAZS/p2u91jbxhP7gv009Mqu5+2q05JX/2aNRnvUc+in55VU/vpzjH59KLqZ555Rps2bdI//vEPbdu2Tb/97W9Vq1YtPfjggwoKCtLIkSOVlJSkDRs2KCsrSyNGjFB0dLR69OghSYqNjVVUVJSGDRumr776SmvXrtULL7yghIQEM9CMHj1a33//vSZMmKBvvvlG8+fP1wcffKDExERfHjoAAKhCfLpC9H//93968MEHdeLECd18883q1auXtm/frptvvlmSNGfOHPn5+Wnw4MEqKChQXFyc5s+fbz6/Vq1aWrFihcaMGaPo6GjVq1dPw4cPV3JysjknMjJSK1euVGJioubOnaumTZvq7bff5pZ7AABg8mkgeu+99667PTAwUKmpqUpNTb3mnIiIiF+8GLNPnz7avXv3DdUIAABqPp9/DhEAAICvEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDluR2IlixZopUrV5qPJ0yYoODgYN1xxx364YcfPFocAACAN7gdiKZPn646depIkjIyMpSamqqUlBQ1btxYiYmJHi8QAACgstV29wlHjx5Vy5YtJUmffPKJBg8erFGjRqlnz57q06ePp+sDAACodG6vENWvX18nTpyQJK1bt079+/eXJAUGBurixYuerQ4AAMAL3F4h6t+/vx577DF17txZ3377re69915J0r59+3TLLbd4uj4AAIBK5/YKUWpqqqKjo/XTTz/pww8/VKNGjSRJWVlZevDBBz1eIAAAQGVze4UoPz9f8+bNk5+fa5aaMmWKjh496rHCAAAAvMXtFaLIyEj961//KjV+8uRJRUZGeqQoAAAAb3I7EBmGUeb4uXPnFBgYWOGCAAAAvK3cp8ySkpIkSTabTZMmTVLdunXNbUVFRcrMzFSnTp08XiAAAEBlK3cg2r17t6QrK0R79+6Vv7+/uc3f318dO3bUM8884/kKAQAAKlm5A9GGDRskSSNGjNDcuXPlcDgqrSgAAABvcvsaopSUlGuGob1791a4IAAAAG9zOxC1b9/e5ctdS7z88su6/fbbPVIUAACAN7kdiJKSkjR48GCNGTNGFy9e1D//+U/169dPKSkpWrZsWWXUCAAAUKncDkQTJkxQRkaGvvjiC3Xo0EEdOnRQQECA9uzZo9/+9reVUSMAAEClcjsQSVLLli1122236R//+Ify8/M1ZMgQhYWFebo2AAAAr3A7EG3dulUdOnTQoUOHtGfPHr3xxhv64x//qCFDhujUqVOVUSMAAEClcjsQ3X333RoyZIi2b9+utm3b6rHHHtPu3buVk5Oj9u3bV0aNAAAAlcrtL3ddt26devfu7TLWokULbd26VS+99JLHCgMAAPAWt1eISsLQd999p7Vr1+rixYuSrnylx4svvujZ6gAAALzA7UB04sQJ9evXT7feeqvuvfdeHTt2TJI0cuRIvroDAABUS24HosTERNntduXk5Lh8weuQIUO0evVqjxYHAADgDTd0DdHatWvVtGlTl/FWrVrphx9+8FhhAAAA3uL2CtH58+ddVoZKnDx5UgEBAR4pCgAAwJvcDkR33nmn/vKXv5iPbTabiouLlZKSor59+3q0OAAAAG9w+5RZSkqK+vXrp127dqmwsFATJkzQvn37dPLkSW3durUyagQAAKhUbq8Q3Xbb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lfHggw/66pAqHYHIi1577TWjefPmhr+/v3H77bcb27dv93VJ1YKkMn8WLVpkzrl48aLxxBNPGDfddJNRt25d47e//a1x7Ngx3xVdzfw8ENFP93322WfGbbfdZgQEBBht2rQx3nzzTZftxcXFxosvvmiEhoYaAQEBRr9+/YyDBw/6qNqqLT8/33jqqaeM5s2bG4GBgcavfvUr4/nnnzcKCgrMOfTz+jZs2FDm35vDhw83DKN8/Ttx4oTx4IMPGvXr1zccDocxYsQI4+zZsz44Gu+wGcZVH/0JAABgQVxDBAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABKBK+sc//iGbzabs7Gxfl2L65ptv1KNHDwUGBqpTp06+LqdMffr00bhx43xdBlDtEIgAlOmRRx6RzWbTzJkzXcY/+eQT2Ww2H1XlW5MnT1a9evV08OBBl++BKrFgwQI1aNBAly9fNsfOnTsnu92uPn36uMzduHGjbDabDh8+XNllAygHAhGAawoMDNSsWbN06tQpX5fiMYWFhTf83MOHD6tXr16KiIhQo0aNSm3v27evzp07p127dpljX3zxhcLCwpSZmalLly6Z4xs2bFDz5s3VokULt+swDMMldAGoOAIRgGuKiYlRWFiYZsyYcc05U6ZMKXX66NVXX9Utt9xiPn7kkUd0//33a/r06QoNDVVwcLCSk5N1+fJljR8/Xg0bNlTTpk21aNGiUvv/5ptvdMcddygwMFC33XabNm3a5LL966+/1oABA1S/fn2FhoZq2LBh+te//mVu79Onj8aOHatx48apcePGiouLK/M4iouLlZycrKZNmyogIECdOnXSmjVrzO02m01ZWVlKTk6WzWbTlClTSu2jdevWatKkiTZu3GiObdy4UQMHDlRkZKS2b9/uMt63b19JUkFBgZ588kmFhIQoMDBQvXr10s6dO13m2mw2rV69Wl27dlVAQIC2bNmi8+fP6+GHH1b9+vXVpEkTzZ49u1RN8+fPV6tWrRQYGKjQ0FD97ne/K/P4AasjEAG4plq1amn69Ol67bXX9H//938V2tf69ev1448/avPmzXrllVc0efJk/eY3v9FNN92kzMxMjR49Wv/93/9d6nXGjx+vp59+Wrt371Z0dLTuu+8+nThxQpJ0+vRp3X333ercubN27dqlNWvWKC8vT//1X//lso8lS5bI399fW7du1YIFC8qsb+7cuZo9e7Zefvll7dmzR3FxcfrP//xPHTp0SJJ07NgxtWvXTk8//bSOHTumZ555psz99O3bVxs2bDAfb9iwQX369FHv3r3N8YsXLyozM9MMRBMmTNCHH36oJUuW6Msvv1TLli0VFxenkydPuuz7ueee08yZM3XgwAF16NBB48eP16ZNm/T3v/9d69at08aNG/Xll1+a83ft2qUnn3xSycnJOnjwoNasWaO77rrrF3+vAEvy8ZfLAqiihg8fbgwcONAwDMPo0aOH8eijjxqGYRgff/yxcfVfHZMnTzY6duzo8tw5c+YYERERLvuKiIgwioqKzLHWrVsbd955p/n48uXLRr169Yx3333XMAzDOHLkiCHJmDlzpjnH6XQaTZs2NWbNmmUYhmFMmzbNiI2NdXnto0ePGpLMb+7u3bu30blz51883vDwcOOll15yGfv1r39tPPHEE+bjjh07GpMnT77uft566y2jXr16htPpNPLz843atWsbx48fN5YtW2bcddddhmEYRnp6uiHJ+OGHH4xz584ZdrvdWLp0qbmPwsJCIzw83EhJSTEM49/fXP7JJ5+Yc86ePWv4+/sbH3zwgTl24sQJo06dOsZTTz1lGIZhfPjhh4bD4TDy8/N/8fgBq2OFCMAvmjVrlpYsWaIDBw7c8D7atWsnP79//5UTGhqq9u3bm49r1aqlRo0a6fjx4y7Pi46ONn9du3ZtdevWzazjq6++0oYNG1S/fn3zp02bNpLkcrFy165dr1tbfn6+fvzxR/Xs2dNlvGfPnm4fc58+fXT+/Hnt3LlTX3zxhW699VbdfPPN6t27t3kd0caNG/WrX/1KzZs31+HDh+V0Ol1e22636/bbby/12t26dTN/ffjwYRUWFqp79+7mWMOGDdW6dWvzcf/+/RUREaFf/epXGjZsmJYuXaoLFy64dTyAVRCIAPyiu+66S3FxcZo4cWKpbX5+fjIMw2XM6XSWmme3210e22y2MseKi4vLXde5c+d03333KTs72+Xn0KFDLqeG6tWrV+59VlTLli3VtGlTbdiwQRs2bFDv3r0lSeHh4WrWrJm2bdumDRs26O6773Z73+4eR4MGDfTll1/q3XffVZMmTTRp0iR17NhRp0+fdvu1gZqOQASgXGbOnKnPPvtMGRkZLuM333yzcnNzXUKRJz876OoLkS9fvqysrCy1bdtWktSlSxft27dPt9xyi1q2bOny4054cDgcCg8P19atW13Gt27dqqioKLdr7tu3rzZu3KiNGze63G5/1113afXq1dqxY4d5/VCLFi3M65tKOJ1O7dy587qv3aJFC9ntdmVmZppjp06d0rfffusyr3bt2oqJiVFKSor27Nmjf/zjH1q/fr3bxwTUdLV9XQCA6qF9+/YaOnSo5s2b5zLep08f/fTTT0pJSdHvfvc7rVmzRqtXr5bD4fDI66ampqpVq1Zq27at5syZo1OnTunRRx+VJCUkJOitt97Sgw8+qAkTJqhhw4b67rvv9N577+ntt99WrVq1yv0648eP1+TJk9WiRQt16tRJixYtUnZ2tpYuXep2zX379lVCQoKcTqe5QiRJvXv31tixY1VYWGgGonr16mnMmDHm3XbNmzdXSkqKLly4oJEjR17zNerXr6+RI0dq/PjxatSokUJCQvT888+7nJZcsWKFvv/+e91111266aabtGrVKhUXF7ucVgNwBYEIQLklJyfr/fffdxlr27at5s+fr+nTp2vatGkaPHiwnnnmGb355pseec2ZM2dq5syZys7OVsuWLfXpp5+qcePGkmSu6jz77LOKjY1VQUGBIiIidM8997gEg/J48skndebMGT399NM6fvy4oqKi9Omnn6pVq1Zu19y3b19dvHhRbdq0UWhoqDneu3dvnT171rw9/+pjLC4u1rBhw3T27Fl169ZNa9eu1U033XTd1/nzn/9snjZs0KCBnn76aZ05c8bcHhwcrI8++khTpkzRpUuX1KpVK7377rtq166d28cE1HQ24+cn/wEAACyGa4gAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDl/T/PECu7rkxu7wAAAABJRU5ErkJggg==\n" }, "metadata": {} } ], "source": [ "# Plot histogram of the number of words in train data 'tweet'\n", "seq_len = [len(tweet.split()) for tweet in train_text]\n", "\n", "pd.Series(seq_len).hist(bins = 100,color='firebrick')\n", "plt.xlabel('Number of Words')\n", "plt.ylabel('Number of texts')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "id": "rfwINnZozkyd" }, "outputs": [], "source": [ "# Majority of titles above have word length under 60. So, we set max title length as 60\n", "MAX_LENGHT = 60\n", "# Tokenize and encode sequences in the train set\n", "tokens_train = tokenizer.batch_encode_plus(\n", " train_text.tolist(),\n", " max_length = MAX_LENGHT,\n", " pad_to_max_length=True,\n", " truncation=True\n", ")\n", "# tokenize and encode sequences in the validation set\n", "tokens_val = tokenizer.batch_encode_plus(\n", " val_text.tolist(),\n", " max_length = MAX_LENGHT,\n", " pad_to_max_length=True,\n", " truncation=True\n", ")\n", "# tokenize and encode sequences in the test set\n", "tokens_test = tokenizer.batch_encode_plus(\n", " test_text.tolist(),\n", " max_length = MAX_LENGHT,\n", " pad_to_max_length=True,\n", " truncation=True\n", ")" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "id": "jE9PI9_H0Moi" }, "outputs": [], "source": [ "# Convert lists to tensors\n", "train_seq = torch.tensor(tokens_train['input_ids'])\n", "train_mask = torch.tensor(tokens_train['attention_mask'])\n", "train_y = torch.tensor(train_labels.tolist())\n", "\n", "val_seq = torch.tensor(tokens_val['input_ids'])\n", "val_mask = torch.tensor(tokens_val['attention_mask'])\n", "val_y = torch.tensor(val_labels.tolist())\n", "\n", "test_seq = torch.tensor(tokens_test['input_ids'])\n", "test_mask = torch.tensor(tokens_test['attention_mask'])\n", "test_y = torch.tensor(test_labels.tolist())" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "id": "Oft-16jR0M6h" }, "outputs": [], "source": [ "# Data Loader structure definition\n", "from torch.utils.data import TensorDataset, DataLoader, RandomSampler, SequentialSampler\n", "batch_size = 32 #define a batch size\n", "\n", "train_data = TensorDataset(train_seq, train_mask, train_y) # wrap tensors\n", "train_sampler = RandomSampler(train_data) # sampler for sampling the data during training\n", "train_dataloader = DataLoader(train_data, sampler=train_sampler, batch_size=batch_size)\n", " # dataLoader for train set\n", "val_data = TensorDataset(val_seq, val_mask, val_y) # wrap tensors\n", "val_sampler = SequentialSampler(val_data) # sampler for sampling the data during training\n", "val_dataloader = DataLoader(val_data, sampler = val_sampler, batch_size=batch_size)\n", " # dataLoader for validation set" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "id": "dH-wI1yhzQkD" }, "outputs": [], "source": [ "# Freezing the parameters and defining trainable BERT structure\n", "for param in bert.parameters():\n", " param.requires_grad = False # false here means gradient need not be computed" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "id": "5oC6f5jD0vm0" }, "outputs": [], "source": [ "class BERT_Arch(nn.Module):\n", " def __init__(self, bert):\n", " super(BERT_Arch, self).__init__()\n", " self.bert = bert\n", " self.dropout = nn.Dropout(0.1) # dropout layer\n", " self.relu = nn.ReLU() # relu activation function\n", " self.fc1 = nn.Linear(768,512) # dense layer 1\n", " self.fc2 = nn.Linear(512,2) # dense layer 2 (Output layer)\n", " self.softmax = nn.LogSoftmax(dim=1) # softmax activation function\n", " def forward(self, sent_id, mask): # define the forward pass\n", " cls_hs = self.bert(sent_id, attention_mask=mask)['pooler_output']\n", " # pass the inputs to the model\n", " x = self.fc1(cls_hs)\n", " x = self.relu(x)\n", " x = self.dropout(x)\n", " x = self.fc2(x) # output layer\n", " x = self.softmax(x) # apply softmax activation\n", " return x\n", "\n", "model = BERT_Arch(bert)\n", "# Defining the hyperparameters (optimizer, weights of the classes and the epochs)\n", "# Define the optimizer\n", "from transformers import AdamW\n", "optimizer = AdamW(model.parameters(),\n", " lr = 1e-5) # learning rate\n", "# Define the loss function\n", "#cross_entropy = nn.NLLLoss()\n", "cross_entropy = torch.nn.NLLLoss()\n", "# Number of training epochs\n", "epochs = 2" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "id": "BEG81NvL1Rt9" }, "outputs": [], "source": [ "# Defining training and evaluation functions\n", "def train():\n", " model.train()\n", " total_loss, total_accuracy = 0, 0\n", "\n", " for step,batch in enumerate(train_dataloader): # iterate over batches\n", " if step % 50 == 0 and not step == 0: # progress update after every 50 batches.\n", " print(' Batch {:>5,} of {:>5,}.'.format(step, len(train_dataloader)))\n", " batch = [r for r in batch] # push the batch to gpu\n", " sent_id, mask, labels = batch\n", " model.zero_grad() # clear previously calculated gradients\n", " preds = model(sent_id, mask)\n", " labels = torch.tensor(labels, dtype=torch.long) # get model predictions for current batch\n", " loss = cross_entropy(preds, labels) # compute loss between actual & predicted values\n", " total_loss = total_loss + loss.item() # add on to the total loss\n", " loss.backward() # backward pass to calculate the gradients\n", " torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0) # clip gradients to 1.0. It helps in preventing exploding gradient problem\n", " optimizer.step() # update parameters\n", " preds=preds.detach().cpu().numpy() # model predictions are stored on GPU. So, push it to CPU\n", "\n", " avg_loss = total_loss / len(train_dataloader) # compute training loss of the epoch\n", " # reshape predictions in form of (# samples, # classes)\n", " return avg_loss # returns the loss and predictions\n", "\n", "def evaluate():\n", " print(\"\\nEvaluating...\")\n", " model.eval() # Deactivate dropout layers\n", "\n", " total_loss, total_accuracy = 0, 0\n", " for step, batch in enumerate(val_dataloader): # Iterate over batches\n", " if step % 50 == 0 and not step == 0:\n", " # Progress update every 50 batches.\n", " # Elapsed = format_time(time.time() - t0)\n", " print(' Batch {:>5,} of {:>5,}.'.format(step, len(val_dataloader)))\n", " # Report progress\n", "\n", " batch = [t for t in batch] # Push the batch to GPU\n", " sent_id, mask, labels = batch\n", "\n", " with torch.no_grad(): # Deactivate autograd\n", " preds = model(sent_id, mask) # Model predictions\n", "\n", " # Convert labels to long tensors if necessary (assuming labels are currently not long tensors)\n", " if not isinstance(labels, torch.LongTensor):\n", " labels = labels.long()\n", "\n", " loss = cross_entropy(preds, labels) # Compute the validation loss\n", "\n", " total_loss += loss.item()\n", " preds = preds.detach().cpu().numpy()\n", "\n", " avg_loss = total_loss / len(val_dataloader) # Compute the validation loss of the epoch\n", " return avg_loss\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "mSZirgun6IhE" }, "outputs": [], "source": [ "# Train and predict\n", "best_valid_loss = float('inf')\n", "train_losses=[] # empty lists to store training and validation loss of each epoch\n", "valid_losses=[]\n", "\n", "for epoch in range(epochs):\n", " print('\\n Epoch {:} / {:}'.format(epoch + 1, epochs))\n", " train_loss = train() # train model\n", " valid_loss = evaluate() # evaluate model\n", " if valid_loss < best_valid_loss: # save the best model\n", " best_valid_loss = valid_loss\n", " torch.save(model.state_dict(), 'c2_new_models2_weights.pt')\n", " train_losses.append(train_loss) # append training and validation loss\n", " valid_losses.append(valid_loss)\n", "\n", " print(f'\\nTraining Loss: {train_loss:.3f}')\n", " print(f'Validation Loss: {valid_loss:.3f}')" ] }, { "cell_type": "code", "source": [ "import torch\n", "\n", "# Define the model (make sure to define your model class if it's custom)\n", "model = BERT_Arch(bert)\n", "\n", "# Save the state dictionary\n", "torch.save(model.state_dict(), '/content/drive/MyDrive/Colab_Notebooks/c2_new_models2_weights.pt')\n" ], "metadata": { "id": "iaLMS0CD8uOb" }, "execution_count": 26, "outputs": [] }, { "cell_type": "markdown", "source": [ "# Prediction Using Unseen Data" ], "metadata": { "id": "l3U9YMtJBsRF" } }, { "cell_type": "code", "execution_count": 36, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "bSlnjFvqa4CD", "outputId": "95c92ac8-e88d-4435-be83-18a77549c592" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "The prediction for the test example is: Fake\n" ] } ], "source": [ "import joblib\n", "import torch\n", "from transformers import BertTokenizer\n", "\n", "# Load the tokenizer and the model\n", "tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')\n", "joblib.dump([model, bert], '/content/drive/MyDrive/Colab_Notebooks/c2_new_models2_weights.pt')\n", "\n", "def predict_fake_news(text):\n", " # Tokenize and encode sequences\n", " inputs = tokenizer.encode_plus(\n", " text,\n", " max_length=60,\n", " pad_to_max_length=True,\n", " truncation=True,\n", " return_tensors=\"pt\"\n", " )\n", "\n", " input_ids = inputs['input_ids']\n", " attention_mask = inputs['attention_mask']\n", "\n", " # Make prediction\n", " model.eval() # Ensure the model is in evaluation mode\n", " with torch.no_grad():\n", " outputs = model(input_ids, attention_mask)\n", "\n", " # Access the logits directly from the outputs Tensor\n", " logits = outputs[0] # Assuming logits are the first element in the output tuple\n", "\n", " # Get the prediction using argmax\n", " prediction = torch.argmax(logits).item()\n", "\n", " # Map prediction to label\n", " label_map = {0: 'Real', 1: 'Fake'}\n", " return label_map[prediction]\n", "\n", "# Test the model with a sample example\n", "test_example = \"Donald Trump Sends Out Embarrassing New Year’s Eve Message; This is Disturbing\"\n", "prediction = predict_fake_news(test_example)\n", "print(f'The prediction for the test example is: {prediction}')" ] }, { "cell_type": "markdown", "source": [ "# Bi-LSTM Model" ], "metadata": { "id": "9o8UNQExBYos" } }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "JwkfdQa7a505" }, "outputs": [], "source": [ "print(data.columns.tolist())" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "vfyQ6_GAJf2y" }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "from sklearn.model_selection import train_test_split\n", "from tensorflow.keras.preprocessing.text import Tokenizer\n", "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", "\n", "# Assuming your dataset is in a DataFrame called `data`\n", "features = ['cred', 'BotScore', 'tweet']\n", "target = 'BinaryNumTarget'\n", "\n", "# Splitting the dataset into features and target\n", "X = data[features]\n", "y = data[target]\n", "\n", "# Further splitting into training, validation, and test sets (70:15:15)\n", "train_data, temp_data, train_labels, temp_labels = train_test_split(X, y, test_size=0.3, stratify=y, random_state=2018)\n", "val_data, test_data, val_labels, test_labels = train_test_split(temp_data, temp_labels, test_size=0.5, stratify=temp_labels, random_state=2018)\n", "\n", "# Tokenize and pad tweet texts for Bi-LSTM and CNN models\n", "tokenizer = Tokenizer(num_words=10000)\n", "tokenizer.fit_on_texts(train_data['tweet'])\n", "train_sequences = tokenizer.texts_to_sequences(train_data['tweet'])\n", "val_sequences = tokenizer.texts_to_sequences(val_data['tweet'])\n", "test_sequences = tokenizer.texts_to_sequences(test_data['tweet'])\n", "\n", "max_sequence_length = 100\n", "train_padded = pad_sequences(train_sequences, maxlen=max_sequence_length)\n", "val_padded = pad_sequences(val_sequences, maxlen=max_sequence_length)\n", "test_padded = pad_sequences(test_sequences, maxlen=max_sequence_length)\n", "\n", "# Combine text sequences with other features\n", "train_features = np.hstack((train_data[['cred', 'BotScore']].values, train_padded))\n", "val_features = np.hstack((val_data[['cred', 'BotScore']].values, val_padded))\n", "test_features = np.hstack((test_data[['cred', 'BotScore']].values, test_padded))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 373 }, "id": "TjsnxCPrpIAW", "outputId": "35a0e7b2-9cb7-4da9-f05f-ee1158a5a808" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/5\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;31m# Compile and train Bi-LSTM model\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0mbi_lstm_model\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moptimizer\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'adam'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mloss\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'binary_crossentropy'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmetrics\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'accuracy'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mbi_lstm_model\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain_padded\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtrain_labels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mepochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m32\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalidation_data\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mval_padded\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mval_labels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/keras/src/utils/traceback_utils.py\u001b[0m in \u001b[0;36merror_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[0mfiltered_tb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 64\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 65\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 66\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 67\u001b[0m \u001b[0mfiltered_tb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_process_traceback_frames\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__traceback__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/keras/src/engine/training.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)\u001b[0m\n\u001b[1;32m 1805\u001b[0m ):\n\u001b[1;32m 1806\u001b[0m \u001b[0mcallbacks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mon_train_batch_begin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1807\u001b[0;31m \u001b[0mtmp_logs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1808\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdata_handler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshould_sync\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1809\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masync_wait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/tensorflow/python/util/traceback_utils.py\u001b[0m in \u001b[0;36merror_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 148\u001b[0m \u001b[0mfiltered_tb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 149\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 150\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 151\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 152\u001b[0m \u001b[0mfiltered_tb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_process_traceback_frames\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__traceback__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/tensorflow/python/eager/polymorphic_function/polymorphic_function.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 830\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 831\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mOptionalXlaContext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_jit_compile\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 832\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 833\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 834\u001b[0m \u001b[0mnew_tracing_count\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexperimental_get_tracing_count\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/tensorflow/python/eager/polymorphic_function/polymorphic_function.py\u001b[0m in \u001b[0;36m_call\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 903\u001b[0m \u001b[0;31m# Lifting succeeded, so variables are initialized and we can run the\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 904\u001b[0m \u001b[0;31m# no_variable_creation function.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 905\u001b[0;31m return tracing_compilation.call_function(\n\u001b[0m\u001b[1;32m 906\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_no_variable_creation_config\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 907\u001b[0m )\n", "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/tensorflow/python/eager/polymorphic_function/tracing_compilation.py\u001b[0m in \u001b[0;36mcall_function\u001b[0;34m(args, kwargs, tracing_options)\u001b[0m\n\u001b[1;32m 137\u001b[0m \u001b[0mbound_args\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunction_type\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbind\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 138\u001b[0m \u001b[0mflat_inputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunction_type\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munpack_inputs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbound_args\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 139\u001b[0;31m return function._call_flat( # pylint: disable=protected-access\n\u001b[0m\u001b[1;32m 140\u001b[0m \u001b[0mflat_inputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcaptured_inputs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfunction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcaptured_inputs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 141\u001b[0m )\n", "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/tensorflow/python/eager/polymorphic_function/concrete_function.py\u001b[0m in \u001b[0;36m_call_flat\u001b[0;34m(self, tensor_inputs, captured_inputs)\u001b[0m\n\u001b[1;32m 1321\u001b[0m and executing_eagerly):\n\u001b[1;32m 1322\u001b[0m \u001b[0;31m# No tape is watching; skip to running the function.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1323\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_inference_function\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcall_preflattened\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1324\u001b[0m forward_backward = self._select_forward_and_backward_functions(\n\u001b[1;32m 1325\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/tensorflow/python/eager/polymorphic_function/atomic_function.py\u001b[0m in \u001b[0;36mcall_preflattened\u001b[0;34m(self, args)\u001b[0m\n\u001b[1;32m 214\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcall_preflattened\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mSequence\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTensor\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mAny\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;34m\"\"\"Calls with flattened tensor inputs and returns the structured output.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 216\u001b[0;31m \u001b[0mflat_outputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcall_flat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 217\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunction_type\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpack_output\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mflat_outputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/tensorflow/python/eager/polymorphic_function/atomic_function.py\u001b[0m in \u001b[0;36mcall_flat\u001b[0;34m(self, *args)\u001b[0m\n\u001b[1;32m 249\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mrecord\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstop_recording\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 250\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_bound_context\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecuting_eagerly\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 251\u001b[0;31m outputs = self._bound_context.call_function(\n\u001b[0m\u001b[1;32m 252\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 253\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/tensorflow/python/eager/context.py\u001b[0m in \u001b[0;36mcall_function\u001b[0;34m(self, name, tensor_inputs, num_outputs)\u001b[0m\n\u001b[1;32m 1484\u001b[0m \u001b[0mcancellation_context\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcancellation\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1485\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcancellation_context\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1486\u001b[0;31m outputs = execute.execute(\n\u001b[0m\u001b[1;32m 1487\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"utf-8\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1488\u001b[0m \u001b[0mnum_outputs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnum_outputs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/tensorflow/python/eager/execute.py\u001b[0m in \u001b[0;36mquick_execute\u001b[0;34m(op_name, num_outputs, inputs, attrs, ctx, name)\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 52\u001b[0m \u001b[0mctx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mensure_initialized\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 53\u001b[0;31m tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,\n\u001b[0m\u001b[1;32m 54\u001b[0m inputs, attrs, num_outputs)\n\u001b[1;32m 55\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NotOkStatusException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Embedding, LSTM, Dense, Dropout\n", "\n", "# Define Bi-LSTM model\n", "bi_lstm_model = Sequential()\n", "bi_lstm_model.add(Embedding(input_dim=10000, output_dim=128, input_length=max_sequence_length))\n", "bi_lstm_model.add(LSTM(128, return_sequences=True))\n", "bi_lstm_model.add(LSTM(64))\n", "bi_lstm_model.add(Dropout(0.5))\n", "bi_lstm_model.add(Dense(1, activation='sigmoid'))\n", "\n", "# Compile and train Bi-LSTM model\n", "bi_lstm_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n", "bi_lstm_model.fit(train_padded, train_labels, epochs=5, batch_size=32, validation_data=(val_padded, val_labels))" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 748 }, "id": "IBAPtxWr3yKz", "outputId": "81c00575-cacc-4b52-ab0d-a6cce01767e3" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "630/630 [==============================] - 4s 5ms/step\n", "Accuracy: 0.9805\n", "F1 Score: 0.9811\n", "Recall: 0.9873\n", "Precision: 0.9750\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": {} } ], "source": [ "# prompt: Write a code to evaluate the performance of the saved model above based on accuracy, f1-score, recall and precision parameters in 4 decimal places. Add a confusion matrix to it. let the confusion matrix highlight percentage in addition to values\n", "\n", "import numpy as np\n", "from sklearn.metrics import accuracy_score, f1_score, recall_score, precision_score, confusion_matrix\n", "import seaborn as sns\n", "\n", "# Load the saved model\n", "model = tf.keras.models.load_model('/content/drive/MyDrive/Colab_Notebooks/Bi-LSTM-Model-1.h5')\n", "\n", "# Predict on the test data\n", "predictions = model.predict(test_padded)\n", "predicted_labels = np.round(predictions)\n", "\n", "# Calculate the performance metrics\n", "accuracy = accuracy_score(test_labels, predicted_labels)\n", "f1_score = f1_score(test_labels, predicted_labels)\n", "recall = recall_score(test_labels, predicted_labels)\n", "precision = precision_score(test_labels, predicted_labels)\n", "\n", "# Print the performance metrics\n", "print(f'Accuracy: {accuracy:.4f}')\n", "print(f'F1 Score: {f1_score:.4f}')\n", "print(f'Recall: {recall:.4f}')\n", "print(f'Precision: {precision:.4f}')\n", "\n", "# Create a confusion matrix\n", "cm = confusion_matrix(test_labels, predicted_labels)\n", "\n", "# Normalize the confusion matrix by row (true labels)\n", "cm_normalized = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n", "\n", "# Create annotations with both counts and percentages\n", "annot = np.empty_like(cm).astype(str)\n", "nrows, ncols = cm.shape\n", "for i in range(nrows):\n", " for j in range(ncols):\n", " c = cm[i, j]\n", " p = cm_normalized[i, j]\n", " s = f'{c}\\n({p:.2%})'\n", " annot[i, j] = s\n", "\n", "# Plot the confusion matrix with annotations\n", "plt.figure(figsize=(10, 7))\n", "ax = sns.heatmap(cm_normalized, annot=annot, fmt='', cmap='Blues', cbar=False)\n", "\n", "ax.set_xlabel('Predicted labels')\n", "ax.set_ylabel('True labels')\n", "ax.set_title('Confusion Matrix')\n", "\n", "# Adjust tick labels based on the shape of the confusion matrix\n", "class_names = ['Class {}'.format(i) for i in range(cm.shape[0])]\n", "ax.xaxis.set_ticklabels(class_names)\n", "ax.yaxis.set_ticklabels(class_names)\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "source": [ "# CNN Model" ], "metadata": { "id": "qQWYo9voBOS-" } }, { "cell_type": "code", "execution_count": 33, "metadata": { "id": "5srutGy9ZplO", "colab": { "base_uri": "https://localhost:8080/", "height": 349 }, "outputId": "c4c4e1de-4788-4855-f42d-a06e03facc36" }, "outputs": [ { "output_type": "error", "ename": "KeyboardInterrupt", "evalue": "", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0;31m# Tokenize and pad tweet texts for Bi-LSTM and CNN models\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0mtokenizer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTokenizer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnum_words\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m10000\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 23\u001b[0;31m \u001b[0mtokenizer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit_on_texts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain_data\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'tweet'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 24\u001b[0m \u001b[0mtrain_sequences\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtokenizer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtexts_to_sequences\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain_data\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'tweet'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0mval_sequences\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtokenizer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtexts_to_sequences\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mval_data\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'tweet'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/keras/src/preprocessing/text.py\u001b[0m in \u001b[0;36mfit_on_texts\u001b[0;34m(self, texts)\u001b[0m\n\u001b[1;32m 301\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mw\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mseq\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 302\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mw\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mword_counts\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 303\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mword_counts\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 304\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 305\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mword_counts\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "#CNN Model\n", "\n", "import numpy as np\n", "import pandas as pd\n", "from sklearn.model_selection import train_test_split\n", "from tensorflow.keras.preprocessing.text import Tokenizer\n", "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", "\n", "# Assuming your dataset is in a DataFrame called `data`\n", "features = ['cred', 'BotScore', 'tweet']\n", "target = 'BinaryNumTarget'\n", "\n", "# Splitting the dataset into features and target\n", "X = data[features]\n", "y = data[target]\n", "\n", "# Further splitting into training, validation, and test sets (70:15:15)\n", "train_data, temp_data, train_labels, temp_labels = train_test_split(X, y, test_size=0.3, stratify=y, random_state=2018)\n", "val_data, test_data, val_labels, test_labels = train_test_split(temp_data, temp_labels, test_size=0.5, stratify=temp_labels, random_state=2018)\n", "\n", "# Tokenize and pad tweet texts for Bi-LSTM and CNN models\n", "tokenizer = Tokenizer(num_words=10000)\n", "tokenizer.fit_on_texts(train_data['tweet'])\n", "train_sequences = tokenizer.texts_to_sequences(train_data['tweet'])\n", "val_sequences = tokenizer.texts_to_sequences(val_data['tweet'])\n", "test_sequences = tokenizer.texts_to_sequences(test_data['tweet'])\n", "\n", "max_sequence_length = 100\n", "train_padded = pad_sequences(train_sequences, maxlen=max_sequence_length)\n", "val_padded = pad_sequences(val_sequences, maxlen=max_sequence_length)\n", "test_padded = pad_sequences(test_sequences, maxlen=max_sequence_length)\n", "\n", "# Combine text sequences with other features\n", "train_features = np.hstack((train_data[['cred', 'BotScore']].values, train_padded))\n", "val_features = np.hstack((val_data[['cred', 'BotScore']].values, val_padded))\n", "test_features = np.hstack((test_data[['cred', 'BotScore']].values, test_padded))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Af_3bfeXnkbZ" }, "outputs": [], "source": [ "\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Embedding, Dense, Dropout\n", "from tensorflow.keras.layers import Conv1D, MaxPooling1D, Flatten\n", "\n", "# Define CNN model\n", "cnn_model = Sequential()\n", "cnn_model.add(Embedding(input_dim=10000, output_dim=128, input_length=max_sequence_length))\n", "cnn_model.add(Conv1D(128, kernel_size=5, activation='relu'))\n", "cnn_model.add(MaxPooling1D(pool_size=2))\n", "cnn_model.add(Flatten())\n", "cnn_model.add(Dropout(0.5))\n", "cnn_model.add(Dense(1, activation='sigmoid'))\n", "# Compile and train CNN model\n", "cnn_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n", "cnn_model.fit(train_padded, train_labels, epochs=5, batch_size=32, validation_data=(val_padded, val_labels))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "3iy50OM31iU8" }, "outputs": [], "source": [ "# prompt: Write a code to evaluate the performance of the saved model above based on accuracy, f1-score, recall and precision parameters in 4 decimal places. Add a confusion matrix to it. let the confusion matrix highlight percentage in addition to values\n", "\n", "import numpy as np\n", "from sklearn.metrics import accuracy_score, f1_score, recall_score, precision_score, confusion_matrix\n", "import seaborn as sns\n", "\n", "# Load the saved model\n", "model = tf.keras.models.load_model('CNN-Model-1.h5')\n", "\n", "# Predict on the test data\n", "predictions = model.predict(test_padded)\n", "predicted_labels = np.round(predictions)\n", "\n", "# Calculate the performance metrics\n", "accuracy = accuracy_score(test_labels, predicted_labels)\n", "f1_score = f1_score(test_labels, predicted_labels)\n", "recall = recall_score(test_labels, predicted_labels)\n", "precision = precision_score(test_labels, predicted_labels)\n", "\n", "# Print the performance metrics\n", "print(f'Accuracy: {accuracy:.4f}')\n", "print(f'F1 Score: {f1_score:.4f}')\n", "print(f'Recall: {recall:.4f}')\n", "print(f'Precision: {precision:.4f}')\n", "\n", "# Create a confusion matrix\n", "cm = confusion_matrix(test_labels, predicted_labels)\n", "\n", "# Normalize the confusion matrix by row (true labels)\n", "cm_normalized = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n", "\n", "# Create annotations with both counts and percentages\n", "annot = np.empty_like(cm).astype(str)\n", "nrows, ncols = cm.shape\n", "for i in range(nrows):\n", " for j in range(ncols):\n", " c = cm[i, j]\n", " p = cm_normalized[i, j]\n", " s = f'{c}\\n({p:.2%})'\n", " annot[i, j] = s\n", "\n", "# Plot the confusion matrix with annotations\n", "plt.figure(figsize=(10, 7))\n", "ax = sns.heatmap(cm_normalized, annot=annot, fmt='', cmap='Blues', cbar=False)\n", "\n", "ax.set_xlabel('Predicted labels')\n", "ax.set_ylabel('True labels')\n", "ax.set_title('Confusion Matrix')\n", "\n", "# Adjust tick labels based on the shape of the confusion matrix\n", "class_names = ['Class {}'.format(i) for i in range(cm.shape[0])]\n", "ax.xaxis.set_ticklabels(class_names)\n", "ax.yaxis.set_ticklabels(class_names)\n", "\n", "plt.show()\n" ] }, { "cell_type": "markdown", "source": [ "# Ensemble Model" ], "metadata": { "id": "TG5m9sUvAyHb" } }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "background_save": true, "base_uri": "https://localhost:8080/" }, "id": "hMh-Ui3N2YVO", "outputId": "c0ba32a7-541c-4c9b-9c78-bb507e2cf716" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/5\n", "2936/2936 [==============================] - 1159s 389ms/step - loss: 0.3232 - accuracy: 0.9037 - val_loss: 0.1407 - val_accuracy: 0.9787\n", "Epoch 2/5\n", "2936/2936 [==============================] - 1130s 385ms/step - loss: 0.0648 - accuracy: 0.9944 - val_loss: 0.0722 - val_accuracy: 0.9824\n", "Epoch 3/5\n", "2936/2936 [==============================] - 1112s 379ms/step - loss: 0.0204 - accuracy: 0.9981 - val_loss: 0.0620 - val_accuracy: 0.9831\n", "Epoch 4/5\n", "2936/2936 [==============================] - 1086s 370ms/step - loss: 0.0100 - accuracy: 0.9981 - val_loss: 0.0663 - val_accuracy: 0.9820\n", "Epoch 5/5\n", "2936/2936 [==============================] - 1095s 373ms/step - loss: 0.0055 - accuracy: 0.9988 - val_loss: 0.0697 - val_accuracy: 0.9821\n" ] } ], "source": [ "# prompt: Generate an ensemble model for combining only BiLSTM and CNN for training and evaluation from saved file\n", "\n", "import tensorflow as tf\n", "from tensorflow.keras.models import Model\n", "from tensorflow.keras.layers import Input, Concatenate, Dense, GlobalAveragePooling1D\n", "\n", "# Define input layers for each model\n", "input_bilstm = Input(shape=(100,), name='input_bilstm')\n", "input_cnn = Input(shape=(100,), name='input_cnn')\n", "\n", "# Load the saved models\n", "bilstm_model = tf.keras.models.load_model('/content/drive/MyDrive/Colab_Notebooks/Bi-LSTM-Model-1.h5')\n", "cnn_model = tf.keras.models.load_model('/content/drive/MyDrive/Colab_Notebooks/CNN-Model-1.h5')\n", "\n", "# Get outputs from each model\n", "bilstm_output = bilstm_model(input_bilstm)\n", "cnn_output = cnn_model(input_cnn)\n", "\n", "# Concatenate the outputs\n", "ensemble_output = Concatenate()([bilstm_output, cnn_output])\n", "\n", "# Add a dense layer with sigmoid activation\n", "ensemble_output = Dense(1, activation='sigmoid')(ensemble_output)\n", "\n", "# Define the ensemble model\n", "ensemble_model = Model(inputs=[input_bilstm, input_cnn], outputs=ensemble_output)\n", "\n", "# Compile the model\n", "ensemble_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n", "\n", "# Train the model\n", "ensemble_model.fit([train_padded, train_padded], train_labels, epochs=5, batch_size=32, validation_data=([val_padded, val_padded], val_labels))\n", "\n", "# Save the model\n", "ensemble_model.save('/content/drive/MyDrive/Colab_Notebooks/ensemble_model_bilstm_cnn.h5')\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 659 }, "id": "mEMr7onjtKEd", "outputId": "e6a12422-24cf-4a9d-b1d1-756120cc3137" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "630/630 [==============================] - 6s 8ms/step\n", "Accuracy: 0.9824\n", "F1 Score: 0.9828\n", "Recall: 0.9814\n", "Precision: 0.9842\n" ] }, { "data": { "image/png": "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ys/PTwsXLlT27Nlj9cuRI4dSpkyp2bNny83NTa6uripdurSyZcuWoLq2bt2qr776SkOHDrUuH/7999+rcuXKGjx4sMaPH5+g8QDALJgxAoA3SP369XX06FG9//77WrVqlbp27ap+/fopKChIkyZN0vTp061958yZo+HDh2vfvn367LPPtHXrVvXv31+LFi1K1JpSp06tFStWKHny5Orbt6/mz5+vsWPH6t13341Te5YsWTR37lx17dpVM2fOVMWKFbV161Z5eHg8dfxq1app/fr1Sp06tYYMGaKJEyfq7bff1q5duxIcKpLCgAED1KtXL23YsEGffvqpDh48qLVr1ypz5syx+jk6Omr+/Pmyt7fXxx9/rObNm+v3339P0LHu3r2rjz76SEWLFtXAgQOt7RUqVNCnn36qSZMm6Y8//kiU8wKAN43FSMjdpgAAAADwBmLGCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpOdi6gKSQrGg3W5cAAHgF3No3w9YlAABszCWeiYcZIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACm52DLgz98+FArV67Unj17dOXKFUlS+vTpVbZsWTVo0EBOTk62LA8AAACASdhsxujMmTPKly+ffH19dejQIcXExCgmJkaHDh1S69atlT9/fp05c8ZW5QEAAAAwEYthGIYtDly9enW5urpqwYIFcnd3j7Xtzp07at26tcLCwrRhw4YEj52saLfEKhMA8Bq7tW+GrUsAANiYSzyvkbPZpXS7du3Sn3/+GScUSZK7u7tGjhyp0qVL26AyAAAAAGZjs0vpUqZMqaCgoKduDwoKUsqUKV9aPQAAAADMy2YzRu3bt1fr1q01ePBgVa1aVenSpZMkhYSEaMuWLRo1apQ++eQTW5UHAAAAwERsdo+RJH3xxReaNm2arly5IovFIkkyDEPp06fXZ599pr59+z7XuNxjBACQuMcIABD/e4xsGoweCwwMjLVcd7Zs2V5oPIIRAEAiGAEAXoPFF/4pW7ZsLxyGAAAAAOB5vRLBCEBcKZI7a2iXeqr/TmGl8UyhIycvqPf4pTpwPNjaJ0+2dBr1aUNVKJZTDg52OhFwRc17z9H5K7fk6Z5cgzvXVdW38ypzek9dv3VPq7cd1fCv1ujOvXDrGMV9smhk9wYq6pNZhiHt/+ucBk5bKb9TF21x2gCAZziwf5/mzf1O/sf/0rVr1zRl+ky9U7VarD4BZ89q6uQJOrB/n6Kio5Ujew5NmvqlvDJkkCSNGDZEe//YrWtXryp58uQqXKSoPuvZW9my57DFKQGvBIIR8IqaNaSFfHJm0EeD5uvytVA1r1NKa2d/omLvjdKla6HKluktbZnbU/NX7taoWWt15364fHJ4KTwiUpLklcZDXmk81H/KCvkHXFEWr1T6cmAzeaXxUIs+30mSXJM5adXMrlr7u58+HbtYDvZ2Gty5rn6Z2VW5ag9SVFSMLd8CAMAThIU9UJ48edSw8Xvq+Wnc2wfOBwerzYct1Kjxe+rcrbtSuKbQ2TOn5eTsbO3j45Nfdeu9q/ReXroTGqpZM7/Uxx3aad3GLbK3t3+ZpwO8Ml6Je4wSG/cY4XXn4uyoazsn6oMe32j9zmPW9l0L+2rjruMa/tUaLRjXVpGR0Wo3eEG8x21crajmjm6t1GV7KTo6RsV8smjXwr7KVWuQLoTcliTlz5lB+5cMUP76wxRw/npinxrwUnGPEd50hfPniTNj1Ld3Dzk4OGjMuAnxHufUyRP6oHEDrfl1kzJnyZIUpQI2E997jGz2HCMAT+dgbycHB3uFP4yM1R4eEamyRXPIYrGoVvn8Oh18Vb/M7KpzW8Zq+4Leerdyof8c193NRXfuhys6+tFM0KmgEF2/dU++DcvK0cFeLs6OatOwjPwDLuvcpZtJdn4AgKQRExOjHb9vk7d3Vn3coZ0qVyijls0+0NYtm5+6z4MHD7RqxXJlzJRJ6dOnf4nVAq8Wmwej9evXa+fOndbXM2fOVJEiRdSiRQvdunXLhpUBtnPvQYT+OBKg/h1qyyuNh+zsLGpWp6RKF8qm9G+5K22qFHJzdVHvttW1afdxvdt5hn757YgWTWqv8sVzPnHM1Cld1b9Dbc1dtjvWcWp2mKbmdUrq1h9TdH3XJFUvm08Nu31lDU8AgNfHzRs39ODBA8397luVK19Bs7+Zq3eqVlfPT7tp/74/Y/Vd/NNCvV2iqMqULKqdO7fr62+/l6OTk40qB2zP5sGoT58+unPnjiTJz89PvXr1Up06dRQYGKiePXvauDrAdj4atEAWixSwcbRC905V1+aV9PP6/YqJMWRn9+if7pptfvpy4W86euqiJn6/Set2HFOH98vHGcvN1UUrpneWf8Bljfp6rbXdxdlRs4e21J4jAarUeqLeaTtZx89e1vLpneXi7PjSzhUAkDhijEdfalWpUlUf+rZR3nz51K5DR1WsVFlLFi+K1bdOvfpavGyF5s7/n7y9s6pPr88UERFhi7KBV4LNF18IDAyUj4+PJGnZsmWqV6+exowZo4MHD6pOnTo2rg6wncAL11Wj/TQld3GSewoXXbl+Rz+Ma6vAi9d1/dY9RUZGyz/gcqx9TgZcUdmi2WO1pUjurF9mdtHdB+Fq2vPbWAsqNK1dQlkypFIl30l6fLuhb/95urx9vN6tXEhLNhxI+hMFACQaz5SecnBwUPYcsVeXy5Y9hw4fjP3/dDc3N7m5ucnbO6sKFSqs8mVLaevmTapdt97LLBl4Zdh8xsjJyUkPHjyQJG3evFk1atSQJKVKlco6kwSY2YPwh7py/Y5SuiVTtbL5tGabnyKjonXg+Dnl9k4Xq28u77QKvvz3Jahuri5aM6ubHkZG6/3PvlbEw6hY/ZO7OCkmxtA/12CJMQwZhmRnsSTtiQEAEp2jk5PyFyiooKDAWO3nzgXJK0PGp+5nSJJh6OHDh0lbIPAKs/mMUfny5dWzZ0+VK1dOf/75pxYvXixJOnXqlDJlymTj6gDbqVYmnywW6VTQVeXInEZjejTUqcAQLfhljyRpyvzN+uGLj7Tz4Bn9vv+UapT1UZ2KBVSzwzRJ/x+KvuqqZC5OajtwvtxdXeTu6iJJunbrnmJiDG3544TGfNZQU/s30axFv8vOYlHvtjUUFR2t3/efstm5AwCe7sH9+woO/vuZdhcvXNAJf395eHjIK0MG+bZtp769eqh48ZIqWaq0du3coe3bftOc7x+tYnrh/HltWL9OZcqWk6dnKoWEXNHcOd/I2dlF5StWstVpATZn8+W6g4OD1aVLF50/f17du3dXu3btJEk9evRQdHS0pk+fnuAxWa4bb4L3qhfViE/qK2O6lLoZ+kCrthzW0JmrYz2ctXWDt9XnoxrKmDalTp27qlGz12rNNj9JUoXiubRxzqdPHDtPnSEKvvxo1bl3SufVwE615ZPTSzExho6cuKBhM1frT7+gJD9HIKmxXDfeRPv+3Kv2bVvHaa/foJFGjhknSVqxfKnmfvuNQkKuKGvWbOrc7RNVeefRkt5Xr4Zo+JBBOn78mO6E3lHqt1KrePES6tS5q7Jmyx5nXOB1F9/lum0ejJICwQgAIBGMAACv0XOMDh48KD8/P+vrVatWqWHDhhowYADXuQIAAAB4KWwejDp16qRTpx7dyxAQEKBmzZopefLkWrJkifr27fvM/SMiInTnzp1YP0ZMdFKXDQAAAOANYvNgdOrUKRUpUkSStGTJElWsWFE//vij5s2bp2XLlj1z/7Fjx8rDwyPWT1QISwwDAAAAiD+bByPDMBQT8+i5Kps3b7Y+uyhz5sy6fv36M/fv37+/QkNDY/04pCuepDUDAAAAeLPYfLnuEiVKaNSoUapWrZp+//13zZo1S9KjB7+mS5fuGXtLzs7OcnZ2jtVmsbNPkloBAAAAvJlsPmM0depUHTx4UN26ddPAgQOVM2dOSdLSpUtVtmxZG1cHvLhUHq46t2WssnilsnUpSaL9++W1dGonW5cBAK+d27dvqXKFMrp48YKtS0mwW7duqnKFMgq5csXWpQCJxubBqFChQvLz81NoaKiGDh1qbZ8wYYLmz59vw8qAxPF5+5pas+2o9blBlUvl1m/zeurqzokK3DRGo7o3kL197H+K1crk0+/ze+nqzokK3jpWP01s/8xgtWRqJ51aN0K3/piigI2j9d3I1vJK4/HEvtkzv6WrOyfq8vbxsdrfKZ1XR1cOUciOCfpuZGs5Ovw9++qewkVHVw5RFi/PWPvMX7lHRfNlVrmiOeL9ngAApG+/nq0qVaoqY8ZHD7QfN2aUmn3QWCWKFFCTxg3iPc6Rw4fUvm1rlS5RRGVLFVPb1i0VHh4eq8/237epZbMPVKpYIZUvU1KffdLFui309m190uVjvV2iqJq811D+/sdj7Ttm5HDNnzc3VpunZyq9W7+hvpqZ8OdNAq8qmwejp3FxcZGjo6OtywBeSDIXR/k2KKP5K/dIkgrmzqiVX3bWxt3H9Xbzcfqw31zVrVRQo7r//QHonSG1lkzpqG37Tql0s3Gq32WmUqd01aJJHf7zWNv3nVKrz+eqcKMRatFnjrJnfks/TmgXp5+Dg50WjG2rXYfOxmq3WCyaN9ZXc5buVGXfSSrmk0Xt3itn3T6yewPNWbpTwZdvxdovMipai3/dry7NeVo6AMRXWFiYVi5fqkbvvR+rvWGj91Szdp14j3Pk8CF16dReZcqW18JFS/Tj4qVq1qKl7Oz+/hNv88YNGtivrxo0aqyfl6/S/B9+Uu269azbv/1mth48uK9FS5erZMlSGjF0kHXb0SOH5ed3RK0+9I1z7AaNGmvdmtUKvX07AWcOvLpsfo9RdHS0pkyZop9//lnBwcFxnl108+ZNG1UGvLha5fMrIjJKf/oFSZLer1FMf52+pLHfrJckBZy/roHTVup/X3yk0V+v070HESrmk1n2dnYaNnONHj9/eeqCLVoypaMcHOwUFRXzxGN9ufA36+/Bl29p4veb9PPkDnH2GdblXZ0MDNFvf57U24WzWdvfSumqNJ5u+vrn7Yp4GKW1v/spT7b0kqS3C2dT8fze6jHu5ycee+12P62d1U0uzo4Kj4h8/jcMAExi5/bf5ejkpEKFi1jb+g14FEhuzbyp0ydPxmucCV+MVfOWH6pdh47WtqzZslt/j4qK0hfjRqtH7z5q/N4H1vYc/3/rgiQFBpxVzdp1lDVrNr33QVMtXfro//WRkZEaNXyoho4YJXv7uPdv58yZS2nSptWWLZtijQ28rmw+YzR8+HBNnjxZTZs2VWhoqHr27KnGjRvLzs5Ow4YNs3V5wAspVzSHDvkHW187OznECQ5hEZFK5uKkovmySJIOHj+vGCNGrRu8LTs7i9xTuKhF3VLauvfkU0PRv3m6J1ez2iX0x5HAWPtUKplbjasX1WdPCDjXbt3T5WuhqlYmn5K5OKpcsRz66/RFOTjYadqApvpk1E+KiTGeeLyDx4PlYG+vkgWyxqs+ADC7gwf3y8cn/wuNcePGDfkdPaJUqVOrdctmqlKxrD7ybaWDB/Zb+/gfP66rISGys7NTk/caqmql8urSqb1Onz5l7ZM7T17t2/uHoqKitHvXDuXOnUeSNG/uHJUoWUr5CxR8ag0FChbSoQM8JgVvBpsHo4ULF+rbb79Vr1695ODgoObNm2vOnDkaMmSI/vjjD1uXB7yQLF6pdPlaqPX1pt3+ertwdjWpVVx2dhZlSOOhAR1rS5K80rhLks5duqF6XWZqeLd3Fbp3qkJ2TFTGdCnVqu/cJx7jn0Z1b6Druyfp0u/jldkrlT7o8Y11WyoPV307vJU6DP1Bd++HP3H/Vn2/U/8OtXRw6UAdPnFB81ftUe+2NbR932mFR0Rq6/c9dGTFYH3ctGKs/cLCIxV6L0xZMryZC0wAQGK7fOmS0qRN+0JjXLxwXpI0e+YMNX7/A3319Rzly+ejju3a6Ny5IEnShX/06dips778arbc3T3Uvs2H1kvgPmrfUfb2DqpXq7q2btmsYSNG69y5IP2yaqU6du6ikcOHqE7NqurT81PdvXs3Vg1p0qTVpUsXX+g8gFeFzYPRlStXVLDgo28iUqRIodDQR39E1qtXT2vXrrVlacALc3F2UnhElPX1lj9OaMDUlZo+oJlC907V0VVDtGHnMUmyzsakS+2mrwa30MLVe1W+1QRVazdFDyOj9ePEuPcL/duUBZv1drMvVPfjGYqOjtGckR9at301uLkWr9+vXQfPPnX/3YcDVL7VBOWrN0w9xv2srBneUst6pTRs5mp9N8pX3y3frWofTVH/jrVVIFeGWPuGR0QquQv3BQJAfISHR8jZyfnZHf/D4+dAvt+kqRo2ek/58vmoT78Bypotm1YuXyZJMv6/T/uOH6tajZryyV9AI0aPlcVi0caNjy7rdnNz07gJk7R+82+aO/9/ypEzp0YOG6Kevfto7ZrVunDhglatWS8Xl2T6etbMWDW4uLjEWegBeF3ZPBhlypRJly9fliTlyJFDGzdulCTt27cvzvOJgNfNjdv35OmePFbb9P9tVfqKfZS7zhBlqtJPq7cdlSQFXnj0QONOTSvqzr0wDZy2SkdOXtCug2f10cD5eqd0XpUqmPUZx7uvM8FXtXXvCbXu971qVyig0oUe3UdUqVRuffZhVd3dN013903T7KEtldItue7um6bWDd5+4ngzBjVTv8krZGdnp6L5Mmv5poO6duuedh44rQrFc8Xq6+meXNdv3XuetwkATMfTM6Xu3LnzQmO8lSaNJCl7jtirgmbLnkNXLl96ah8nJydlzJRZV/7/769/W7limdzc3VXlnWrav+9PvfNOVTk6Oqp6zVrav+/PWH1DQ2/LMxVXC+DNYPPFFxo1aqQtW7aodOnS+uSTT9SqVSt99913Cg4OVo8ePWxdHvBCjpy4oGZ1Sz5x2+NL7JrUKqHzl2/q0IlHlzskd3GKcy9P9P9/42dnZ4n3sR/3dXJ89M+8su8k2f9jlaJ6lQupV5tqqtJmsi5dvR1nf9+GZXTrzgOt/d1PKd2SSZIcHewVpkg5OtjL/h+1ZMv0lpK5OOnwidfvWRwAYAt58/lo7epfXmiMjBkzKU3atAoKDIzVfi4oSOUrPLrk2Sd/ATk5OSkoKFDFipeQ9GhRhUuXLsrLK0OcMW/evKmvZ83UvB9+kiTFREcrKurRlQ9RUVGKiY6O1f/M6dMqUbLUC50H8Kqw+YzRuHHjNGDAAElS06ZNtX37dnXu3FlLly7VuHHjbFwd8GI27fGXT3Yva7CQpB6tqyp/zgzKlz29+nWopd5tq6vX+KXWMPTrjmMqnj+L+nespRxZ0qhI3kz6elgrnbt0wxo8SuT31uHlg5Th/59TVLKAtz5uWlGFcmdUFi9PVSqZW/PHttHZ4Gvae/TRB+bJwBAdP3vZ+nPp6m3FGIaOn72s23fDYtWdxjOF+rWvqZ5fLJEk3b4bJv+Ay+rWoopKF8qmyqXyaM/hAGv/ckVzKOD8NeusFwDgv5UtV15nz57RndC/70MNPndOJ/z9df36NYVHhOuEv79O+Psr8v9X7A0JCVGDerXkd/TRlQYWi0Vt2rbTTwt/0KYN6xV87pxmTJ+qoMAANWr8aBnwFClS6IMmzTRr5pfavWunggIDNHrkMElSjZq14tQ1Ydxotfb9SOnSpZMkFSlaTGtWr1LA2bNatmSxihQtZu0bFhYm/+PHVLZc+SR5j4CXzeYzRv9WpkwZlSlTxtZlAIni2JlLOnzivN6rUUzfLdslSapRzkd929eUs6OD/E5d1Ac9vtHGXX8/TO/3fafUZsB89fCtpp6+1fUg/KH2Hg1U/a5fWVe0S+bipDzZ0svh/x/A+iA8Ug3eKaxBH9eVazInXbkeqo27/fXFt3P1MDIqbmHPMLHv+5r2w9ZYC0d0HPI/fTviQ3VpXllTFmzWgeN/r7bXpFYJfb9i93O9RwBgRrly51HefD7asOFXfdCkmSRp+NBBsS5Va/p+Q0nSuo1blDFjJkVFRSooMFDh4X9/mdWqdRtFRDzUhPFjFRoaqjx58mr2t3OVOUsWa58evfvK3sFBA/v3VUR4uAoWKqxv586Xu0fsh4Dv2rlDwcHBGj1ugrWtWYtWOn7sL7Vq/oEKFCykTl26Wbdt27pF6b28rDNRwOvOYjx+UMpL9Msv8Z86rl+/foLHT1a027M7AS9JrfL5NaZHQxV/f4xs8M8tyeXLnl6/ftNdhRqO0J173ICLV8utfTNsXQLwVNt/36YpE8dr2ao1sR7I+rpo1byJWrT8UHXqvWvrUoD/5BLPqSCbzBg1bNgwXv0sFoui/3UtK/C6Wb/zmHJmSaOMaT10IeS2rctJdOnTeKj94B8IRQCQQBUrVVbwuSBdDQlRei8vW5eTILdu3VTVatVVu249W5cCJBqbzBglNWaMAAASM0YAgPjPGL1+87YAAAAAkMhsFoy2bt0qHx+fJ67hHxoaqvz582v79u02qAwAAACA2dgsGE2dOlUdOnSQu7t7nG0eHh7q1KmTpkyZYoPKAAAAAJiNzYLRkSNHVKtW3PXzH6tRo4YOHDjwEisCAAAAYFY2C0YhISFydHR86nYHBwddu3btJVYEAAAAwKxsFowyZsyov/7666nbjx49Kq/XbOlKAAAAAK8nmwWjOnXqaPDgwQoPj/vsk7CwMA0dOlT16rE2PgAAAICkZ7PnGIWEhKhYsWKyt7dXt27dlCdPHknSiRMnNHPmTEVHR+vgwYNKly5dgsfmOUYAAInnGAEA4v8co3h2S3zp0qXT7t271blzZ/Xv31+P85nFYlHNmjU1c+bM5wpFAAAAAJBQNgtGkuTt7a1169bp1q1bOnPmjAzDUK5cueTp6WnLsgAAAACYjE2D0WOenp4qWbKkrcsAAAAAYFI2W3wBAAAAAF4VBCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6iRKMbt++nRjDAAAAAIBNJDgYffHFF1q8eLH1dZMmTZQ6dWplzJhRR44cSdTiAAAAAOBlSHAwmj17tjJnzixJ2rRpkzZt2qRff/1VtWvXVp8+fRK9QAAAAABIag4J3eHKlSvWYLRmzRo1adJENWrUUNasWVW6dOlELxAAAAAAklqCZ4w8PT11/vx5SdL69etVrVo1SZJhGIqOjk7c6gAAAADgJUjwjFHjxo3VokUL5cqVSzdu3FDt2rUlSYcOHVLOnDkTvUAAAAAASGoJDkZTpkxR1qxZdf78eY0fP14pUqSQJF2+fFldunRJ9AIBAAAAIKlZDMMwbF1EYktWtJutSwAAvAJu7Zth6xIAADbmEs+poHh1++WXX+J94Pr168e7LwAAAAC8CuIVjBo2bBivwSwWCwswAAAAAHjtxCsYxcTEJHUdAAAAAGAzCV6u+5/Cw8MTqw4AAAAAsJkEB6Po6GiNHDlSGTNmVIoUKRQQECBJGjx4sL777rtELxAAAAAAklqCg9Ho0aM1b948jR8/Xk5OTtb2AgUKaM6cOYlaHAAAAAC8DAkORgsWLNA333yjli1byt7e3tpeuHBhnThxIlGLAwAAAICXIcHB6OLFi8qZM2ec9piYGEVGRiZKUQAAAADwMiU4GPn4+GjHjh1x2pcuXaqiRYsmSlEAAAAA8DLF8zmwfxsyZIh8fX118eJFxcTEaPny5Tp58qQWLFigNWvWJEWNAAAAAJCkEjxj1KBBA61evVqbN2+Wq6urhgwZIn9/f61evVrVq1dPihoBAAAAIElZDMMwbF1EYktWtJutSwAAvAJu7Zth6xIAADbmEs9r5BJ8Kd1j+/fvl7+/v6RH9x0VL178eYcCAAAAAJtKcDC6cOGCmjdvrl27dillypSSpNu3b6ts2bJatGiRMmXKlNg1AgAAAECSSvA9Ru3bt1dkZKT8/f118+ZN3bx5U/7+/oqJiVH79u2TokYAAAAASFIJvscoWbJk2r17d5yluQ8cOKAKFSrowYMHiVrg8+AeIwCAxD1GAID432OU4BmjzJkzP/FBrtHR0cqQIUNChwMAAAAAm0twMJowYYI++eQT7d+/39q2f/9+ffrpp5o4cWKiFgcAAAAAL0O8LqXz9PSUxWKxvr5//76ioqLk4PBoXurx766urrp582bSVRtPXEoHAJC4lA4AkMjLdU+dOvUFSgEAAACAV1u8gpGvr29S1wEAAAAANvPcD3iVpPDwcD18+DBWm7u7+wsVBAAAAAAvW4IXX7h//766deumtGnTytXVVZ6enrF+AAAAAOB1k+Bg1LdvX23dulWzZs2Ss7Oz5syZo+HDhytDhgxasGBBUtQIAAAAAEkqwZfSrV69WgsWLFDlypXVtm1bVahQQTlz5pS3t7cWLlyoli1bJkWdAAAAAJBkEjxjdPPmTWXPnl3So/uJHi/PXb58eW3fvj1xqwMAAACAlyDBwSh79uwKDAyUJOXNm1c///yzpEczSSlTpkzU4gAAAADgZUhwMGrbtq2OHDkiSerXr59mzpwpFxcX9ejRQ3369En0AgEAAAAgqVkMwzBeZIBz587pwIEDypkzpwoVKpRYdb2Q8ChbVwAAeBV4luxm6xIAADYWdmhGvPq90HOMJMnb21ve3t4vOgwAAAAA2Ey8gtH06dPjPWD37t2fuxgAAAAAsIV4XUqXLVu2+A1msSggIOCFi3pRXEoHAJC4lA4AkMiX0j1ehQ4AAAAA3kQJXpUOAAAAAN40BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6zxWMduzYoVatWqlMmTK6ePGiJOmHH37Qzp07E7U4AAAAAHgZEhyMli1bppo1aypZsmQ6dOiQIiIiJEmhoaEaM2ZMohcIAAAAAEktwcFo1KhRmj17tr799ls5Ojpa28uVK6eDBw8manEAAAAA8DIkOBidPHlSFStWjNPu4eGh27dvJ0ZNAAAAAPBSJTgYpU+fXmfOnInTvnPnTmXPnj1RigIAAACAlynBwahDhw769NNPtXfvXlksFl26dEkLFy5U79691blz56SoEQAAAACSlENCd+jXr59iYmJUtWpVPXjwQBUrVpSzs7N69+6tTz75JClqBAAAAIAkZTEMw3ieHR8+fKgzZ87o3r178vHxUYoUKRK7tucWHmXrCgAArwLPkt1sXQIAwMbCDs2IV78Ezxg95uTkJB8fn+fdHQAAAABeGQkORlWqVJHFYnnq9q1bt75QQQAAAADwsiU4GBUpUiTW68jISB0+fFh//fWXfH19E6suAAAAAHhpEhyMpkyZ8sT2YcOG6d69ey9cEAAAAAC8bAlervtpWrVqpblz5ybWcAAAAADw0iRaMNqzZ49cXFwSazgAAAAAeGkSfCld48aNY702DEOXL1/W/v37NXjw4EQrDAAAAABelgQHIw8Pj1iv7ezslCdPHo0YMUI1atRItMIAAAAA4GVJUDCKjo5W27ZtVbBgQXl6eiZVTQAAAADwUiXoHiN7e3vVqFFDt2/fTqJyAAAAAODlS/DiCwUKFFBAQEBS1AIAAAAANpHgYDRq1Cj17t1ba9as0eXLl3Xnzp1YPwAAAADwurEYhmHEp+OIESPUq1cvubm5/b2zxWL93TAMWSwWRUdHJ36VCRQeZesKAACvAs+S3WxdAgDAxsIOzYhXv3gHI3t7e12+fFn+/v7/2a9SpUrxOnBSIhgBACSCEQAg/sEo3qvSPc5Pr0LwAQAAAIDElKB7jP556RwAAAAAvCkS9Byj3LlzPzMc3bx584UKAgAAAICXLUHBaPjw4fLw8EiqWgAAAADAJhIUjJo1a6a0adMmVS0AAAAAYBPxvseI+4sAAAAAvKniHYziuao3AAAAALx24n0pXUxMTFLWAQAAAAA2k6DlugEAAADgTUQwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6BCMAAAAApkcwAgAAAGB6r2wwCgkJ0YgRI2xdBgAAAAATeGWD0ZUrVzR8+HBblwEAAADABBxsdeCjR4/+5/aTJ0++pEoAAAAAmJ3NglGRIkVksVhkGEacbY/bLRaLDSoDAAAAYDY2C0apUqXS+PHjVbVq1SduP3bsmN59992XXBUAAAAAM7JZMCpevLguXbokb2/vJ26/ffv2E2eTAAAAACCx2SwYffzxx7p///5Tt2fJkkXff//9S6wIAAAAgFlZjDdwWiY8ytYVAABeBZ4lu9m6BACAjYUdmhGvfq/sct0AAAAA8LLY7FI6AAlzYP8+zZv7nfyP/6Vr165pyvSZeqdqNev2G9eva+rkidqze6fu3r2rYsVLqN/AwfL2zipJCr19W1/N/FJ7du/UlcuX5emZSlWqVlPXTz6Vm5ubjc4KAPBP5YrlUI/W1VTMJ4u80nioSY9vtHpb7EecDO5cV20blVVKt2TacyRA3ccs1tnga9btfdvVVO0K+VUodyY9jIqSV8W+Tz1eKg9X/bm4nzKm81T6Cn0Uei9MkvTN8Fb6sP7bcfofP3tZxd8fnUhnC7xamDECXhNhYQ+UJ08e9R80NM42wzD0WfeuunDhvKZ++ZUWL10hrwwZ1aldWz148ECSdPXaVV27elU9e3+uZSvXaMTosdq1c4eGDR74sk8FAPAUrsmc5Xfqoj4bu/iJ23u1qaYuzSup+5hFqth6ou6HPdTqmV3l7PT3d91OjvZavumQvl2645nHmz20hfxOX4rT3nvCUmWt1t/6k7PmIN24fV/LNx16/pMDXnHMGAGvifIVKql8hUpP3HbuXJCOHjmsZavWKGfOXJKkQUOG6Z1K5bR+3Vo1fv8D5cqVW5OnfWndJ3OWLPrk08804PM+ioqKkoMD/zsAAFvbuOu4Nu46/tTtXVtU0RffbtCabX6SpPaDF+jc5rGqX6Wwlmw4IEkaNXudJKnVu6X/81gdPigvD7fkGvPNr6pVPn+sbXfuhevOvXDr63crF5KnezL98Mue5zov4HXAjBHwBoh8+FCS5OzkbG2zs7OTk5OTDh088NT97t29pxQpUhCKAOA1kDVjanml8dDWvSesbXfuhWvfX0EqXShrgsbKmz29+neorfaDFygm5tnrcPk2LKOte08q+PKthJYNvDZsHozWr1+vnTt3Wl/PnDlTRYoUUYsWLXTrFv/4gPjImi27vLwyaPrUSboTGqrIhw81d843CrlyRdeuXXviPrdu3dQ3s7/Sex80fcnVAgCeR/q33CVJV2/ejdV+9cZdpUvtHu9xnBwdNH9sGw2YulLnrzz7by2vNB6qWc5H81bsTljBwGvG5sGoT58+unPnjiTJz89PvXr1Up06dRQYGKiePXvauDrg9eDo6KjJ077UuaAgVShbSqVLFNG+P/eqfIWKsrOzxOl/7949devcSdlz5NDHXVjOGADMZGT3+joZGKJF6/bFq3/Ld0vr9t0w/fLb0Wd3Bl5jNr9+JjAwUD4+PpKkZcuWqV69ehozZowOHjyoOnXq2Lg64PXhk7+Afl6+Snfv3lVkZKRSpUqlls0+UP78BWL1u3//nrp0ai9XV1dNmT5Tjo6ONqoYAJAQV64/+iI5bSo36++SlDa1m46evBDvcSqVzK0COTOo0b4ikiSL5dEXaBd+G6cvvttgvUfpMd8Gb+untX8qMir6Bc8AeLXZPBg5OTlZV83avHmzWrduLUlKlSqVdSYJQPw9Xnr73LkgHT/2l7p+8ql1271799S5Yzs5OTlp2oxZcnZ2ftowAIBXTNDFG7p8LVRVSufR0VMXJUluri4qWSCrvl2y8xl7/6157zlK5vz3l2LF83vrm+GtVK3dVAWcj335dYXiuZQzS1rNW8miC3jz2TwYlS9fXj179lS5cuX0559/avHiR8tTnjp1SpkyZbJxdcCr48H9+woODra+vnjhgk74+8vDw0NeGTJo44Zf5emZSl5eGXT69EmNHztGVd6pprLlykt6FIo+7vCRwsPDNGbcBN2/d0/3792TJHmmSiV7e3ubnBcA4G+uyZyUI3Ma6+usGVOrUO6MunXngc5fuaWZP/6mz9vX0pngawq6eENDu9TV5Wuh+uW3I9Z9Mqf3lKd7cmX28pS9nZ0K5c4oSTp7/pruhz1U4IXrsY6ZOmUKSdKJgCvW5xg91qZhGf15NFDHz15OqlMGXhk2D0YzZsxQly5dtHTpUs2aNUsZMz76x/vrr7+qVq1aNq4OeHUcO/aX2rdtbX09cfxYSVL9Bo00csw4Xbt2TRPHj9ON6zeUJk0a1avfQJ0+7mLt73/8mPyOPvrgrFe7eqyx123coowZ+SICAGytmI+3Ns75e6Z/fO/3JEk//PKHOg79nybN26zkyZw1Y1BzpXRLpt2Hz6p+168U8TDKus/gznVjPZx17+L+kqQa7adpx4HT8a7FPYWLGlYtot4Tlr7oaQGvBYthGM9eo/E1Ex717D4AgDefZ0kWFwEAsws7NCNe/Wy+Kt3Bgwfl5+dnfb1q1So1bNhQAwYM0MP/fzYLAAAAACQlmwejTp066dSpU5KkgIAANWvWTMmTJ9eSJUvUt29fG1cHAAAAwAxsHoxOnTqlIkWKSJKWLFmiihUr6scff9S8efO0bNmyZ+4fERGhO3fuxPqJiIhI4qoBAAAAvElsHowMw1BMTIykR8t1P352UebMmXX9+vX/2lWSNHbsWHl4eMT6mfDF2CStGQAAAMCbxeaLL7zzzjvKnDmzqlWrpnbt2un48ePKmTOnfv/9d/n6+iooKOg/94+IiIgzQ2TYO/N8FgAAiy8AAF6fxRemTp2qgwcPqlu3bho4cKBy5swpSVq6dKnKli37zP2dnZ3l7u4e64dQhFfd7du3VLlCGV28GP8nlb8qbt26qcoVyijkyhVblwIAr5VUHq46t2WssnilsnUpSaJ62Xz6Y1E/WSwWW5cCPBebB6NChQrJz89PoaGhGjp0qLV9woQJmj9/vg0rA5LOt1/PVpUqVa3PDho3ZpSafdBYJYoUUJPGDeI1xvVr1zSgXx+9U7GcSpcooqbvN9LmjRvi9Nv++za1bPaBShUrpPJlSuqzT/5+tlHo7dv6pMvHertEUTV5r6H8/Y/H2nfMyOGaP29urDZPz1R6t35DfTVzekJPGwBM7fP2NbVm21EFX74pSapcKrd+m9dTV3dOVOCmMRrVvYHs7WP/aVatTD79Pr+Xru6cqOCtY/XTxPbPDFZ929XUb/N66sbuybq8ffx/9k3l4aoz60cq7NAMeaRIZm0vnCeT9vz0ua7tmqSlUzvJ0z25dZu9vZ12LeyrEvm9Y421abe/oqKi1axOiXi9H8CrxubB6GlcXFzk6Oho6zKARBcWFqaVy5eq0Xvvx2pv2Og91axdJ97jDBzwuYICAzVtxiwtW7FaVatVV59en8UKN5s3btDAfn3VoFFj/bx8leb/8JNq161n3f7tN7P14MF9LVq6XCVLltKIoYOs244eOSw/vyNq9aFvnGM3aNRY69asVujt2wk4cwAwr2QujvJtUEbzV+6RJBXMnVErv+ysjbuP6+3m4/Rhv7mqW6mgRnX/+8sx7wyptWRKR23bd0qlm41T/S4zlTqlqxZN6vCfx3JytNfyTYf07dIdz6xr9tAW8jt9KU77V0Na6Pd9p1Sm+RfycEumvu1qWrd99uE7+uNIgPYfOxdnvx9+2auuzSs/87jAq8jmwSg6OloTJ05UqVKllD59eqVKlSrWD/Cm2bn9dzk6OalQ4SLWtn4DBqlZi5bKlClzvMc5cuiQmrdspYKFCilT5szq+HEXubm5y//YMUlSVFSUvhg3Wj1691GTps2VNWs25ciZUzVr/R2+AgPOqmbtOsqaNZve+6CpAgICJEmRkZEaNXyoBg0ZLnt7+zjHzpkzl9KkTastWzY957sAAOZSq3x+RURG6U+/IEnS+zWK6a/TlzT2m/UKOH9dOw+c0cBpK9WpSQWlSP7oloBiPpllb2enYTPXKPDCdR0+cUFTF2xR4TwZ5eDw9D/hRs1epy8X/qa/nhB4/qnDB+Xl4ZZcUxdsibMtb7b0mrt8t84EX9XP6/crT7Z0kqSsGVPLt2FZDZ2x+oljrtvup+L5vZUt01vxeVuAV4rNg9Hw4cM1efJkNW3aVKGhoerZs6caN24sOzs7DRs2zNblAYnu4MH98vHJ/8LjFC5aVBvW/6rQ27cVExOjX9etVcTDCJUoWUqS5H/8uK6GhMjOzk5N3muoqpXKq0un9jp9+pR1jNx58mrf3j8UFRWl3bt2KHfuPJKkeXPnqETJUspfoOBTj1+gYCEdOnDghc8DAMygXNEcOuQfbH3t7OSg8IjIWH3CIiKVzMVJRfNlkSQdPH5eMUaMWjd4W3Z2FrmncFGLuqW0de9JRUXFvFA9ebOnV/8OtdV+8ALFxMRdh8vv9EVVfTuv7O3tVKVUHmvI+nJgMw2culL3Hjz50Sjnr9zSlet3VK5ojheqD7AFmwejhQsX6ttvv1WvXr3k4OCg5s2ba86cORoyZIj++OMPW5cHJLrLly4pTdq0LzzOhElTFRUZpYrlSqtk0YIaNXyIpkyboSzej675vnDhvCRp9swZ6tips778arbc3T3Uvs2H1kvgPmrfUfb2DqpXq7q2btmsYSNG69y5IP2yaqU6du6ikcOHqE7NqurT81PdvXs31vHTpEmrS5cuvvB5AIAZZPFKpcvXQq2vN+3219uFs6tJreKys7MoQxoPDehYW5LklcZdknTu0g3V6zJTw7u9q9C9UxWyY6IypkupVn3nPvEY8eXk6KD5Y9towNSVOn/l1hP7dB6+UI2qFdHx1cP0MDJaE+ZuVPO6JRUW/lAHjp3TLzO76q9VQzW0S704+16+FvrGLjCBN5vNg9GVK1dUsOCjb6VTpEih0NBH/9OoV6+e1q5da8vSgCQRHh4hZ6cXXzlx5pfTdPfuHX3z3Tz9uHiZPvRtq769PtPpUyclScb/Px+sfcePVa1GTfnkL6ARo8fKYrFo48b1kiQ3NzeNmzBJ6zf/prnz/6ccOXNq5LAh6tm7j9auWa0LFy5o1Zr1cnFJpq9nzYx1fBcXF4WHh7/weQCAGbg4Oyk8Isr6essfJzRg6kpNH9BMoXun6uiqIdqw89Gl0I9ncNKldtNXg1to4eq9Kt9qgqq1m6KHkdH6cWK7F6plZPf6OhkYokXr9j21j3/AFdVoP0156gxRmwHz5Ohgr8Ef11WPcUs0+fMP9MeRAJVqOlYNqhZWnYoFYu0bHvFQyV2cXqhGwBZsHowyZcqky5cvS5Jy5MihjRs3SpL27dvHstt4I3l6ptSdO3deaIzzwcFa9OP/NHzUGJV+u4zy5M2rj7t0k0/+Alr000JJ0ltp0kiSsuf4+3IGJycnZcyUWVf+/9/cv61csUxu7u6q8k417d/3p955p6ocHR1VvWYt7d/3Z6y+oaG35cl9gAAQLzdu34u1spskTf/fVqWv2Ee56wxRpir9tHrbUUlS4IVHD7jv1LSi7twL08Bpq3Tk5AXtOnhWHw2cr3dK51Wpglmfu5ZKJXOrcbWiurtvmu7um6Zfv/5EknTht3Ea9PGTFwH6oldjzfjxN128elsVSuTS8s2H9CD8odbvOKaKJXLF6uvp7qrrt+49d32ArTjYuoBGjRppy5YtKl26tD755BO1atVK3333nYKDg9WjRw9blwckurz5fLR29S8vNEZ4eJgkyc4S+7sNOzt7Gf//TaNP/gJycnJSUFCgihV/tHRqZGSkLl26KC+vDHHGvHnzpr6eNVPzfvhJkhQTHa2oqEffbkZFRSkmOjpW/zOnT1vvZwIA/LcjJy6oWd2ST9z2+BK7JrVK6Pzlmzp04tGl0MldnOLc/xP9/1cD2Nk9/7OCmveeo2TOf6/8Wzy/t74Z3krV2k1VwPlrcfpXLpVbebOlU8eh/5Mk2dvZydHh0cI8j//7mLOTg7JnfkuHT55/7voAW7H5jNG4ceM0YMAASVLTpk21fft2de7cWUuXLtW4ceNsXB2Q+MqWK6+zZ8/oTujf15oHnzunE/7+un79msIjwnXC318n/P0V+fChJCkkJEQN6tWS39FH3yZmzZZdWbJ4a+TwIfI7elTng4M1f95c/bFnl6pUrSbp0aWpHzRpplkzv9TuXTsVFBig0SOHSZJq1KwVp64J40arte9HSpfu0cpDRYoW05rVqxRw9qyWLVmsIkWLWfuGhYXJ//gxlS1XPkneIwB402za4y+f7F5K6fb3s4J6tK6q/DkzKF/29OrXoZZ6t62uXuOXWsPQrzuOqXj+LOrfsZZyZEmjInkz6ethrXTu0g0dPvHoAeEl8nvr8PJBypDGwzpu5vSeKpQ7ozJ7ecrezk6FcmdUodwZ5Zrs0eVtgReu6/jZy9afoIs3JEknAq7o2r9mepydHDTl8ybqOvInGcajuvYcCVCnJhVVMHdGNaxaRHsOB1j7lyqYTREPo7T3aGASvItA0rL5jNG/lSlTRmXKlLF1GUCSyZU7j/Lm89GGDb/qgybNJEnDhw6Kdala0/cbSpLWbdyijBkzKSoqUkGBgdaZIkdHR82Y/Y2mTZ6k7t0+1oMHD5QlcxaNHDNOFSpWso7To3df2Ts4aGD/vooID1fBQoX17dz5cvf4+wNUknbt3KHg4GCNHjfB2tasRSsdP/aXWjX/QAUKFlKnLt2s27Zt3aL0Xl7WmSgAwH87duaSDp84r/dqFNN3y3ZJkmqU81Hf9jXl7Oggv1MX9UGPb7Rx19/Povt93ym1GTBfPXyrqadvdT0If6i9RwNVv+tX1hXtkrk4KU+29HL4x8zN4M519WH9t62v9y7u/+h47adpx4HTCap7YKc6Wr/zmI6e+nuxnV7jl2j+mDbaNOczLfp1n1ZsOWzd1qRWcS36db/CwiOfMBrwarMYj+P/S/TLL/G/jKh+/foJHj886tl9AFva/vs2TZk4XstWrZGdnc0nbhOsVfMmatHyQ9Wp966tSwH+k2fJbs/uBLwktcrn15geDVX8/TGywZ9fSS51SlcdWTFE5VqO17lLN2xdDmAVdmhGvPrZZMaoYcOG8epnsVgU/a/7GoA3QcVKlRV8LkhXQ0KU3svL1uUkyK1bN1W1WnXVrht3iVYAwNOt33lMObOkUca0HroQctvW5SQ67wyp9dnYxYQivLZsMmOU1JgxAgBIzBgBAOI/Y/T6XcMDAAAAAInMZsFo69at8vHxeeLzXEJDQ5U/f35t377dBpUBAAAAMBubBaOpU6eqQ4cOcnd3j7PNw8NDnTp10pQpU2xQGQAAAACzsVkwOnLkiGrVivsslcdq1KihAwcOvMSKAAAAAJiVzYJRSEiIHB0dn7rdwcFB167FffoyAAAAACQ2mwWjjBkz6q+//nrq9qNHj8rrNVvGGAAAAMDryWbBqE6dOho8eLDCw8PjbAsLC9PQoUNVrx7PSQEAAACQ9Gz2HKOQkBAVK1ZM9vb26tatm/LkySNJOnHihGbOnKno6GgdPHhQ6dKlS/DYPMcIACDxHCMAQPyfY+SQxHU8Vbp06bR792517txZ/fv31+N8ZrFYVLNmTc2cOfO5QhEAAAAAJJTNgpEkeXt7a926dbp165bOnDkjwzCUK1cueXp62rIsAAAAACZj02D0mKenp0qWLGnrMgAAAACYlM0WXwAAAACAVwXBCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpWQzDMGxdBIDEFRERobFjx6p///5ydna2dTkAABvh8wCIP4IR8Aa6c+eOPDw8FBoaKnd3d1uXAwCwET4PgPjjUjoAAAAApkcwAgAAAGB6BCMAAAAApkcwAt5Azs7OGjp0KDfaAoDJ8XkAxB+LLwAAAAAwPWaMAAAAAJgewQgAAACA6RGMAAAAAJgewQh4xVksFq1cudLWZQAAbIzPAyBpEYwAG7py5Yo++eQTZc+eXc7OzsqcObPeffddbdmyxdalSZIMw9CQIUPk5eWlZMmSqVq1ajp9+rStywKAN86r/nmwfPly1ahRQ6lTp5bFYtHhw4dtXRKQ6AhGgI0EBQWpePHi2rp1qyZMmCA/Pz+tX79eVapUUdeuXW1dniRp/Pjxmj59umbPnq29e/fK1dVVNWvWVHh4uK1LA4A3xuvweXD//n2VL19eX3zxha1LAZKOAcAmateubWTMmNG4d+9enG23bt2y/i7JWLFihfV13759jVy5chnJkiUzsmXLZgwaNMh4+PChdfvhw4eNypUrGylSpDDc3NyMYsWKGfv27TMMwzCCgoKMevXqGSlTpjSSJ09u+Pj4GGvXrn1ifTExMUb69OmNCRMmWNtu375tODs7Gz/99NMLnj0A4LFX/fPgnwIDAw1JxqFDh577fIFXlYONcxlgSjdv3tT69es1evRoubq6xtmeMmXKp+7r5uamefPmKUOGDPLz81OHDh3k5uamvn37SpJatmypokWLatasWbK3t9fhw4fl6OgoSeratasePnyo7du3y9XVVcePH1eKFCmeeJzAwEBduXJF1apVs7Z5eHiodOnS2rNnj5o1a/YC7wAAQHo9Pg8AsyAYATZw5swZGYahvHnzJnjfQYMGWX/PmjWrevfurUWLFlk/CIODg9WnTx/r2Lly5bL2Dw4O1nvvvaeCBQtKkrJnz/7U41y5ckWSlC5duljt6dKls24DALyY1+HzADAL7jECbMAwjOfed/HixSpXrpzSp0+vFClSaNCgQQoODrZu79mzp9q3b69q1app3LhxOnv2rHVb9+7dNWrUKJUrV05Dhw7V0aNHX+g8AAAvhs8D4NVBMAJsIFeuXLJYLDpx4kSC9tuzZ49atmypOnXqaM2aNTp06JAGDhyohw8fWvsMGzZMx44dU926dbV161b5+PhoxYoVkqT27dsrICBAH374ofz8/FSiRAl9+eWXTzxW+vTpJUkhISGx2kNCQqzbAAAv5nX4PABMw7a3OAHmVatWrQTfbDtx4kQje/bssfq2a9fO8PDweOpxmjVrZrz77rtP3NavXz+jYMGCT9z2ePGFiRMnWttCQ0NZfAEAEtmr/nnwTyy+gDcZM0aAjcycOVPR0dEqVaqUli1bptOnT8vf31/Tp09XmTJlnrhPrly5FBwcrEWLFuns2bOaPn269ds/SQoLC1O3bt20bds2nTt3Trt27dK+ffuUL18+SdJnn32mDRs2KDAwUAcPHtRvv/1m3fZvFotFn332mUaNGqVffvlFfn5+at26tTJkyKCGDRsm+vsBAGb1qn8eSI8WiTh8+LCOHz8uSTp58qQOHz7MPad4s9g6mQFmdunSJaNr166Gt7e34eTkZGTMmNGoX7++8dtvv1n76F/Ls/bp08dInTq1kSJFCqNp06bGlClTrN8QRkREGM2aNTMyZ85sODk5GRkyZDC6detmhIWFGYZhGN26dTNy5MhhODs7G2nSpDE+/PBD4/r160+tLyYmxhg8eLCRLl06w9nZ2ahatapx8uTJpHgrAMDUXvXPg++//96QFOdn6NChSfBuALZhMYwXuOsPAAAAAN4AXEoHAAAAwPQIRgAAAABMj2AEAAAAwPQIRgAAAABMj2AEAAAAwPQIRgAAAABMj2AEAAAAwPQIRgAAAABMj2AEAHhp2rRpo4YNG1pfV65cWZ999tlLr2Pbtm2yWCy6ffv2U/tYLBatXLky3mMOGzZMRYoUeaG6goKCZLFYdPjw4RcaBwCQcAQjADC5Nm3ayGKxyGKxyMnJSTlz5tSIESMUFRWV5Mdevny5Ro4cGa++8QkzAAA8LwdbFwAAsL1atWrp+++/V0REhNatW6euXbvK0dFR/fv3j9P34cOHcnJySpTjpkqVKlHGAQDgRTFjBACQs7Oz0qdPL29vb3Xu3FnVqlXTL7/8Iunvy99Gjx6tDBkyKE+ePJKk8+fPq0mTJkqZMqVSpUqlBg0aKCgoyDpmdHS0evbsqZQpUyp16tTq27evDMOIddx/X0oXERGhzz//XJkzZ5azs7Ny5syp7777TkFBQapSpYokydPTUxaLRW3atJEkxcTEaOzYscqWLZuSJUumwoULa+nSpbGOs27dOuXOnVvJkiVTlSpVYtUZX59//rly586t5MmTK3v27Bo8eLAiIyPj9Pv666+VOXNmJU+eXE2aNFFoaGis7XPmzFG+fPnk4uKivHnz6quvvnrqMW/duqWWLVsqTZo0SpYsmXLlyqXvv/8+wbUDAJ6NGSMAQBzJkiXTjRs3rK+3bNkid3d3bdq0SZIUGRmpmjVrqkyZMtqxY4ccHBw0atQo1apVS0ePHpWTk5MmTZqkefPmae7cucqXL58mTZqkFStW6J133nnqcVu3bq09e/Zo+vTpKly4sAIDA3X9+nVlzpxZy5Yt03vvvaeTJ0/K3d1dyZIlkySNHTtW//vf/zR79mzlypVL27dvV6tWrZQmTRpVqlRJ58+fV+PGjdW1a1d17NhR+/fvV69evRL8nri5uWnevHnKkCGD/Pz81KFDB7m5ualv377WPmfOnNHPP/+s1atX686dO2rXrp26dOmihQsXSpIWLlyoIUOGaMaMGSpatKgOHTqkDh06yNXVVb6+vnGOOXjwYB0/fly//vqr3nrrLZ05c0ZhYWEJrh0AEA8GAMDUfH19jQYNGhiGYRgxMTHGpk2bDGdnZ6N3797W7enSpTMiIiKs+/zwww9Gnjx5jJiYGGtbRESEkSxZMmPDhg2GYRiGl5eXMX78eOv2yMhII1OmTNZjGYZhVKpUyfj0008NwzCMkydPGpKMTZs2PbHO3377zZBk3Lp1y9oWHh5uJE+e3Ni9e3esvu3atTOaN29uGIZh9O/f3/Dx8Ym1/fPPP48z1r9JMlasWPHU7RMmTDCKFy9ufT106FDD3t7euHDhgrXt119/Nezs7IzLly8bhmEYOXLkMH788cdY44wcOdIoU6aMYRiGERgYaEgyDh06ZBiGYbz77rtG27Ztn1oDACDxMGMEANCaNWuUIkUKRUZGKiYmRi1atNCwYcOs2wsWLBjrvqIjR47ozJkzcnNzizVOeHi4zp49q9DQUF2+fFmlS5e2bnNwcFCJEiXiXE732OHDh2Vvb69KlSrFu+4zZ87owYMHql69eqz2hw8fqmjRopIkf3//WHVIUpkyZeJ9jMcWL16s6dOn6+zZs7p3756ioqLk7u4eq0+WLFmUMWPGWMeJiYnRyZMn5ebmprNnz6pdu3bq0KGDtU9UVJQ8PDyeeMzOnTvrvffe08GDB1WjRg01bNhQZcuWTXDtAIBnIxgBAFSlShXNmjVLTk5OypAhgxwcYn88uLq6xnp97949FS9e3HqJ2D+lSZPmuWp4fGlcQty7d0+StHbt2liBRHp031Ri2bNnj1q2bKnhw4erZs2a8vDw0KJFizRp0qQE1/rtt9/GCWr29vZP3Kd27do6d+6c1q1bp02bNqlq1arq2rWrJk6c+PwnAwB4IoIRAECurq7KmTNnvPsXK1ZMixcvVtq0aePMmjzm5eWlvXv3qmLFipIezYwcOHBAxYoVe2L/ggULKiYmRr///ruqVasWZ/vjGavo6Ghrm4+Pj5ydnRUcHPzUmaZ8+fJZF5J47I8//nj2Sf7D7t275e3trYEDB1rbzp07F6dfcHCwLl26pAwZMliPY2dnpzx58ihdunTKkCGDAgIC1LJly3gfO02aNPL19ZWvr68qVKigPn36EIwAIAmwKh0AIMFatmypt956Sw0aNNCOHTsUGBiobdu2qXv37rpw4YIk6dNPP9W4ceO0cuVKnThxQl26dPnPZxBlzZpVvr6++uijj7Ry5UrrmD///LMkydvbWxaLRWvWrNG1a9d07949ubm5qXfv3urRo4fmz5+vs2fP6uDBg/ryyy81f/58SdLHH3+s06dPq0+fPjp58qR+/PFHzZs3L0HnmytXLgUHB2vRokU6e/aspk+frhUrVsTp5+LiIl9fXx05ckQ7duxQ9+7d1aRJE6VPn16SNHz4cI0dO1bTp0/XqVOn5Ofnp++//16TJ09+4nGHDBmiVatW6cyZMzp27JjWrFmjfPnyJah2AED8EIwAAAmWPHlybd++XVmyZFHjxo2VL18+tWvXTuHh4dYZpF69eunDDz+Ur6+vypQpIzc3NzVq1Og/x501a5bef/99denSRXnz5lWHDh10//59SVLGjBk1fPhw9evXT+nSpVO3bt0kSSNHjtTgwYM1duxY5cuXT7Vq1dLatWuVLVs2SY/u+1m2bJlWrlypwoULa/bs2RozZkyCzrd+/frq0aOHunXrpiJFimj37t0aPHhwnH45c+ZU48aNVadOHdWoUUOFChWKtRx3+/btNWfOHH3//fcqWLCgKlWqpHnz5llr/TcnJyf1799fhQoVUsWKFWVvb69FixYlqHYAQPxYjKfdBQsAAAAAJsGMEQAAAADTIxgBAAAAMD2CEQAAAADTIxgBAAAAMD2CEQAAAADTIxgBAAAAMD2CEQAAAADTIxgBAAAAMD2CEQAAAADTIxgBAAAAMD2CEQAAAADT+z/n5voDfWhpDwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# prompt: write a code to generate the performance evaluation for the ensemble model saved in file based on accuracy, precision, recall and f1-score with both value and percentage based confusion matrix\n", "import numpy as np\n", "from sklearn.metrics import accuracy_score, f1_score, recall_score, precision_score, confusion_matrix\n", "import seaborn as sns\n", "# Load the saved ensemble model\n", "ensemble_model = tf.keras.models.load_model('/content/drive/MyDrive/Colab_Notebooks/ensemble_model_bilstm_cnn.h5')\n", "\n", "# Predict on the test data\n", "predictions = ensemble_model.predict([test_padded, test_padded])\n", "predicted_labels = np.round(predictions)\n", "\n", "# Calculate the performance metrics\n", "accuracy = accuracy_score(test_labels, predicted_labels)\n", "f1_score = f1_score(test_labels, predicted_labels)\n", "recall = recall_score(test_labels, predicted_labels)\n", "precision = precision_score(test_labels, predicted_labels)\n", "\n", "# Print the performance metrics\n", "print(f'Accuracy: {accuracy:.4f}')\n", "print(f'F1 Score: {f1_score:.4f}')\n", "print(f'Recall: {recall:.4f}')\n", "print(f'Precision: {precision:.4f}')\n", "\n", "# Create a confusion matrix\n", "cm = confusion_matrix(test_labels, predicted_labels)\n", "\n", "# Normalize the confusion matrix by row (true labels)\n", "cm_normalized = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n", "\n", "# Create annotations with both counts and percentages\n", "annot = np.empty_like(cm).astype(str)\n", "nrows, ncols = cm.shape\n", "for i in range(nrows):\n", " for j in range(ncols):\n", " c = cm[i, j]\n", " p = cm_normalized[i, j]\n", " s = f'{c}\\n({p:.2%})'\n", " annot[i, j] = s\n", "\n", "# Plot the confusion matrix with annotations\n", "plt.figure(figsize=(10, 7))\n", "ax = sns.heatmap(cm_normalized, annot=annot, fmt='', cmap='Blues', cbar=False)\n", "\n", "ax.set_xlabel('Predicted labels')\n", "ax.set_ylabel('True labels')\n", "ax.set_title('Confusion Matrix')\n", "\n", "# Adjust tick labels based on the shape of the confusion matrix\n", "class_names = ['Class {}'.format(i) for i in range(cm.shape[0])]\n", "ax.xaxis.set_ticklabels(class_names)\n", "ax.yaxis.set_ticklabels(class_names)\n", "\n", "plt.show()\n" ] }, { "cell_type": "markdown", "source": [ "# Prediction Interface" ], "metadata": { "id": "nmWkCSQD__44" } }, { "cell_type": "code", "execution_count": 37, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "gd1Mwr9kh7kC", "outputId": "7a68b8aa-a31d-4d68-c820-3bbaf7f38ba3" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Collecting gradio\n", " Downloading gradio-4.36.1-py3-none-any.whl (12.3 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.3/12.3 MB\u001b[0m \u001b[31m28.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting aiofiles<24.0,>=22.0 (from gradio)\n", " Downloading aiofiles-23.2.1-py3-none-any.whl (15 kB)\n", "Requirement already satisfied: altair<6.0,>=4.2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (4.2.2)\n", "Collecting fastapi (from gradio)\n", " Downloading fastapi-0.111.0-py3-none-any.whl (91 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m92.0/92.0 kB\u001b[0m \u001b[31m8.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting ffmpy (from gradio)\n", " Downloading ffmpy-0.3.2.tar.gz (5.5 kB)\n", " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", "Collecting gradio-client==1.0.1 (from gradio)\n", " Downloading gradio_client-1.0.1-py3-none-any.whl (318 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m318.1/318.1 kB\u001b[0m \u001b[31m37.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting httpx>=0.24.1 (from gradio)\n", " Downloading httpx-0.27.0-py3-none-any.whl (75 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m75.6/75.6 kB\u001b[0m \u001b[31m11.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: huggingface-hub>=0.19.3 in /usr/local/lib/python3.10/dist-packages (from gradio) (0.23.3)\n", "Requirement already satisfied: importlib-resources<7.0,>=1.3 in /usr/local/lib/python3.10/dist-packages (from gradio) (6.4.0)\n", "Requirement already satisfied: jinja2<4.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (3.1.4)\n", "Requirement already satisfied: markupsafe~=2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.1.5)\n", "Requirement already satisfied: matplotlib~=3.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (3.7.1)\n", "Requirement already satisfied: numpy<3.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (1.25.2)\n", "Requirement already satisfied: orjson~=3.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (3.10.5)\n", "Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from gradio) (24.1)\n", "Requirement already satisfied: pandas<3.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.0.3)\n", "Requirement already satisfied: pillow<11.0,>=8.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (9.4.0)\n", "Requirement already satisfied: pydantic>=2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.7.3)\n", "Collecting pydub (from gradio)\n", " Downloading pydub-0.25.1-py2.py3-none-any.whl (32 kB)\n", "Collecting python-multipart>=0.0.9 (from gradio)\n", " Downloading python_multipart-0.0.9-py3-none-any.whl (22 kB)\n", "Requirement already satisfied: pyyaml<7.0,>=5.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (6.0.1)\n", "Collecting ruff>=0.2.2 (from gradio)\n", " Downloading ruff-0.4.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (8.8 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m8.8/8.8 MB\u001b[0m \u001b[31m37.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting semantic-version~=2.0 (from gradio)\n", " Downloading semantic_version-2.10.0-py2.py3-none-any.whl (15 kB)\n", "Collecting tomlkit==0.12.0 (from gradio)\n", " Downloading tomlkit-0.12.0-py3-none-any.whl (37 kB)\n", "Requirement already satisfied: typer<1.0,>=0.12 in /usr/local/lib/python3.10/dist-packages (from gradio) (0.12.3)\n", "Requirement already satisfied: typing-extensions~=4.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (4.12.2)\n", "Requirement already satisfied: urllib3~=2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.0.7)\n", "Collecting uvicorn>=0.14.0 (from gradio)\n", " Downloading uvicorn-0.30.1-py3-none-any.whl (62 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.4/62.4 kB\u001b[0m \u001b[31m7.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from gradio-client==1.0.1->gradio) (2023.6.0)\n", "Collecting websockets<12.0,>=10.0 (from gradio-client==1.0.1->gradio)\n", " Downloading websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (129 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m129.9/129.9 kB\u001b[0m \u001b[31m14.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: entrypoints in /usr/local/lib/python3.10/dist-packages (from altair<6.0,>=4.2.0->gradio) (0.4)\n", "Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair<6.0,>=4.2.0->gradio) (4.19.2)\n", "Requirement already satisfied: toolz in /usr/local/lib/python3.10/dist-packages (from altair<6.0,>=4.2.0->gradio) (0.12.1)\n", "Requirement already satisfied: anyio in /usr/local/lib/python3.10/dist-packages (from httpx>=0.24.1->gradio) (3.7.1)\n", "Requirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from httpx>=0.24.1->gradio) (2024.6.2)\n", "Collecting httpcore==1.* (from httpx>=0.24.1->gradio)\n", " Downloading httpcore-1.0.5-py3-none-any.whl (77 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m77.9/77.9 kB\u001b[0m \u001b[31m9.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: idna in /usr/local/lib/python3.10/dist-packages (from httpx>=0.24.1->gradio) (3.7)\n", "Requirement already satisfied: sniffio in /usr/local/lib/python3.10/dist-packages (from httpx>=0.24.1->gradio) (1.3.1)\n", "Collecting h11<0.15,>=0.13 (from httpcore==1.*->httpx>=0.24.1->gradio)\n", " Downloading h11-0.14.0-py3-none-any.whl (58 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.3/58.3 kB\u001b[0m \u001b[31m8.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.19.3->gradio) (3.14.0)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.19.3->gradio) (2.31.0)\n", "Requirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.19.3->gradio) (4.66.4)\n", "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (1.2.1)\n", "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (0.12.1)\n", "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (4.53.0)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (1.4.5)\n", "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (3.1.2)\n", "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (2.8.2)\n", "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas<3.0,>=1.0->gradio) (2023.4)\n", "Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas<3.0,>=1.0->gradio) (2024.1)\n", "Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic>=2.0->gradio) (0.7.0)\n", "Requirement already satisfied: pydantic-core==2.18.4 in /usr/local/lib/python3.10/dist-packages (from pydantic>=2.0->gradio) (2.18.4)\n", "Requirement already satisfied: click>=8.0.0 in /usr/local/lib/python3.10/dist-packages (from typer<1.0,>=0.12->gradio) (8.1.7)\n", "Requirement already satisfied: shellingham>=1.3.0 in /usr/local/lib/python3.10/dist-packages (from typer<1.0,>=0.12->gradio) (1.5.4)\n", "Requirement already satisfied: rich>=10.11.0 in /usr/local/lib/python3.10/dist-packages (from typer<1.0,>=0.12->gradio) (13.7.1)\n", "Collecting starlette<0.38.0,>=0.37.2 (from fastapi->gradio)\n", " Downloading starlette-0.37.2-py3-none-any.whl (71 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m71.9/71.9 kB\u001b[0m \u001b[31m9.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting fastapi-cli>=0.0.2 (from fastapi->gradio)\n", " Downloading fastapi_cli-0.0.4-py3-none-any.whl (9.5 kB)\n", "Collecting ujson!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,>=4.0.1 (from fastapi->gradio)\n", " Downloading ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (53 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m53.6/53.6 kB\u001b[0m \u001b[31m5.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting email_validator>=2.0.0 (from fastapi->gradio)\n", " Downloading email_validator-2.1.2-py3-none-any.whl (30 kB)\n", "Collecting dnspython>=2.0.0 (from email_validator>=2.0.0->fastapi->gradio)\n", " Downloading dnspython-2.6.1-py3-none-any.whl (307 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m307.7/307.7 kB\u001b[0m \u001b[31m31.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (23.2.0)\n", "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (2023.12.1)\n", "Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (0.35.1)\n", "Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (0.18.1)\n", "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib~=3.0->gradio) (1.16.0)\n", "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio) (3.0.0)\n", "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.10/dist-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio) (2.16.1)\n", "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio->httpx>=0.24.1->gradio) (1.2.1)\n", "Collecting httptools>=0.5.0 (from uvicorn>=0.14.0->gradio)\n", " Downloading httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (341 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m341.4/341.4 kB\u001b[0m \u001b[31m29.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting python-dotenv>=0.13 (from uvicorn>=0.14.0->gradio)\n", " Downloading python_dotenv-1.0.1-py3-none-any.whl (19 kB)\n", "Collecting uvloop!=0.15.0,!=0.15.1,>=0.14.0 (from uvicorn>=0.14.0->gradio)\n", " Downloading uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.4 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.4/3.4 MB\u001b[0m \u001b[31m56.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting watchfiles>=0.13 (from uvicorn>=0.14.0->gradio)\n", " Downloading watchfiles-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.2/1.2 MB\u001b[0m \u001b[31m68.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub>=0.19.3->gradio) (3.3.2)\n", "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->typer<1.0,>=0.12->gradio) (0.1.2)\n", "Building wheels for collected packages: ffmpy\n", " Building wheel for ffmpy (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for ffmpy: filename=ffmpy-0.3.2-py3-none-any.whl size=5584 sha256=3cacb542c5f87008c0848f723ad0b2db06b1937716a3d3fc5025dc91b7ca770a\n", " Stored in directory: /root/.cache/pip/wheels/bd/65/9a/671fc6dcde07d4418df0c592f8df512b26d7a0029c2a23dd81\n", "Successfully built ffmpy\n", "Installing collected packages: pydub, ffmpy, websockets, uvloop, ujson, tomlkit, semantic-version, ruff, python-multipart, python-dotenv, httptools, h11, dnspython, aiofiles, watchfiles, uvicorn, starlette, httpcore, email_validator, httpx, gradio-client, fastapi-cli, fastapi, gradio\n", "Successfully installed aiofiles-23.2.1 dnspython-2.6.1 email_validator-2.1.2 fastapi-0.111.0 fastapi-cli-0.0.4 ffmpy-0.3.2 gradio-4.36.1 gradio-client-1.0.1 h11-0.14.0 httpcore-1.0.5 httptools-0.6.1 httpx-0.27.0 pydub-0.25.1 python-dotenv-1.0.1 python-multipart-0.0.9 ruff-0.4.9 semantic-version-2.10.0 starlette-0.37.2 tomlkit-0.12.0 ujson-5.10.0 uvicorn-0.30.1 uvloop-0.19.0 watchfiles-0.22.0 websockets-11.0.3\n" ] } ], "source": [ "# prompt: write a code to install and import Gradio, to run the function predict_fake_news(text)\n", "\n", "!pip install gradio" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 646 }, "id": "nrmUxArzwTQ0", "outputId": "51d162aa-a3cb-4f01-dee0-a985f1177470" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Setting queue=True in a Colab notebook requires sharing enabled. Setting `share=True` (you can turn this off by setting `share=False` in `launch()` explicitly).\n", "\n", "Colab notebook detected. To show errors in colab notebook, set debug=True in launch()\n", "Running on public URL: https://f02208f8032e00faae.gradio.live\n", "\n", "This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/html": [ "
" ] }, "metadata": {} }, { "output_type": "execute_result", "data": { "text/plain": [] }, "metadata": {}, "execution_count": 38 } ], "source": [ "import gradio as gr\n", "import tweepy\n", "\n", "\n", "# Define a function to update on Twitter\n", "def update_on_Twitter(tweet_text, prediction):\n", " CONSUMER_KEY = \"q76xzfaSG7jL4unpvaNuPM5Ms\"\n", " CONSUMER_SECRET = \"7h2JCH9fveW3srWarhCmwLbr8rTtVeJ04Qo3q65VItX2L4eFs1\"\n", " ACCESS_TOKEN = \"1636314191198932992-VesD9DTEnagO7fQdCiu5Fh6vuFLbw1\"\n", " ACCESS_TOKEN_SECRET = \"DcTCYDGba8UWlbMEpDvmTMZuVI2XAip7Tu8QgLTrC12AW\"\n", " BAERER_TOKEN = \"AAAAAAAAAAAAAAAAAAAAAPJjnwEAAAAA3DnqW09w51Oufv8UCReOPQLPUtA%3Dz9vzO4DXVbXRU63RZB3TzbCrBc0saEnQZ49GMmGkDqKVu30qwC\"\n", "\n", " # Authenticate to Twitter\n", " auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)\n", " auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)\n", "\n", " # Create an API object\n", " api = tweepy.API(auth)\n", "\n", " # Create a Client object\n", " client = tweepy.Client(\n", " BAERER_TOKEN,\n", " CONSUMER_KEY,\n", " CONSUMER_SECRET,\n", " ACCESS_TOKEN,\n", " ACCESS_TOKEN_SECRET,\n", " wait_on_rate_limit=True\n", " )\n", "\n", " postText = f\"The news: {tweet_text} is {prediction}\"\n", "\n", " try:\n", " api.verify_credentials()\n", " print(\"Authentication OK\")\n", " client.create_tweet(text=postText)\n", " return f'Detect Fake News on Twitter Bot Account'\n", " except Exception as e:\n", " print(e)\n", " return f'Error: {e}'\n", "\n", "# Use Gradio Blocks to create a more flexible interface\n", "with gr.Blocks() as demo:\n", " gr.Markdown(\"# Fake News Detection\")\n", " text_input = gr.Textbox(placeholder=\"Enter a news Tweet here...\", label=\"News Tweet\")\n", " text_output = gr.Textbox(label=\"Prediction\")\n", " link_output = gr.HTML(label=\"Twitter Bot Account\")\n", "\n", " # Button to get prediction\n", " gr.Button(\"Predict\").click(predict_fake_news, inputs=text_input, outputs=text_output)\n", "\n", " # Button to generate a Gradio link\n", " gr.Button(\"Detect on Twitter\").click(update_on_Twitter, inputs=[text_input, text_output], outputs=link_output)\n", "\n", "# Launch the interface\n", "demo.launch()\n" ] } ], "metadata": { "accelerator": "GPU", "colab": { "gpuType": "T4", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "74b2c16b3dd94af3a6394c71fe9d1d98": { "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_3467cbed80734b45befed3d8867652a6", "IPY_MODEL_ef11cdc5dea344759f9b0f78939c14d4", "IPY_MODEL_55b4b9ea6dd34aecb7213964c47e250b" ], "layout": "IPY_MODEL_5dec5fbe4ae941a581cea79167270bf6" } }, "3467cbed80734b45befed3d8867652a6": { "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_3085ba25f51f49ae95930564e2d54a0f", "placeholder": "​", "style": "IPY_MODEL_1b4ec4fc682b488caee3ac9ef0b197cd", "value": "config.json: 100%" } }, "ef11cdc5dea344759f9b0f78939c14d4": { "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_c3d27b7643194755979e3b231a7c7359", "max": 570, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_13a985113cb040b79027ed3b59ecfb51", "value": 570 } }, "55b4b9ea6dd34aecb7213964c47e250b": { "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_8041895128094c65b1e65760067bb5bd", "placeholder": "​", "style": "IPY_MODEL_f8465e5d2654402fbf9aa789ee39948c", "value": " 570/570 [00:00<00:00, 4.04kB/s]" } }, "5dec5fbe4ae941a581cea79167270bf6": { "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 } }, "3085ba25f51f49ae95930564e2d54a0f": { "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 } }, "1b4ec4fc682b488caee3ac9ef0b197cd": { "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": "" } }, "c3d27b7643194755979e3b231a7c7359": { "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 } }, "13a985113cb040b79027ed3b59ecfb51": { "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": "" } }, "8041895128094c65b1e65760067bb5bd": { "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 } }, "f8465e5d2654402fbf9aa789ee39948c": { "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": "" } }, "42778e0f00ee4099845365a4129a9b07": { "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_ee8a393f6f7a43c0af95f13bb1d8d1b4", "IPY_MODEL_46a9f330d01b43ec9323b0866ef1960e", "IPY_MODEL_f5ff7383a64b435096ebc0654c063311" ], "layout": "IPY_MODEL_7ed0cdc589ab4bccb301a7ac2a4cacc6" } }, "ee8a393f6f7a43c0af95f13bb1d8d1b4": { "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_f76cc9fee554462992ae333536ac3e78", "placeholder": "​", "style": "IPY_MODEL_9bc6e00fb6dc450e8643dd97bd093b2a", "value": "model.safetensors: 100%" } }, "46a9f330d01b43ec9323b0866ef1960e": { "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_7f76440815a94593ae2d93a87b418dad", "max": 440449768, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_8a992dca377b4736970d717dd9e41e49", "value": 440449768 } }, "f5ff7383a64b435096ebc0654c063311": { "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_2b72f679299d4049864f1daea16b9a77", "placeholder": "​", "style": "IPY_MODEL_5589161d795941edb2fdb804bfd815b5", "value": " 440M/440M [00:08<00:00, 53.4MB/s]" } }, "7ed0cdc589ab4bccb301a7ac2a4cacc6": { "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 } }, "f76cc9fee554462992ae333536ac3e78": { "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 } }, "9bc6e00fb6dc450e8643dd97bd093b2a": { "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": "" } }, "7f76440815a94593ae2d93a87b418dad": { "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 } }, "8a992dca377b4736970d717dd9e41e49": { "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": "" } }, "2b72f679299d4049864f1daea16b9a77": { "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 } }, "5589161d795941edb2fdb804bfd815b5": { "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": "" } }, "b58b34df1fac4232b1a392fadabe3446": { "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_0efb7ee658794030b36ca44d79d4b236", "IPY_MODEL_d1eeefd866074f50be6ffd9d6a199d24", "IPY_MODEL_e78ef5b5c8f149dabfd4fb1445251a88" ], "layout": "IPY_MODEL_494b1cb203cf441b8eff14b64371213e" } }, "0efb7ee658794030b36ca44d79d4b236": { "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_87ed154eea034d2180ccd5bab5229155", "placeholder": "​", "style": "IPY_MODEL_d599ca19c22943d6aecfeb13fc16f5de", "value": "tokenizer_config.json: 100%" } }, "d1eeefd866074f50be6ffd9d6a199d24": { "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_a1ade1b5205b429894d5374b29490bb8", "max": 48, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_f3f2ec20971140b99c3be6bdf21ffa43", "value": 48 } }, "e78ef5b5c8f149dabfd4fb1445251a88": { "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_af52e94cb5c446ca972b7a7837293b03", "placeholder": "​", "style": "IPY_MODEL_d26f83118504442b8e8bdd7e33d30b03", "value": " 48.0/48.0 [00:00<00:00, 302B/s]" } }, "494b1cb203cf441b8eff14b64371213e": { "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 } }, "87ed154eea034d2180ccd5bab5229155": { "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 } }, "d599ca19c22943d6aecfeb13fc16f5de": { "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": "" } }, "a1ade1b5205b429894d5374b29490bb8": { "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 } }, "f3f2ec20971140b99c3be6bdf21ffa43": { "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": "" } }, "af52e94cb5c446ca972b7a7837293b03": { "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 } }, "d26f83118504442b8e8bdd7e33d30b03": { "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": "" } }, "88439fa69b2d4b41a20dffe1c3c62258": { "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_a64be3a4ebe34c0085c256c5dcaa2a09", "IPY_MODEL_64b358189e6a4c47a622846aeb0c7566", "IPY_MODEL_e9feed4a39f64631b2dfe746a583a03c" ], "layout": "IPY_MODEL_1f77f1a77fa4486a937b3a33c994e348" } }, "a64be3a4ebe34c0085c256c5dcaa2a09": { "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_237c63d8f3cd4794a61ab360fff10ac2", "placeholder": "​", "style": "IPY_MODEL_506133fbc79541d2936f8efc78dd7dde", "value": "vocab.txt: 100%" } }, "64b358189e6a4c47a622846aeb0c7566": { "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_30c34b5a4eef43cda64fb5568cb7dc4f", "max": 231508, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_073eb0f4e8f440acadeb1a326a96a178", "value": 231508 } }, "e9feed4a39f64631b2dfe746a583a03c": { "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_9258c3a11e4b4c4b98e433d44cea9554", "placeholder": "​", "style": "IPY_MODEL_3c32d976a9314b0bb6d74d5cf2488134", "value": " 232k/232k [00:00<00:00, 1.55MB/s]" } }, "1f77f1a77fa4486a937b3a33c994e348": { "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 } }, "237c63d8f3cd4794a61ab360fff10ac2": { "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 } }, "506133fbc79541d2936f8efc78dd7dde": { "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": "" } }, "30c34b5a4eef43cda64fb5568cb7dc4f": { "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 } }, "073eb0f4e8f440acadeb1a326a96a178": { "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": "" } }, "9258c3a11e4b4c4b98e433d44cea9554": { "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 } }, "3c32d976a9314b0bb6d74d5cf2488134": { "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": "" } }, "a7e453f3b0494ba7a7ddbd703468b377": { "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_a2f8e2390258408899d6ead630fe2037", "IPY_MODEL_8951cf1b3ef24ce6bb857f70929444e1", "IPY_MODEL_f776aaf69f1c452daf5b441b85aac33e" ], "layout": "IPY_MODEL_12cc0ac549734af28451abb30e1cda83" } }, "a2f8e2390258408899d6ead630fe2037": { "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_4b50bdc9ce454a3f914452480613bfe9", "placeholder": "​", "style": "IPY_MODEL_5cdd170770a04b72af140314eb64b505", "value": "tokenizer.json: 100%" } }, "8951cf1b3ef24ce6bb857f70929444e1": { "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_6b711f56c8d549d1b11790071647c7ad", "max": 466062, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_99c9a4bc768e40a582bd73b88f21eb96", "value": 466062 } }, "f776aaf69f1c452daf5b441b85aac33e": { "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_28e9d0f866a1405d94f8c9b2a2f18490", "placeholder": "​", "style": "IPY_MODEL_385c6ece940b42c8b53bf9a42775a1d7", "value": " 466k/466k [00:00<00:00, 2.37MB/s]" } }, "12cc0ac549734af28451abb30e1cda83": { "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 } }, "4b50bdc9ce454a3f914452480613bfe9": { "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 } }, "5cdd170770a04b72af140314eb64b505": { "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": "" } }, "6b711f56c8d549d1b11790071647c7ad": { "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 } }, "99c9a4bc768e40a582bd73b88f21eb96": { "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": "" } }, "28e9d0f866a1405d94f8c9b2a2f18490": { "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 } }, "385c6ece940b42c8b53bf9a42775a1d7": { "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 }