{
"cells": [
{
"cell_type": "markdown",
"id": "19423337",
"metadata": {},
"source": [
"[Lien youtube de la vidéo source ](https://youtu.be/0rtlRbKPQLE?si=PZ-nbxa-z1TOUav5)"
]
},
{
"cell_type": "markdown",
"id": "2aac4a64",
"metadata": {},
"source": [
"[Code Source GITHUB](https://github.com/MamatorHack/spam-detector)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "8a313f24",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd # Manipulation de données\n",
"import numpy as np # Calculs mathématiques\n",
"import matplotlib.pyplot as plt # Affichage de graphiques\n",
"import seaborn as sns # Visualisation de données\n",
"import pickle # Sauvegarder et charger des modèles\n",
"from sklearn.feature_extraction.text import CountVectorizer # Transformer le texte en nombres\n",
"from sklearn.model_selection import train_test_split # Séparer les données\n",
"from sklearn.naive_bayes import MultinomialNB # Modèle d'apprentissage\n",
"from sklearn.metrics import accuracy_score # Vérifier la performance du modèle"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "e530b713",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
label
\n",
"
message
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
ham
\n",
"
Go until jurong point, crazy.. Available only ...
\n",
"
\n",
"
\n",
"
1
\n",
"
ham
\n",
"
Ok lar... Joking wif u oni...
\n",
"
\n",
"
\n",
"
2
\n",
"
spam
\n",
"
Free entry in 2 a wkly comp to win FA Cup fina...
\n",
"
\n",
"
\n",
"
3
\n",
"
ham
\n",
"
U dun say so early hor... U c already then say...
\n",
"
\n",
"
\n",
"
4
\n",
"
ham
\n",
"
Nah I don't think he goes to usf, he lives aro...
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" label message\n",
"0 ham Go until jurong point, crazy.. Available only ...\n",
"1 ham Ok lar... Joking wif u oni...\n",
"2 spam Free entry in 2 a wkly comp to win FA Cup fina...\n",
"3 ham U dun say so early hor... U c already then say...\n",
"4 ham Nah I don't think he goes to usf, he lives aro..."
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Charger le fichier SMSSpamCollection from UCI ML repository\n",
"df = pd.read_csv('SMSSpamCollection', sep='\\t', header=None, names=['label', 'message'])\n",
"\n",
"# Afficher les 5 premières lignes du dataset\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"id": "15e1439e",
"metadata": {},
"source": [
"### Nettoyer les données "
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "fb533887",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
label
\n",
"
message
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
0
\n",
"
Go until jurong point, crazy.. Available only ...
\n",
"
\n",
"
\n",
"
1
\n",
"
0
\n",
"
Ok lar... Joking wif u oni...
\n",
"
\n",
"
\n",
"
2
\n",
"
1
\n",
"
Free entry in 2 a wkly comp to win FA Cup fina...
\n",
"
\n",
"
\n",
"
3
\n",
"
0
\n",
"
U dun say so early hor... U c already then say...
\n",
"
\n",
"
\n",
"
4
\n",
"
0
\n",
"
Nah I don't think he goes to usf, he lives aro...
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 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..."
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Convertir les labels en 0 (ham) et 1 (spam)\n",
"df['label'] = df['label'].map({'ham': 0, 'spam': 1})\n",
"\n",
"# Afficher les 5 premières lignes\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "c4ea8a09",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"((5572, 8713), (5572,))"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Convertir les messages en nombres\n",
"vectorizer = CountVectorizer()\n",
"X = vectorizer.fit_transform(df['message'])\n",
"\n",
"# Labels (0 ou 1)\n",
"y = df['label']\n",
"\n",
"# Afficher la taille des données\n",
"X.shape, y.shape"
]
},
{
"cell_type": "markdown",
"id": "b1ccf31e",
"metadata": {},
"source": [
"`5572` est le nombre de messages converties & `8713` le nombre de caractéristiques pour identifier un Spam"
]
},