{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Sentiment Analysis" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from __future__ import annotations\n", "\n", "from typing import TYPE_CHECKING\n", "\n", "if TYPE_CHECKING:\n", " from sklearn.base import BaseEstimator\n", "\n", "import json\n", "import re\n", "import warnings\n", "from functools import cache\n", "from pathlib import Path\n", "\n", "import joblib\n", "import matplotlib.pyplot as plt\n", "import nltk\n", "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns\n", "from nltk.corpus import stopwords\n", "from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.metrics import confusion_matrix\n", "from sklearn.model_selection import RandomizedSearchCV, train_test_split\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.svm import SVC\n", "\n", "from app.constants import CACHE_DIR, MODELS_DIR, SENTIMENT140_PATH\n", "from app.model import TextCleaner, TextLemmatizer" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "SEED = 42\n", "MAX_FEATURES = 20000" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[nltk_data] Downloading package wordnet to /home/tymec/nltk_data...\n", "[nltk_data] Package wordnet is already up-to-date!\n", "[nltk_data] Downloading package stopwords to /home/tymec/nltk_data...\n", "[nltk_data] Package stopwords is already up-to-date!\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nltk.download(\"wordnet\")\n", "nltk.download(\"stopwords\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load the data" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
targetiddateflagusertextsentiment
001467810369Mon Apr 06 22:19:45 PDT 2009NO_QUERY_TheSpecialOne_@switchfoot http://twitpic.com/2y1zl - Awww, t...0
101467810672Mon Apr 06 22:19:49 PDT 2009NO_QUERYscotthamiltonis upset that he can't update his Facebook by ...0
201467810917Mon Apr 06 22:19:53 PDT 2009NO_QUERYmattycus@Kenichan I dived many times for the ball. Man...0
301467811184Mon Apr 06 22:19:57 PDT 2009NO_QUERYElleCTFmy whole body feels itchy and like its on fire0
401467811193Mon Apr 06 22:19:57 PDT 2009NO_QUERYKaroli@nationwideclass no, it's not behaving at all....0
\n", "
" ], "text/plain": [ " target id date flag \\\n", "0 0 1467810369 Mon Apr 06 22:19:45 PDT 2009 NO_QUERY \n", "1 0 1467810672 Mon Apr 06 22:19:49 PDT 2009 NO_QUERY \n", "2 0 1467810917 Mon Apr 06 22:19:53 PDT 2009 NO_QUERY \n", "3 0 1467811184 Mon Apr 06 22:19:57 PDT 2009 NO_QUERY \n", "4 0 1467811193 Mon Apr 06 22:19:57 PDT 2009 NO_QUERY \n", "\n", " user text \\\n", "0 _TheSpecialOne_ @switchfoot http://twitpic.com/2y1zl - Awww, t... \n", "1 scotthamilton is upset that he can't update his Facebook by ... \n", "2 mattycus @Kenichan I dived many times for the ball. Man... \n", "3 ElleCTF my whole body feels itchy and like its on fire \n", "4 Karoli @nationwideclass no, it's not behaving at all.... \n", "\n", " sentiment \n", "0 0 \n", "1 0 \n", "2 0 \n", "3 0 \n", "4 0 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Load the data\n", "data = pd.read_csv(\n", " SENTIMENT140_PATH,\n", " encoding=\"ISO-8859-1\",\n", " names=[\n", " \"target\", # 0 = negative, 2 = neutral, 4 = positive\n", " \"id\", # The id of the tweet\n", " \"date\", # The date of the tweet\n", " \"flag\", # The query, NO_QUERY if not present\n", " \"user\", # The user that tweeted\n", " \"text\", # The text of the tweet\n", " ],\n", ")\n", "\n", "# Ignore rows with neutral sentiment\n", "data = data[data[\"target\"] != 2]\n", "\n", "# Map the sentiment values\n", "data[\"sentiment\"] = data[\"target\"].map({0: 0, 4: 1})\n", "\n", "# Show the first few rows\n", "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load the stopwords" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "stopwords_en = stopwords.words(\"english\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Explore the data" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAFzCAYAAADsTAnbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA5QElEQVR4nO3df1xW9f3/8Seg/PDHdeFPkInCslSWaWLh5arNRV426pOLmhZTUtR0YCmZSnPo+tRwtkqdJrU+n7BNl7rPcgWJEaaWkj9w5o/SrFFYeIGmcCUpINf5/tGXMy51AYY7Co/77XZutzjv13mfl9fNdzw9nHPwMQzDEAAAgEV8rW4AAAC0boQRAABgKcIIAACwFGEEAABYijACAAAsRRgBAACWIowAAABLEUYAAICl2ljdwOXM4/GopKREHTt2lI+Pj9XtAABwxTAMQ1999ZXCwsLk6/vt1z4II9+ipKRE4eHhVrcBAMAV68iRI+rZs+e31hBGvkXHjh0lffNB2mw2i7sBAODK4Xa7FR4ebn4v/TaEkW9R96MZm81GGAEA4CI05jYHbmAFAACWIowAAABLEUYAAIClCCMAAMBShBEAAGApwggAALAUYQQAAFiqSWGktrZWv/71rxUZGamgoCBdddVV+u///m8ZhmHWGIah9PR09ejRQ0FBQYqNjdXhw4e95jlx4oQSEhJks9kUHByspKQknTp1yqtm7969uvnmmxUYGKjw8HAtXLjwvH7Wrl2rfv36KTAwUAMGDNAbb7zhNd6YXgAAgMWMJnjyySeNLl26GNnZ2UZRUZGxdu1ao0OHDsbixYvNmgULFhh2u91Yt26d8f777xv/9V//ZURGRhqnT582a0aOHGkMHDjQeO+994x33nnH6NOnj3HfffeZ4xUVFUZISIiRkJBg7N+/3/jLX/5iBAUFGc8//7xZs3XrVsPPz89YuHCh8cEHHxhz58412rZta+zbt69JvXybiooKQ5JRUVHRlI8JAIBWrynfQ5sURuLi4owJEyZ47bv77ruNhIQEwzAMw+PxGKGhocZTTz1ljpeXlxsBAQHGX/7yF8MwDOODDz4wJBk7d+40a9avX2/4+PgYX3zxhWEYhvHcc88ZnTp1Mqqqqsya2bNnG3379jW//vnPf27ExcV59RITE2M8+OCDje6lIYQRAAAuTlO+hzbpxzTDhg1Tfn6+PvroI0nS+++/r3fffVe33367JKmoqEgul0uxsbHmMXa7XTExMSooKJAkFRQUKDg4WEOGDDFrYmNj5evrq+3bt5s1t9xyi/z9/c0ap9OpQ4cO6eTJk2ZN/fPU1dSdpzG9nKuqqkput9trAwAAl1aTfjfNnDlz5Ha71a9fP/n5+am2tlZPPvmkEhISJEkul0uSFBIS4nVcSEiIOeZyudS9e3fvJtq0UefOnb1qIiMjz5ujbqxTp05yuVwNnqehXs6VkZGh3/zmN434JFqeiDk5VreAZvbpgjirW0AzYo22LKxPb026MrJmzRqtXLlSq1at0u7du7VixQr9/ve/14oVKy5Vf/9RaWlpqqioMLcjR45Y3RIAAC1ek66MPProo5ozZ47GjBkjSRowYIA+++wzZWRkKDExUaGhoZKk0tJS9ejRwzyutLRUgwYNkiSFhoaqrKzMa96zZ8/qxIkT5vGhoaEqLS31qqn7uqGa+uMN9XKugIAABQQENO7DAAAAzaJJV0a+/vpr+fp6H+Ln5yePxyNJioyMVGhoqPLz881xt9ut7du3y+FwSJIcDofKy8tVWFho1mzcuFEej0cxMTFmzZYtW1RTU2PW5OXlqW/fvurUqZNZU/88dTV152lMLwAAwHpNCiN33nmnnnzySeXk5OjTTz/Vq6++qmeeeUY/+9nPJEk+Pj6aPn26nnjiCb322mvat2+fxo0bp7CwMI0aNUqS1L9/f40cOVKTJk3Sjh07tHXrVqWkpGjMmDEKCwuTJN1///3y9/dXUlKSDhw4oNWrV2vx4sVKTU01e3n44YeVm5urp59+WgcPHtT8+fO1a9cupaSkNLoXAABgvSb9mOYPf/iDfv3rX+uXv/ylysrKFBYWpgcffFDp6elmzaxZs1RZWanJkyervLxcN910k3JzcxUYGGjWrFy5UikpKbr11lvl6+ur+Ph4LVmyxBy32+168803lZycrOjoaHXt2lXp6emaPHmyWTNs2DCtWrVKc+fO1WOPPaarr75a69at07XXXtukXgAAgLV8DKPe61Phxe12y263q6KiQjabzep2Linu1G95uFu/ZWGNtiytYX025Xsov5sGAABYijACAAAsRRgBAACWIowAAABLEUYAAIClCCMAAMBShBEAAGApwggAALAUYQQAAFiKMAIAACxFGAEAAJYijAAAAEsRRgAAgKUI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uXOVnJysgIAASdKUKVO0dOlSzZo1SxMmTNDGjRu1Zs0a5eT8607y1NRUJSYmasiQIbrxxhu1aNEiVVZWavz48ZLUqF4AAMDloUlh5PPPP9d9992nL7/8Ut26ddNNN92k9957T926dZMkPfvss/L19VV8fLyqqqrkdDr13HPPmcf7+fkpOztbU6dOlcPhUPv27ZWYmKjHH3/crImMjFROTo5mzJihxYsXq2fPnnrxxRfldDrNmtGjR+vYsWNKT0+Xy+XSoEGDlJub63VTa0O9AACAy0OT3jPS2vCeEVzJWsN7DFoT1mjL0hrW5yV9zwgAAEBzIowAAABLEUYAAIClCCMAAMBShBEAAGApwggAALAUYQQAAFiKMAIAACxFGAEAAJYijAAAAEsRRgAAgKUIIwAAwFKEEQAAYCnCCAAAsBRhBAAAWIowAgAALEUYAQAAliKMAAAASxFGAACApQgjAADAUoQRAABgKcIIAACwFGEEAABYijACAAAsRRgBAACWIowAAABLfacwsmDBAvn4+Gj69OnmvjNnzig5OVldunRRhw4dFB8fr9LSUq/jiouLFRcXp3bt2ql79+569NFHdfbsWa+aTZs2afDgwQoICFCfPn2UlZV13vmXLVumiIgIBQYGKiYmRjt27PAab0wvAADAWhcdRnbu3Knnn39e1113ndf+GTNm6PXXX9fatWu1efNmlZSU6O677zbHa2trFRcXp+rqam3btk0rVqxQVlaW0tPTzZqioiLFxcVp+PDh2rNnj6ZPn66JEydqw4YNZs3q1auVmpqqefPmaffu3Ro4cKCcTqfKysoa3QsAALCej2EYRlMPOnXqlAYPHqznnntOTzzxhAYNGqRFixapoqJC3bp106pVq3TPPfdIkg4ePKj+/furoKBAQ4cO1fr163XHHXeopKREISEhkqTMzEzNnj1bx44dk7+/v2bPnq2cnBzt37/fPOeYMWNUXl6u3NxcSVJMTIxuuOEGLV26VJLk8XgUHh6uadOmac6cOY3qpSFut1t2u10VFRWy2WxN/ZiuKBFzcqxuAc3s0wVxVreAZsQabVlaw/psyvfQi7oykpycrLi4OMXGxnrtLywsVE1Njdf+fv36qVevXiooKJAkFRQUaMCAAWYQkSSn0ym3260DBw6YNefO7XQ6zTmqq6tVWFjoVePr66vY2FizpjG9nKuq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FKSBAwfqr3/9azN8UsDlISAgQKGhoerdu7emTp2q2NhYvfbaazp58qTGjRunTp06qV27drr99tt1+PBh87jPPvtMd955pzp16qT27dvrBz/4gd544w1J3j+mYT22ToQRWMrPz0+//e1v9Yc//EGff/75eeOffPKJRo4cqfj4eO3du1erV6/Wu+++q5SUFLNm3LhxKikp0aZNm/R///d/euGFF1RWVuY1j6+vr5YsWaIDBw5oxYoV2rhxo2bNmiXpm0vEixYtks1m09GjR3X06FHNnDnzvF4SEhL0+uuvmyFGkjZs2KCvv/5aP/vZzyR985ufX375ZWVmZurAgQOaMWOGfvGLX2jz5s3N8nkBl5ugoCBVV1frgQce0K5du/Taa6+poKBAhmHopz/9qWpqaiRJycnJqqqq0pYtW7Rv3z797ne/U4cOHc6bj/XYShmARRITE4277rrLMAzDGDp0qDFhwgTDMAzj1VdfNer+aiYlJRmTJ0/2Ou6dd94xfH19jdOnTxsffvihIcnYuXOnOX748GFDkvHss8/+23OvXbvW6NKli/n1Sy+9ZNjt9vPqevfubc5TU1NjdO3a1Xj55ZfN8fvuu88YPXq0YRiGcebMGaNdu3bGtm3bvOZISkoy7rvvvm//MIArQP016/F4jLy8PCMgIMAYNWqUIcnYunWrWXv8+HEjKCjIWLNmjWEYhjFgwABj/vz5F5z37bffNiQZJ0+eNAyD9dgatfjXwePK8Lvf/U4/+clPzvsX0Pvvv6+9e/dq5cqV5j7DMOTxeFRUVKSPPvpIbdq00eDBg83xPn36qFOnTl7zvPXWW8rIyNDBgwfldrt19uxZnTlzRl9//XWjfwbdpk0b/fznP9fKlSs1duxYVVZW6u9//7teeeUVSdLHH3+sr7/+WrfddpvXcdXV1br++uub9HkAl6vs7Gx16NBBNTU18ng8uv/++3X33XcrOztbMTExZl2XLl3Ut29fffjhh5Kkhx56SFOnTtWbb76p2NhYxcfH67rrrrvoPliPLQthBJeFW265RU6nU2lpaXrggQfM/adOndKDDz6ohx566LxjevXqpY8++qjBuT/99FPdcccdmjp1qp588kl17txZ7777rpKSklRdXd2kG+ISEhL0ox/9SGVlZcrLy1NQUJBGjhxp9ipJOTk5+t73vud1HL9rAy3F8OHDtXz5cvn7+yssLExt2rTRa6+91uBxEydOlNPpVE5Ojt58801lZGTo6aef1rRp0y66F9Zjy0EYwWVjwYIFGjRokPr27WvuGzx4sD744AP16dPngsf07dtXZ8+e1T/+8Q9FR0dL+uZfRPWfziksLJTH49HTTz8tX99vbpNas2aN1zz+/v6qra1tsMdhw4YpPDxcq1ev1vr163Xvvfeqbdu2kqSoqCgFBASouLhYP/rRj5r2hweuEO3btz9vPfbv319nz57V9u3bNWzYMEnSl19+qUOHDikqKsqsCw8P15QpUzRlyhSlpaXpj3/84wXDCOux9SGM4LIxYMAAJSQkaMmSJea+2bNna+jQoUpJSdHEiRPVvn17ffDBB8rLy9PSpUvVr18/xcbGavLkyVq+fLnatm2rRx55REFBQeZjgn369FFNTY3+8Ic/6M4779TWrVuVmZnpde6IiAidOnVK+fn5GjhwoNq1a/dvr5jcf//9yszM1EcffaS3337b3N+xY0fNnDlTM2bMkMfj0U033aSKigpt3bpVNptNiYmJl+BTA6x39dVX66677tKkSZP0/PPPq2PHjpozZ46+973v6a677pIkTZ8+XbfffruuueYanTx5Um+//bb69+9/wflYj62Q1TetoPWqfzNcnaKiIsPf39+o/1dzx44dxm233WZ06NDBaN++vXHdddcZTz75pDleUlJi3H777UZAQIDRu3dvY9WqVUb37t2NzMxMs+aZZ54xevToYQQFBRlOp9N4+eWXvW6YMwzDmDJlitGlSxdDkjFv3jzDMLxvmKvzwQcfGJKM3r17Gx6Px2vM4/EYixYtMvr27Wu0bdvW6Natm+F0Oo3Nmzd/tw8LuAxcaM3WOXHihDF27FjDbreb6+yjjz4yx1NSUoyrrrrKCAgIMLp162aMHTvWOH78uGEY59/Aahisx9bGxzAMw8IsBDS7zz//XOHh4Xrrrbd06623Wt0OAKABhBFc8TZu3KhTp05pwIABOnr0qGbNmqUvvvhCH330kfnzYwDA5Yt7RnDFq6mp0WOPPaZ//vOf6tixo4YNG6aVK1cSRADgCsGVEQAAYCleBw8AACxFGAEAAJYijAAAAEsRRgAAgKUIIwCuKJs2bZKPj4/Ky8utbgVAMyGMALgox44d09SpU9WrVy8FBAQoNDRUTqdTW7dubbZz/PjHP9b06dO99g0bNkxHjx6V3W5vtvNcrAceeECjRo2yug3gisd7RgBclPj4eFVXV2vFihX6/ve/r9LSUuXn5+vLL7+8pOf19/dXaGjoJT0HgP8wK99FD+DKdPLkSUOSsWnTpm+tSUpKMrp27Wp07NjRGD58uLFnzx5zfN68ecbAgQONl19+2ejdu7dhs9mM0aNHG2632zCMb34PiiSvraio6LzfY/LSSy8ZdrvdeP31141rrrnGCAoKMuLj443KykojKyvL6N27txEcHGxMmzbNOHv2rHn+M2fOGI888ogRFhZmtGvXzrjxxhuNt99+2xyvmzc3N9fo16+f0b59e8PpdBolJSVm/+f2V/94AI3Hj2kANFmHDh3UoUMHrVu3TlVVVResuffee1VWVqb169ersLBQgwcP1q233qoTJ06YNZ988onWrVun7OxsZWdna/PmzVqwYIEkafHixXI4HJo0aZKOHj2qo0ePKjw8/ILn+vrrr7VkyRK98sorys3N1aZNm/Szn/1Mb7zxht544w396U9/0vPPP6+//vWv5jEpKSkqKCjQK6+8or179+ree+/VyJEjdfjwYa95f//73+tPf/qTtmzZouLiYs2cOVOSNHPmTP385z/XyJEjzf6GDRv2nT9boFWyOg0BuDL99a9/NTp16mQEBgYaw4YNM9LS0oz333/fMAzDeOeddwybzWacOXPG65irrrrKeP755w3D+ObKQrt27cwrIYZhGI8++qgRExNjfv2jH/3IePjhh73muNCVEUnGxx9/bNY8+OCDRrt27YyvvvrK3Od0Oo0HH3zQMAzD+Oyzzww/Pz/jiy++8Jr71ltvNdLS0v7tvMuWLTNCQkLMr7/tt9gCaDzuGQFwUeLj4xUXF6d33nlH7733ntavX6+FCxfqxRdfVGVlpU6dOqUuXbp4HXP69Gl98skn5tcRERHq2LGj+XWPHj1UVlbW5F7atWunq666yvw6JCREERER6tChg9e+urn37dun2tpaXXPNNV7zVFVVefV87rwX2x+Ab0cYAXDRAgMDddttt+m2227Tr3/9a02cOFHz5s3TL3/5S/Xo0UObNm0675jg4GDzv8/9ZYY+Pj7yeDxN7uNC83zb3KdOnZKfn58KCwvl5+fnVVc/wFxoDoNf5wU0O8IIgGYTFRWldevWafDgwXK5XGrTpo0iIiIuej5/f3/V1tY2X4P/3/XXX6/a2lqVlZXp5ptvvuh5LlV/QGvDDawAmuzLL7/UT37yE/35z3/W3r17VVRUpLVr12rhwoW66667FBsbK4fDoVGjRunNN9/Up59+qm3btulXv/qVdu3a1ejzREREaPv27fr00091/Pjxi7pqciHXXHONEhISNG7cOP3tb39TUVGRduzYoYyMDOXk5DSpv7179+rQoUM6fvy4ampqmqU/oLUhjABosg4dOigmJkbPPvusbrnlFl177bX69a9/rUmTJmnp0qXy8fHRG2+8oVtuuUXjx4/XNddcozFjxuizzz5TSEhIo88zc+ZM+fn5KSoqSt26dVNxcXGz/RleeukljRs3To888oj69u2rUaNGaefOnerVq1ej55g0aZL69u2rIUOGqFu3bs36wjegNfEx+AEoAACwEFdGAACApQgjAADAUoQRAABgKcIIAACwFGEEAABYijACAAAsRRgBAACWIowAAABLEUYAAIClCCMAAMBShBEAAGApwggAALDU/wOo97ayD2CTygAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot the distribution\n", "_, ax = plt.subplots(figsize=(6, 4))\n", "data[\"sentiment\"].value_counts().plot(kind=\"bar\", ax=ax)\n", "ax.set_xticklabels([\"Negative\", \"Positive\"], rotation=0)\n", "ax.set_xlabel(\"Sentiment\")\n", "ax.grid(False)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "@cache\n", "def extract_words(text: str) -> list[str]:\n", " return re.findall(r\"(\\b[^\\s]+\\b)\", text.lower())" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
wordcount
0i750749
1to564469
2the520036
3a377506
4my314024
\n", "
" ], "text/plain": [ " word count\n", "0 i 750749\n", "1 to 564469\n", "2 the 520036\n", "3 a 377506\n", "4 my 314024" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Extract words and count them\n", "words = data[\"text\"].apply(extract_words).explode()\n", "word_counts = words.value_counts().reset_index()\n", "word_counts.columns = [\"word\", \"count\"]\n", "word_counts.head()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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WNBxPMYY07lzZ+Pt7W1KlSplunbtambNmmWef/55I8nMnDnznj/n7777zkgyO3fudLQl9UfLli0dbV9//bWRZHbt2mWMMebq1asmJCTEeHp6moEDB5rp06ebmjVrGknm3Xffdaz3xx9/GEmmZMmSplChQmbixIlm6tSp5ujRo2bHjh3Gx8fH5M+f30yYMMGMGzfO5MiRw5QpU8b8/c/K/cYKACBtItcg10gPuUaRIkVMixYtbmvftWuXCQwMNCVLljRvvfWWmTFjhqlVq5ax2WxO4yDpuKdNm2aMMSYhIcFUr17d5MiRw5w7d86x3OjRo40kU61aNTNp0iQzbdo00759e/PKK684lqldu7apXbu243nSz/ePP/5wii1p7P3yyy+Otrlz5zq2P336dDNgwACTOXNmU6hQIadtJvX3vHnzHG0POj4SEhJMWFiYcXd3N3379jUzZsww9evXN6Ghobdt805effVVY7PZTI8ePcyHH35opkyZYtq1a2cmTpxojDHm119/NfXr1zeSHO/nzz77zBjz4L83jLn5vipdurTJli2bGTt2rHnrrbdMgQIFjI+Pj2McJyQkmMyZM5vBgwc71ps6dapxc3Mzbm5uJjo62rFcQECAGTJkiGO5UaNGGUmmXr165r333jN9+/Y17u7uplKlSiYuLs7p55kzZ04THBxs+vXrZ+bMmWMWL15sEhMTTa1atYybm5t56aWXzHvvvWfq1KnjGNd/78dq1aqZwMBAM2LECDN37lzz5ptvmqeeesqsWrXK6ZhPnDhhJJn33nvvnj8DPF4U1oB05u/J7owZM4y/v7+5evWqMcaYVq1aORKzfya7ixcvNpLM+PHjnbbXsmVLY7PZzMGDB40xN//wSDJnz569awwbN258oD+ySTp16mTc3NzMxo0bb3stMTHRGGPMgAEDjCSzZs0ax2uXLl0yTzzxhClYsKBJSEgwxtxKOEqXLu30B65du3bGZrOZhg0bOm0/LCzMFChQwKlNkrHb7U7JzJw5c4wkkzNnThMTE+NoHz58uFPiExcXZ7Jnz25Kly5trl275lju+++/N5LM66+/7mjr3LmzkWTGjh3rtP9y5cqZChUq3KvLTFRUlFPSc/HiRePm5mZatWplcuTI4Viuf//+JigoyNGP7777rpFkPv/8c8cycXFxJiwszGTKlMlxbEnJV0BAgImK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27fvtvY7xedKSXHcKdZ9+/Yla5xJf+xXrlypjRs3Op4nfdu2Zs0a+fn5OZ0OX6BAAR04cOC2b3IftB+Dg4Pl4+Nzx1P573TM9xsrAIC0j1wjZZFrOLOSa3h4eKhw4cL6448/nNqTzvLy9PRUvXr17vj4+5lTK1as0Ny5c/Xyyy8rODhYnTt3drrkt3DhwkpMTLztMuL7SbpE9Z+zRf7zrKikvvxnX8XHx992bI+iQIECOn36tK5everUfvDgwQfeRlBQkLp06aIvvvhCx48fV5kyZTR69GjH63d7Tz/M7w3p9r6QpP3798vX19dxZp6Xl5dj9tS/F9Bq1qyp2NhYLViwQGfOnFGtWrWc4pBuH4NxcXH6448/Huh9l9SPly9fdmq/07iWbo6fwYMH68cff9SuXbsUFxenKVOmOC1z8uRJxcXFOc7gg2tQWAPSuUyZMmnWrFkaPXq0mjZtetflGjVqpISEBM2YMcOpferUqbLZbGrYsKGkm/ee+KeyZctKkmMqeT8/P0m3JwN34ubmpubNm+s///mPNm3adNvrSd/ONmrUSL/99pvWr1/veO3KlSv64IMPVLBgwcd2iv3DqlixorJnz67Zs2c7+kOSli9frj179qhx48bJtq8nnnhCefLk0dSpUxUfH6/q1atLupkUHDp0SN98842qVq0qDw8PxzqNGjXSn3/+qS+//NLRduPGDb333nvKlCmTateufc99uru7q0GDBlq8eLGOHTvmaN+zZ4/jG9skDzJWAABpH7lGyiLXuOVRco2wsLDbxkP27NkVHh6uOXPm6PTp07etk3QpoXRz7HXv3l2VK1fWm2++qblz52rLli168803Hcs0b95cbm5uGjt27G2FxnudgVi4cGFJctzfTrp5ttoHH3zgtFzFihUVHBys2bNnKy4uztE+f/78B3pvPKgGDRooPj5eH374oaMtMTFR77///gOtf/78eafnmTJlUpEiRZx+Rnd7Tz/o740k69ev15YtWxzPjx8/riVLlujpp592OjuvZs2a2rBhg3755RdHYS1btmwKCQnRW2+95VgmSb169eTl5aXp06c7/ew++ugjRUdHP9D7rlGjRrpx44ZmzZrlaEtISNB7773ntNzVq1d1/fp1p7bChQvL39//tnG9efNmSVK1atXuu388Ph73XwRAWte5c+f7LtO0aVM99dRTeu21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7ZqJiYkxxty6rGfSpEnG3d3dfPvtt8YY47g0wxhjGjZsaHr27JnygbpARh4XeLzI8x6Pf16aePLkSZMnTx7TokULx+U9SctcuHDBuLu7m2+++SbF40xt6Dfrbty4YYy59XcyKirKVK9e3dSrV8/s3LnTadnLly+bTJkymVmzZqV4nKkN/fZ4ZOTPv48qI/Rdhjlj7e+eeuopff3115o7d6569eqlL7/8Unv27NG0adMUFRWlfPnyuTrEVOXs2bPasWOHdu3a5bis7aOPPpKXl5eaNWummJgYeXh4OJavU6eOPD090+Upxf+cxenrr79WXFycxowZo4YNG6pBgwZatWqVPD09Hd+ee3p6KnPmzK4N/DG4cOGCTpw4oRMnTji+XZgzZ46ioqLUqFEjSTe/gU36ViIsLMzx//SGcXEL4+KWf87ANWnSJF29elVDhgxR79691bZtW33++eeOMxakm9/ipccb9zMukJLI85Lfvn37NGrUKEVERGju3LnatWuXcufOrcWLF+vHH39Uv379dPr0acffuBs3bqhMmTIKCgpyceSuRb9Zt2fPHvXr10/NmzfXq6++qg0bNig4OFiff/65du7cqQEDBui3335zLO/h4aGyZcsqW7ZsLoza9ei35MHnX+sybN+5urLnSps3bza1a9c2BQoUMIULFzbFihUzW7ZscXVYqcqOHTvME088YUqVKmXc3d1N48aNzdy5c40xxuzatcsUKVLElC1b1mzbts1xM+5evXqZunXrprub1u7fv98EBgaaF154wbzxxhumWrVqply5cqZnz57m+vXr5uzZs6ZDhw7GZrOZ1157zbzzzjtm0KBBJjAw0Ozfv9/V4SerHTt2mBIlSphSpUoZLy8v061bN7Ns2TJjjDHff/+9yZUrl6lbt66Jjo52fCPRpUsX89xzzzmdtZUeMC5uYVzccvDgQZMlSxbTo0cP88EHH5h27dqZcuXKmXr16jluEvzyyy8bNzc307VrVzN06FDTt29f4+/vb/bs2ePi6JMX4wKuQp6XPH7//XcTGBhonn/+eVOtWjVTpUoVkzdvXvPDDz8YY4z55ZdfjL+/v6lfv775+OOPzaZNm8wrr7xicuTIYY4ePeri6F2HfrNuz549JiAgwHTu3Nk8//zzpn79+sZut5uPP/7YGGPM4cOHTaFChUzNmjXNqFGjzMqVK83AgQNNUFCQOXz4sIujdx36LXnw+de6jNx3GbqwZowx0dHR5o8//jA7duxwulwAxpw5c8YUKFDADBw40Bw6dMgsW7bMdOnSxeTNm9dMmDDBGGPMkSNHTNWqVU3+/PlNaGioadiwofH39zfbtm1zcfTJ726zOJUvX9688MILJjY21hhjzMyZM02VKlVM+fLlTd26dc3WrVtdFPHjcfLkSZM7d24zcOBAs3HjRvP555+bunXrmvLly5tPP/3UGHMzWSxatKjJnz+/adCggWnevLnx8/MzO3bscHH0yY9xcRPjwtndZuAqX768CQsLcxTXvv76a9O6dWtTvXp106JFC7N9+3ZXhp3sGBdwNfK8R3Pjxg3zwgsvmA4dOjjatm7darp162bc3d3Nf/7zH2OMMfv27TPPPPOMKVasmClUqJApVapUhi5i0m+P5qWXXjLNmzd3PD9z5owZMWKEcXNzM9OmTTPGGHPs2DHz4osvmtDQUFOsWDFTsWLFDN939Nuj4/OvdRm97zJ8YQ13t2nTJlO6dGlz/PhxR9vRo0fNuHHjTFBQkJkyZYqj/eOPPzbjxo0zb775ptm3b58rwn3s+vTpYypWrOjUdv36dTNz5kxTqVIl8/rrrzvOtrhw4YKJj49Pl9NXr1ixwoSGhpro6GhH29atW02vXr1MSEiIWbRokTHm5n0dxo4da/r3728GDx6cbqZS/ifGxU2MC2cjR440+fPnd2q7ceOGWbZsmalUqZLp0KGD455iSd/QpfVv6u6EcQGkbXFxcaZ27dpm2LBhTu1RUVHmxRdfNN7e3mb16tXGmJv3ajp58qTZu3evOX/+vCvCTTXot0fTokUL061bt9va33zzTWOz2cySJUuMMcbExsaaK1eumFOnTjnuZ5qR0W+Pjs+/1mX0vqOwhrvatm2b8fHxcZyynuTPP/80I0eONKVLl77ttfQo6YyTDz/80FSqVMls377d6dKky5cvmwEDBpjy5cs7vg3/+83I05uffvrJZM6c2WzatMmpfffu3aZLly6mTp066e6smzthXDhjXNyUdMPglStXmrJly5olS5Y4/dyvX79upk+fbsqWLWt27dpljGFcZIRxAaRlffr0MWFhYY4b7Sc5duyYef75503Dhg3NhQsXXBNcKka/WTd69GiTL18+c/LkSWPMrckd4uLiTO/evU1ISIjjNdxCvz06Pv9al9H7LkNOXoAHkyNHDlWrVk1Lly51TI+b1N6hQwfZ7Xbt2LFDkhw33zZ/uwl3Wpd0LG5uN98mjRo10qlTpzRmzBhdvHjRsYyfn59GjRql7du3O6YKTlonPcqVK5dy586tlStXKi4uztEeEhKiHj16aPfu3dq5c6fTOowLxkV6HxdJU9on3YA6NDRUfn5+eu+997R7927Hcna7XV27dtXBgwe1Zs0aSYyL9DwugPSgVq1aunbtmubNm6dLly452vPly6emTZtq+/btTu24iX6zrkGDBsqXL58mTJigqKgo2Ww2JSYmytPTUy1btlR0dLSioqJcHWaqQ789uoz++fdRZPS+S7/ZPB5aTEyMzpw5o7/++kuSlDNnTrVu3VqfffaZPv30U8esHpJUvHhxFStWTL/88osSExMdHyaT/k3rmMXplmvXrunixYuOGfpCQkLUrl07jRw5UosXL3ZaNiwsTGXKlNHKlSud2hkXjIv0PC6YgesWxgWQth05ckQffvihPvroI/3www+SpNatW6tGjRqaM2eOPv/8c0eeKEmVKlWSr69vhi8Q0W/WHTp0SG+99ZbGjx+vzz77TJJUtWpVPf/881q7dq0mT56skydPOr6EKlGihPz8/HTlyhVXhu1y9Fvy4POvdfSdM4/7L4KMYOfOnerdu7f+/PNPZc2aVSVLltTHH3+snj176vz583rttdcUFxendu3aqXDhwpJuVpgLFy6crt4QkrR7925Vq1ZN9erV0+nTp7V3716NGTNGH330kZ5++mn95z//0bPPPquoqCi1a9dOZcqU0ddff61Tp045+ia92LVrlwYPHqzjx4/riSeeUPny5TVu3DiNGDFCp0+fVufOnXX16lU1b95cmTNnlnSzaJA/f37XBv4YMC5uYVzcsnfvXlWtWlXPPfecPDw8tGXLFr377ruaNWuWunTpovXr16tevXoaMmSI6tSpoxo1amjZsmXavXu3KlSo4OrwkxXjAkjbdu7cqaeeekpFixbV2bNndebMGbVs2VLTp0/Xe++9p+7du2vmzJnav3+/+vbtq8DAQH3yySdyc3NTjhw5XB2+y9Bv1u3atUs1atRQ2bJldfXqVe3YsUMLFy7U22+/rUGDBunatWtasmSJ9u7dq3HjxsnPz08fffSR4uLi0l1u9TDot+TB51/r6Ls7SPmrT5HaHDlyxAQH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UX+biIiIiL4bx3lE1JIwsUZEVsnHxweOjo44cODAt17r3r07ioqKUFtbqx775JNPoNFo4OvrCwBwc3NDeXm5+rrBYEBJSckPiqFVq1bqe4mIiIioaXCcR0QtCRNrRGSVWrdujQULFiAxMRFbt27FF198gU8//RSbN2/GxIkT0bp1a0yePBklJSXIz8/H7NmzERMTo+67MXjwYOTm5iI3NxdnzpzBjBkzUFVV9YNi6NixIxwdHZGXl4dr166hurq6GT4pERERkW3hOI+IWhIm1ojIaqWkpGD+/PlYtGgRunfvjnHjxqGiogJt2rTB3r17UVlZiZCQEIwZMwYRERFYt26d+t6pU6di8uTJmDRpEsLCwuDt7Y1Bgwb9oL9vb2+PtWvXIjMzE507d8aIESOa+iMSERER2SSO84iopVDkfx8uJyIiIiIiIiIiou/FFWtERERERERERERmYGKNiIiIiIiIiIjIDEysERERERERERERmYGJNSIiIiIiIiIiIjMwsUZERERERERERGQGJtaIiIiIiIiIiIjMwMQaERERERERERGRGZhYIyIiIiIiIiIiMgMTa0RERERERERERGZgYo2IiIiIiIiIiMgMTKwRERERERERERGZ4f8ByXWyJL1524cAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot the most common words\n", "_, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))\n", "\n", "sns.barplot(data=word_counts.head(10), x=\"count\", y=\"word\", ax=ax1)\n", "ax1.set_title(\"Most common words\")\n", "ax1.grid(False)\n", "ax1.tick_params(axis=\"x\", rotation=45)\n", "\n", "ax2.set_title(\"Most common words (excluding stopwords)\")\n", "sns.barplot(\n", " data=word_counts[~word_counts[\"word\"].isin(stopwords_en)].head(10),\n", " x=\"count\",\n", " y=\"word\",\n", " ax=ax2,\n", ")\n", "ax2.grid(False)\n", "ax2.tick_params(axis=\"x\", rotation=45)\n", "ax2.set_ylabel(\"\")\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Split the data" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# Set the features and target\n", "X, y = data[\"text\"].tolist(), data[\"sentiment\"].tolist()\n", "\n", "# Split the data\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=SEED)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create a tokenizer and transform the data" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# Create the preprocessing pipeline\n", "preprocess_pipeline = Pipeline(\n", " [\n", " # Text preprocessing\n", " (\"clean\", TextCleaner()),\n", " (\"lemma\", TextLemmatizer()),\n", " # Tokenize (NOTE: Can be replaced with TfidfVectorizer, but left for clarity)\n", " (\"vectorize\", CountVectorizer(stop_words=stopwords_en, ngram_range=(1, 2), max_features=MAX_FEATURES)),\n", " (\"tfidf\", TfidfTransformer()),\n", " ],\n", " memory=joblib.Memory(CACHE_DIR, verbose=0),\n", " verbose=True,\n", ")" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[Pipeline] ............. (step 4 of 4) Processing tfidf, total= 0.0s\n" ] } ], "source": [ "# Fit the pipeline\n", "with warnings.catch_warnings():\n", " warnings.simplefilter(\"ignore\")\n", " preprocess_pipeline.fit(X_train)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# Transform the data\n", "X_train_preprocessed = preprocess_pipeline.transform(X_train)\n", "X_test_preprocessed = preprocess_pipeline.transform(X_test)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['.cache/X_test_preprocessed.pkl']" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Cache the preprocessed data\n", "joblib.dump(X_train_preprocessed, CACHE_DIR / \"X_train_preprocessed.pkl\")\n", "joblib.dump(X_test_preprocessed, CACHE_DIR / \"X_test_preprocessed.pkl\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Or load cached data" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Load the transformed data\n", "X_train_preprocessed = joblib.load(CACHE_DIR / \"X_train_preprocessed.pkl\")\n", "X_test_preprocessed = joblib.load(CACHE_DIR / \"X_test_preprocessed.pkl\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pick the classifier" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "def evaluate_model(clf: BaseEstimator) -> None:\n", " # Calculate the accuracy\n", " accuracy = clf.score(X_test_preprocessed, y_test)\n", "\n", " # Calculate the confusion matrix\n", " y_pred = clf.predict(X_test_preprocessed)\n", " cm = confusion_matrix(y_test, y_pred)\n", "\n", " # Plot the confusion matrix\n", " categories = [\"Negative\", \"Positive\"]\n", " group_names = [\"True Neg\", \"False Pos\", \"False Neg\", \"True Pos\"]\n", " group_percentages = [f\"{value:.2%}\" for value in cm.flatten() / cm.sum()]\n", "\n", " labels = [f\"{v1}\\n{v2}\" for v1, v2 in zip(group_names, group_percentages)]\n", " labels = np.asarray(labels).reshape(2, 2)\n", "\n", " _, ax = plt.subplots(figsize=(8, 6))\n", " ax.grid(False)\n", " ax.set_title(f\"Accuracy: {accuracy:.2%}\")\n", " sns.heatmap(\n", " cm,\n", " xticklabels=categories,\n", " yticklabels=categories,\n", " annot=labels,\n", " square=True,\n", " cbar=False,\n", " cmap=\"viridis\",\n", " linewidths=0.5,\n", " fmt=\"\",\n", " ax=ax,\n", " )\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "def random_search(clf: BaseEstimator, param_distributions: dict) -> tuple[BaseEstimator, dict]:\n", " # Create the search\n", " search = RandomizedSearchCV(\n", " clf,\n", " param_distributions,\n", " n_iter=10,\n", " scoring=\"accuracy\",\n", " n_jobs=-1,\n", " cv=3,\n", " random_state=SEED,\n", " verbose=1,\n", " )\n", "\n", " # Fit the search\n", " search.fit(X_train_preprocessed, y_train)\n", "\n", " # Print the best parameters\n", " print(f\"Best parameters: {search.best_params_}\")\n", "\n", " return search.best_estimator_, search.best_params_" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fitting 3 folds for each of 10 candidates, totalling 30 fits\n", "Best parameters: {'solver': 'liblinear', 'penalty': 'l2', 'C': 1438.44988828766}\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Logistic Regression\n", "lr_clf = LogisticRegression(max_iter=1000, random_state=SEED)\n", "\n", "# Find optimal hyperparameters\n", "best_lr_clf, lr_params = random_search(\n", " lr_clf,\n", " {\n", " \"C\": np.logspace(-4, 4, 20),\n", " \"solver\": [\"liblinear\", \"saga\"], # lbfgs takes too long\n", " \"penalty\": [\"l1\", \"l2\"],\n", " },\n", ")\n", "\n", "# Evaluate the model\n", "evaluate_model(best_lr_clf)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fitting 3 folds for each of 10 candidates, totalling 30 fits\n" ] } ], "source": [ "# SVM\n", "svm_clf = SVC(random_state=SEED)\n", "\n", "# Find optimal hyperparameters\n", "best_svm_clf, svm_params = random_search(\n", " svm_clf,\n", " {\n", " \"C\": np.logspace(-4, 4, 20),\n", " \"kernel\": [\"linear\", \"poly\", \"rbf\"],\n", " \"degree\": [2, 3, 4],\n", " },\n", ")\n", "\n", "# Evaluate the model\n", "evaluate_model(best_svm_clf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Export the final model" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "best_clf = best_lr_clf # TODO: Pick the best classifier\n", "best_params = lr_params # TODO: Pick the best parameters" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "# Merge the tokenizer and the best classifier\n", "model = Pipeline(\n", " [\n", " (\"preprocess\", preprocess_pipeline),\n", " (\"clf\", best_clf),\n", " ],\n", ")" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "# Export the model and the parameters\n", "joblib.dump(model, MODELS_DIR / \"best_model.pkl\")\n", "with Path.open(MODELS_DIR / \"best_params.json\", \"w\") as f:\n", " json.dump(best_params, f, indent=2)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "# Import and test the model\n", "model = joblib.load(MODELS_DIR / \"best_model.pkl\")\n", "assert model.predict([\"I love this!\"])[0] == 1 # noqa: S101\n", "assert model.predict([\"I hate this!\"])[0] == 0 # noqa: S101" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" } }, "nbformat": 4, "nbformat_minor": 2 }