{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": [],
      "gpuType": "T4"
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "collapsed": true,
        "id": "AS9GGbw-GkpF",
        "outputId": "e421cd35-5757-4929-cdd8-2ee6b43b65b4"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Requirement already satisfied: pandas in /usr/local/lib/python3.12/dist-packages (2.2.2)\n",
            "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.12/dist-packages (1.6.1)\n",
            "Requirement already satisfied: matplotlib in /usr/local/lib/python3.12/dist-packages (3.10.0)\n",
            "Requirement already satisfied: seaborn in /usr/local/lib/python3.12/dist-packages (0.13.2)\n",
            "Requirement already satisfied: numpy>=1.26.0 in /usr/local/lib/python3.12/dist-packages (from pandas) (2.0.2)\n",
            "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.12/dist-packages (from pandas) (2.9.0.post0)\n",
            "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.12/dist-packages (from pandas) (2025.2)\n",
            "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.12/dist-packages (from pandas) (2025.2)\n",
            "Requirement already satisfied: scipy>=1.6.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (1.16.3)\n",
            "Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (1.5.2)\n",
            "Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (3.6.0)\n",
            "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (1.3.3)\n",
            "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (0.12.1)\n",
            "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (4.61.0)\n",
            "Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (1.4.9)\n",
            "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (25.0)\n",
            "Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (11.3.0)\n",
            "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (3.2.5)\n",
            "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n"
          ]
        }
      ],
      "source": [
        "pip install pandas scikit-learn matplotlib seaborn\n"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import pandas as pd\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.feature_extraction.text import CountVectorizer\n",
        "from sklearn.naive_bayes import MultinomialNB\n",
        "from sklearn.metrics import accuracy_score, confusion_matrix, classification_report\n",
        "import seaborn as sns\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "df = pd.read_csv(\"spam.csv\", encoding='latin-1')[['v1', 'v2']]\n",
        "df.columns = ['Label', 'Message']\n",
        "df['Label'] = df['Label'].map({'ham':0, 'spam':1})\n",
        "print(df.head())\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "VBJ7x9bEG1Tu",
        "outputId": "b7df4aab-247e-4658-9883-67535ef47d7e"
      },
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "   Label                                            Message\n",
            "0      0  Go until jurong point, crazy.. Available only ...\n",
            "1      0                      Ok lar... Joking wif u oni...\n",
            "2      1  Free entry in 2 a wkly comp to win FA Cup fina...\n",
            "3      0  U dun say so early hor... U c already then say...\n",
            "4      0  Nah I don't think he goes to usf, he lives aro...\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "X = df['Message']\n",
        "y = df['Label']\n",
        "\n",
        "X_train, X_test, y_train, y_test = train_test_split(\n",
        "    X, y, test_size=0.2, random_state=42\n",
        ")\n"
      ],
      "metadata": {
        "id": "8UYri9Z0G1Wf"
      },
      "execution_count": 10,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "vectorizer = CountVectorizer()\n",
        "X_train_vec = vectorizer.fit_transform(X_train)\n",
        "X_test_vec = vectorizer.transform(X_test)\n"
      ],
      "metadata": {
        "id": "qRj-sxXsG1Y9"
      },
      "execution_count": 11,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "nb_model = MultinomialNB()\n",
        "nb_model.fit(X_train_vec, y_train)\n",
        "\n",
        "y_pred = nb_model.predict(X_test_vec)\n"
      ],
      "metadata": {
        "id": "ojif6K6vG1bx"
      },
      "execution_count": 12,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "\n",
        "accuracy = accuracy_score(y_test, y_pred)\n",
        "print(f\"Accuracy: {accuracy*100:.2f}%\")\n",
        "cm = confusion_matrix(y_test, y_pred)\n",
        "sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=['Ham','Spam'], yticklabels=['Ham','Spam'])\n",
        "plt.title(\"Confusion Matrix\")\n",
        "plt.xlabel(\"Predicted\")\n",
        "plt.ylabel(\"Actual\")\n",
        "plt.show()\n",
        "\n",
        "print(classification_report(y_test, y_pred))\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 646
        },
        "id": "7DfI_PBVG1eW",
        "outputId": "2b81c19f-331c-497d-ef6c-fbc339618ca5"
      },
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Accuracy: 98.39%\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 2 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhsAAAHHCAYAAAAWM5p0AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAP7pJREFUeJzt3Xt8z/X///H7ezbb7Ey2mcIcwrKcP5pDiIg5RUqJOUQ5lWNaOYvVKkJFSagcEiVRIsdkJHJIQsgqtjluoR1sr98fvt6/3m1q4/3ae9v7dv1cXpeL9/P1fD9fj9fbZ+3h8Xw+X2+LYRiGAAAATOLi6AAAAEDRRrIBAABMRbIBAABMRbIBAABMRbIBAABMRbIBAABMRbIBAABMRbIBAABMRbIBAABMRbIBmOjo0aNq1aqV/Pz8ZLFYtHLlSruO/+uvv8pisWjBggV2Hbcwa9asmZo1a+boMAD8DckGirxjx47pySefVMWKFeXh4SFfX181atRIM2bM0F9//WXqtaOionTgwAFNmTJFH3zwgerVq2fq9fJTr169ZLFY5Ovrm+PnePToUVksFlksFr366qt5Hv/UqVOaMGGC9u7da4doATiSq6MDAMy0Zs0ade3aVe7u7urZs6dq1Kih9PR0bdu2TaNGjdLBgwf1zjvvmHLtv/76S3FxcXrhhRc0ePBgU65Rvnx5/fXXX3JzczNl/P/i6uqqK1eu6PPPP9fDDz9sc27RokXy8PBQamrqTY196tQpTZw4URUqVFCtWrVy/b5169bd1PUAmIdkA0XWiRMn1K1bN5UvX14bN25UmTJlrOcGDRqkX375RWvWrDHt+mfOnJEk+fv7m3YNi8UiDw8P08b/L+7u7mrUqJGWLFmSLdlYvHixIiMjtWLFinyJ5cqVKypRooSKFy+eL9cDkHtMo6DIio2N1aVLlzRv3jybROO6ypUr65lnnrG+vnr1qiZPnqxKlSrJ3d1dFSpU0PPPP6+0tDSb91WoUEHt2rXTtm3b9L///U8eHh6qWLGi3n//fWufCRMmqHz58pKkUaNGyWKxqEKFCpKuTT9c//PfTZgwQRaLxaZt/fr1aty4sfz9/eXt7a2qVavq+eeft56/0ZqNjRs3qkmTJvLy8pK/v786duyoQ4cO5Xi9X375Rb169ZK/v7/8/PzUu3dvXbly5cYf7D889thj+vLLL3Xx4kVr265du3T06FE99thj2fqfP39eI0eOVHh4uLy9veXr66s2bdpo37591j6bN29W/fr1JUm9e/e2Tsdcv89mzZqpRo0a2r17t+69916VKFHC+rn8c81GVFSUPDw8st1/69atFRAQoFOnTuX6XgHcHJINFFmff/65KlasqIYNG+aq/xNPPKFx48apTp06mj59upo2baqYmBh169YtW99ffvlFDz30kO6//3699tprCggIUK9evXTw4EFJUufOnTV9+nRJ0qOPPqoPPvhAr7/+ep7iP3jwoNq1a6e0tDRNmjRJr732mjp06KBvv/32X9/39ddfq3Xr1kpKStKECRM0fPhwbd++XY0aNdKvv/6arf/DDz+sP//8UzExMXr44Ye1YMECTZw4Mddxdu7cWRaLRZ988om1bfHixapWrZrq1KmTrf/x48e1cuVKtWvXTtOmTdOoUaN04MABNW3a1PqLv3r16po0aZIkqX///vrggw/0wQcf6N5777WOc+7cObVp00a1atXS66+/rubNm+cY34wZM1S6dGlFRUUpMzNTkvT2229r3bp1mjVrlkJCQnJ9rwBukgEUQcnJyYYko2PHjrnqv3fvXkOS8cQTT9i0jxw50pBkbNy40dpWvnx5Q5KxdetWa1tSUpLh7u5ujBgxwtp24sQJQ5Lxyiuv2IwZFRVllC9fPlsM48ePN/7+Izl9+nRDknHmzJkbxn39GvPnz7e21apVywgMDDTOnTtnbdu3b5/h4uJi9OzZM9v1+vTpYzPmgw8+aJQqVeqG1/z7fXh5eRmGYRgPPfSQ0aJFC8MwDCMzM9MIDg42Jk6cmONnkJqaamRmZma7D3d3d2PSpEnWtl27dmW7t+uaNm1qSDLmzJmT47mmTZvatH311VeGJOPFF180jh8/bnh7exudOnX6z3sEYB9UNlAkpaSkSJJ8fHxy1f+LL76QJA0fPtymfcSIEZKUbW1HWFiYmjRpYn1dunRpVa1aVcePH7/pmP/p+lqPzz77TFlZWbl6z+nTp7V371716tVLJUuWtLbffffduv/++633+XdPPfWUzesmTZro3Llz1s8wNx577DFt3rxZCQkJ2rhxoxISEnKcQpGurfNwcbn2n57MzEydO3fOOkW0Z8+eXF/T3d1dvXv3zlXfVq1a6cknn9SkSZPUuXNneXh46O233871tQDcGpINFEm+vr6SpD///DNX/U+ePCkXFxdVrlzZpj04OFj+/v46efKkTXu5cuWyjREQEKALFy7cZMTZPfLII2rUqJGeeOIJBQUFqVu3blq2bNm/Jh7X46xatWq2c9WrV9fZs2d1+fJlm/Z/3ktAQIAk5ele2rZtKx8fH3300UdatGiR6tevn+2zvC4rK0vTp09XlSpV5O7urttuu02lS5fW/v37lZycnOtrli1bNk+LQV999VWVLFlSe/fu1cyZMxUYGJjr9wK4NSQbKJJ8fX0VEhKiH3/8MU/v++cCzRspVqxYju2GYdz0Na6vJ7jO09NTW7du1ddff60ePXpo//79euSRR3T//fdn63srbuVernN3d1fnzp21cOFCffrppzesakjS1KlTNXz4cN1777368MMP9dVXX2n9+vW66667cl3Bka59Pnnxww8/KCkpSZJ04MCBPL0XwK0h2UCR1a5dOx07dkxxcXH/2bd8+fLKysrS0aNHbdoTExN18eJF684SewgICLDZuXHdP6snkuTi4qIWLVpo2rRp+umnnzRlyhRt3LhRmzZtynHs63EePnw427mff/5Zt912m7y8vG7tBm7gscce0w8//KA///wzx0W11y1fvlzNmzfXvHnz1K1bN7Vq1UotW7bM9pnkNvHLjcuXL6t3794KCwtT//79FRsbq127dtltfAD/jmQDRdazzz4rLy8vPfHEE0pMTMx2/tixY5oxY4aka9MAkrLtGJk2bZokKTIy0m5xVapUScnJydq/f7+17fTp0/r0009t+p0/fz7be68/3Oqf23GvK1OmjGrVqqWFCxfa/PL+8ccftW7dOut9mqF58+aaPHmy3njjDQUHB9+wX7FixbJVTT7++GP98ccfNm3Xk6KcErO8Gj16tOLj47Vw4UJNmzZNFSpUUFRU1A0/RwD2xUO9UGRVqlRJixcv1iOPPKLq1avbPEF0+/bt+vjjj9WrVy9JUs2aNRUVFaV33nlHFy9eVNOmTfXdd99p4cKF6tSp0w23Vd6Mbt26afTo0XrwwQf19NNP68qVK5o9e7buvPNOmwWSkyZN0tatWxUZGany5csrKSlJb731lm6//XY1btz4huO/8soratOmjSIiItS3b1/99ddfmjVrlvz8/DRhwgS73cc/ubi4aMyYMf/Zr127dpo0aZJ69+6thg0b6sCBA1q0aJEqVqxo069S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bX09cOBADRw40JGhAQBgN06eazg22fD3989VtpeZySOsAQAorByabPz9MeWGYaht27Z69913VbZsWQdGBQCAfbm4OHdpw6HJRtOmTW1eFytWTPfcc48qVqzooIgAALA/Z59GKRBbXwEAQNFVIHajAABQlLEbpYBx9r8QAEDR4+y/2hyabHTubPtdAKmpqXrqqafk5eVl0/5v3/oKAEBB5+z/kHZosuHn52fz+vHHH3dQJAAAwCwOTTbmz5/vyMsDAJAvqGwAAABTOXmuwdZXAABgLiobAACYjGkUAABgKifPNZhGAQAA5qKyAQCAyZhGAQAApnLyXINpFAAAYC4qGwAAmIxpFAAAYConzzVINgAAMJuzVzZYswEAAExFZQMAAJM5eWGDZAMAALMxjQIAAGAiKhsAAJjMyQsbJBsAAJiNaRQAAAATUdkAAMBkTl7YINkAAMBsTKMAAACYiMoGAAAmc/bKBskGAAAmc/Jcg2QDAACzOXtlgzUbAAAUUX/88Ycef/xxlSpVSp6engoPD9f3339vPW8YhsaNG6cyZcrI09NTLVu21NGjR23GOH/+vLp37y5fX1/5+/urb9++unTpUp7iINkAAMBkFot9jry4cOGCGjVqJDc3N3355Zf66aef9NprrykgIMDaJzY2VjNnztScOXO0c+dOeXl5qXXr1kpNTbX26d69uw4ePKj169dr9erV2rp1q/r375+3+zcMw8hb+AWfZ+3Bjg4BKJAu7HrD0SEABY5HPiwouG9mnF3G2fh0RK77Pvfcc/r222/1zTff5HjeMAyFhIRoxIgRGjlypCQpOTlZQUFBWrBggbp166ZDhw4pLCxMu3btUr169SRJa9euVdu2bfX7778rJCQkV7FQ2QAAoAhatWqV6tWrp65duyowMFC1a9fW3LlzredPnDihhIQEtWzZ0trm5+enBg0aKC7uWnIUFxcnf39/a6IhSS1btpSLi4t27tyZ61hINgAAMJm9plHS0tKUkpJic6SlpeV4zePHj2v27NmqUqWKvvrqKw0YMEBPP/20Fi5cKElKSEiQJAUFBdm8LygoyHouISFBgYGBNuddXV1VsmRJa5/cINkAAMBkLhaLXY6YmBj5+fnZHDExMTleMysrS3Xq1NHUqVNVu3Zt9e/fX/369dOcOXPy+e5JNgAAKDSio6OVnJxsc0RHR+fYt0yZMgoLC7Npq169uuLj4yVJwcHBkqTExESbPomJidZzwcHBSkpKsjl/9epVnT9/3tonN0g2AAAwmb2mUdzd3eXr62tzuLu753jNRo0a6fDhwzZtR44cUfny5SVJoaGhCg4O1oYNG6znU1JStHPnTkVEXFuIGhERoYsXL2r37t3WPhs3blRWVpYaNGiQ6/vnoV4AAJjMEQ/1GjZsmBo2bKipU6fq4Ycf1nfffad33nlH77zzjjWmoUOH6sUXX1SVKlUUGhqqsWPHKiQkRJ06dZJ0rRLywAMPWKdfMjIyNHjwYHXr1i3XO1Ekkg0AAEzn4oAHiNavX1+ffvqpoqOjNWnSJIWGhur1119X9+7drX2effZZXb58Wf3799fFixfVuHFjrV27Vh4eHtY+ixYt0uDBg9WiRQu5uLioS5cumjlzZp5i4TkbgBPhORtAdvnxnI02s3O/TfTffDkg91MXBQmVDQAATObs341CsgEAgMmcPNdgNwoAADAXlQ0AAExmkXOXNkg2AAAwmSN2oxQkTKMAAABTUdkAAMBk7EYBAACmcvJcg2kUAABgLiobAACYzMXJSxskGwAAmMzJcw2SDQAAzObsC0RZswEAAExFZQMAAJM5eWGDZAMAALM5+wJRplEAAICpqGwAAGAy565rkGwAAGA6dqMAAACYiMoGAAAmc/avmM9VsrFq1apcD9ihQ4ebDgYAgKLI2adRcpVsdOrUKVeDWSwWZWZm3ko8AACgiMlVspGVlWV2HAAAFFlOXthgzQYAAGZjGuUmXL58WVu2bFF8fLzS09Ntzj399NN2CQwAgKKCBaJ59MMPP6ht27a6cuWKLl++rJIlS+rs2bMqUaKEAgMDSTYAAICNPD9nY9iwYWrfvr0uXLggT09P7dixQydPnlTdunX16quvmhEjAACFmsVisctRWOU52di7d69GjBghFxcXFStWTGlpabrjjjsUGxur559/3owYAQAo1Cx2OgqrPCcbbm5ucnG59rbAwEDFx8dLkvz8/PTbb7/ZNzoAAFDo5XnNRu3atbVr1y5VqVJFTZs21bhx43T27Fl98MEHqlGjhhkxAgBQqPEV83k0depUlSlTRpI0ZcoUBQQEaMCAATpz5ozeeecduwcIAEBhZ7HY5yis8lzZqFevnvXPgYGBWrt2rV0DAgAARQsP9QIAwGSFeSeJPeQ52QgNDf3XD+348eO3FBAAAEWNk+caeU82hg4davM6IyNDP/zwg9auXatRo0bZKy4AAFBE5DnZeOaZZ3Jsf/PNN/X999/fckAAABQ17EaxkzZt2mjFihX2Gg4AgCKD3Sh2snz5cpUsWdJewwEAUGSwQDSPateubfOhGYahhIQEnTlzRm+99ZZdgwMAAIVfnpONjh072iQbLi4uKl26tJo1a6Zq1arZNbibdW7nLEeHABRIf5z/y9EhAAVOpUBP069htzULhVSek40JEyaYEAYAAEWXs0+j5DnZKlasmJKSkrK1nzt3TsWKFbNLUAAAoOjIc2XDMIwc29PS0lS8ePFbDggAgKLGxbkLG7lPNmbOnCnpWino3Xfflbe3t/VcZmamtm7dWmDWbAAAUJCQbOTS9OnTJV2rbMyZM8dmyqR48eKqUKGC5syZY/8IAQBAoZbrZOPEiROSpObNm+uTTz5RQECAaUEBAFCUOPsC0Tyv2di0aZMZcQAAUGQ5+zRKnnejdOnSRS+//HK29tjYWHXt2tUuQQEAgKIjz8nG1q1b1bZt22ztbdq00datW+0SFAAARQnfjZJHly5dynGLq5ubm1JSUuwSFAAARQnf+ppH4eHh+uijj7K1L126VGFhYXYJCgCAosTFTkdhlefKxtixY9W5c2cdO3ZM9913nyRpw4YNWrx4sZYvX273AAEAQOGW52Sjffv2WrlypaZOnarly5fL09NTNWvW1MaNG/mKeQAAcuDksyh5TzYkKTIyUpGRkZKklJQULVmyRCNHjtTu3buVmZlp1wABACjsWLNxk7Zu3aqoqCiFhITotdde03333acdO3bYMzYAAFAE5KmykZCQoAULFmjevHlKSUnRww8/rLS0NK1cuZLFoQAA3ICTFzZyX9lo3769qlatqv379+v111/XqVOnNGvWLDNjAwCgSHCx2OcorHJd2fjyyy/19NNPa8CAAapSpYqZMQEAgCIk15WNbdu26c8//1TdunXVoEEDvfHGGzp79qyZsQEAUCS4WCx2OQqrXCcb99xzj+bOnavTp0/rySef1NKlSxUSEqKsrCytX79ef/75p5lxAgBQaDn748rzvBvFy8tLffr00bZt23TgwAGNGDFCL730kgIDA9WhQwczYgQAAIXYLT39tGrVqoqNjdXvv/+uJUuW2CsmAACKFBaI2kGxYsXUqVMnderUyR7D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lStX1rx58/Trr7+qefPmkqSAgABZLBb16tVLkpSVlaWYmBiFhobK09NTNWvW1PLly22u88UXX+jOO++Up6enmjdvbhMnAOdFsgE4mKenp9LT0yVJGzZs0OHDh7V+/XqtXr1aGRkZat26tXx8fPTNN9/o22+/lbe3tx544AHre1577TUtWLBA7733nrZt26bz58//57eI9uzZU0uWLNHMmTN16NAhvf322/L29tYdd9yhFStWSJIOHz6s06dPa8aMGZKkmJgYvf/++5ozZ44OHjyoYcOG6fHHH9eWLVskXUuKOnfurPbt22vv3r164okn9Nxzz5n1sQEoTAwA+SYqKsro2LGjYRiGkZWVZaxfv95wd3c3Ro4caURFRRlBQUFGWlqatf8HH3xgVK1a1cjKyrK2paWlGZ6ensZXX31lGIZhlClTxoiNjbWez8jIMG6//XbrdQzDMJo2bWo888wzhmEYxuHDhw1Jxvr163OMcdOmTYYk48KFC9a21NRUo0SJEsb27dtt+vbt29d49NFHDcMwjOjoaCMsLMzm/OjRo7ONBcD5sGYDyGerV6+Wt7e3MjIylJWVpccee0wTJkzQoEGDFB4ebrNOY9++ffrll1/k4+NjM0ZqaqqOHTum5ORknT59Wg0aNLCec3V1Vb169W742Oy9e/eqWLFiatq0aa5j/uWXX3TlyhXdf//9Nu3p6emqXbu2JOnQoUM2cUhSRERErq8BoOgi2QDyWfPmzTV79mwVL15cISEhcnX9/z+GXl5eNn0vXbqkunXratGiRdnGKV269E1d39PTM8/vuXTpkiRpzZo1Klu2rM05d3f3m4oDgPMg2QDymZeXlypXrpyrvnXq1NFHH32kwMBA+fr65tinTJky2rlzp+69915J0tWrV7V7927VqVMnx/7h4eHKysrSli1b1LJly2znr1dWMjMzrW1hYWFyd3dXfHz8DSsi1atX16pVq2zaduzY8d83CaDIY4EoUIB1795dt912mzp27KhvvvlGJ06c0ObNm/X000/r999/lyQ988wzeumll7Ry5Ur9/PPPGjhw4L8+I6NChQqKiopSnz59tHLlSuuYy5YtkySVL19eFotFq1ev1pkzZ3Tp0iX5+Pho5MiRGjZsmBYuXKhjx45pz549mjVrlhYuXChJeuqpp3T06FGNGjVKhw8f1uLFi7VgwQKzPyIAhQDJBlCAlShRQlu3blW5cuXUuXNnVa9eXX379lVqaqq10jFixAj16NFDUVFRioiIkI+Pjx588MF/HXf27Nl66KGHNHDgQFWrVk39+vXT5cuXJUlly5bVxIkT9dxzzykoKEiDBw+WJE2ePFljx45VTEyMqlevrgceeEBr1qxRaGioJKlcuXJasWKFVq5cqZo1a2rOnDmaOnWqiZ8OgMLCYtxoFRkAAIAdUNkAAACmItkAAACmItkAAACmItkAAACmItkAAACmItkAAACmItkAAACmItkAAACmItkAAACmItkAAACmItkAAACmItkAAACm+n+sy+WnYtEezQAAAABJRU5ErkJggg==\n"
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.98      1.00      0.99       965\n",
            "           1       0.99      0.89      0.94       150\n",
            "\n",
            "    accuracy                           0.98      1115\n",
            "   macro avg       0.98      0.95      0.96      1115\n",
            "weighted avg       0.98      0.98      0.98      1115\n",
            "\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "new_messages = [\"Congratulations! You won a free ticket.\", \"Hey, are we still meeting today?\"]\n",
        "new_vec = vectorizer.transform(new_messages)\n",
        "predictions = nb_model.predict(new_vec)\n",
        "\n",
        "for msg, pred in zip(new_messages, predictions):\n",
        "    label = \"Spam\" if pred == 1 else \"Ham\"\n",
        "    print(f\"Message: '{msg}' => Prediction: {label}\")\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "uxrPs_KQHOFB",
        "outputId": "7d6815c6-bde3-43ba-a0ee-69df94d03e0a"
      },
      "execution_count": 14,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Message: 'Congratulations! You won a free ticket.' => Prediction: Spam\n",
            "Message: 'Hey, are we still meeting today?' => Prediction: Ham\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "\n",
        "import numpy as np\n",
        "feature_names = np.array(vectorizer.get_feature_names_out())\n",
        "top_spam_words = feature_names[np.argsort(nb_model.feature_log_prob_[1])[-10:]]\n",
        "print(\"Top spam words:\", top_spam_words)\n"
      ],
      "metadata": {
        "id": "EFbz0g7jHWT9"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "Nor4DHwPHWZI"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "4wwtu1YZICKW"
      },
      "execution_count": null,
      "outputs": []
    }
  ]
}