
{
"cell_type": "markdown",
"id": "efd4b561",
"metadata": {},
"source": [
"### Modélisation "
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "aea723b8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Précision du modèle : 98.57%\n"
]
}
],
"source": [
"# Séparer les données en entraînement (80%) et test (20%)\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
"\n",
"# Créer et entraîner le modèle\n",
"model = MultinomialNB()\n",
"model.fit(X_train, y_train)\n",
"\n",
"# Prédire sur les données de test\n",
"y_pred = model.predict(X_test)\n",
"\n",
"# Évaluer la précision du modèle\n",
"accuracy = accuracy_score(y_test, y_pred)\n",
"print(f\"Précision du modèle : {accuracy * 100:.2f}%\")"
]
},
{
"cell_type": "markdown",
"id": "f6eda2fa",
"metadata": {},
"source": [
"### Test"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "2d01ce1c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SPAM ❌\n",
"HAM ✅\n"
]
}
],
"source": [
"def predict_spam(message):\n",
" message_transformed = vectorizer.transform([message])\n",
" prediction = model.predict(message_transformed)\n",
" return \"SPAM ❌\" if prediction[0] == 1 else \"HAM ✅\"\n",
"\n",
"# Tester avec un message\n",
"\n",
"print(predict_spam(\"Hey, you have winning cup. Give your account bank detail to keep your prize !\"))\n",
"print(predict_spam(\"Hey, well ? Ready for competition ?\"))\n"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "7e014dbc",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SPAM ❌\n",
"HAM ✅\n"
]
}
],
"source": [
"print(predict_spam(\"Congratulations! You've won a lottery. Claim your prize now!\"))\n",
"print(predict_spam(\"Don't forget our meeting tomorrow at 10 AM.\"))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "c61d8311",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SPAM ❌\n"
]
}
],
"source": [
"print(predict_spam(\"Give me your credit card details to claim your prize!\"))"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "ef960679",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"HAM ✅\n"
]
}
],
"source": [
"print(predict_spam(\"Hello friend, how are you doing today? , we are English class today, see you later!\"))"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "58f88820",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"HAM ✅\n"
]
}
],
"source": [
"print(predict_spam(\"You are ugly , you need money, give your credit card details.\"))"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "8f4f505b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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XHPFiwIAAGhPrXYN0VVXXaUf/OAHWrFiRWs9JQAAQLto1Yuq//3vf+vDDz9szacEAABocy16y2zu3Llh923bVk1NjV5++WVNmzatVRYGAADQXloURG+//XbY/auuukrJycn66U9/+qmfQAMAAOhoWhREr7/+emuvAwAAIGpaFETnnThxQgcPHpTL5dJ1112n5OTk1loXAABAu2nRRdVnzpzR3Xffrf79++umm27SjTfeKK/Xq+nTp+v9999v7TUCAAC0qRYF0dy5c1VeXq6XXnpJdXV1qqur0x/+8AeVl5dr3rx5rb1GAACANtWit8x+97vf6be//a3GjBnjbPvGN76h+Ph4TZkyRatXr26t9QEAALS5Fp0hev/99+V2uyO2p6Sk8JYZAADodFoURD6fTw8//LA++OADZ1tDQ4OWLFkin8/XaosDAABoDy16y2zlypWaNGmSBgwYoOHDh8vlcqmqqkpxcXHasmVLa68RAACgTbUoiIYNG6ZDhw5pw4YNOnDggGzb1h133KE777xT8fHxrb1GAACANtWiICosLJTb7daMGTPCtj/zzDM6ceKEFi5c2CqLAwAAaA8tuoZozZo1+uIXvxix/frrr9cvfvGLK14UAABAe2pREAUCAfXv3z9ie3Jysmpqaq54UQAAAO2pRUGUmpqqN998M2L7m2++Ka/Xe8WLAgAAaE8tuoboe9/7nvx+v86ePatbbrlFkvTaa69pwYIFfFM1AADodFoURAsWLNB7772n2bNnq6mpSZLUo0cPLVy4UIsWLWrVBQIAALS1FgWRy+XSY489poceekj79+9XfHy80tLSFBcX19rrAwAAaHMtCqLzevfura9+9auttRYAAICoaNFF1QAAAF0JQQQAAIxHEAEAAOMRRAAAwHgEEQAAMB5BBAAAjEcQAQAA4xFEAADAeAQRAAAwHkEEAACMRxABAADjEUQAAMB4BBEAADBeVIOosLBQX/3qV5WQkKCUlBRNnjxZBw8eDJuxbVuLFy+W1+tVfHy8xowZo3379oXNNDY2as6cOerXr5969eqlnJwcHT16NGwmGAwqLy9PlmXJsizl5eWprq6urQ8RAAB0AlENovLyct17772qqKhQWVmZPvzwQ2VlZenMmTPOzLJly7R8+XIVFRVp9+7d8ng8Gj9+vE6dOuXM+P1+lZSUaNOmTdq2bZtOnz6t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jx8vSXr22Wc1YMAAlZSUaMqUKXr88ceVm5vrXKidlpamJ598UqNHj9bq1avVo0ePdj0mAG2LM0QAupy3335bt912m66++molJCRozJgxkqTDhw+Hzfl8PuffSUlJGjx4sPbv3y9JqqysVHFxsXr37u3cJkyYoHPnzqm6urrdjgVA++AMEYAu5cyZM8rKylJWVpY2bNig5ORkHT58WBMmTFBTU9OnPt7lckmSzp07p1mzZik/Pz9iZuDAga2+bgDRRRAB6FIOHDigkydPaunSpUpNTZUkvfXWWxedraiocOImGAzqn//8p774xS9Kkr7yla9o3759uvbaa9tn4QCiirfMAHQpAwcOVGxsrJ566im9++672rx5s37yk59cdPaRRx7Ra6+9pr179+quu+5Sv379NHnyZEnSwoULtWPHDt17772qqqrSoUOHtHnzZs2ZM6cdjwZAeyGIAHQpycnJKi4u1m9+8xsNHTpUS5cu1RNPPHHR2aVLl+r+++9XRkaGampqtHnzZsXGxkqSbrjhBpWXl+vQoUO68cYb9eUvf1kPPfSQ+vfv356HA6CduGzbtqO9CAAAgGjiDBEAADAeQQQAAIxHEAEAAOMRRAAAwHgEEQAAMB5BBAAAjEcQAQAA4xFEAADAeAQRAAAwHkEEAACMRxABAADj/T8Foj4NDGZV/wAAAABJRU5ErkJggg==",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.countplot(x='label', data=df)"
]
},