{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3011196c-f625-41a7-a7f5-89136c1af9d6",
   "metadata": {},
   "source": [
    "# NLP Classification Project  \n",
    "\n",
    "\n",
    "---\n",
    "\n",
    "## Student Information\n",
    "**Name:** Sultan Abdulrahim Hassan  \n",
    "**Student ID:** 251002896  \n",
    "**Course:** Practical Image Processing and Natural Language Processing_Third Trimester 2025  \n",
    "**Instructor:** Dr. Hajar Saleh  \n",
    "**Date:** 20 - 12 - 2025  \n",
    "\n",
    "---\n",
    "\n",
    "## 1. Environment Setup\n",
    "Below we install and import all required libraries used in this project.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "522b4eaf-90c6-4e1f-beff-260f72315f88",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting matplotlib\n",
      "  Downloading matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl.metadata (52 kB)\n",
      "Collecting contourpy>=1.0.1 (from matplotlib)\n",
      "  Downloading contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl.metadata (5.5 kB)\n",
      "Collecting cycler>=0.10 (from matplotlib)\n",
      "  Using cached cycler-0.12.1-py3-none-any.whl.metadata (3.8 kB)\n",
      "Collecting fonttools>=4.22.0 (from matplotlib)\n",
      "  Downloading fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl.metadata (114 kB)\n",
      "Collecting kiwisolver>=1.3.1 (from matplotlib)\n",
      "  Downloading kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl.metadata (6.3 kB)\n",
      "Requirement already satisfied: numpy>=1.23 in /opt/anaconda3/envs/NLP_Project/lib/python3.10/site-packages (from matplotlib) (2.2.6)\n",
      "Requirement already satisfied: packaging>=20.0 in /opt/anaconda3/envs/NLP_Project/lib/python3.10/site-packages (from matplotlib) (25.0)\n",
      "Collecting pillow>=8 (from matplotlib)\n",
      "  Downloading pillow-12.0.0-cp310-cp310-macosx_10_10_x86_64.whl.metadata (8.8 kB)\n",
      "Collecting pyparsing>=3 (from matplotlib)\n",
      "  Using cached pyparsing-3.2.5-py3-none-any.whl.metadata (5.0 kB)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in /opt/anaconda3/envs/NLP_Project/lib/python3.10/site-packages (from matplotlib) (2.9.0.post0)\n",
      "Requirement already satisfied: six>=1.5 in /opt/anaconda3/envs/NLP_Project/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib) (1.17.0)\n",
      "Downloading matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl (8.2 MB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m8.2/8.2 MB\u001b[0m \u001b[31m22.8 MB/s\u001b[0m  \u001b[33m0:00:00\u001b[0mm0:00:01\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hDownloading contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl (268 kB)\n",
      "Using cached cycler-0.12.1-py3-none-any.whl (8.3 kB)\n",
      "Downloading fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl (2.4 MB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.4/2.4 MB\u001b[0m \u001b[31m11.0 MB/s\u001b[0m  \u001b[33m0:00:00\u001b[0m\n",
      "\u001b[?25hDownloading kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl (66 kB)\n",
      "Downloading pillow-12.0.0-cp310-cp310-macosx_10_10_x86_64.whl (5.3 MB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.3/5.3 MB\u001b[0m \u001b[31m33.1 MB/s\u001b[0m  \u001b[33m0:00:00\u001b[0m\n",
      "\u001b[?25hUsing cached pyparsing-3.2.5-py3-none-any.whl (113 kB)\n",
      "Installing collected packages: pyparsing, pillow, kiwisolver, fonttools, cycler, contourpy, matplotlib\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7/7\u001b[0m [matplotlib]7\u001b[0m [matplotlib]\n",
      "\u001b[1A\u001b[2KSuccessfully installed contourpy-1.3.2 cycler-0.12.1 fonttools-4.61.1 kiwisolver-1.4.9 matplotlib-3.10.8 pillow-12.0.0 pyparsing-3.2.5\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "\n",
    "# Install matplotlib in the current environment\n",
    "!{sys.executable} -m pip install matplotlib\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "801c52e2-8e3d-4718-a1a2-6094a5a75ad1",
   "metadata": {},
   "source": [
    "## 2. Load the Dataset\n",
    "We load the unbalanced sentiment dataset and display the first few rows.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "33145f70-9dfb-4e49-a13a-f8350cb8fc17",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>sentiment</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Java Concurrency in Practice is probably the b...</td>\n",
       "      <td>positive</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>haha aww hun i bet you are more creative tha...</td>\n",
       "      <td>positive</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>_pickle lol, thank you very much Hope you`re h...</td>\n",
       "      <td>positive</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Out for an evening on the town with jeremy. Sa...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>- just took over the #1 Most Endorsed spot on...</td>\n",
       "      <td>positive</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                text sentiment\n",
       "0  Java Concurrency in Practice is probably the b...  positive\n",
       "1    haha aww hun i bet you are more creative tha...  positive\n",
       "2  _pickle lol, thank you very much Hope you`re h...  positive\n",
       "3  Out for an evening on the town with jeremy. Sa...  negative\n",
       "4   - just took over the #1 Most Endorsed spot on...  positive"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "df = pd.read_csv(\"unbalanceddataset.csv\")\n",
    "df.head()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9d27bc78-8c7d-4c81-b160-5adbe84178c7",
   "metadata": {},
   "source": [
    "## 3. Visualize Class Distribution\n",
    "Before preprocessing, we examine whether the dataset is balanced by plotting the class counts.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "a431d8dd-a0c9-4aeb-85d1-dd4fa961650c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sentiment\n",
      "positive    2000\n",
      "negative     600\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Bar plot for class distribution\n",
    "class_counts = df[\"sentiment\"].value_counts()\n",
    "\n",
    "plt.figure(figsize=(5, 4))\n",
    "class_counts.plot(kind=\"bar\")\n",
    "plt.title(\"Class Distribution\")\n",
    "plt.xlabel(\"Sentiment\")\n",
    "plt.ylabel(\"Count\")\n",
    "plt.show()\n",
    "\n",
    "print(class_counts)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "27784f13-c153-4bfe-bc85-69f85e140b9e",
   "metadata": {},
   "source": [
    "## 4. Data Preprocessing\n",
    "The dataset is cleaned using:\n",
    "- Lowercasing  \n",
    "- Removing URLs  \n",
    "- Removing mentions (@)  \n",
    "- Removing hashtags  \n",
    "- Keeping alphabetic characters only  \n",
    "- Removing extra spaces  \n",
    "\n",
    "A new column called **clean_text** is created.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "34aa6d32-ea3a-45cc-9f94-1e4111708ff3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>clean_text</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Java Concurrency in Practice is probably the b...</td>\n",
       "      <td>java concurrency in practice is probably the b...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>haha aww hun i bet you are more creative tha...</td>\n",
       "      <td>haha aww hun i bet you are more creative than me</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>_pickle lol, thank you very much Hope you`re h...</td>\n",
       "      <td>pickle lol thank you very much hope you re hav...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Out for an evening on the town with jeremy. Sa...</td>\n",
       "      <td>out for an evening on the town with jeremy sad...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>- just took over the #1 Most Endorsed spot on...</td>\n",
       "      <td>just took over the most endorsed spot on twind...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                text  \\\n",
       "0  Java Concurrency in Practice is probably the b...   \n",
       "1    haha aww hun i bet you are more creative tha...   \n",
       "2  _pickle lol, thank you very much Hope you`re h...   \n",
       "3  Out for an evening on the town with jeremy. Sa...   \n",
       "4   - just took over the #1 Most Endorsed spot on...   \n",
       "\n",
       "                                          clean_text  \n",
       "0  java concurrency in practice is probably the b...  \n",
       "1   haha aww hun i bet you are more creative than me  \n",
       "2  pickle lol thank you very much hope you re hav...  \n",
       "3  out for an evening on the town with jeremy sad...  \n",
       "4  just took over the most endorsed spot on twind...  "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import re\n",
    "\n",
    "def clean_text(text):\n",
    "    text = str(text).lower()  # Lowercase\n",
    "    text = re.sub(r\"http\\S+|www\\.\\S+\", \" \", text)  # Remove URLs\n",
    "    text = re.sub(r\"@\\w+\", \" \", text)  # Remove @mentions\n",
    "    text = re.sub(r\"#\", \" \", text)  # Remove hashtags\n",
    "    text = re.sub(r\"[^a-z\\s']\", \" \", text)  # Keep letters only\n",
    "    text = re.sub(r\"\\s+\", \" \", text).strip()  # Remove extra spaces\n",
    "    return text\n",
    "\n",
    "df[\"clean_text\"] = df[\"text\"].apply(clean_text)\n",
    "df[[\"text\", \"clean_text\"]].head()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ce266786-da3a-4756-aff8-5f9e6b520d1c",
   "metadata": {},
   "source": [
    "## 5. Split the Dataset\n",
    "We split the dataset into training and testing sets using an 80–20 ratio.\n",
    "Stratify is used to preserve class proportions.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "009051d6-d8a9-4521-8e00-6abbcaaf063a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2080, 520)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X = df[\"clean_text\"]\n",
    "y = df[\"sentiment\"]\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    X, y,\n",
    "    test_size=0.2,\n",
    "    stratify=y,\n",
    "    random_state=42\n",
    ")\n",
    "\n",
    "len(X_train), len(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fdca646e-31c4-448f-a5fb-5125a9bbdfab",
   "metadata": {},
   "source": [
    "## 6. Feature Representation (TF-IDF)\n",
    "We convert clean text into numerical vectors using TF-IDF with:\n",
    "- max_features=10000  \n",
    "- ngram_range = (1,2)  \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "cc1899eb-b7d1-4100-ace8-27ad182f686e",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "\n",
    "tfidf = TfidfVectorizer(\n",
    "    max_features=10000,\n",
    "    ngram_range=(1, 2),\n",
    "    min_df=2\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8276232f-7bb1-4cc9-8043-7f2ddfeff1b6",
   "metadata": {},
   "source": [
    "## 7. Model 1: Logistic Regression\n",
    "We train a logistic regression classifier using class_weight='balanced'.\n",
    "Below is the classification report and confusion matrix.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "c25b0bba-d23a-459f-8e34-855992c7cb8a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Logistic Regression Results:\n",
      "\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "    negative       0.59      0.76      0.66       120\n",
      "    positive       0.92      0.84      0.88       400\n",
      "\n",
      "    accuracy                           0.82       520\n",
      "   macro avg       0.76      0.80      0.77       520\n",
      "weighted avg       0.84      0.82      0.83       520\n",
      "\n",
      "Confusion Matrix:\n",
      "[[ 91  29]\n",
      " [ 63 337]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.metrics import classification_report, confusion_matrix\n",
    "\n",
    "logreg_model = Pipeline([\n",
    "    (\"tfidf\", tfidf),\n",
    "    (\"clf\", LogisticRegression(class_weight=\"balanced\", max_iter=1000))\n",
    "])\n",
    "\n",
    "logreg_model.fit(X_train, y_train)\n",
    "y_pred = logreg_model.predict(X_test)\n",
    "\n",
    "print(\"Logistic Regression Results:\\n\")\n",
    "print(classification_report(y_test, y_pred))\n",
    "print(\"Confusion Matrix:\")\n",
    "print(confusion_matrix(y_test, y_pred))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e28b62a9-9e60-444b-918e-77e758a979ee",
   "metadata": {},
   "source": [
    "## 8. Model 2: Linear SVM (Support Vector Machine)\n",
    "We train an SVM classifier using the same TF-IDF features.\n",
    "Here are the performance metrics and confusion matrix.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "3dca9032-7167-4e6c-b75b-91b2bb0877cd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Linear SVM Results:\n",
      "\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "    negative       0.78      0.53      0.63       120\n",
      "    positive       0.87      0.95      0.91       400\n",
      "\n",
      "    accuracy                           0.86       520\n",
      "   macro avg       0.82      0.74      0.77       520\n",
      "weighted avg       0.85      0.86      0.85       520\n",
      "\n",
      "Confusion Matrix:\n",
      "[[ 63  57]\n",
      " [ 18 382]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.svm import LinearSVC\n",
    "\n",
    "svm_model = Pipeline([\n",
    "    (\"tfidf\", tfidf),          # same TF-IDF settings\n",
    "    (\"clf\", LinearSVC())       # Linear Support Vector Machine\n",
    "])\n",
    "\n",
    "svm_model.fit(X_train, y_train)\n",
    "y_pred2 = svm_model.predict(X_test)\n",
    "\n",
    "print(\"Linear SVM Results:\\n\")\n",
    "print(classification_report(y_test, y_pred2))\n",
    "print(\"Confusion Matrix:\")\n",
    "print(confusion_matrix(y_test, y_pred2))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5df5ec94-e5f7-40d1-b934-701e95cba1b7",
   "metadata": {},
   "source": [
    "## 9. Model 3: Naive Bayes\n",
    "We evaluate a Naive Bayes classifier for comparison with the previous models.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "dfa10b5e-27e6-4eb7-8a0f-64de68075234",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Naive Bayes Results:\n",
      "\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "    negative       1.00      0.07      0.14       120\n",
      "    positive       0.78      1.00      0.88       400\n",
      "\n",
      "    accuracy                           0.79       520\n",
      "   macro avg       0.89      0.54      0.51       520\n",
      "weighted avg       0.83      0.79      0.71       520\n",
      "\n",
      "Confusion Matrix:\n",
      "[[  9 111]\n",
      " [  0 400]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.naive_bayes import MultinomialNB\n",
    "from sklearn.metrics import classification_report, confusion_matrix\n",
    "\n",
    "nb_model = Pipeline([\n",
    "    (\"tfidf\", tfidf),\n",
    "    (\"clf\", MultinomialNB())\n",
    "])\n",
    "\n",
    "nb_model.fit(X_train, y_train)\n",
    "y_pred_nb = nb_model.predict(X_test)\n",
    "\n",
    "print(\"Naive Bayes Results:\\n\")\n",
    "print(classification_report(y_test, y_pred_nb))\n",
    "print(\"Confusion Matrix:\")\n",
    "print(confusion_matrix(y_test, y_pred_nb))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d9dec6c3-da9f-43e3-ad90-4b6296a321f2",
   "metadata": {},
   "source": [
    "### Confusion Matrix Visualization\n",
    "The heatmaps below show the errors and correct predictions of each classifier.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "2083abca-dfab-4297-8313-987a8e14cfad",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAF4CAYAAACo+KV7AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASl1JREFUeJztnQd4FNUWx88sSSghoUNAegfpgoD0Ih1pFpCqgIKAFKlPqfJEsICigqJSFLEDgvQiHaSI0qSJFCH0FmrKvO9/cfbtLkmY3U2yu5n/z28MO/XuzOw995R7jqbrui6EEEKICWxmdiKEEEIoNAghhLgFNQ1CCCGmodAghBBiGgoNQgghpqHQIIQQYhoKDUIIIaYJMr8rIYQQcPv2bbl79654S0hIiKRLl04CCQoNQghxU2CkD8smEnPT6/sWEREhx44dCyjBQaFBCCFucBcaRsxNSVu6q0iaEM/vXexdidw/W52PQoMQQlI7QelE80Jo6FpgupSpaRBCiCdoWPA/D/HiUF9CoUEIIZ6g2e4tnhKgmkZgtpoQQohPoKZBCCGeoGlemqcC0z5FoUEIIZ6g0TxFCCGEJAo1DUII8QSN5ilCCCGmsXkZARWYcUjUNAghxBM0a2oagSnqCCGE+ARqGoQQ4gmaNaOnKDQIIcQTNJqnCCGEkEShpkEIIZ6g0TxFCCHEtNDQLBk9RU2DEEI8QbOmphGYrSaEEOITqGkQQojH5imb5/eO5ilCCLEQNu3e4s3xAQjNU4QQQkxD8xQhhHiCZk1HOIUGIYR4gsaQW0IIIaaFhs2SmkZgtpoQQohPoHmKEEI8QaN5ihBCiGmhYaN5ihBCCEkMmqcIIcQTNJqnCCGEmBYaNkuap6hpEEKIJ2jW1DQCU9QRQgjxCdQ0CCHEI2xempgCc8xOoUEIIZ6g0TxFCCGEJAo1DUII8QSNRZgIIYSYFho2S4bcBmarCSHEX3wamheLSaZNmyblypWT8PBwtVSvXl2WLl1q33779m3p06ePZMuWTTJmzCjt2rWTs2fPOp3jxIkT0rx5c8mQIYPkzJlThgwZIjExMW5/bQoNQgjxc/LmzStvvvmm7Ny5U3bs2CH169eXVq1ayb59+9T2gQMHyqJFi+S7776TdevWyenTp6Vt27b242NjY5XAuHv3rmzevFlmz54ts2bNklGjRrndFk3XdT1Jvx0hhKRirl27JpkyZZK0TSeLFpze4/Po0bfkztKBcvXqVaU9uEvWrFnlrbfekieffFJy5MghX331lfo3+PPPP6VUqVKyZcsWqVatmtJKWrRooYRJrly51D7Tp0+XYcOGyfnz5yUkJMT0dalpEEKID81T165dc1ru3LmT6GWhNXz99ddy48YNZaaC9hEdHS0NGza071OyZEnJnz+/EhoAf8uWLWsXGKBx48bqeoa2YhYKDUII8cYRrnmxiEi+fPmU5mIsEyZMiPdye/bsUf6KtGnTSq9evWT+/PlSunRpiYyMVJpC5syZnfaHgMA2gL+OAsPYbmxzB4bcEkKIDzl58qSTeQpCIT5KlCghu3fvVuas77//Xrp27ar8FykNhQYhhPhwRnj4vxFRDwLaRNGiRdW/H3nkEdm+fbu899578swzzygH95UrV5y0DURPRUREqH/j76+//up0PiO6ytjHLDRPEUKIB2ia5vXiDXFxccr/AQESHBwsq1evtm87ePCgCrGFzwPgL8xb586ds++zcuVKJaxg4nIHCo1k4PDhw9KoUSNln8SLsWDBgiQ9/99//63Oi5A5co+6deuqxYok9XcvWLCgdOvWLcnOR7xnxIgRsn79evXbR+ePz7/88ot07NhR9TPdu3eXQYMGydq1a5Vj/LnnnlOCApFTAP0RhEPnzp3l999/l+XLl8trr72m5nYkZA6znNA4evSovPjii1K4cGFJly6dkqg1atRQ6tytW7eS9dqwNeLB/ve//5UvvvhCKleuLKkFdCYQWLif8d1HCExjFPX222+7fX6EBI4ZM0bZbgMNCHF8b8TR+zuI1cd9hkkjOYEAchxZh4aGyqOPPipz5syRQEdLQU0DGkKXLl2UX6NBgwbKNIWO//HHH1fbJ0+erEJqMamvdu3ayuT0448/2o9PkyaNLF68WP2FMOnUqZM637hx49z+3qnSp/Hzzz/LU089pSQobkyZMmWUzW/jxo1qFiRCzD755JNkuTY6UoS3vfrqq9K3b99kuUaBAgXUdaCS+oKgoCC5efOmmkz09NNPO22bO3euEtKYoeoJEBpjx45VnU2FChVMH7dixQqxKp58dwgN3GcMAlyjbmDasNmSbjyJ5/jKK6+of585c0Y+/fRTNbCCaaVnz54SsGj/Lt4cb5LPPvss0e34zX344YdqSazfWLJkiXhLqhMax44d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",
      "text/plain": [
       "<Figure size 400x400 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Confusion matrix for Logistic Regression\n",
    "cm_logreg = confusion_matrix(y_test, y_pred)\n",
    "labels = sorted(y_test.unique())   # ['negative', 'positive']\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(4, 4))\n",
    "im = ax.imshow(cm_logreg, cmap=\"Blues\")\n",
    "\n",
    "# Add colorbar\n",
    "plt.colorbar(im)\n",
    "\n",
    "# Set tick labels\n",
    "ax.set_xticks(np.arange(len(labels)))\n",
    "ax.set_yticks(np.arange(len(labels)))\n",
    "ax.set_xticklabels(labels)\n",
    "ax.set_yticklabels(labels)\n",
    "\n",
    "ax.set_xlabel(\"Predicted Label\")\n",
    "ax.set_ylabel(\"True Label\")\n",
    "ax.set_title(\"Confusion Matrix – Logistic Regression\")\n",
    "\n",
    "# Annotate cells with numbers\n",
    "for i in range(cm_logreg.shape[0]):\n",
    "    for j in range(cm_logreg.shape[1]):\n",
    "        ax.text(j, i, cm_logreg[i, j], ha=\"center\", va=\"center\", color=\"black\")\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "adc81369-a6e4-496c-981a-9ac9a54b5003",
   "metadata": {},
   "source": [
    "#### Confusion Matrix – Logistic Regression\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "aeb6e889-7d0a-4f45-930c-85d77e8fa36a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Confusion matrix for Linear SVM\n",
    "cm_svm = confusion_matrix(y_test, y_pred2)\n",
    "labels = sorted(y_test.unique())   # ['negative', 'positive']\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(4, 4))\n",
    "im = ax.imshow(cm_svm, cmap=\"Blues\")\n",
    "\n",
    "# Add colorbar\n",
    "plt.colorbar(im)\n",
    "\n",
    "# Set tick labels\n",
    "ax.set_xticks(np.arange(len(labels)))\n",
    "ax.set_yticks(np.arange(len(labels)))\n",
    "ax.set_xticklabels(labels)\n",
    "ax.set_yticklabels(labels)\n",
    "\n",
    "ax.set_xlabel(\"Predicted Label\")\n",
    "ax.set_ylabel(\"True Label\")\n",
    "ax.set_title(\"Confusion Matrix – Linear SVM\")\n",
    "\n",
    "# Annotate cells with numbers\n",
    "for i in range(cm_svm.shape[0]):\n",
    "    for j in range(cm_svm.shape[1]):\n",
    "        ax.text(j, i, cm_svm[i, j], ha=\"center\", va=\"center\", color=\"black\")\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cb42d75d-687a-4c00-8df3-d5afb36d2612",
   "metadata": {},
   "source": [
    "#### Confusion Matrix – Linear SVM\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "c3e4a305-c1c5-453d-a1a9-bf5b541b6679",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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jnCG3JKAY9y4cVKvXr3sboaj+e677zTB9NSpU+nuV6FCBZkyZUqWtYtkPxQaJFtBx/TVV195rRs6dKisWrUq29pERG666SY5cuSIO/lt7ty5UqhQoRS3ZtOmTdKnTx9HuzQMm0uwQvMUCTjy58+vC8k+wsLCpFSpUlfcr3jx4uJYDGc6wqlpOJRbb71VnnzySXn66aelSJEi2kHALGQBs8Rjjz2mnQJCAlu2bCk///yz1zGef/55KVGihNbKwr4jRozwMithFHr77bdLsWLFdMTaokUL2bp1q5dpA3Ts2FE1Duu9p3lq+fLlEh4ensJMMnDgQG2TxQ8//CA333yz5MmTR2sl4drOnj0rOf0Z9u/fXxfcX9zn0aNHu6u2njx5Unr06CGFCxeWvHnzyl133SW//fab+/N//vmn3HPPPbo9X758cv3118uSJUtSmKfwd8+ePTU8FOuwWN8VT/PUQw89JF26dPFqY2Jiorbrvffe0/eXLl2SiRMnSsWKFfVZ1a1bVz7//HMJZke4YfNfsEKh4WDmzZunncWGDRtk0qRJMmHCBFmxYoVuu//++yUmJka+/fZb2bJli9x4443SqlUrOXHihG6fP3++vPDCC/Lyyy/r9nLlysmMGTO8jo9icJGRkdqh//TTT1K1alW5++673dV8IVTAnDlz1BRivfcE54RZ5IsvvnCvS0pKkk8++US6deum73///Xe58847pXPnzvLLL7/oNpwTnakTnmGuXLlk48aN8sYbb8jrr78u//nPf3TbI488Ips3b5avv/5aoqKiVJjg/qMjB/369ZMLFy7IunXrZPv27fosU9PwYKqCYMDgAc8JC0yIycHzWLRokcTFxbnXLVu2TM6dO6cDAwCBAQEyc+ZM2bFjhwwePFgefvhhWbt27VW8SyRTQXIfcR4tWrQwmzdv7rWuYcOG5vDhw83vv//ejIiIMOPj4722V65c2Zw1a5b+3bhxY7Nfv35e25s1a2bWrVs3zXMmJSWZBQoUMBctWuReh6/gggULvPYbO3as13EGDhxotmzZ0v1+2bJlZu7cuc2TJ0/q+169epl9+vTxOgauweVymefPnzdz8jOsUaOGeenSJfc6PD+s27t3r97bH3/80b3t+PHjZp48ecxPP/1U39euXdscN25cqsdes2aNft66x3PmzDELFiyYYr/y5cubkydP1r8T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",
      "text/plain": [
       "<Figure size 400x400 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "cm_nb = confusion_matrix(y_test, y_pred_nb)\n",
    "labels = sorted(y_test.unique())\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(4, 4))\n",
    "im = ax.imshow(cm_nb, cmap=\"Blues\")\n",
    "plt.colorbar(im)\n",
    "\n",
    "ax.set_xticks(np.arange(len(labels)))\n",
    "ax.set_yticks(np.arange(len(labels)))\n",
    "ax.set_xticklabels(labels)\n",
    "ax.set_yticklabels(labels)\n",
    "\n",
    "ax.set_xlabel(\"Predicted Label\")\n",
    "ax.set_ylabel(\"True Label\")\n",
    "ax.set_title(\"Confusion Matrix – Naive Bayes\")\n",
    "\n",
    "for i in range(cm_nb.shape[0]):\n",
    "    for j in range(cm_nb.shape[1]):\n",
    "        ax.text(j, i, cm_nb[i, j], ha=\"center\", va=\"center\", color=\"black\")\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c43a4ec9-1750-49be-9cab-49b14c7a9fb1",
   "metadata": {},
   "source": [
    "#### Confusion Matrix – Naive Bayes\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b62761df-5e53-4c45-9f12-59c92d9ce781",
   "metadata": {},
   "source": [
    "## 10. Conclusion\n",
    "\n",
    "- The Linear SVM achieved the highest accuracy among all models.  \n",
    "- Logistic Regression also performed strongly and provided stable results.  \n",
    "- Naive Bayes was fast but less accurate due to feature independence assumptions.  \n",
    "- TF-IDF proved effective for sentiment classification.  \n",
    "- Future improvements may include:\n",
    "  - Using word embeddings (Word2Vec, GloVe)\n",
    "  - Fine-tuning transformer models like BERT\n",
    "  - Performing hyper-parameter optimization  \n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.10 (NLP_Project)",
   "language": "python",
   "name": "nlp_project"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.18"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
