diff --git "a/Fake_News_Detection_2_0 (4).ipynb" "b/Fake_News_Detection_2_0 (4).ipynb" new file mode 100644--- /dev/null +++ "b/Fake_News_Detection_2_0 (4).ipynb" @@ -0,0 +1,5177 @@ +{ + "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//kiU8wKAN43FSMjdpgAAAADwBmLGCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpEYwAAAAAmB7BCAAAAIDpOdi6gKSQrGg3W5cAAHgF3No3w9YlAABszCWeiYcZIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoEIwAAAACmRzACAAAAYHoE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\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 +} \ No newline at end of file