
{
"cell_type": "markdown",
"id": "55444fb4",
"metadata": {},
"source": [
"### Sauvegarder le model "
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "faf22bf2",
"metadata": {},
"outputs": [],
"source": [
"# Sauvegarder le vectorizer\n",
"with open('sms_vectorizer.pkl', 'wb') as file:\n",
" pickle.dump(vectorizer, file)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "dba57e87",
"metadata": {},
"outputs": [],
"source": [
"\n",
"# Sauvegarder le modèle \n",
"\n",
"with open('sms_spam_detector_model.pkl','wb') as file:\n",
" pickle.dump(model,file)"
]
},
{
"cell_type": "markdown",
"id": "f92bf821",
"metadata": {},
"source": [
"### Charger le modèle "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6ebccf7a",
"metadata": {},
"outputs": [
{
"ename": "FileNotFoundError",
"evalue": "[Errno 2] No such file or directory: 'dht11_model.pkl'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[26], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mopen\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdht11_model.pkl\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrb\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;28;01mas\u001b[39;00m file: \n\u001b[1;32m 2\u001b[0m model\u001b[38;5;241m=\u001b[39mpickle\u001b[38;5;241m.\u001b[39mload(file)\n",
"File \u001b[0;32m~/anaconda3/lib/python3.12/site-packages/IPython/core/interactiveshell.py:324\u001b[0m, in \u001b[0;36m_modified_open\u001b[0;34m(file, *args, **kwargs)\u001b[0m\n\u001b[1;32m 317\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m file \u001b[38;5;129;01min\u001b[39;00m {\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m2\u001b[39m}:\n\u001b[1;32m 318\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 319\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIPython won\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt let you open fd=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfile\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m by default \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 320\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mas it is likely to crash IPython. If you know what you are doing, \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124myou can use builtins\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m open.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 322\u001b[0m )\n\u001b[0;32m--> 324\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m io_open(file, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n",
"\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'dht11_model.pkl'"
]
}
],
"source": [
"with open('sms_spam_detector_model.pkl','rb') as file: \n",
" model=pickle.load(file)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "base",
"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
}