From 5c692a7e6b1828ffd61afa998718cf256860e56d Mon Sep 17 00:00:00 2001 From: smriti pandey Date: Sun, 17 Aug 2025 11:53:53 +0530 Subject: [PATCH 1/3] Add text classification model to detect spam messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This project is a text classification model that detects whether a given SMS/text message is Spam or Ham (Not Spam) using Deep Learning. The model was trained on a labeled dataset of SMS messages and deployed with a user-friendly Streamlit web application. 🔹 Project Workflow Dataset used: https://www.kaggle.com/datasets/uciml/sms-spam-collection-dataset Data Preprocessing Cleaned and tokenized SMS messages Converted text to sequences using Tokenizer Applied padding to maintain equal input length (MAX_LEN = 100) Model Architecture Built using TensorFlow/Keras Embedding layer for word representation LSTM / Dense layers for sequential learning Final sigmoid output layer for binary classification (Spam vs Ham) Training & Evaluation Optimizer: Adam Loss function: Binary Crossentropy Metrics: Accuracy Achieved high classification performance on test data Deployment Model saved as spam_classifier.h5 / spam_classifier.keras Tokenizer saved as tokenizer.pkl Deployed using Streamlit for real-time predictions 🔹 Features ✅ Detects spam messages with high accuracy ✅ Returns prediction confidence score ✅ Interactive web UI using Streamlit ✅ Supports any user-entered SMS/text message 🔹 Example Predictions Input: "Congratulations! You have won a $500 gift voucher. Click the link to claim." → 🚨 Spam detected! (Confidence: 99%) Input: "Hey, are we still meeting tomorrow at 5?" → ✅ Ham (Not Spam) (Confidence: 100%) 🔹 Technologies Used Python TensorFlow / Keras NLTK / Text Preprocessing Streamlit Pickle --- ...fication for spam detection ml model.ipynb | 839 ++++++++++++++++++ .../pages/models/Spam detection model/app.py | 45 + .../Spam detection model/spam detector .png | Bin 0 -> 54391 bytes 3 files changed, 884 insertions(+) create mode 100644 src/apps/pages/models/Spam detection model/Text Classification for spam detection ml model.ipynb create mode 100644 src/apps/pages/models/Spam detection model/app.py create mode 100644 src/apps/pages/models/Spam detection model/spam detector .png diff --git a/src/apps/pages/models/Spam detection model/Text Classification for spam detection ml model.ipynb b/src/apps/pages/models/Spam detection model/Text Classification for spam detection ml model.ipynb new file mode 100644 index 00000000..e30ac939 --- /dev/null +++ b/src/apps/pages/models/Spam detection model/Text Classification for spam detection ml model.ipynb @@ -0,0 +1,839 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "738548d9-1fdf-49fb-936e-061ce19b6acd", + "metadata": {}, + "source": [ + "**Importing libraries**" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "0f4aaa89-bd52-442e-bdf5-9dc27edebf88", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import tensorflow as tf\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import Embedding, LSTM, Dense, Dropout, Bidirectional\n", + "from tensorflow.keras.preprocessing.text import Tokenizer\n", + "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import classification_report, confusion_matrix\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import re\n", + "import nltk\n", + "from nltk.corpus import stopwords\n", + "from sklearn.preprocessing import LabelEncoder\n" + ] + }, + { + "cell_type": "markdown", + "id": "607b6dcb-df2c-4b98-8aa4-a50f07b86628", + "metadata": {}, + "source": [ + "**Loading Dataset**" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "9a5598b2-5a6c-4a36-b3e3-ac1959cef471", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv(r\"C:\\Users\\fastf\\Downloads\\sms dataset\\spam.csv\", encoding=\"latin-1\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "4abf31c5-041e-4354-98f2-fb247823e16e", + "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", + "
v1v2Unnamed: 2Unnamed: 3Unnamed: 4
0hamGo until jurong point, crazy.. Available only ...NaNNaNNaN
1hamOk lar... Joking wif u oni...NaNNaNNaN
2spamFree entry in 2 a wkly comp to win FA Cup fina...NaNNaNNaN
3hamU dun say so early hor... U c already then say...NaNNaNNaN
4hamNah I don't think he goes to usf, he lives aro...NaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " v1 v2 Unnamed: 2 \\\n", + "0 ham Go until jurong point, crazy.. Available only ... NaN \n", + "1 ham Ok lar... Joking wif u oni... NaN \n", + "2 spam Free entry in 2 a wkly comp to win FA Cup fina... NaN \n", + "3 ham U dun say so early hor... U c already then say... NaN \n", + "4 ham Nah I don't think he goes to usf, he lives aro... NaN \n", + "\n", + " Unnamed: 3 Unnamed: 4 \n", + "0 NaN NaN \n", + "1 NaN NaN \n", + "2 NaN NaN \n", + "3 NaN NaN \n", + "4 NaN NaN " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cf8781a9-8333-464e-82d5-6bba238060e5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(5572, 5)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "0ad61425-4c83-40d1-85f3-0146983fe3cf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['v1', 'v2', 'Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4'], dtype='object')" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "8169bca7-aa5f-496e-af0e-9eaac9bc2ba4", + "metadata": {}, + "outputs": [], + "source": [ + "df = df[['v1', 'v2']] \n", + "df.columns = ['label', 'message'] \n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5151ed13-5ff4-4693-90f2-d69dd93ec40e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "label\n", + "ham 4825\n", + "spam 747\n", + "Name: count, dtype: int64\n" + ] + } + ], + "source": [ + "print(df['label'].value_counts()) " + ] + }, + { + "cell_type": "markdown", + "id": "d4bc67e1-67f0-4c4f-b43b-0bff15ae3437", + "metadata": {}, + "source": [ + "**Data visualization**" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "9dad45a9-aee7-4f6d-82ab-402f019cbaaf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "([,\n", + " ],\n", + " [Text(-0.44971325876899215, -1.0038714981945516, 'ham'),\n", + " Text(0.4701548196619535, 1.0495019988302243, 'spam')],\n", + " [Text(-0.24529814114672294, -0.5475662717424826, '86.6%'),\n", + " Text(0.2657396806784954, 0.593196781947518, '13.4%')])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAGFCAYAAAASI+9IAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAzNklEQVR4nO3deXxU5aE38N85sy+ZrBAChIQg++qObCJoQEQFhCpoLWJfq7b17fXttb3vdX17r9r22oVerdb2VotWi6C4VrGIgFWRRVkERLICCVkgyezLWd4/Bo6gbIFJzpxzft/Phw/kmZnwzExyfvPsgqqqKoiIiACIeleAiIiyB0OBiIg0DAUiItIwFIiISMNQICIiDUOBiIg0DAUiItIwFIiISMNQICIiDUOBiIg0DAUiItIwFIiISMNQICIiDUOBiIg0DAUiItIwFIiISMNQICIiDUOBiIg0DAUiItIwFIiISMNQICIiDUOBiIg0DAUiItIwFIiISMNQICIiDUOBiIg0DAUiItIwFIiISMNQICIiDUOBiIg0DAUiItIwFIiISMNQICIiDUOBiIg0DAUiItIwFIjolJYtW4aRI0fC4/GgsLAQl19+OSKRCBYuXIhZs2bhoYceQs+ePREIBPC9730PyWRSe+zbb7+NCRMmIC8vD4WFhZg5cyaqqqq022trayEIApYuXYqJEyfC4/HgwgsvxO7du7FhwwZccMEF8Pv9mD59OlpaWvR4+pbCUCCik2psbMT8+fOxaNEi7Ny5E++//z7mzJkDVVUBAKtWrcLOnTuxevVqvPDCC3jllVfw0EMPaY+PRCK4++67sWHDBqxatQqiKGL27NlQFOWY/+eBBx7Avffei82bN8Nut2P+/Pm455578Nvf/hbr1q1DVVUV7r///m597pakEhGdxKZNm1QAam1t7Tdu+853vqMWFBSokUhEK/v973+v+v1+VZbl436/5uZmFYC6bds2VVVVtaamRgWg/vGPf9Tu88ILL6gA1FWrVmlljzzyiDp48OBMPS06Abu+kUSUfdRYDKlduwBBSP8RRQgOBwSXC3A6Ibhc2h84HBAEQe8qd6nRo0dj6tSpGDlyJKZNm4bKykrMnTsX+fn52u1er1e7/yWXXIJwOIy9e/eirKwMVVVVuO+++/Dxxx+jtbVVayHU19djxIgR2uNGjRql/bu4uBgAMHLkyGPKmpubu/S5EsBQIPoaJRhE7LXXTu/OggC4XBD9foiBAIScHIg5ORACAYiBQPrfeXkQj7poGo3NZsO7776LDz/8ECtXrsTvfvc7/Pu//zvWr19/0scdCcurr74apaWlePrpp9G7d28oioIRI0YcM+4AAA6H4xuP/XrZ17ucKPMYCkRnQ1WBeBxKPA6ltfWEdxM8Hog9ekAsKoKtqCj9d48eEHJzDdHSEAQB48ePx/jx43H//fejrKwMr7zyCgBgy5YtiMVi8Hg8AICPP/4Yfr8fffv2xcGDB7Fz50489dRTmDhxIgDggw8+0O150KkxFIi6gRqLQa6vh1xfj9TRNzgcsBUXw9anD2x9+sDety/Ew90y2WL9+vVYtWoVKisr0bNnT6xfvx4tLS0YOnQotm7dimQyiVtvvRX33nsv6urq8MADD+AHP/gBRFFEfn4+CgsL8Yc//AElJSWor6/HT3/6U72fEp0EQ4FIT6kU5H37IO/bpxUJXq8WEra+fWHv1w/CUd0o3S0QCGDt2rX4zW9+g2AwiLKyMjz22GO48sor8be//Q1Tp07FwIEDMWnSJCQSCdxwww148MEHAQCiKOLFF1/EXXfdhREjRmDw4MFYvHgxJk+erNvzoZMTVPXwvDIiAgDITU0IP/mk3tX4is0GW79+sFdUwFFRAbGkJGu6nBYuXIj29nasWLFC76pQhrClQJTtZBlyTQ3kmhokVq2C4PHA3r8/7BUVsA8aBDEnR+8akokwFMiUUoqKSEpBVFIQlVREJAXRlIK4rEJSVagqoKiAAhWKCgScIiaV+PSu9mlRYzGkduxAascOAICttBSOoUPhGDYMYm6uzrUjo2P3ERlOXFbQGpPRGpfRnpARlZT0RV9SD4eAglQnZy4We2y4ZUh6gDfruo86wda7NxxDh8I+bBhsBQV6V4cMiC0FylopRcXBuIyWmISWuIzWw3+HOnvFtxC5oQFyQwOwahVsJSVwjBkD56hRENxuvatGBsFQoKwQlRTUh1NojqYv/C0xCR1JBWzGnjm5sRFyYyPi774Lx5AhcJ57Lmz9+2fNIDVlJ4YC6SIpq9gbTqE2lERdOIXmmKx3lcxLkpDavh2p7dsh5OXBOWYMnGPGcPyBjouhQN1CVlTsj0ioDSdRF0qhMSpBYTOg26nt7Ui8/z4Sa9bAPmQIXBdfDHtZmd7VoizCUKAucyAqoTaURG0ohf2RVKcHf6kLqSqknTsh7dwJW0kJnGPHwjFiBASRu+lbHUOBMupAVMKutgR2tifQkWQKGIHc2IjYK68g/t57cF18MZznnw/B6dS7WqQThgKdteaYhJ1tCexqT6AtwSAwKrWjA/GVK5FYuxbOsWPhGjs2vT04WQpDgc5IJKXg87YEth+Kc5DYZNR4HIn330dy/Xq4xo+H86KLdN17iboXQ4FOm6So2NORxLZDcdQEU2CbwNzUWAzxf/wDiY8+gmvCBDgvuACCnZcMs+M7TKcUTSnY1BrDp61xRCVOGbIaNRJB/J130uEwcSKc553HAWkTYyjQCR2Ky/ikOYbth+JgFpAaDCL+5ptIbtgAz7RpsFdU6F0l6gIMBfqGveEUPmmOYU9HkiuK6RuU5mZEliyBfcgQeCors+5QIDo7DAUCACiqit3tSXzSHENDVNK7OmQA0q5dCO3ZA9fYsXBNnMhprCbBULC4pKxi66E4NjbH0M51BdRZkoTEBx8guWUL3JWVcI4YoXeN6CwxFCxKVlRsbInho6YY4jI7iejsqKEQYsuXI7VtGzwzZ/LgHwPjFAIL2tWWwNM727C6IcpAoIySdu9G6PHHkdy8We+q0BliS8FC9kdSeG9/BPsjHDOgLpRIIPb660h9/jk8V18NMS9P7xpRJzAULKA9IWNNQwQ725N6V4UsRKquRuiJJ+CeOjW9KprnOBgCQ8HE4rKCjw7EsLElBvYSkS5SKcTffhvS7t3wzJ4N0e/Xu0Z0ChxTMCFFVbGpJYandrRhfTMDgfQnVVcj/OSTSFVV6V0VOgW2FExmXziFv+8N42Ccm9RRdlEjEUSfew7OcePgnjIFgs2md5XoOBgKJiEpKtY2RrGhOcZVyJTVkh9+CLmuDt7rruNq6CzE7iMTaIym8MwX7fiEgUAGIe/fj9BTTyG1Y4feVaGvYSgYmKyqWNsQwZIvOtDK7iIymkQC0ZdeQnz1aqgqP85kC3YfGVRzTMIbdSEecEOGl1i7FnJzM7yzZ3P/pCzAloLBKKqKDw9E8ewX7QwEMg1p1y6E//QnKG1telfF8hgKBtIal7BkdwfWNkY5zZRMR2luRvjppyHV1OhdFUtjKBjEppYYntnVjkZua00mpsZiiDz3HBIbN+pdFcvimEKWSykq3q4P4/O2hN5VIeoeioL4m29CDYfhnjxZ79pYDkMhi7UnZLxcE+TYAVlSYs2adDBcdRX3TepGDIUsVdWRxOt1IW5tTZaW3LQJSjQK75w5EOy8XHUHjilkoY8ORLGsOshAIAIg7dyJyPPPQ02wC7U7MBSyiKSoeL02hDWNUa5MJjqKXFuL8DPPQIlE9K6K6TEUskQkpeCvX3ZwQJnoBJQDBxD5y18YDF2MoZAFmqISnv2iHQ2cbkp0UkpzMyJLlkCJRvWuimkxFHRWHUziuS/bEUwpeleFyBCUpqZ0i4HB0CUYCjra3Z7A8uogmAdEnaM0NaVbDLGY3lUxHYaCTna2JbCiJsTtKojO0JExBpXBkFEMBR1sPRjHa7UhsIFAdHaUAwcQee45qMmk3lUxDYZCN9vcEsNb9WFOOSXKELmhAdGlS6HKXPmfCQyFbrS+KYqV+zidjijTpKoqxF59lYf1ZADXjXeTDxqj+OAAZ0sQdRmHA1BVgPsknRWGQjd4vyGCj5s4GEbUVVyXXsodVTOEodCFVFXFP/ZHsKklrndViMxJEOCZORPO887TuyamwVDoQmsaowwEoq7icMA7dy4cgwbpXRNTYSh0kU9bY+wyIuoigtcL74IFsPfpo3dVTIeh0AX2dCSxci9nGRF1BTE/H94bb4StsFDvqpgSQyHDGqMpvFob5DoEoi5gKymBd8ECiH4/gPS4naQCDpEzjjKFoZBB7QkZy6q4lxFRV7APGADvt74FwekEkD5/5I26EBKyinkDAhA5FTUjuHgtQ2KSgqVVQUQkthGIMs0xejS88+drgRCX079vu9qTqAml8M7esM41NA+2FDJAUlQsrw7iUILL7IkyzTVhAtxTp2pfh5IyllYF0RL/6vdty8EE8pw2XNLLq0cVTYWhcJZUNd2E3RfhATlEGSUIcE+fDtdFF2lFLTEJL1UFj3v+yJrGKHJdNgzLd3VnLU2HoXCW3tsfwa527tBIlFF2O7xz5sAxdKhWtDecwvLqIOIn2W/+zboQcp0i+vgc3VFLU2IonIVPW2PYwMVpdBz/rK3F4g8/xJaGBhwIh/Hc9ddj5lEXuEdWr8bL27djfzAIh82GMSUluG/qVFzQt+9pff/l27bh1uXLMWPwYPx1/nytfOnWrXjoH/9AJJnEt887Dz+rrNRuq2trw5wlS7D6ttsQcLsz92QzTHC74Z0/H/Z+/bSyXe0JvF576vNHZBV4tSaEW4bkwWPnkOmZ4Kt2hpqiEv7BHU/pBKKpFEYWF+MXM2Yc9/ZzCgvxyxkz8OEdd+DtRYvQLy8Pc5YsQetpHEpf396O+1auxCVHXTQB4GAkgrteew0/q6zEy9/+Nl747DO8s3u3dvv/efNNPHD55dkdCLm58C1adEwgbGqJ4dVOHEgVTCl4oy7EHVPPEFsKZyApq3j1ND61kHVdMXAgrhg48IS3zxs16piv/3PaNCz59FN83tSESysqTvg4WVFw2/Ll+Olll+Gjujp0xL9qqda2tSHgcmHOiBEAgIn9++OLlhZMGzQIL23dCofNhmuGDTvLZ9Z1xOJi+G68EWJODoD0eN37DVGsb+78zgBVwRTWN8cwtpgDz53FlsIZWLkvzJlGlDFJScKzmzYh4HJhRHHxSe/78zVrUOjz4ebjbAA3oLAQsVQKWxob0RaNYvP+/RheXIy2aBQPr16NX56g1ZINbOXl8N9yixYIsqrijbrwGQXCEWsbotgXTmWqipbBlkInbTsYx/ZDCb2rQSbw9hdf4NZlyxBNpdArJwcrbr4ZhT7fCe//cX09ntu8Getuv/24t+d5PHhi9mzc8coriKVSuGH0aEw95xx8f8UK3Hbxxahra8P8F16AJMv46eTJuHb48K56ap3iGDECnlmzINhsAICErOCVmhBqQ2d3QVcAvFbL8YXOYih0wsG4hJX7uEiGMmNi//5Yd/vtOBiN4tnNm7HwpZew6rvfRY/DWzgcLZRI4LaXX8Zvr7nmpMFx9dChuPqoAe11NTXY0dyMX86YgfMWL8Yf585Fsd+PqU8/jXFlZcf9v7qTc+xYuCsrIRxejRxOKXipqgNNscy0xI+ML8ytCGj/B50cQ+E0SUp6HIFbWFCm+JxOVBQWoqKwEBeWluK8xYux5NNPcffEid+4b82hQ6hvb8cNf/2rVqYcHkgtfOghbPzhD9G/oOCYxyQkCT9+8008NWcOqg8dgqQomFBeDiDd1bRx/35cOXhw1z3BU3BXVsJ1ySXa14fiMv5W1YGOZGZ/yTi+0DkMhdP03v4ImjP06YXoeFRVRUI6/iLIQUVF+PCOO44p+4/33kM4mcSj06ejTyDwjcf8cs0aXD5wIMb07o0tjY2QlK8utilZhqzo9AnHZoNn1iw4Dw+IA8D+SArLqoKIddHsjbUNUfT1OdDXz/ULp8JQOA1ftCewuZXrEej0hRMJVB86pH1d196OrY2NyPd4UOD14rG1a3Hl4MEozsnBoWgUf9qwAQ3BIGYd1c//vZdfRu9AAA9cfjncDgeGfW0QOvfw1NKvlwPAzuZmvPz559r4w6CiIoiCgL9s3oxivx9ftrbiPD3OInC54Lv+etj799eKvuxI4NWaELpy2zCOL5w+hsIptCdkvFXPcQTqnE8bGnD1s89qX//7O+8AAOaPHo1fz5yJ3a2teGHLFhyMRlHg8eDcPn3w90WLMLRnT+0x+zo6zmjnT1VV8aPXX8fD06bBd3gDOY/DgSdmzcKP33oLSUnCL2fMQO/jtC66kpCTA9+NN8J2VIh91hrHO3vD3bLV/JHxhXkDcrvhfzMuQeUKjxNSVRXPfdmB/dzXyPSKPTbcMiQfACA3NSH85JM618hcxKIi+G66CWLuVxfkdY0R/PNA959OeE1ZDoYVcH+kE2FL4SQ2tsQZCERnyVZaCt/8+RA8HgDpAfJ39oax5aA+U7tX7Q+jIuCAm91Ix8VX5QQ6kjLWNUb1rgaRodmHDIHv5pu1QEgd3mZer0AAgIiUXilNx8dQOIGVe8NIKuxZIzpTzgsuSJ+UZk93SEQlBX/9sgNVQf1XGX92MM7VzifAUDiOnW2JrPjBJTIq15Qp8Fx1lbZgrD0hY8nudjRGs6c79p29YcgcUv0GhsLXxCUF/+CqZaIzI4rwXHst3EctwDsQlbBkdzvaEtm18rMlLuOTpu4f6M52DIWvWdsY5TnLRGfC6YR3/nw4x4zRiqqDSfz1y46s/Z3654Eo2rm55TEYCkdpikr4lIvUiDpN8Png/8534DjnHK1s28E4llUHs3psTlLT3Uj0FYbCUd7d1z2LaIjMRCwogP/WW2Hr3Vsr+/BAFG/Wh5HFeaCpCaWwo407Hx/BdQqHbT8Uxz6uSSDqFFufPvDOnw/x8M6tqqri3X0Rw20Ls2pfGBU5XLsAsKUAIL1/++r9PFqTqDPsAwfC953vaIEgKSpeqQkZLhCA9NqFDw5w7QLAUAAAfNwUy9qBMKJs5Dj3XHhvuAGCI73raFxS8OKeDuzuSOpcszP3aWscwSQHnS0fClFJwaYW432yIdKLa9IkeK+5BoKYvnx0JGUs+bLD8N2vsgp8xCmqDIX1TbGsnh1BlDUEAZ6ZM+G+7DKtqDkmYcnuDhyMm+MT9paDcctPUbV0KERTCja38pMB0Sk5HPBefz2c55+vFdWFknh+dwfCJjqOUFHTM6eszNKhsL45xuM1iU5B8Hrhu/lmOI46unNHWwJLq4JImLCVvf1QAm0Wbi1YNhTYSiA6NSEvD75Fi2Dv21cr+6Q5htdqQ+iikzN1pwD4wMI7JFs2FD5mK4HopMRevdKL0goLAaTXIKzaF8Z7Fpi+vaMtgda4sQfOz5QlQyGSUvApWwlEJ2SvqIB/4UKIfj8AQFZUvFYbwgaLzNRTYd3WgiVXNHMsgejEHKNGwXPNNRBsNgBAXFbwcnUI9RY7f2BXexLNMQk9Pda6TFqupcBWAtGJucaPh2fWLC0QQikZz+/usFwgHGHF0xetFYEAPm6KspVA9HWCAPf06XBddJFW1BqXsHRPEEEL/8J82ZFEU1RCsdc6l0pLtRSiksKtsYm+zm6Hd+7cYwJhXziF53Z3WDoQjtjYYq2eBUuFwraDcXCLI6KvCG43fDfdBMewYVrZF+0JvLinA3GzzjntpJ1tCUQl64SjpULhs4NsJRAdIQQC6TUIZWVa2eaWGFbUhPjh6SiSCmyxUA+DZUKhLpTMujNiifQi9uyZXoPQo4dWtqYhgpX7Ijxo6jg+bY1DUa3xylgmFD6zUNITnYytrAz+W26BGAgAABRVxRt1Ie4QehLBlIIvDbwteGdYIhSikmLofd6JMsUxfDh8N90Ewe0GACRlFS9VBbH9EI+jPJXNFlm4Z4l5VtsOxk27TwvR6XJefDHc06ZBEAQA6TU7L1UFcSBmze0cOqsunEJbQka+y6Z3VbqUJVoKHGAmq3NfcQU806drgXAoLmPJ7nYGQidttcC1xPShwAFmsjSbDZ45c+AaN04raoik8NyX7WhP8veis7YdTJh+wNn0ocABZrIslwu+BQvgHDlSK9rTkcQLezoQ5ZzTMxKWFOwx+fikqUMhmuIAM1mT4PfDv3Ah7BUVWtmWg3Esrw5ym5eztMXkXUimHmjedogDzGQ9YlERfDfeCDEvTyv7oDGKDyx+zGSmVAdTiEkKPHZzfqY257M6jNPsyGpspaXwLVqkBYKiqvh7fYiBkEEqYOo1C6YNhfaEjJa4dc9ZJeuxDx4M37e/DdHjAQCkFBUvV4ew5SA/HGWamUPBtN1HZh8MIjqa8/zz4Z4xA4KY/pwXlRQsqwqiIcopp12hJphESlHhEAW9q5Jxpm0pmDnJiY7muuwyeGbO1AKhPSHjud0dDIQuJKnpYDAjU4ZCXFawN2LNk6LIQkQRnmuvhXvSJK3oQFTCkt3tOJRg12lXM+vMRlN2H1UHU1A464jMzOGA91vfguOcc7SimmASr9SEkOQPf7fY05GEoqoQBXN1IZkyFDieQGYm+HzwLlgAe+/eWtn2Q3G8VR/mh6FuFJdV7A2nUJbj1LsqGWW6UFBUFVUm7esjEgsK4L3xRtgKCrSyj5uieL+BU071sLsjabpQMN2YQn04hQRXrJEJ2Xr3hm/RIi0QVFXFu/vCDAQdmXFCi+laCuw6IjOyDxwI79y5EJzpT6WSouL1uhC+aOfPu56CSQUHohJ6ec1zKTXPMzmMoUBm4xgzBp6rr9amnMYlBctrgtgb5pTTbPBlR8JUoWCq7qOWmMTtgMlUXJMmwXvttVogBJMynvuyg4GQRWqC5pr+bp54A1DNAWYyC0GAe8YMuC64QCtqiUlYWhVEiNucZpWmmARJUWE3yepmU4XC/gg/PZEJ2O3wzp0Lx+DBWlF9KIXlNUFOoshCspoOhj4+h95VyQiThYK5mnFkPYLHA+/8+bCXlmplO9sSeKMuxG3gs9j+CEMh67QlZER4mhQZmJCXB9+NN8JWVKSVbWiOYdX+iI61otPREEkB8OhdjYwwTSiwlUBGJvbqBd+CBRBzcgCk1yCsbojik+aYzjWj02GmrmvThMI+zsYgg7L17w/f9ddDcLkAALKi4s36MHa08RwEowilFASTMgJOm95VOWumCYWGKFsKZDyOkSPhufZaCLb0xSQhK3i5OoS6MH+ejaYhIpkiFEyxTkFSVLTGuFUwGYtz3Dh4Zs/WAiGcUvD8lx0MBIMySxe2KVoKzTEJnLlNhiEIcFdWwjV2rFZ0MC7hb1VBBLn40rDMcqiRKULhgEneDLIAmw3e2bPhGD5cK9oXTmFZdRBxzjk1tANRCbKiwmbwRWzmCIUYQ4EMwO2G7/rrYS8v14p2tyfwWm0InE1tfLKavhYZfb2COUKBLQXKckIgkF6D0LOnVvZpawwr90bAPDCPA1GGgu5kVUVrnIPMlL3EHj3gu+kmiIGAVra2IYIPm7gGwWzaTHA2tuFDIZhUeAQhZS1bWRl8N9wAwe0GkD4Z8O/1YWw7xDUIZmSGXZoNHwodSeMnM5mTfdgweGfPhmBP/5olZRUraoOoNtlWy/SVdrYU9NdhgmQm83FedBHc06dDENIzUaIpBS9VB9HI8S9TM8OHVOOHggmSmczFffnlcI0fr33dlpDxtz0dpuhaoJNLKelFiH6HcdcFGz8U+ItG2UIU4bn2WjhHjdKKGiMpvFQdRJRzTi2jPSEzFPRkhuYamYDTmV6DUFGhFVV1JLGiNggelGYt7UkZfWHcaakmCAX+xpG+BL8/vQahVy+tbOvBON6uD3P7FQsy+rRUQ4eCrKgI82MY6UgsLEyvQcjL08r+eSCKdY1R/SpFumpPGPuaZOhQ6EgqXA1KurH17Qvv/PkQvV4A6TUI7+6L4NPWuM41Iz0ZvUvb4KFg7BefjMs+eDC8110HwZHuO04pKl6rDeHLjqTONSO9sftIRxxPID04zzsP7quugiCmZ5jEJAXLqoOmOpKRzlxEUpFSVDgMuluqoUMhyJYCdTPX5MlwX3qp9nVHUsbSPUEcNPinQ8qsqKQg16CnsBk6FDj3m7qNKMIzcyac556rFTVFJbxUFURYYouVjpUw8NkYhg6FFHfCo+7gcMA7bx4cAwdqRbWhJF6pDiHBn0E6DiMfmMRQIDoJweuFd8EC2Pv00co+PxTHm/Vh7s5LJ5SQjdt6ZCgQnYCYnw/vTTfBVlCgla1vimJ1A9cg0MnFDdy1zVAgOg5bSQm8N94I0ecDAKiqilX7I9jYwjUIdGrsPtIJQ4G6ghgIwLdwIQSnEwAgKSreqAthVzvXINDpMfK1yeChoHcNyIwEj0f7d1xSsLwmiL1hrkGg0ycxFPRh5Beesl8wKeOlqiBaeAY4dRJbCjpJGviFp+zWEpOwtCqIEJujdAYMPKRg7FBgS4G6wt5wCsurg4YeLCR9saWgA1VVYeBZX5SldrUn8HptyNCf9Eh/Rv7AathQYKueMm1TSwz/2Bfhdux01ox8eTJsKMgqf3Upc1riMt7dF9G7GmQSdsGYO6QCgGFPl7YZ+EWn7GPg1j5lIbthr6wGDgWHYWtORGZn1LMUAAOHgiAIDAYiykp2hoI+nAZ+4YnIvNhS0ImRX3giMi+7gS9NDAUiogwz8rXJ0KHgtBn3hSci8+KYgk6MnMZEZF5GvjYxFIiIMozrFHTC2UdElI24olknbCkQUTYy8rXJ4KGgdw2IiL7JZ+CLk3FrDsBr5I47IjKtHIaCPnKchq4+EZmQ3y5ySqpeAk6b3lUgIjpGwOAfVg1d+4CBm2hEZE65DAX9BJwijNtIIyIzyjV4D4ahQ0EUBEOP8hOR+bD7SGd5Bn8DiMhc2FLQWZ7L2G8AEZkLxxR0VsBQIKIsYvRZkYYPhXyGAhFlCY9dMPyW/gwFIqIMyXUY/3pkglAw/FMgIpMww/XI8M/AZRPh57RUIsoCvbx2vatw1kxxNTXDG0FExlfidehdhbNmilDow1AgIp0JMMcHVFOEQm+f8d8IIjK2QrfN8DOPAJOEQonXwT2QiEhXJSZoJQAmCQWnTUCR2/hTwYjIuMzSY2GKUADM84YQkTGZYZAZMFUomOMNISLjsQlAD485eitMEwqcgUREein22GETzDGyaZpQKHTb4DLByD8RGU+JibqvTRMKgiCYZvSfiIzFTNce04QCAPQ20RtDRMbR2ySDzIDJQqEPB5uJqJsFHCIKTDQl3lShUOp3wM5hBSLqRhUBp95VyChThYLTJqAsh60FIuo+FQFzXXNMFQoAMCjXpXcViMgibAJQnsOWQlY7J9fJfZCIqFv09TlMsQne0UwXCj6HyC0viKhbmK3rCDBhKADAwFxzNeeIKDsNyjNfdzVDgYjoDBS5bch3mWcq6hGmDIVCtx0FJnyziCh7DDLph09ThgLA1gIRdS0zdh0BDAUiok4LOERTnMd8PKYNhT4+O7xc3kxEXWBQnnk/dJo2FARBwDlsLRBRFxhZ4Na7Cl3GtKEAmPuNIyJ99PLaUWzSriPA5KFQ6negyES7FxKR/sYUmvvDpqlDAQDGFJn7DSSi7uMUBQzLN+esoyNMHwoj8l1wmP5ZElF3GJrvNN1eR19n+sul2y5iiEnnExNR9zJ71xFggVAAgHPZhUREZ6mnx4YSC5zuaIlQ6O1zoNjDAWciOnOjLdBKACwSCgAHnInozDlEYHiBNbqhLRMKw/JdcIrmHiAioq4xOM8Ft80al0trPEsALpto+qlkRNQ1rDDAfIRlQgHggDMRdV5Pjw19/eYfYD7CUqFQ7LWjD4/qJKJOGNfLq3cVupWlQgEAxhVb6w0mojPXw23DYIttrGm5UBiQ60QvD1sLRHRq43t5IQjWmqBiuVAAgHG9PHpXgYiyXA+3DYNNfG7CiVgyFAbmOtGDu6cS0UmMs2ArAbBoKAiCgPEWGzwiotNX5LZhiAVbCYBFQwEABuextUBEx2fFsYQjLBsKgiBgUm+2FojoWFZuJQAWDgUAGJjr4roFIjqGVccSjrB0KADApBK2FogordBtw1ALtxIAhgLKcpwoz7HOEnYiOrEJFm8lAAwFAMDk3j69q0BEOiv12zGUm2YyFACgl9duqV0QiehYogBU9vXrXY2swFA4bHJvL7x2azcbiazqwh4e9OD2NwAYChq3XcSUPuxGIrKagEPkYtajMBSOMqLAjTIL7Zt+umRJwsrHH8YvZp6P+y4pxS+uvgCr/vBfUBTlmPs1V+/GX350Ex6cVIEHJpTjiZuno71x30m/dyzUgVcfuQcPVw7HfWP74ldzxmHXB+9qt3/61jI8euVo/L/JA/HWrx885rFtDfX4r1kXIx4OZey5kvVM7euD08ZegiPYXvqaaaV+/GlXG2RV75pkj7XPLMb65c9i3kO/Q/GAIdi34zMse/AuuP05GL/gewCAg3tr8OStM3HhtTfi8tvvgdsfQHPNbthdJx64k1JJ/OmOufAXFGHBL/4HuT17o6NpP1y+dN9upO0gXv7Zv2Deg4uR37ccz961ABUXjMOQiZUAgBUP/yum//A+uP05Xf8ikClVBBwYnMfB5aMxFL6mwG3D2GIP/nkgpndVskbd1o0Ydul07WKc37sftrz9Mvbt2KLdZ+XjD2Pw+Mtx5Y8e0MoK+paf9PtuevWviAXbccef34LN4Tj8vUu12w/tr4Pbn4NR02YDACouGI/m6t0YMrESn/19OWwOJ0ZMnZmpp0kWYxeAKzi4/A3sPjqOS4q9KHBxX6Qjys+9GHs+WYeWuioAQOPu7aj77BMMnnA5AEBRFOz64F0UlQ3A/9w5D/8xdSgev3kaPl/91km/7441b6PfyAvw6qM/wX9ePgy/mTcRq//0ayiyDAAo6leBVDyGhl1bEe1ow74dn6HXwGGIdrTh3d8/imt+8mjXPnEytbHFXuTz9/wb2FI4DrsooLLUhxf3BPWuSla4dOFdiIeD+PWcSyDYbFBlGZXf/78YM30OACByqAXJaARr/rwYlXf+G6b/7/ux+8P38PyPF+K7f3gFFeePP+73bdtfh+oNH2DMlddh4eIX0Lq3Gq8++hMosoypt/0YnkAe5j3031h6/w+Qisdw3lXfwqBxU7Dswbsw7obvom1/Hf7yLzdBkSRM/d6/YuTl13Tny0IGlu8SMbaY56ocD0PhBMpznBie78LnbQm9q6K7rStX4LO3luH6h59CccVgNHyxHW88di9yevTC+VffAFVND8AMmzwdE266HQDQe/BI1G/ZgPXLnj1hKCiKAl9BEWbf+yuINhv6DBuNYMsBrPvLf2PqbT8GAAyfchWGT7lKe0z1xn/iwJ6duOYnj+K/rr0INzzyFHIKi/H4zZXof94l8Bf06OJXg8zgir5+2EUOLh8PQ+EkpvTxYU8wiYTFR53//psHcenCuzD6cN9+r4HD0H5gL9b8+bc4/+ob4M0rgGi3o2fFoGMe16P/INR99vEJv2+gqBii3QHR9lUTvmf/gQi1NkNKJWF3HLsHjZRM4NVH7sG3/uMJHNxbA0WWtcAp6jcAe7dtxtBLp2XqaZNJDc1zoiJg7f2NToZjCifhc4iYyrULSMZjEMRjf1RE0aZNSbU7nOg77Fy01FYdc5/W+irklZTiRMpGX5S+uB81tbW1rgo5RcXfCAQAeO/pxzBo/FT0GToaqiJDkSXtNkVKQVHkM3p+ZB0Bh4hppRxcPhmGwimMKnRjuMX3Qxk6qRKr//Rr7Fq3Em0N9fj8vTfxwXNPYvhlX3XrTLr5+9i2cgU+eXkJWuur8eGLf8Sute9g7LxbtPssve/7ePt3P9O+vnjeLYh2HMIbv/y/aKmrwq51K/H+//wWl3xr0Tfq0FS1C1tXrsAVd/wEANCjfCAEUcSGFc9h17qVaKndg77Dz+3CV4GMTgAwsywHbjsveycjqEc6hOmEkrKKZ75ox6GENT+JJiJhrHziEexY/RbCba0I9OiF0dNmY8ptPz7mE/3GFc/j/T//Fh3NjehRNgCX3/4TDJt8pXb7H/7XtcjvXYp5D/23Vla3ZQPefOw+NO7ejkDPElxw7QJcuvCuY7qUVFXFU4uuwqW3/AhDJ1Vq5TvXrsRrj/4EUiqByjv/DRfO/nYXvxJkZGOLPdz88jQwFE5TU1TCkt3tkPhqERlOL48d3x6cC5vFt8U+HWxHnaZirx1T+/JTBpHROEUB15TnMBBOE0OhE84t8lj67FYiI5pW6kOBm4vUThdDoZOu7OdHnpMvG5ERjC50YXgBz0rpDF7dOsllEzGrfwDcVJEou/X02Li30RlgKJyBXl47ZzEQZTGnKGBWeYCrls8AQ+EMXdjTg4G5HF8gykYz+vk5jnCGGApn4ap+fuS7+BISZZNLS7wYYvEFp2eDV7Sz4LaLuH5ALs92JsoSYwrduIRHa54VhsJZynPZMG9AAA6+kkS6qgg4UFnKsb6zxUtZBpR4Hbi2PAC2F4j0UeyxYVZ5ACIXqJ01hkKGnJPrxHTuvkjU7QIOEfMG5MLJeeIZwVDIoNFFbozrxdOciLqLyyZg3oAA/Oy/zRi+khk2qcSHkQWc+UDU1UQBmN0/Bz08PCsskxgKXeDKfn70z3HoXQ0iU7uy1I/yHK4VyjSGQhcQBQGz+wdQ7OHiGaKuMKGXFyMLuadRV2AodBGnTcC8AbnI5eZ5RBl1UU8PJpRwLUJX4RWrC/kdIhYMZDAQZcq4Yg+m8Nz0LsWT17pBMCnjhT0daEsop74zER3XpBIvxnG1cpdjKHSTUErGC18GLXvOM9HZuKy3FxcXMxC6A0OhG4VTCl7c04HWOIOB6HRd0deH83tw/U93YSh0s2hKwd+qOtAUYzAQnYwAYHqpH6OLOMuoOzEUdJCQFSyrDmJvWNK7KkRZSQBwVZkfI3iUZrdjKOgkpahYURNEVTCld1WIsooI4JryHJ6JoBOGgo4UVcWbdWF83pbQuypEWcEupANhUB4DQS8MBZ2pqorVDVF80hzTuypEuspxiJjTPwclPm4RoyeGQpbYfiiOt+vDkPhukAX18dkxuz93O80GDIUsciAq4eXqIIIpLnIj6xhZ4MK0Uj/sIs9DyAYMhSwTSSlYUcuZSWR+AoApfXy4sCfXIGQThkIWUlQVq/ZHsKklrndViLqE2yZgVnkOygPc+jrbMBSy2NaDcbyzNwyZ7xCZSJHbhusqAsh3cWv5bMRQyHKNkRRergkhxHEGMoFzcp24uswPl40DytmKoWAAkZSCV2qC2BfhOAMZkwDgkl4eTOzlhSBwQDmbMRQMQlZVrGmIYkNzDHzDyEgCDhEzy3LQj0fUGgJDwWD2hVN4sz7EsxnIEIblu1BZ6oOb3UWGwVAwoJSiYk1DBBs5O4mylMsmoLKvD8O5oZ3hMBQMrD6cwlt1IbQn2Wqg7FGe48CV/fzIdXJ2kRExFAwuKat4vyGCza1sNZC+XKKAKX18PP/A4BgKJlEXSuKt+jA62GogHVTkODC9nx8Btg4Mj6FgIklZxeqGCD5lq4G6iduWbh2MKmTrwCwYCiZUG0pi1b4IWngWNHURUQDOLXJjQi8vPHbOLDIThoJJKaqKbQcTWNcYRVhilxJlzjkBJ6b08aHAza4iM2IomFxSVrG+OX2ID3fKoLPR02PDlD4+lOdwEzszYyhYRDilYG1jBNsOJrgimjrFZxcwqbcPowpc3KLCAhgKFtMck7B6fwQ1oZTeVaEsZxeAi3p6MLbYC6eNYWAVDAWLqgkm8d5+DkbT8Q3Ld+HS3l4uQLMghoKFqaqKbYcS+LgphkMJhoPV2YR0GFzc04Mij13v6pBOGAoEVVXxRUcS65tiaIxye26rcdkEnFvoxvk93chxsGVgdQwFOkZdKImPm2Icc7CAHIeIC3q4MabIzUNvSMNQoONqjknY2BLDjkMJSPwJMZUebhsuLvZgaL4LNs4moq9hKNBJxSQFn7XGsbk1ziNBDa7M78DFxR5UBLjOgE6MoUCnRVFVfNGexGetcdSHU1zrYBB+h4hh+S6MKHChJweP6TQwFKjTwikFO9sS2NGW4MB0FnKKAgbnOTE834WyHAcXnFGnMBTorLQlZOxoS2BnWwKtXPOgG1EA+uc4MKLAjXNynXCIDAI6MwwFypimqJRuQbQnEOS5Dt2ij8+O4fkuDM13cbdSygiGAmWcqqrYH5Gwoy2BPR1JBDlAnTGikA6Cihwnhua7kOfiugLKLIZCFpk8eTLGjBmD3/zmN3pXJaPaEjLqQinUhZKoD6cQ4RzXTsl1iuif40RFwIGyHAfXFFCX4nQE6nL5LhvyXTaMOXx2b2tMQl04hbpQCvXhFOIyQ+JofoeIfn6H9ofnFlB3YihQtyvy2FHkseP8Hh6oqoqmmIz6cLolsT8iWSokbAJQ4LKhp8eOUoYAZQG2Q7OMoii45557UFBQgF69euHBBx/UbvvVr36FkSNHwufzobS0FHfeeSfC4bB2+zPPPIO8vDy88cYbGDx4MLxeL+bOnYtIJIJnn30W5eXlyM/Pxw9/+EPIcnbMFBIEAb28dlzU04N5A3Lxo1GF+MGIAtwwIICpfXwYU+hGX58dLhNs3ZzrFHFOwIlLij24pjwHtw7Jw92jC3Hr0HxcXZ6DMUVuBgLpji2FLPPss8/i7rvvxvr16/HRRx9h4cKFGD9+PK644gqIoojFixejvLwcNTU1uPPOO3HPPffgiSee0B4fjUaxePFivPjiiwiFQpgzZw7mzJmDvLw8vPXWW6iursZ1112HCRMm4Prrr9fxmZ6Y3yHC73CiPHBseSglozUmozUuozUuHf5bRiKLWhYOEfDZRQScNvTw2NDDbUcPjw1FbhvHAsgQONCcRSZPngxZlrFu3Tqt7KKLLsKUKVPw6KOPfuP+L730Eu644w60trYCSLcUbrnlFuzZswcDBgwAANx+++1YsmQJmpqa4Pf7AQDTp09HeXk5nnzyyW54Vl0vKauISArCKQWRlIKwlP47JqmIywrisoq4pCJ2+N+Skv6RP9L2EARAOPyVcNQNR9/usYnw2gX4HCJ8dhFeuwifQ4DPLh5TxsNoyOjYUsgyo0aNOubrkpISNDc3AwBWr16Nhx9+GDt27EAwGIQkSYjH44hEIvD5fAAAr9erBQIAFBcXo7y8XAuEI2VHvqcZOG0CnLb0YDYRnR22Z7OMw+E45mtBEKAoCurq6jBjxgyMGDECy5cvx6ZNm/D4448DAFKp1Ekff6LvSUT0dWwpGMTGjRshSRIee+wxiGI6y5cuXapzrYjIbNhSMIgBAwZAkiT87ne/Q3V1NZYsWWKaMQEiyh4MBYMYM2YMfvWrX+HnP/85RowYgeeffx6PPPKI3tUiIpPh7CMiItKwpUBERBqGAhERaRgKRESkYSgQEZGGoUBERBqGAhERaRgKRESkYSgQEZGGoUBERBqGAhERaRgKRESkYSgQEZGGoUBERBqGAhERaRgKRESkYSgQEZGGoUBERBqGAhERaRgKRESkYSgQEZGGoUBERBqGAhERaRgKRESkYSgQEZGGoUBERBqGAhERaRgKRESkYSgQEZGGoUBERBqGAhERaRgKRESkYSgQEZGGoUBERBqGAhERaRgKRESkYSgQEZGGoUBERBqGAhERaRgKRESkYSgQEZGGoUBERJr/DyXS+kmvMYKjAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "counts = df['label'].value_counts()\n", + "\n", + "plt.pie(\n", + " counts, \n", + " labels=counts.index, \n", + " autopct='%1.1f%%', \n", + " colors=['skyblue','lightcoral'], \n", + " startangle=90,\n", + " explode=(0,0.05) \n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "4f72cb68-9eac-4d06-b5cc-9605771d1146", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\fastf\\AppData\\Local\\Temp\\ipykernel_11288\\1575302485.py:2: FutureWarning: \n", + "\n", + "Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.\n", + "\n", + " sns.countplot(x='label', data=df, palette=['skyblue','lightcoral'])\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiUAAAGHCAYAAABvUSKTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA5qklEQVR4nO3dfXzPdf////sbO7XtzWYnxsbUGhoSWSORczU6V02LcuDIWSsOclROqgOpkHQgnXBE1il1iGU5OzoxRi3R6GyFT2bSvIfYZp6/P/ru9fO2EXPyftVu18vldbn0er4e79f7+Xxtb7v3fJ28HcYYIwAAAA+r5ukOAAAASIQSAABgE4QSAABgC4QSAABgC4QSAABgC4QSAABgC4QSAABgC4QSAABgC4QSAABgC4QS/Gls2bJF9957r2JiYuTr66uAgABdeeWVmjp1qn799VdPd0+S9Prrr2vGjBkXZN+PPvqooqOjVaNGDdWqVeuUdRMmTJDD4dAvv/xS4fb4+Hh17NjxgvTRrjZs2KCbb75Z0dHR8vHxUXh4uBITEzVy5EhPd61S5s+fL4fDIYfDobVr15bbbozRpZdeKofDUeV+1vhzI5TgT2HevHlq1aqVsrKy9I9//EPp6elasmSJbr/9ds2ZM0cDBgzwdBclXbhQ8t577+lf//qX7rnnHq1bt04fffTReX+Pv6oPPvhAbdu2VWFhoaZOnaqVK1fqueeeU7t27fTGG294unvnJDAwUC+//HK59nXr1un7779XYGCgB3oFVF4NT3cA+CPr16/X/fffr65du2rp0qXy8fGxtnXt2lUjR45Uenq6B3t44W3dulWSNGLECIWFhXm4N38uU6dOVUxMjD788EPVqPH//5N35513aurUqR7s2bm74447tGjRIr3wwgsKCgqy2l9++WUlJiaqsLDQg70Dzh4zJbC9SZMmyeFw6MUXX3QLJGW8vb3Vu3dva/348eOaOnWqGjduLB8fH4WFhemee+7R7t273V7XsGFD9e/fv9z+Onbs6DblvXbtWjkcDi1evFiPPPKIIiMjFRQUpC5dumjHjh1ur/vggw/0008/WVPrDofjtGM7k742bNhQjz76qCQpPDxcDodDEyZMOO1+z9bEiROVkJCg4OBgBQUF6corr9TLL7+sk7+vs2HDhkpKStKyZcvUsmVL+fn5qUmTJlq2bJmk308rNGnSRDVr1lSbNm20adOm077vl19+KYfDUeH/7a9YsUIOh0Pvv/++JGnfvn0aNGiQoqKi5OPjo9DQULVr1+4PZ43279+vOnXquAWSMtWquf8TWDa+JUuWqHnz5vL19VWjRo00c+ZMt7qjR49q5MiRuuKKK+R0OhUcHKzExES999575d7D4XBo2LBhevXVVxUXFyc/Pz+1bt1amZmZMsbo6aefVkxMjAICAtSpUyd99913px3Pie666y5J0uLFi602l8uld955R/fdd1+FrykuLtaTTz5p/c6Fhobq3nvv1b59+9zqVq9erY4dOyokJER+fn6Kjo7Wrbfeqt9++82qmT17tlq0aKGAgAAFBgaqcePG+uc//2lt37dvn4YMGaKmTZsqICBAYWFh6tSpkz7++ONy/dq9e7duu+02BQYGqlatWurbt6+ysrLkcDg0f/58t9pNmzapd+/eCg4Olq+vr1q2bKk333zTrea3337TqFGjrNO9wcHBat26tduxgg0ZwMaOHTtm/P39TUJCwhm/ZtCgQUaSGTZsmElPTzdz5swxoaGhJioqyuzbt8+qa9CggenXr1+513fo0MF06NDBWl+zZo2RZBo2bGj69u1rPvjgA7N48WITHR1tYmNjzbFjx4wxxmzbts20a9fOREREmPXr11vLufb1888/NwMGDDCSTHp6ulm/fr3ZtWvXKfc5fvx4I8nk5eWZkpKScsvll1/uNj5jjOnfv795+eWXTUZGhsnIyDBPPPGE8fPzMxMnTnSra9Cggalfv76Jj483ixcvNsuXLzcJCQnGy8vLjBs3zrRr1868++67ZsmSJeayyy4z4eHh5rfffjvtMWjZsqVp165dufY+ffqYsLAwU1JSYowxpnv37iY0NNS8+OKLZu3atWbp0qVm3LhxJi0t7bT7/9vf/mYkmeHDh5vMzExTXFx8ytoGDRqYevXqmejoaPPKK6+Y5cuXm759+xpJ5umnn7bqDhw4YPr3729ee+01s3r1apOenm5GjRplqlWrZhYsWOC2T0mmQYMGpm3btm7HJjg42Dz44IPmxhtvNMuWLTOLFi0y4eHhpnnz5ub48eOnHdOrr75qJJmsrCyTkpJi2rRpY22bPXu2qVmzpiksLCz3sy4tLTU9evQwNWvWNBMnTjQZGRnmpZdeMvXq1TNNmza1fla5ubnG19fXdO3a1SxdutSsXbvWLFq0yKSkpJiCggJjjDGLFy+2juvKlSvNRx99ZObMmWNGjBhhvd/27dvN/fffb9LS0szatWvNsmXLzIABA0y1atXMmjVrrLpDhw6ZSy+91AQHB5sXXnjBfPjhh+bBBx80MTExRpJ59dVXrdrVq1cbb29v0759e/PGG2+Y9PR0079//3J1gwcPNv7+/mbatGlmzZo1ZtmyZWbKlCnm+eefP+2xhWcRSmBreXl5RpK58847z6g+JyfHSDJDhgxxa9+wYYORZP75z39abWcbSq6//nq3ujfffNNIcgseN9xwg2nQoMF572tZ0DgxVJ1KWe3plpNDyYlKS0tNSUmJefzxx01ISIjbH8gGDRoYPz8/s3v3bqstOzvbSDJ169Y1hw8fttqXLl1qJJn333//tP2dOXOmkWR27Nhhtf3666/Gx8fHjBw50moLCAgwqampfzj+k/3yyy/mmmuuscbu5eVl2rZtayZPnmwOHjzoVtugQQPjcDhMdna2W3vXrl1NUFCQ2/hOdOzYMVNSUmIGDBhgWrZs6bZNkomIiDCHDh2y2sqOzRVXXOF2fGfMmGEkmS1btpx2TCeGkrLfz61btxpjjLnqqqtM//79jTGmXCgpCxLvvPOO2/6ysrKMJPPvf//bGGPM22+/bSSVOw4nGjZsmKlVq9Zp+3mysuPUuXNnc/PNN1vtL7zwgpFkVqxY4VY/ePDgcmGjcePGpmXLllZYLZOUlGTq1q1rSktLjTHGxMfHm5tuuums+gfP4/QN/lLWrFkjSeVOy7Rp00ZNmjTRqlWrKr3vE08RSVLz5s0lST/99FOl9nch+ypJH330kbKyssotl1xySbna1atXq0uXLnI6napevbq8vLw0btw47d+/X/n5+W61V1xxherVq2etN2nSRNLvp6/8/f3Ltf/R8enbt698fHzcpugXL16soqIi3XvvvVZbmzZtNH/+fD355JPKzMxUSUnJGR2HkJAQffzxx8rKytKUKVN044036ptvvtHYsWPVrFmzcncpXX755WrRooVbW3JysgoLC/X5559bbW+99ZbatWungIAA1ahRQ15eXnr55ZeVk5NTrg/XXXedatasaa2XHZuePXu6neI702N2og4dOuiSSy7RK6+8oq+++kpZWVmnPHWzbNky1apVS7169dKxY8es5YorrlBERIR1J88VV1whb29vDRo0SAsWLNAPP/xQbl9t2rTRgQMHdNddd+m999475d1ec+bM0ZVXXilfX1/rOK1atcrtOK1bt06BgYHq0aOH22vLTk+V+e6777R9+3b17dtXktzGcP3112vPnj3WKdU2bdpoxYoVevjhh7V27VodOXLkzA4oPIpQAlurU6eO/P39lZube0b1+/fvlyTVrVu33LbIyEhre2WEhIS4rZdd31LZf+wuZF8lqUWLFmrdunW5xdfX161u48aN6tatm6Tf73L69NNPlZWVpUceeURS+fEFBwe7rXt7e5+2/ejRo6ftZ3BwsHr37q3//Oc/Ki0tlfT7tSlt2rTR5ZdfbtW98cYb6tevn1566SUlJiYqODhY99xzj/Ly8s7oeLRu3VpjxozRW2+9pZ9//lkPPvigfvzxx3IXu0ZERJR7bVlb2c/k3XffVZ8+fVSvXj0tXLhQ69evt8JAReM938fsRA6HQ/fee68WLlyoOXPm6LLLLlP79u0rrN27d68OHDggb29veXl5uS15eXlWsLjkkkv00UcfKSwsTEOHDtUll1yiSy65RM8995y1r5SUFL3yyiv66aefdOuttyosLEwJCQnKyMiwaqZNm6b7779fCQkJeuedd5SZmamsrCz16NHD7fdq//79Cg8PL9ffk9v27t0rSRo1alS5/g8ZMkSSrDHMnDlTY8aM0dKlS3XdddcpODhYN910k7799tszPra4+Lj7BrZWvXp1de7cWStWrNDu3btVv37909aXBYc9e/aUq/35559Vp04da93X11dFRUXl9vHLL7+41V0oZ9PXCyktLU1eXl5atmyZW2BZunTpRXl/Sbr33nv11ltvKSMjQ9HR0crKytLs2bPdaurUqaMZM2ZoxowZ2rlzp95//309/PDDys/PP+u7r7y8vDR+/HhNnz7durOpTEUhp6yt7Ge2cOFCxcTE6I033nCb6ajo9+li6N+/v8aNG6c5c+boX//61ynr6tSpo5CQkFMerxNvIW7fvr3at2+v0tJSbdq0Sc8//7xSU1MVHh6uO++8U9LvP7d7771Xhw8f1v/+9z+NHz9eSUlJ+uabb9SgQQMtXLhQHTt2LPezPHjwoNt6SEiINm7cWK4/J/8syj4TY8eO1S233FLhGOLi4iRJNWvW1MSJEzVx4kTt3bvXmjXp1auXtm/ffspjBM9ipgS2N3bsWBljNHDgQBUXF5fbXlJSov/+97+SpE6dOkn6/Y/GibKyspSTk6POnTtbbQ0bNtSWLVvc6r755hu3O2rOlo+PzxnPnJxNXy8kh8OhGjVqqHr16lbbkSNH9Nprr12U95ekbt26qV69enr11Vf16quvytfXt9zU/Ymio6M1bNgwde3a1e2USkX27NlTYXvZ6YPIyEi39m3btunLL790a3v99dcVGBioK6+8UtLvx8zb29stkOTl5VV4983FUK9ePf3jH/9Qr1691K9fv1PWJSUlaf/+/SotLa1wFq3sD/qJqlevroSEBL3wwguSVOHxrlmzpnr27KlHHnlExcXF2rZtm6Tfj9PJd8xt2bJF69evd2vr0KGDDh48qBUrVri1p6Wlua3HxcUpNjZWX375ZYX9b926dYXPZgkPD1f//v111113aceOHW53EMFemCmB7SUmJmr27NkaMmSIWrVqpfvvv1+XX365SkpK9MUXX+jFF19UfHy8evXqpbi4OA0aNEjPP/+8qlWrpp49e+rHH3/UY489pqioKD344IPWflNSUnT33XdryJAhuvXWW/XTTz9p6tSpCg0NrXRfmzVrpnfffVezZ89Wq1atVK1aNbVu3brC2rPp64V0ww03aNq0aUpOTtagQYO0f/9+PfPMMxXefn2hVK9eXffcc4+mTZumoKAg3XLLLXI6ndZ2l8ul6667TsnJyWrcuLECAwOVlZWl9PT0U/4fc5nu3burfv366tWrlxo3bqzjx48rOztbzz77rAICAvTAAw+41UdGRqp3796aMGGC6tatq4ULFyojI0NPPfWUdc1MUlKS3n33XQ0ZMkS33Xabdu3apSeeeEJ169b12OmBKVOm/GHNnXfeqUWLFun666/XAw88oDZt2sjLy0u7d+/WmjVrdOONN+rmm2/WnDlztHr1at1www2Kjo7W0aNH9corr0iSunTpIkkaOHCg/Pz81K5dO9WtW1d5eXmaPHmynE6nrrrqKkm/H6cnnnhC48ePV4cOHbRjxw49/vjjiomJ0bFjx6x+9evXT9OnT9fdd9+tJ598UpdeeqlWrFihDz/8UJL7rdtz585Vz5491b17d/Xv31/16tXTr7/+qpycHH3++ed66623JEkJCQlKSkpS8+bNVbt2beXk5Oi1115TYmKi27VPsBlPX2kLnKns7GzTr18/Ex0dbby9vU3NmjVN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9enTR08//bSSk5Oti2djY2M1c+ZMdejQQbNnz5avr+9FHROA02OmBIAtffHFF7rxxhvVoEEDBQYGqmPHjpKknTt3utUlJiZa/x0cHKy4uDjl5ORIkjZv3qz58+crICDAWrp3767jx48rNzf3oo0FwJlhpgSA7Rw+fFjdunVTt27dtHDhQoWGhmrnzp3q3r27iouL//D1DodDknT8+HENHjxYI0aMKFcTHR193vsN4NwQSgDYzvbt2/XLL79oypQpioqKkiRt2rSpwtrMzEwrYBQUFOibb75R48aNJUlXXnmltm3bpksvvfTidBzAOeH0DQDbiY6Olre3t55//nn98MMPev/99/XEE09UWPv4449r1apV2rp1q/r37686deropptukiSNGTNG69ev19ChQ5Wdna1vv/1W77//voYPH34RRwPgTBFKANhOaGio5s+fr7feektNmzbVlClT9Mwzz1RYO2XKFD3wwANq1aqV9uzZo/fff1/e3t6SpObNm2vdunX69ttv1b59e7Vs2VKPPfaY6tatezGHA+AMOYwxxtOdAAAAYKYEAADYAqEEAADYAqEEAADYAqEEAADYAqEEAADYAqEEAADYAqEEAADYAqEEAADYAqEEAADYAqEEAADYAqEEAADYwv8HSOhTGNvrxB4AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(6,4))\n", + "sns.countplot(x='label', data=df, palette=['skyblue','lightcoral'])\n", + "plt.title(\"Count of Ham vs Spam Messages\")\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "33494638-d3f2-42d7-87d1-1359f804cb47", + "metadata": {}, + "source": [ + "**Data preprocessing**" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "daf34158-19de-44e6-8f22-5f66fd5087cd", + "metadata": {}, + "outputs": [], + "source": [ + "# Text cleaning" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "bb0a8c8c-e3b0-408f-887f-dd0cae2441aa", + "metadata": {}, + "outputs": [], + "source": [ + "def clean_text(text):\n", + " text = text.lower()\n", + " text = re.sub(r'[^a-z\\s]', '', text)\n", + " text = re.sub(r'\\s+', ' ', text).strip()\n", + " return text\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "0965fa83-1301-4b49-b2c2-8f4253b59401", + "metadata": {}, + "outputs": [], + "source": [ + "df['cleaned_message'] = df['message'].apply(clean_text)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "0542ac72-d5b3-48ef-8a33-2759e6efae4f", + "metadata": {}, + "outputs": [], + "source": [ + "#Stopwords removal" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "3512f967-6cfb-496f-b902-eed8100f9173", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package stopwords to\n", + "[nltk_data] C:\\Users\\fastf\\AppData\\Roaming\\nltk_data...\n", + "[nltk_data] Package stopwords is already up-to-date!\n" + ] + } + ], + "source": [ + "nltk.download('stopwords')\n", + "stop_words = set(stopwords.words('english'))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "179704e1-3931-4ad9-9cf2-c17cb6f9b0c0", + "metadata": {}, + "outputs": [], + "source": [ + "def remove_stopwords(text):\n", + " words = text.split() \n", + " words = [word for word in words if word not in stop_words] \n", + " return ' '.join(words) \n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "f5eda51a-4395-4649-b90a-e2ed2c938253", + "metadata": {}, + "outputs": [], + "source": [ + "#Tokenization" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "ea59eaa0-0638-4323-803a-789b87db03f3", + "metadata": {}, + "outputs": [], + "source": [ + "tokenizer = Tokenizer(num_words=5000, oov_token=\"\")\n", + "tokenizer.fit_on_texts(df['cleaned_message'])\n", + "sequences = tokenizer.texts_to_sequences(df['cleaned_message'])\n", + "X = pad_sequences(sequences, maxlen=100, padding='post')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "7e332198-dd4a-4a59-abe7-3f0ae6d31e14", + "metadata": {}, + "outputs": [], + "source": [ + "#Label encoding" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "ed3bfc43-505b-47f2-980f-16643e7b4adc", + "metadata": {}, + "outputs": [], + "source": [ + "le = LabelEncoder()\n", + "y = le.fit_transform(df['label'])" + ] + }, + { + "cell_type": "markdown", + "id": "1de96a95-45ec-4c21-8290-be69f4c16b00", + "metadata": {}, + "source": [ + "**Train test split**" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "e459ffc8-12d9-46f1-8c1a-3e48e8ff5ffb", + "metadata": {}, + "outputs": [], + "source": [ + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)" + ] + }, + { + "cell_type": "markdown", + "id": "8ecb919a-f92f-46d0-aee9-3eb17a7cd9bb", + "metadata": {}, + "source": [ + "**Building the model**" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "5360429d-ae84-4c87-9f6d-fb340d7aef4e", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\fastf\\AppData\\Roaming\\Python\\Python312\\site-packages\\keras\\src\\layers\\core\\embedding.py:97: UserWarning: Argument `input_length` is deprecated. Just remove it.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "model = Sequential([\n", + " Embedding(input_dim=5000, output_dim=128, input_length=100),\n", + " Bidirectional(LSTM(64, return_sequences=False)),\n", + " Dropout(0.5),\n", + " Dense(32, activation='relu'),\n", + " Dense(1, activation='sigmoid') \n", + "])\n", + "\n", + "model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "309cedd8-a95f-4f1b-b9db-60a807b40272", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/5\n", + "\u001b[1m70/70\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 144ms/step - accuracy: 0.8438 - loss: 0.3923 - val_accuracy: 0.9758 - val_loss: 0.0900\n", + "Epoch 2/5\n", + "\u001b[1m70/70\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 126ms/step - accuracy: 0.9831 - loss: 0.0587 - val_accuracy: 0.9830 - val_loss: 0.0714\n", + "Epoch 3/5\n", + "\u001b[1m70/70\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 127ms/step - accuracy: 0.9947 - loss: 0.0211 - val_accuracy: 0.9821 - val_loss: 0.0780\n", + "Epoch 4/5\n", + "\u001b[1m70/70\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 128ms/step - accuracy: 0.9957 - loss: 0.0123 - val_accuracy: 0.9812 - val_loss: 0.0999\n", + "Epoch 5/5\n", + "\u001b[1m70/70\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 133ms/step - accuracy: 0.9985 - loss: 0.0057 - val_accuracy: 0.9794 - val_loss: 0.1043\n" + ] + } + ], + "source": [ + "history = model.fit(X_train, y_train, validation_data=(X_test, y_test), \n", + " epochs=5, batch_size=64, verbose=1)\n" + ] + }, + { + "cell_type": "markdown", + "id": "80b4d02b-5d47-4bd5-89af-a609a137b76b", + "metadata": {}, + "source": [ + "**Evaluating the model**" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "616930a7-ad28-46a8-8bdb-2b8883b99a92", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m35/35\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 31ms/step - accuracy: 0.9787 - loss: 0.0956\n", + "Test Accuracy: 0.98\n" + ] + } + ], + "source": [ + "loss, acc = model.evaluate(X_test, y_test)\n", + "print(f\"Test Accuracy: {acc:.2f}\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "0a3df77a-c7b0-4e3a-acdc-5f4451ba3727", + "metadata": {}, + "source": [ + "**Model evaluation**" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "5a532356-dc6a-4205-97a1-913e8e76a2d4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m35/35\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 42ms/step\n", + " precision recall f1-score support\n", + "\n", + " Ham 0.98 0.99 0.99 965\n", + " Spam 0.94 0.90 0.92 150\n", + "\n", + " accuracy 0.98 1115\n", + " macro avg 0.96 0.95 0.95 1115\n", + "weighted avg 0.98 0.98 0.98 1115\n", + "\n" + ] + }, + { + "data": { + "image/png": "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NUr169dX/fr19fLLL//ueadPn77ifVw+/luO93J5vkZJ7sViseixxx7TG2+8oQULFuimm25Su3btnI7dtWuXOnXqJOnXVSaffvqp0tPTNXny5BJ/r7P7/L0YBw4cqAsXLigsLIy5B0A5I0FAheDp6anY2Fjt3r3bNMnQmcu/JDMyMkzHTp48qZCQEJfF5uPjI0nKz8+32+84z0GS2rVrp/fee085OTnauXOn2rRpo/j4eKWmpl7x+sHBwVe8D0kuvZffGjhwoE6dOqUFCxboscceu+K41NRUeXt76/3331fv3r0VHR2tli1bluo7nU32vJKMjAyNGjVKzZo10+nTpzVhwoRSfSeA0iFBQIWRkJAgwzA0ZMgQp5P6CgsL9d5770mS7rnnHkmyTTK8LD09XYcPH1ZsbKzL4ro8E3/fvn12+y/H4oynp6dat26tefPmSZL27NlzxbGxsbHauHGjLSG47PXXX5efn1+ZLQGsWbOmnnrqKd13330aMGDAFcdZLBZ5eXnJ09PTti8vL0/Lly83jXVVVaaoqEh9+/aVxWLR2rVrlZycrDlz5mj16tVXfW0AxcNzEFBhtGnTRvPnz9fIkSPVokULjRgxQrfccosKCwv1xRdfaOHChYqMjNR9992nRo0aaejQoZozZ448PDzUpUsXHTt2TFOnTlXt2rU1duxYl8XVtWtXVa1aVYMHD9aMGTPk5eWlpUuX6r///a/duAULFmjjxo2Ki4tTnTp1dOHCBdtKgQ4dOlzx+tOmTdP777+vu+++W88++6yqVq2qN998Ux988IFSUlIUFBTksntx9MILL/zhmLi4OM2aNUv9+vXT0KFDdfr0af3f//2f06WoUVFRSk1N1dtvv6169erJx8enVPMGpk2bpq1bt2r9+vUKCwvT+PHjtWXLFg0ePFjNmzdXREREia8JoGRIEFChDBkyRLfffrtmz56tmTNnKjMzU97e3rrpppvUr18/jR492jZ2/vz5ql+/vhYvXqx58+YpKChI9957r5KTk53OOSitypUra926dYqPj1f//v11ww036PHHH1eXLl30+OOP28Y1a9ZM69ev17Rp05SZmamAgABFRkZqzZo1th6+M40aNdL27dv1zDPPaNSoUcrLy1Pjxo312muvleiJhGXlnnvu0ZIlSzRz5kzdd999qlmzpoYMGaLq1atr8ODBdmOn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f/7zn8rPz7/iuKlTp+qBBx7Ql19+qf79+6tv3746fPiw7XhgYKCWLl2qQ4cO6eWXX9aiRYs0e/Zsu2t8++23Wrt2rdatW6cVK1ZoyZIliouL04kTJ7RlyxbNnDlTU6ZM0c6dO8vsfgGXMvCnNGDAAMPT09Pw9/e323x8fAxJRnZ2ttPzunbtaowfP972OSYmxmjbtq3t88WLFw1/f3/jkUcese3LyMgwJBk7duwos/sBSuudd94xqlSpYvj4+BjR0dFGQkKC8eWXX9qOSzKGDx9ud07r1q2NESNGXPGaKSkpRosWLWyfp02bZvj5+Rlnz5617evcubNRt25do6ioyLavUaNGRnJysituCyhzVBD+xO6++27t3bvXbnv11Vdtx4uKivT888+radOmCg4OVkBAgNavX6/jx4/bXadp06a2//b09FRwcLCioqJs+0JDQyX9OhkMqGgeeOABnTx5UmvWrFHnzp21efNm3XbbbVq6dKltTJs2bezOadOmjV0F4Z133lHbtm0VFhamgIAATZ061fRzUrduXQUGBto+h4aGqkmTJvLw8LDbx88JrhUkCH9i/v7+atCggd1Ws2ZN2/EXX3xRs2fP1tNPP62NGzdq79696ty5swoKCuyu4+3tbffZYrHY7bNYLJKkS5culeHdAKXn4+Ojjh076tlnn9X27ds1cOBATZs27XfPufy/6507d+qhhx5Sly5d9P777+uLL77Q5MmTS/xzcnkfPye4VpAgXMe2bt2qHj16qH///rr11ltVr149ff311+4OCyhzTZo00S+//GL77DgvYOfOnbr55pslSZ9++qluvPFGTZ48WS1btlTDhg31/fffl2u8gDuwzPE61qBBA7377rvavn27qlSpolmzZikzM1ONGzd2d2iAS5w+fVq9evXSoEGD1LRpUwUGBurzzz9XSkqKevToYRu3atUqtWzZUm3bttWbb76pXbt2afHixZJ+/Tk5fvy4UlNT1apVK33wwQdKS0tz1y0B5YYE4To2depUHT16VJ07d5afn5+GDh2q+++/Xzk5Oe4ODXCJgIAAtW7dWrNnz9a3336rwsJC1a5dW0OGDNEzzzxjGzd9+nSlpqZq5MiRCgsL05tvvqkmTZpIknr06KGxY8dq9OjRys/PV1xcnKZOnarExEQ33RVQPiyGYRjuDgIA3MVisSgtLc3pk0eB6xlzEAAAgAkJAgAAMGEOAoDrGl1WwDkqCAAAwIQEAQAAmJAgAAAAExIEAABgQoIAAABMSBAAAIAJCQIAADAhQQAAACb/D0g8UyavkOHyAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "y_pred = (model.predict(X_test) > 0.5).astype(\"int32\")\n", + "\n", + "print(classification_report(y_test, y_pred, target_names=['Ham','Spam']))\n", + "\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.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "183ab565-6b68-4b9d-ab43-51cabb4fa15d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" + ] + } + ], + "source": [ + "model.save(\"spam_classifier.h5\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "2e0a0139-f428-4c68-af13-7c40e799dd9e", + "metadata": {}, + "source": [ + "**Prediction on new messages**" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "fdae9abc-338b-4463-a519-38e8a7c220af", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ham (Spam prob: 0.0000, Ham prob: 1.0000, Confidence: 100.00%)\n", + "Spam (Spam prob: 1.0000, Ham prob: 0.0000, Confidence: 100.00%)\n" + ] + } + ], + "source": [ + "def predict_message(msg, threshold=0.5):\n", + " \n", + " seq = tokenizer.texts_to_sequences([msg])\n", + " padded = pad_sequences(seq, maxlen=100, padding='post')\n", + "\n", + " \n", + " spam_prob = float(model.predict(padded, verbose=0)[0][0]) \n", + "\n", + " \n", + " label = \"Spam\" if spam_prob > threshold else \"Ham\"\n", + "\n", + " \n", + " confidence = spam_prob if label == \"Spam\" else 1 - spam_prob\n", + "\n", + " \n", + " return f\"{label} (Spam prob: {spam_prob:.4f}, Ham prob: {1-spam_prob:.4f}, Confidence: {confidence*100:.2f}%)\"\n", + "\n", + "\n", + "\n", + "print(predict_message(\"Ok lar... Joking wif u oni...\"))\n", + "print(predict_message(\"SIX chances to win CASH! From 100 to 20,000 pounds txt> CSH11 and send to 87575. Cost 150p/day, 6days, 16+ TsandCs apply Reply HL 4 info\"))\n" + ] + }, + { + "cell_type": "markdown", + "id": "5aa8d9ef-6ba7-4803-bbbe-80dc0bd06fb9", + "metadata": {}, + "source": [ + "**Visualizing the model**" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "9ff69096-dcc1-439d-8662-d033da9f23c5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "plt.plot(history.history['accuracy'], label='Train Accuracy')\n", + "plt.plot(history.history['val_accuracy'], label='Val Accuracy')\n", + "plt.title('Model Accuracy')\n", + "plt.xlabel('Epochs')\n", + "plt.ylabel('Accuracy')\n", + "plt.legend()\n", + "plt.show()\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "cc3998aa-0c74-4442-90ed-764e27ca2955", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "plt.plot(history.history['loss'], label='Train Loss')\n", + "plt.plot(history.history['val_loss'], label='Val Loss')\n", + "plt.title('Model Loss')\n", + "plt.xlabel('Epochs')\n", + "plt.ylabel('Loss')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "1535e199-0006-42ec-8dd4-87941e2742c4", + "metadata": {}, + "outputs": [], + "source": [ + "import pickle\n", + "\n", + "\n", + "with open(\"tokenizer.pkl\", \"wb\") as f:\n", + " pickle.dump(tokenizer, f)\n" + ] + }, + { + "cell_type": "markdown", + "id": "7558fc7b-0c73-4424-8830-a8bc4aff7fba", + "metadata": {}, + "source": [ + "**Save this as app.py**" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "dc4112ef-c4b9-46dc-ab39-613ea2dc3f44", + "metadata": {}, + "outputs": [], + "source": [ + "import streamlit as st\n", + "import tensorflow as tf\n", + "import pickle\n", + "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", + "\n", + "# Load model\n", + "model = tf.keras.models.load_model(\"spam_classifier.h5\", compile=False)\n", + "\n", + "# Load tokenizer\n", + "with open(\"tokenizer.pkl\", \"rb\") as f:\n", + " tokenizer = pickle.load(f)\n", + "\n", + "# Max sequence length (should be same as used in training)\n", + "MAX_LEN = 100 \n", + "\n", + "st.title(\"📧 Spam Message Detector\")\n", + "\n", + "# User input\n", + "message = st.text_area(\"Enter a message:\")\n", + "\n", + "if st.button(\"Predict\"):\n", + " if message.strip() != \"\":\n", + " # Convert message to sequence\n", + " seq = tokenizer.texts_to_sequences([message])\n", + " padded = pad_sequences(seq, maxlen=MAX_LEN, padding=\"post\", truncating=\"post\")\n", + "\n", + " # Predict\n", + " prediction = model.predict(padded)\n", + " prob = float(prediction[0][0])\n", + "\n", + " if prob > 0.5:\n", + " st.error(f\"🚨 Spam detected! (Confidence: {prob:.2f})\")\n", + " else:\n", + " st.success(f\"✅ Ham (Not Spam) (Confidence: {1-prob:.2f})\")\n", + " else:\n", + " st.warning(\"Please enter a message before predicting.\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db3e8012-b5b3-4184-9a9e-ae0ac18f4433", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/apps/pages/models/Spam detection model/app.py b/src/apps/pages/models/Spam detection model/app.py new file mode 100644 index 00000000..b45bf524 --- /dev/null +++ b/src/apps/pages/models/Spam detection model/app.py @@ -0,0 +1,45 @@ +import streamlit as st +import tensorflow as tf +import pickle +from tensorflow.keras.preprocessing.sequence import pad_sequences + +# Load model +model = tf.keras.models.load_model("spam_classifier.h5") + + + +# Load tokenizer +with open("tokenizer.pkl", "rb") as f: + tokenizer = pickle.load(f) + +# Max sequence length (should be same as used in training) +MAX_LEN = 100 + +st.title("📧 Spam Message Detector") + +# User input +message = st.text_area("Enter a message:") + +if st.button("Predict"): + if message.strip() != "": + # Convert message to sequence + seq = tokenizer.texts_to_sequences([message]) + padded = pad_sequences(seq, maxlen=MAX_LEN, padding="post", truncating="post") + + # Predict + prediction = model.predict(padded) + prob = float(prediction[0][0]) + + if prob > 0.5: + st.error(f"🚨 Spam detected! (Confidence: {prob:.2f})") + else: + st.success(f"✅ Ham (Not Spam) (Confidence: {1-prob:.2f})") + else: + st.warning("Please enter a message before predicting.") + + +# In[ ]: + + + + diff --git a/src/apps/pages/models/Spam detection model/spam detector .png b/src/apps/pages/models/Spam detection model/spam detector .png new file mode 100644 index 0000000000000000000000000000000000000000..079da57878485027f48e82dffecb0096b6940021 GIT binary patch literal 54391 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

l~{sZTklN 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 ZMatMaAJ^b_Q`KG0XFYyu{4wa4e*+9-BufAQ literal 0 HcmV?d00001 From 8898f7ad7150812e7759793ba507e87eec9c1746 Mon Sep 17 00:00:00 2001 From: smriti pandey Date: Mon, 18 Aug 2025 23:13:31 +0530 Subject: [PATCH 2/3] Add spam_detector.py Remove unnecessary files and add the spam_detector.py --- .../SPAM detection model/spam_detector.py | 56 ++ ...fication for spam detection ml model.ipynb | 839 ------------------ .../pages/models/Spam detection model/app.py | 45 - .../Spam detection model/spam detector .png | Bin 54391 -> 0 bytes 4 files changed, 56 insertions(+), 884 deletions(-) create mode 100644 src/apps/pages/models/SPAM detection model/spam_detector.py delete mode 100644 src/apps/pages/models/Spam detection model/Text Classification for spam detection ml model.ipynb delete mode 100644 src/apps/pages/models/Spam detection model/app.py delete mode 100644 src/apps/pages/models/Spam detection model/spam detector .png diff --git a/src/apps/pages/models/SPAM detection model/spam_detector.py b/src/apps/pages/models/SPAM detection model/spam_detector.py new file mode 100644 index 00000000..248e8000 --- /dev/null +++ b/src/apps/pages/models/SPAM detection model/spam_detector.py @@ -0,0 +1,56 @@ +import streamlit as st +import tensorflow as tf +import pickle +from tensorflow.keras.preprocessing.sequence import pad_sequences + + +# --------------------------- +# Load model & tokenizer +# --------------------------- +@st.cache_resource +def load_model_and_tokenizer(): + try: + model = tf.keras.models.load_model("spam_classifier.h5") + with open("tokenizer.pkl", "rb") as f: + tokenizer = pickle.load(f) + return model, tokenizer + except Exception as e: + st.error(f"Could not load model/tokenizer: {e}") + st.stop() + +model, tokenizer = load_model_and_tokenizer() + + +# --------------------------- +# Prediction function +# --------------------------- +def predict_message(message, model, tokenizer, max_len=100): + seq = tokenizer.texts_to_sequences([message]) + padded = pad_sequences(seq, maxlen=max_len, padding="post", truncating="post") + prob = float(model.predict(padded)[0][0]) + return prob + + +# --------------------------- +# Streamlit UI +# --------------------------- +def spam_app(): + st.title("Spam Message Detector") + + message = st.text_area("Enter a message:") + + if st.button("Predict") and message.strip(): + prob = predict_message(message, model, tokenizer) + + if prob > 0.5: + st.error(f"Spam detected! (Confidence: {prob:.2f})") + else: + st.success(f"Ham (Not Spam) (Confidence: {1-prob:.2f})") + elif st.button("Predict"): + st.warning("Please enter a message before predicting.") + + +# --------------------------- +# Run app +# --------------------------- +spam_app() diff --git a/src/apps/pages/models/Spam detection model/Text Classification for spam detection ml model.ipynb b/src/apps/pages/models/Spam detection model/Text Classification for spam detection ml model.ipynb deleted file mode 100644 index e30ac939..00000000 --- a/src/apps/pages/models/Spam detection model/Text Classification for spam detection ml model.ipynb +++ /dev/null @@ -1,839 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "738548d9-1fdf-49fb-936e-061ce19b6acd", - "metadata": {}, - "source": [ - "**Importing libraries**" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "0f4aaa89-bd52-442e-bdf5-9dc27edebf88", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import tensorflow as tf\n", - "from tensorflow.keras.models import Sequential\n", - "from tensorflow.keras.layers import Embedding, LSTM, Dense, Dropout, Bidirectional\n", - "from tensorflow.keras.preprocessing.text import Tokenizer\n", - "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.metrics import classification_report, confusion_matrix\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "import re\n", - "import nltk\n", - "from nltk.corpus import stopwords\n", - "from sklearn.preprocessing import LabelEncoder\n" - ] - }, - { - "cell_type": "markdown", - "id": "607b6dcb-df2c-4b98-8aa4-a50f07b86628", - "metadata": {}, - "source": [ - "**Loading Dataset**" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "9a5598b2-5a6c-4a36-b3e3-ac1959cef471", - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_csv(r\"C:\\Users\\fastf\\Downloads\\sms dataset\\spam.csv\", encoding=\"latin-1\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "4abf31c5-041e-4354-98f2-fb247823e16e", - "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", - "
v1v2Unnamed: 2Unnamed: 3Unnamed: 4
0hamGo until jurong point, crazy.. Available only ...NaNNaNNaN
1hamOk lar... Joking wif u oni...NaNNaNNaN
2spamFree entry in 2 a wkly comp to win FA Cup fina...NaNNaNNaN
3hamU dun say so early hor... U c already then say...NaNNaNNaN
4hamNah I don't think he goes to usf, he lives aro...NaNNaNNaN
\n", - "
" - ], - "text/plain": [ - " v1 v2 Unnamed: 2 \\\n", - "0 ham Go until jurong point, crazy.. Available only ... NaN \n", - "1 ham Ok lar... Joking wif u oni... NaN \n", - "2 spam Free entry in 2 a wkly comp to win FA Cup fina... NaN \n", - "3 ham U dun say so early hor... U c already then say... NaN \n", - "4 ham Nah I don't think he goes to usf, he lives aro... NaN \n", - "\n", - " Unnamed: 3 Unnamed: 4 \n", - "0 NaN NaN \n", - "1 NaN NaN \n", - "2 NaN NaN \n", - "3 NaN NaN \n", - "4 NaN NaN " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "cf8781a9-8333-464e-82d5-6bba238060e5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(5572, 5)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "0ad61425-4c83-40d1-85f3-0146983fe3cf", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['v1', 'v2', 'Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4'], dtype='object')" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.columns" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "8169bca7-aa5f-496e-af0e-9eaac9bc2ba4", - "metadata": {}, - "outputs": [], - "source": [ - "df = df[['v1', 'v2']] \n", - "df.columns = ['label', 'message'] \n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "5151ed13-5ff4-4693-90f2-d69dd93ec40e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "label\n", - "ham 4825\n", - "spam 747\n", - "Name: count, dtype: int64\n" - ] - } - ], - "source": [ - "print(df['label'].value_counts()) " - ] - }, - { - "cell_type": "markdown", - "id": "d4bc67e1-67f0-4c4f-b43b-0bff15ae3437", - "metadata": {}, - "source": [ - "**Data visualization**" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "9dad45a9-aee7-4f6d-82ab-402f019cbaaf", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "([,\n", - " ],\n", - " [Text(-0.44971325876899215, -1.0038714981945516, 'ham'),\n", - " Text(0.4701548196619535, 1.0495019988302243, 'spam')],\n", - " [Text(-0.24529814114672294, -0.5475662717424826, '86.6%'),\n", - " Text(0.2657396806784954, 0.593196781947518, '13.4%')])" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "counts = df['label'].value_counts()\n", - "\n", - "plt.pie(\n", - " counts, \n", - " labels=counts.index, \n", - " autopct='%1.1f%%', \n", - " colors=['skyblue','lightcoral'], \n", - " startangle=90,\n", - " explode=(0,0.05) \n", - ")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "4f72cb68-9eac-4d06-b5cc-9605771d1146", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\fastf\\AppData\\Local\\Temp\\ipykernel_11288\\1575302485.py:2: FutureWarning: \n", - "\n", - "Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.\n", - "\n", - " sns.countplot(x='label', data=df, palette=['skyblue','lightcoral'])\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiUAAAGHCAYAAABvUSKTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA5qklEQVR4nO3dfXzPdf////sbO7XtzWYnxsbUGhoSWSORczU6V02LcuDIWSsOclROqgOpkHQgnXBE1il1iGU5OzoxRi3R6GyFT2bSvIfYZp6/P/ru9fO2EXPyftVu18vldbn0er4e79f7+Xxtb7v3fJ28HcYYIwAAAA+r5ukOAAAASIQSAABgE4QSAABgC4QSAABgC4QSAABgC4QSAABgC4QSAABgC4QSAABgC4QSAABgC4QS/Gls2bJF9957r2JiYuTr66uAgABdeeWVmjp1qn799VdPd0+S9Prrr2vGjBkXZN+PPvqooqOjVaNGDdWqVeuUdRMmTJDD4dAvv/xS4fb4+Hh17NjxgvTRrjZs2KCbb75Z0dHR8vHxUXh4uBITEzVy5EhPd61S5s+fL4fDIYfDobVr15bbbozRpZdeKofDUeV+1vhzI5TgT2HevHlq1aqVsrKy9I9//EPp6elasmSJbr/9ds2ZM0cDBgzwdBclXbhQ8t577+lf//qX7rnnHq1bt04fffTReX+Pv6oPPvhAbdu2VWFhoaZOnaqVK1fqueeeU7t27fTGG294unvnJDAwUC+//HK59nXr1un7779XYGCgB3oFVF4NT3cA+CPr16/X/fffr65du2rp0qXy8fGxtnXt2lUjR45Uenq6B3t44W3dulWSNGLECIWFhXm4N38uU6dOVUxMjD788EPVqPH//5N35513aurUqR7s2bm74447tGjRIr3wwgsKCgqy2l9++WUlJiaqsLDQg70Dzh4zJbC9SZMmyeFw6MUXX3QLJGW8vb3Vu3dva/348eOaOnWqGjduLB8fH4WFhemee+7R7t273V7XsGFD9e/fv9z+Onbs6DblvXbtWjkcDi1evFiPPPKIIiMjFRQUpC5dumjHjh1ur/vggw/0008/WVPrDofjtGM7k742bNhQjz76qCQpPDxcDodDEyZMOO1+z9bEiROVkJCg4OBgBQUF6corr9TLL7+sk7+vs2HDhkpKStKyZcvUsmVL+fn5qUmTJlq2bJmk308rNGnSRDVr1lSbNm20adOm077vl19+KYfDUeH/7a9YsUIOh0Pvv/++JGnfvn0aNGiQoqKi5OPjo9DQULVr1+4PZ43279+vOnXquAWSMtWquf8TWDa+JUuWqHnz5vL19VWjRo00c+ZMt7qjR49q5MiRuuKKK+R0OhUcHKzExES999575d7D4XBo2LBhevXVVxUXFyc/Pz+1bt1amZmZMsbo6aefVkxMjAICAtSpUyd99913px3Pie666y5J0uLFi602l8uld955R/fdd1+FrykuLtaTTz5p/c6Fhobq3nvv1b59+9zqVq9erY4dOyokJER+fn6Kjo7Wrbfeqt9++82qmT17tlq0aKGAgAAFBgaqcePG+uc//2lt37dvn4YMGaKmTZsqICBAYWFh6tSpkz7++ONy/dq9e7duu+02BQYGqlatWurbt6+ysrLkcDg0f/58t9pNmzapd+/eCg4Olq+vr1q2bKk333zTrea3337TqFGjrNO9wcHBat26tduxgg0ZwMaOHTtm/P39TUJCwhm/ZtCgQUaSGTZsmElPTzdz5swxoaGhJioqyuzbt8+qa9CggenXr1+513fo0MF06NDBWl+zZo2RZBo2bGj69u1rPvjgA7N48WITHR1tYmNjzbFjx4wxxmzbts20a9fOREREmPXr11vLufb1888/NwMGDDCSTHp6ulm/fr3ZtWvXKfc5fvx4I8nk5eWZkpKScsvll1/uNj5jjOnfv795+eWXTUZGhsnIyDBPPPGE8fPzMxMnTnSra9Cggalfv76Jj483ixcvNsuXLzcJCQnGy8vLjBs3zrRr1868++67ZsmSJeayyy4z4eHh5rfffjvtMWjZsqVp165dufY+ffqYsLAwU1JSYowxpnv37iY0NNS8+OKLZu3atWbp0qVm3LhxJi0t7bT7/9vf/mYkmeHDh5vMzExTXFx8ytoGDRqYevXqmejoaPPKK6+Y5cuXm759+xpJ5umnn7bqDhw4YPr3729ee+01s3r1apOenm5GjRplqlWrZhYsWOC2T0mmQYMGpm3btm7HJjg42Dz44IPmxhtvNMuWLTOLFi0y4eHhpnnz5ub48eOnHdOrr75qJJmsrCyTkpJi2rRpY22bPXu2qVmzpiksLCz3sy4tLTU9evQwNWvWNBMnTjQZGRnmpZdeMvXq1TNNmza1fla5ubnG19fXdO3a1SxdutSsXbvWLFq0yKSkpJiCggJjjDGLFy+2juvKlSvNRx99ZObMmWNGjBhhvd/27dvN/fffb9LS0szatWvNsmXLzIABA0y1atXMmjVrrLpDhw6ZSy+91AQHB5sXXnjBfPjhh+bBBx80MTExRpJ59dVXrdrVq1cbb29v0759e/PGG2+Y9PR0079//3J1gwcPNv7+/mbatGlmzZo1ZtmyZWbKlCnm+eefP+2xhWcRSmBreXl5RpK58847z6g+JyfHSDJDhgxxa9+wYYORZP75z39abWcbSq6//nq3ujfffNNIcgseN9xwg2nQoMF572tZ0DgxVJ1KWe3plpNDyYlKS0tNSUmJefzxx01ISIjbH8gGDRoYPz8/s3v3bqstOzvbSDJ169Y1hw8fttqXLl1qJJn333//tP2dOXOmkWR27Nhhtf3666/Gx8fHjBw50moLCAgwqampfzj+k/3yyy/mmmuuscbu5eVl2rZtayZPnmwOHjzoVtugQQPjcDhMdna2W3vXrl1NUFCQ2/hOdOzYMVNSUmIGDBhgWrZs6bZNkomIiDCHDh2y2sqOzRVXXOF2fGfMmGEkmS1btpx2TCeGkrLfz61btxpjjLnqqqtM//79jTGmXCgpCxLvvPOO2/6ysrKMJPPvf//bGGPM22+/bSSVOw4nGjZsmKlVq9Zp+3mysuPUuXNnc/PNN1vtL7zwgpFkVqxY4VY/ePDgcmGjcePGpmXLllZYLZOUlGTq1q1rSktLjTHGxMfHm5tuuums+gfP4/QN/lLWrFkjSeVOy7Rp00ZNmjTRqlWrKr3vE08RSVLz5s0lST/99FOl9nch+ypJH330kbKyssotl1xySbna1atXq0uXLnI6napevbq8vLw0btw47d+/X/n5+W61V1xxherVq2etN2nSRNLvp6/8/f3Ltf/R8enbt698fHzcpugXL16soqIi3XvvvVZbmzZtNH/+fD355JPKzMxUSUnJGR2HkJAQffzxx8rKytKUKVN044036ptvvtHYsWPVrFmzcncpXX755WrRooVbW3JysgoLC/X5559bbW+99ZbatWungIAA1ahRQ15eXnr55ZeVk5NTrg/XXXedatasaa2XHZuePXu6neI702N2og4dOuiSSy7RK6+8oq+++kpZWVmnPHWzbNky1apVS7169dKxY8es5YorrlBERIR1J88VV1whb29vDRo0SAsWLNAPP/xQbl9t2rTRgQMHdNddd+m999475d1ec+bM0ZVXXilfX1/rOK1atcrtOK1bt06BgYHq0aOH22vLTk+V+e6777R9+3b17dtXktzGcP3112vPnj3WKdU2bdpoxYoVevjhh7V27VodOXLkzA4oPIpQAlurU6eO/P39lZube0b1+/fvlyTVrVu33LbIyEhre2WEhIS4rZdd31LZf+wuZF8lqUWLFmrdunW5xdfX161u48aN6tatm6Tf73L69NNPlZWVpUceeURS+fEFBwe7rXt7e5+2/ejRo6ftZ3BwsHr37q3//Oc/Ki0tlfT7tSlt2rTR5ZdfbtW98cYb6tevn1566SUlJiYqODhY99xzj/Ly8s7oeLRu3VpjxozRW2+9pZ9//lkPPvigfvzxx3IXu0ZERJR7bVlb2c/k3XffVZ8+fVSvXj0tXLhQ69evt8JAReM938fsRA6HQ/fee68WLlyoOXPm6LLLLlP79u0rrN27d68OHDggb29veXl5uS15eXlWsLjkkkv00UcfKSwsTEOHDtUll1yiSy65RM8995y1r5SUFL3yyiv66aefdOuttyosLEwJCQnKyMiwaqZNm6b7779fCQkJeuedd5SZmamsrCz16NHD7fdq//79Cg8PL9ffk9v27t0rSRo1alS5/g8ZMkSSrDHMnDlTY8aM0dKlS3XdddcpODhYN910k7799tszPra4+Lj7BrZWvXp1de7cWStWrNDu3btVv37909aXBYc9e/aUq/35559Vp04da93X11dFRUXl9vHLL7+41V0oZ9PXCyktLU1eXl5atmyZW2BZunTpRXl/Sbr33nv11ltvKSMjQ9HR0crKytLs2bPdaurUqaMZM2ZoxowZ2rlzp95//309/PDDys/PP+u7r7y8vDR+/HhNnz7durOpTEUhp6yt7Ge2cOFCxcTE6I033nCb6ajo9+li6N+/v8aNG6c5c+boX//61ynr6tSpo5CQkFMerxNvIW7fvr3at2+v0tJSbdq0Sc8//7xSU1MVHh6uO++8U9LvP7d7771Xhw8f1v/+9z+NHz9eSUlJ+uabb9SgQQMtXLhQHTt2LPezPHjwoNt6SEiINm7cWK4/J/8syj4TY8eO1S233FLhGOLi4iRJNWvW1MSJEzVx4kTt3bvXmjXp1auXtm/ffspjBM9ipgS2N3bsWBljNHDgQBUXF5fbXlJSov/+97+SpE6dOkn6/Y/GibKyspSTk6POnTtbbQ0bNtSWLVvc6r755hu3O2rOlo+PzxnPnJxNXy8kh8OhGjVqqHr16lbbkSNH9Nprr12U95ekbt26qV69enr11Vf16quvytfXt9zU/Ymio6M1bNgwde3a1e2USkX27NlTYXvZ6YPIyEi39m3btunLL790a3v99dcVGBioK6+8UtLvx8zb29stkOTl5VV4983FUK9ePf3jH/9Qr1691K9fv1PWJSUlaf/+/SotLa1wFq3sD/qJqlevroSEBL3wwguSVOHxrlmzpnr27KlHHnlExcXF2rZtm6Tfj9PJd8xt2bJF69evd2vr0KGDDh48qBUrVri1p6Wlua3HxcUpNjZWX375ZYX9b926dYXPZgkPD1f//v111113aceOHW53EMFemCmB7SUmJmr27NkaMmSIWrVqpfvvv1+XX365SkpK9MUXX+jFF19UfHy8evXqpbi4OA0aNEjPP/+8qlWrpp49e+rHH3/UY489pqioKD344IPWflNSUnT33XdryJAhuvXWW/XTTz9p6tSpCg0NrXRfmzVrpnfffVezZ89Wq1atVK1aNbVu3brC2rPp64V0ww03aNq0aUpOTtagQYO0f/9+PfPMMxXefn2hVK9eXffcc4+mTZumoKAg3XLLLXI6ndZ2l8ul6667TsnJyWrcuLECAwOVlZWl9PT0U/4fc5nu3burfv366tWrlxo3bqzjx48rOztbzz77rAICAvTAAw+41UdGRqp3796aMGGC6tatq4ULFyojI0NPPfWUdc1MUlKS3n33XQ0ZMkS33Xabdu3apSeeeEJ169b12OmBKVOm/GHNnXfeqUWLFun666/XAw88oDZt2sjLy0u7d+/WmjVrdOONN+rmm2/WnDlztHr1at1www2Kjo7W0aNH9corr0iSunTpIkkaOHCg/Pz81K5dO9WtW1d5eXmaPHmynE6nrrrqKkm/H6cnnnhC48ePV4cOHbRjxw49/vjjiomJ0bFjx6x+9evXT9OnT9fdd9+tJ598UpdeeqlWrFihDz/8UJL7rdtz585Vz5491b17d/Xv31/16tXTr7/+qpycHH3++ed66623JEkJCQlKSkpS8+bNVbt2beXk5Oi1115TYmKi27VPsBlPX2kLnKns7GzTr18/Ex0dbby9vU3NmjVN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9enTR08//bSSk5Oti2djY2M1c+ZMdejQQbNnz5avr+9FHROA02OmBIAtffHFF7rxxhvVoEEDBQYGqmPHjpKknTt3utUlJiZa/x0cHKy4uDjl5ORIkjZv3qz58+crICDAWrp3767jx48rNzf3oo0FwJlhpgSA7Rw+fFjdunVTt27dtHDhQoWGhmrnzp3q3r27iouL//D1DodDknT8+HENHjxYI0aMKFcTHR193vsN4NwQSgDYzvbt2/XLL79oypQpioqKkiRt2rSpwtrMzEwrYBQUFOibb75R48aNJUlXXnmltm3bpksvvfTidBzAOeH0DQDbiY6Olre3t55//nn98MMPev/99/XEE09UWPv4449r1apV2rp1q/r37686deropptukiSNGTNG69ev19ChQ5Wdna1vv/1W77//voYPH34RRwPgTBFKANhOaGio5s+fr7feektNmzbVlClT9Mwzz1RYO2XKFD3wwANq1aqV9uzZo/fff1/e3t6SpObNm2vdunX69ttv1b59e7Vs2VKPPfaY6tatezGHA+AMOYwxxtOdAAAAYKYEAADYAqEEAADYAqEEAADYAqEEAADYAqEEAADYAqEEAADYAqEEAADYAqEEAADYAqEEAADYAqEEAADYAqEEAADYwv8HSOhTGNvrxB4AAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.figure(figsize=(6,4))\n", - "sns.countplot(x='label', data=df, palette=['skyblue','lightcoral'])\n", - "plt.title(\"Count of Ham vs Spam Messages\")\n", - "plt.show()\n" - ] - }, - { - "cell_type": "markdown", - "id": "33494638-d3f2-42d7-87d1-1359f804cb47", - "metadata": {}, - "source": [ - "**Data preprocessing**" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "daf34158-19de-44e6-8f22-5f66fd5087cd", - "metadata": {}, - "outputs": [], - "source": [ - "# Text cleaning" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "bb0a8c8c-e3b0-408f-887f-dd0cae2441aa", - "metadata": {}, - "outputs": [], - "source": [ - "def clean_text(text):\n", - " text = text.lower()\n", - " text = re.sub(r'[^a-z\\s]', '', text)\n", - " text = re.sub(r'\\s+', ' ', text).strip()\n", - " return text\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "0965fa83-1301-4b49-b2c2-8f4253b59401", - "metadata": {}, - "outputs": [], - "source": [ - "df['cleaned_message'] = df['message'].apply(clean_text)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "0542ac72-d5b3-48ef-8a33-2759e6efae4f", - "metadata": {}, - "outputs": [], - "source": [ - "#Stopwords removal" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "3512f967-6cfb-496f-b902-eed8100f9173", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package stopwords to\n", - "[nltk_data] C:\\Users\\fastf\\AppData\\Roaming\\nltk_data...\n", - "[nltk_data] Package stopwords is already up-to-date!\n" - ] - } - ], - "source": [ - "nltk.download('stopwords')\n", - "stop_words = set(stopwords.words('english'))" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "179704e1-3931-4ad9-9cf2-c17cb6f9b0c0", - "metadata": {}, - "outputs": [], - "source": [ - "def remove_stopwords(text):\n", - " words = text.split() \n", - " words = [word for word in words if word not in stop_words] \n", - " return ' '.join(words) \n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "f5eda51a-4395-4649-b90a-e2ed2c938253", - "metadata": {}, - "outputs": [], - "source": [ - "#Tokenization" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "ea59eaa0-0638-4323-803a-789b87db03f3", - "metadata": {}, - "outputs": [], - "source": [ - "tokenizer = Tokenizer(num_words=5000, oov_token=\"\")\n", - "tokenizer.fit_on_texts(df['cleaned_message'])\n", - "sequences = tokenizer.texts_to_sequences(df['cleaned_message'])\n", - "X = pad_sequences(sequences, maxlen=100, padding='post')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "7e332198-dd4a-4a59-abe7-3f0ae6d31e14", - "metadata": {}, - "outputs": [], - "source": [ - "#Label encoding" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "ed3bfc43-505b-47f2-980f-16643e7b4adc", - "metadata": {}, - "outputs": [], - "source": [ - "le = LabelEncoder()\n", - "y = le.fit_transform(df['label'])" - ] - }, - { - "cell_type": "markdown", - "id": "1de96a95-45ec-4c21-8290-be69f4c16b00", - "metadata": {}, - "source": [ - "**Train test split**" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "e459ffc8-12d9-46f1-8c1a-3e48e8ff5ffb", - "metadata": {}, - "outputs": [], - "source": [ - "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)" - ] - }, - { - "cell_type": "markdown", - "id": "8ecb919a-f92f-46d0-aee9-3eb17a7cd9bb", - "metadata": {}, - "source": [ - "**Building the model**" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "5360429d-ae84-4c87-9f6d-fb340d7aef4e", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\fastf\\AppData\\Roaming\\Python\\Python312\\site-packages\\keras\\src\\layers\\core\\embedding.py:97: UserWarning: Argument `input_length` is deprecated. Just remove it.\n", - " warnings.warn(\n" - ] - } - ], - "source": [ - "model = Sequential([\n", - " Embedding(input_dim=5000, output_dim=128, input_length=100),\n", - " Bidirectional(LSTM(64, return_sequences=False)),\n", - " Dropout(0.5),\n", - " Dense(32, activation='relu'),\n", - " Dense(1, activation='sigmoid') \n", - "])\n", - "\n", - "model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "309cedd8-a95f-4f1b-b9db-60a807b40272", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1/5\n", - "\u001b[1m70/70\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 144ms/step - accuracy: 0.8438 - loss: 0.3923 - val_accuracy: 0.9758 - val_loss: 0.0900\n", - "Epoch 2/5\n", - "\u001b[1m70/70\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 126ms/step - accuracy: 0.9831 - loss: 0.0587 - val_accuracy: 0.9830 - val_loss: 0.0714\n", - "Epoch 3/5\n", - "\u001b[1m70/70\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 127ms/step - accuracy: 0.9947 - loss: 0.0211 - val_accuracy: 0.9821 - val_loss: 0.0780\n", - "Epoch 4/5\n", - "\u001b[1m70/70\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 128ms/step - accuracy: 0.9957 - loss: 0.0123 - val_accuracy: 0.9812 - val_loss: 0.0999\n", - "Epoch 5/5\n", - "\u001b[1m70/70\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 133ms/step - accuracy: 0.9985 - loss: 0.0057 - val_accuracy: 0.9794 - val_loss: 0.1043\n" - ] - } - ], - "source": [ - "history = model.fit(X_train, y_train, validation_data=(X_test, y_test), \n", - " epochs=5, batch_size=64, verbose=1)\n" - ] - }, - { - "cell_type": "markdown", - "id": "80b4d02b-5d47-4bd5-89af-a609a137b76b", - "metadata": {}, - "source": [ - "**Evaluating the model**" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "616930a7-ad28-46a8-8bdb-2b8883b99a92", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m35/35\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 31ms/step - accuracy: 0.9787 - loss: 0.0956\n", - "Test Accuracy: 0.98\n" - ] - } - ], - "source": [ - "loss, acc = model.evaluate(X_test, y_test)\n", - "print(f\"Test Accuracy: {acc:.2f}\")\n" - ] - }, - { - "cell_type": "markdown", - "id": "0a3df77a-c7b0-4e3a-acdc-5f4451ba3727", - "metadata": {}, - "source": [ - "**Model evaluation**" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "5a532356-dc6a-4205-97a1-913e8e76a2d4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m35/35\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 42ms/step\n", - " precision recall f1-score support\n", - "\n", - " Ham 0.98 0.99 0.99 965\n", - " Spam 0.94 0.90 0.92 150\n", - "\n", - " accuracy 0.98 1115\n", - " macro avg 0.96 0.95 0.95 1115\n", - "weighted avg 0.98 0.98 0.98 1115\n", - "\n" - ] - }, - { - "data": { - "image/png": "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NUr169dX/fr19fLLL//ueadPn77ifVw+/luO93J5vkZJ7sViseixxx7TG2+8oQULFuimm25Su3btnI7dtWuXOnXqJOnXVSaffvqp0tPTNXny5BJ/r7P7/L0YBw4cqAsXLigsLIy5B0A5I0FAheDp6anY2Fjt3r3bNMnQmcu/JDMyMkzHTp48qZCQEJfF5uPjI0nKz8+32+84z0GS2rVrp/fee085OTnauXOn2rRpo/j4eKWmpl7x+sHBwVe8D0kuvZffGjhwoE6dOqUFCxboscceu+K41NRUeXt76/3331fv3r0VHR2tli1bluo7nU32vJKMjAyNGjVKzZo10+nTpzVhwoRSfSeA0iFBQIWRkJAgwzA0ZMgQp5P6CgsL9d5770mS7rnnHkmyTTK8LD09XYcPH1ZsbKzL4ro8E3/fvn12+y/H4oynp6dat26tefPmSZL27NlzxbGxsbHauHGjLSG47PXXX5efn1+ZLQGsWbOmnnrqKd13330aMGDAFcdZLBZ5eXnJ09PTti8vL0/Lly83jXVVVaaoqEh9+/aVxWLR2rVrlZycrDlz5mj16tVXfW0AxcNzEFBhtGnTRvPnz9fIkSPVokULjRgxQrfccosKCwv1xRdfaOHChYqMjNR9992nRo0aaejQoZozZ448PDzUpUsXHTt2TFOnTlXt2rU1duxYl8XVtWtXVa1aVYMHD9aMGTPk5eWlpUuX6r///a/duAULFmjjxo2Ki4tTnTp1dOHCBdtKgQ4dOlzx+tOmTdP777+vu+++W88++6yqVq2qN998Ux988IFSUlIUFBTksntx9MILL/zhmLi4OM2aNUv9+vXT0KFDdfr0af3f//2f06WoUVFRSk1N1dtvv6169erJx8enVPMGpk2bpq1bt2r9+vUKCwvT+PHjtWXLFg0ePFjNmzdXREREia8JoGRIEFChDBkyRLfffrtmz56tmTNnKjMzU97e3rrpppvUr18/jR492jZ2/vz5ql+/vhYvXqx58+YpKChI9957r5KTk53OOSitypUra926dYqPj1f//v11ww036PHHH1eXLl30+OOP28Y1a9ZM69ev17Rp05SZmamAgABFRkZqzZo1th6+M40aNdL27dv1zDPPaNSoUcrLy1Pjxo312muvleiJhGXlnnvu0ZIlSzRz5kzdd999qlmzpoYMGaLq1atr8ODBdmOn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f/7zn8rPz7/iuKlTp+qBBx7Ql19+qf79+6tv3746fPiw7XhgYKCWLl2qQ4cO6eWXX9aiRYs0e/Zsu2t8++23Wrt2rdatW6cVK1ZoyZIliouL04kTJ7RlyxbNnDlTU6ZM0c6dO8vsfgGXMvCnNGDAAMPT09Pw9/e323x8fAxJRnZ2ttPzunbtaowfP972OSYmxmjbtq3t88WLFw1/f3/jkUcese3LyMgwJBk7duwos/sBSuudd94xqlSpYvj4+BjR0dFGQkKC8eWXX9qOSzKGDx9ud07r1q2NESNGXPGaKSkpRosWLWyfp02bZvj5+Rlnz5617evcubNRt25do6ioyLavUaNGRnJysituCyhzVBD+xO6++27t3bvXbnv11Vdtx4uKivT888+radOmCg4OVkBAgNavX6/jx4/bXadp06a2//b09FRwcLCioqJs+0JDQyX9OhkMqGgeeOABnTx5UmvWrFHnzp21efNm3XbbbVq6dKltTJs2bezOadOmjV0F4Z133lHbtm0VFhamgIAATZ061fRzUrduXQUGBto+h4aGqkmTJvLw8LDbx88JrhUkCH9i/v7+atCggd1Ws2ZN2/EXX3xRs2fP1tNPP62NGzdq79696ty5swoKCuyu4+3tbffZYrHY7bNYLJKkS5culeHdAKXn4+Ojjh076tlnn9X27ds1cOBATZs27XfPufy/6507d+qhhx5Sly5d9P777+uLL77Q5MmTS/xzcnkfPye4VpAgXMe2bt2qHj16qH///rr11ltVr149ff311+4OCyhzTZo00S+//GL77DgvYOfOnbr55pslSZ9++qluvPFGTZ48WS1btlTDhg31/fffl2u8gDuwzPE61qBBA7377rvavn27qlSpolmzZikzM1ONGzd2d2iAS5w+fVq9evXSoEGD1LRpUwUGBurzzz9XSkqKevToYRu3atUqtWzZUm3bttWbb76pXbt2afHixZJ+/Tk5fvy4UlNT1apVK33wwQdKS0tz1y0B5YYE4To2depUHT16VJ07d5afn5+GDh2q+++/Xzk5Oe4ODXCJgIAAtW7dWrNnz9a3336rwsJC1a5dW0OGDNEzzzxjGzd9+nSlpqZq5MiRCgsL05tvvqkmTZpIknr06KGxY8dq9OjRys/PV1xcnKZOnarExEQ33RVQPiyGYRjuDgIA3MVisSgtLc3pk0eB6xlzEAAAgAkJAgAAMGEOAoDrGl1WwDkqCAAAwIQEAQAAmJAgAAAAExIEAABgQoIAAABMSBAAAIAJCQIAADAhQQAAACb/D0g8UyavkOHyAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "y_pred = (model.predict(X_test) > 0.5).astype(\"int32\")\n", - "\n", - "print(classification_report(y_test, y_pred, target_names=['Ham','Spam']))\n", - "\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.show()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "183ab565-6b68-4b9d-ab43-51cabb4fa15d", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" - ] - } - ], - "source": [ - "model.save(\"spam_classifier.h5\")\n" - ] - }, - { - "cell_type": "markdown", - "id": "2e0a0139-f428-4c68-af13-7c40e799dd9e", - "metadata": {}, - "source": [ - "**Prediction on new messages**" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "fdae9abc-338b-4463-a519-38e8a7c220af", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Ham (Spam prob: 0.0000, Ham prob: 1.0000, Confidence: 100.00%)\n", - "Spam (Spam prob: 1.0000, Ham prob: 0.0000, Confidence: 100.00%)\n" - ] - } - ], - "source": [ - "def predict_message(msg, threshold=0.5):\n", - " \n", - " seq = tokenizer.texts_to_sequences([msg])\n", - " padded = pad_sequences(seq, maxlen=100, padding='post')\n", - "\n", - " \n", - " spam_prob = float(model.predict(padded, verbose=0)[0][0]) \n", - "\n", - " \n", - " label = \"Spam\" if spam_prob > threshold else \"Ham\"\n", - "\n", - " \n", - " confidence = spam_prob if label == \"Spam\" else 1 - spam_prob\n", - "\n", - " \n", - " return f\"{label} (Spam prob: {spam_prob:.4f}, Ham prob: {1-spam_prob:.4f}, Confidence: {confidence*100:.2f}%)\"\n", - "\n", - "\n", - "\n", - "print(predict_message(\"Ok lar... Joking wif u oni...\"))\n", - "print(predict_message(\"SIX chances to win CASH! From 100 to 20,000 pounds txt> CSH11 and send to 87575. Cost 150p/day, 6days, 16+ TsandCs apply Reply HL 4 info\"))\n" - ] - }, - { - "cell_type": "markdown", - "id": "5aa8d9ef-6ba7-4803-bbbe-80dc0bd06fb9", - "metadata": {}, - "source": [ - "**Visualizing the model**" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "9ff69096-dcc1-439d-8662-d033da9f23c5", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "plt.plot(history.history['accuracy'], label='Train Accuracy')\n", - "plt.plot(history.history['val_accuracy'], label='Val Accuracy')\n", - "plt.title('Model Accuracy')\n", - "plt.xlabel('Epochs')\n", - "plt.ylabel('Accuracy')\n", - "plt.legend()\n", - "plt.show()\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "cc3998aa-0c74-4442-90ed-764e27ca2955", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "plt.plot(history.history['loss'], label='Train Loss')\n", - "plt.plot(history.history['val_loss'], label='Val Loss')\n", - "plt.title('Model Loss')\n", - "plt.xlabel('Epochs')\n", - "plt.ylabel('Loss')\n", - "plt.legend()\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "1535e199-0006-42ec-8dd4-87941e2742c4", - "metadata": {}, - "outputs": [], - "source": [ - "import pickle\n", - "\n", - "\n", - "with open(\"tokenizer.pkl\", \"wb\") as f:\n", - " pickle.dump(tokenizer, f)\n" - ] - }, - { - "cell_type": "markdown", - "id": "7558fc7b-0c73-4424-8830-a8bc4aff7fba", - "metadata": {}, - "source": [ - "**Save this as app.py**" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "dc4112ef-c4b9-46dc-ab39-613ea2dc3f44", - "metadata": {}, - "outputs": [], - "source": [ - "import streamlit as st\n", - "import tensorflow as tf\n", - "import pickle\n", - "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", - "\n", - "# Load model\n", - "model = tf.keras.models.load_model(\"spam_classifier.h5\", compile=False)\n", - "\n", - "# Load tokenizer\n", - "with open(\"tokenizer.pkl\", \"rb\") as f:\n", - " tokenizer = pickle.load(f)\n", - "\n", - "# Max sequence length (should be same as used in training)\n", - "MAX_LEN = 100 \n", - "\n", - "st.title(\"📧 Spam Message Detector\")\n", - "\n", - "# User input\n", - "message = st.text_area(\"Enter a message:\")\n", - "\n", - "if st.button(\"Predict\"):\n", - " if message.strip() != \"\":\n", - " # Convert message to sequence\n", - " seq = tokenizer.texts_to_sequences([message])\n", - " padded = pad_sequences(seq, maxlen=MAX_LEN, padding=\"post\", truncating=\"post\")\n", - "\n", - " # Predict\n", - " prediction = model.predict(padded)\n", - " prob = float(prediction[0][0])\n", - "\n", - " if prob > 0.5:\n", - " st.error(f\"🚨 Spam detected! (Confidence: {prob:.2f})\")\n", - " else:\n", - " st.success(f\"✅ Ham (Not Spam) (Confidence: {1-prob:.2f})\")\n", - " else:\n", - " st.warning(\"Please enter a message before predicting.\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "db3e8012-b5b3-4184-9a9e-ae0ac18f4433", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "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.7" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/src/apps/pages/models/Spam detection model/app.py b/src/apps/pages/models/Spam detection model/app.py deleted file mode 100644 index b45bf524..00000000 --- a/src/apps/pages/models/Spam detection model/app.py +++ /dev/null @@ -1,45 +0,0 @@ -import streamlit as st -import tensorflow as tf -import pickle -from tensorflow.keras.preprocessing.sequence import pad_sequences - -# Load model -model = tf.keras.models.load_model("spam_classifier.h5") - - - -# Load tokenizer -with open("tokenizer.pkl", "rb") as f: - tokenizer = pickle.load(f) - -# Max sequence length (should be same as used in training) -MAX_LEN = 100 - -st.title("📧 Spam Message Detector") - -# User input -message = st.text_area("Enter a message:") - -if st.button("Predict"): - if message.strip() != "": - # Convert message to sequence - seq = tokenizer.texts_to_sequences([message]) - padded = pad_sequences(seq, maxlen=MAX_LEN, padding="post", truncating="post") - - # Predict - prediction = model.predict(padded) - prob = float(prediction[0][0]) - - if prob > 0.5: - st.error(f"🚨 Spam detected! (Confidence: {prob:.2f})") - else: - st.success(f"✅ Ham (Not Spam) (Confidence: {1-prob:.2f})") - else: - st.warning("Please enter a message before predicting.") - - -# In[ ]: - - - - diff --git a/src/apps/pages/models/Spam detection model/spam detector .png b/src/apps/pages/models/Spam detection model/spam detector .png deleted file mode 100644 index 079da57878485027f48e82dffecb0096b6940021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54391 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

l~{sZTklN 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 ZMatMaAJ^b_Q`KG0XFYyu{4wa4e*+9-BufAQ From 0ef1ed65775ddca827f5ad7674f60827b3e07d96 Mon Sep 17 00:00:00 2001 From: smriti pandey Date: Fri, 22 Aug 2025 13:49:32 +0530 Subject: [PATCH 3/3] update spam_detector.py --- .../SPAM detection model/spam_detector.py | 60 ++++++++++++++----- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/src/apps/pages/models/SPAM detection model/spam_detector.py b/src/apps/pages/models/SPAM detection model/spam_detector.py index 248e8000..e2460957 100644 --- a/src/apps/pages/models/SPAM detection model/spam_detector.py +++ b/src/apps/pages/models/SPAM detection model/spam_detector.py @@ -1,8 +1,26 @@ +import os import streamlit as st import tensorflow as tf import pickle from tensorflow.keras.preprocessing.sequence import pad_sequences +# --------------------------- +# Download model/tokenizer from Kaggle Kernel +# --------------------------- +@st.cache_resource +def download_from_kaggle(output_dir="kaggle_models"): + try: + os.makedirs(output_dir, exist_ok=True) + kernel_ref = "smritipandey02/spam-detection" # Hardcoded username + notebook + + # Download kernel outputs + os.system(f"kaggle kernels output {kernel_ref} -p {output_dir}") + + st.success(f"Downloaded model/tokenizer from Kaggle Kernel: {kernel_ref}") + return output_dir + except Exception as e: + st.error(f"Could not download from Kaggle: {e}") + st.stop() # --------------------------- # Load model & tokenizer @@ -10,17 +28,17 @@ @st.cache_resource def load_model_and_tokenizer(): try: - model = tf.keras.models.load_model("spam_classifier.h5") - with open("tokenizer.pkl", "rb") as f: + model_dir = download_from_kaggle() + + model = tf.keras.models.load_model(os.path.join(model_dir, "spam_classifier.h5")) + with open(os.path.join(model_dir, "tokenizer.pkl"), "rb") as f: tokenizer = pickle.load(f) + return model, tokenizer except Exception as e: st.error(f"Could not load model/tokenizer: {e}") st.stop() -model, tokenizer = load_model_and_tokenizer() - - # --------------------------- # Prediction function # --------------------------- @@ -30,25 +48,37 @@ def predict_message(message, model, tokenizer, max_len=100): prob = float(model.predict(padded)[0][0]) return prob - # --------------------------- # Streamlit UI # --------------------------- def spam_app(): st.title("Spam Message Detector") - message = st.text_area("Enter a message:") + # Load Model button + if st.button("Load Model", key="load_btn"): + with st.spinner("Loading model & tokenizer..."): + model, tokenizer = load_model_and_tokenizer() + st.session_state["model"] = model + st.session_state["tokenizer"] = tokenizer + st.success("Model & Tokenizer Loaded Successfully!") - if st.button("Predict") and message.strip(): - prob = predict_message(message, model, tokenizer) + # Input box + message = st.text_area("Enter a message:", key="msg_input") - if prob > 0.5: - st.error(f"Spam detected! (Confidence: {prob:.2f})") + # Predict button + if st.button("Predict", key="predict_btn"): + if not message.strip(): + st.warning("Please enter a message before predicting.") + elif "model" not in st.session_state or "tokenizer" not in st.session_state: + st.warning("Please load the model first.") else: - st.success(f"Ham (Not Spam) (Confidence: {1-prob:.2f})") - elif st.button("Predict"): - st.warning("Please enter a message before predicting.") - + prob = predict_message(message, + st.session_state["model"], + st.session_state["tokenizer"]) + if prob > 0.5: + st.error(f"Spam detected! (Confidence: {prob:.2f})") + else: + st.success(f"Ham (Not Spam) (Confidence: {1-prob:.2f})") # --------------------------- # Run app