jfo25 commited on
Commit
43838d2
·
1 Parent(s): 4782b19

first commit on HF

Browse files
Files changed (2) hide show
  1. SMSSpamCollection +0 -0
  2. spam-detector-Mathis-AI.ipynb +455 -0
SMSSpamCollection ADDED
The diff for this file is too large to render. See raw diff
 
spam-detector-Mathis-AI.ipynb ADDED
@@ -0,0 +1,455 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "id": "19423337",
6
+ "metadata": {},
7
+ "source": [
8
+ "[Lien youtube de la vidéo source ](https://youtu.be/0rtlRbKPQLE?si=PZ-nbxa-z1TOUav5)"
9
+ ]
10
+ },
11
+ {
12
+ "cell_type": "markdown",
13
+ "id": "2aac4a64",
14
+ "metadata": {},
15
+ "source": [
16
+ "[Code Source GITHUB](https://github.com/MamatorHack/spam-detector)"
17
+ ]
18
+ },
19
+ {
20
+ "cell_type": "code",
21
+ "execution_count": 13,
22
+ "id": "8a313f24",
23
+ "metadata": {},
24
+ "outputs": [],
25
+ "source": [
26
+ "import pandas as pd # Manipulation de données\n",
27
+ "import numpy as np # Calculs mathématiques\n",
28
+ "import matplotlib.pyplot as plt # Affichage de graphiques\n",
29
+ "import seaborn as sns # Visualisation de données\n",
30
+ "from sklearn.feature_extraction.text import CountVectorizer # Transformer le texte en nombres\n",
31
+ "from sklearn.model_selection import train_test_split # Séparer les données\n",
32
+ "from sklearn.naive_bayes import MultinomialNB # Modèle d'apprentissage\n",
33
+ "from sklearn.metrics import accuracy_score # Vérifier la performance du modèle"
34
+ ]
35
+ },
36
+ {
37
+ "cell_type": "code",
38
+ "execution_count": 2,
39
+ "id": "e530b713",
40
+ "metadata": {},
41
+ "outputs": [
42
+ {
43
+ "data": {
44
+ "text/html": [
45
+ "<div>\n",
46
+ "<style scoped>\n",
47
+ " .dataframe tbody tr th:only-of-type {\n",
48
+ " vertical-align: middle;\n",
49
+ " }\n",
50
+ "\n",
51
+ " .dataframe tbody tr th {\n",
52
+ " vertical-align: top;\n",
53
+ " }\n",
54
+ "\n",
55
+ " .dataframe thead th {\n",
56
+ " text-align: right;\n",
57
+ " }\n",
58
+ "</style>\n",
59
+ "<table border=\"1\" class=\"dataframe\">\n",
60
+ " <thead>\n",
61
+ " <tr style=\"text-align: right;\">\n",
62
+ " <th></th>\n",
63
+ " <th>label</th>\n",
64
+ " <th>message</th>\n",
65
+ " </tr>\n",
66
+ " </thead>\n",
67
+ " <tbody>\n",
68
+ " <tr>\n",
69
+ " <th>0</th>\n",
70
+ " <td>ham</td>\n",
71
+ " <td>Go until jurong point, crazy.. Available only ...</td>\n",
72
+ " </tr>\n",
73
+ " <tr>\n",
74
+ " <th>1</th>\n",
75
+ " <td>ham</td>\n",
76
+ " <td>Ok lar... Joking wif u oni...</td>\n",
77
+ " </tr>\n",
78
+ " <tr>\n",
79
+ " <th>2</th>\n",
80
+ " <td>spam</td>\n",
81
+ " <td>Free entry in 2 a wkly comp to win FA Cup fina...</td>\n",
82
+ " </tr>\n",
83
+ " <tr>\n",
84
+ " <th>3</th>\n",
85
+ " <td>ham</td>\n",
86
+ " <td>U dun say so early hor... U c already then say...</td>\n",
87
+ " </tr>\n",
88
+ " <tr>\n",
89
+ " <th>4</th>\n",
90
+ " <td>ham</td>\n",
91
+ " <td>Nah I don't think he goes to usf, he lives aro...</td>\n",
92
+ " </tr>\n",
93
+ " </tbody>\n",
94
+ "</table>\n",
95
+ "</div>"
96
+ ],
97
+ "text/plain": [
98
+ " label message\n",
99
+ "0 ham Go until jurong point, crazy.. Available only ...\n",
100
+ "1 ham Ok lar... Joking wif u oni...\n",
101
+ "2 spam Free entry in 2 a wkly comp to win FA Cup fina...\n",
102
+ "3 ham U dun say so early hor... U c already then say...\n",
103
+ "4 ham Nah I don't think he goes to usf, he lives aro..."
104
+ ]
105
+ },
106
+ "execution_count": 2,
107
+ "metadata": {},
108
+ "output_type": "execute_result"
109
+ }
110
+ ],
111
+ "source": [
112
+ "# Charger le fichier SMSSpamCollection from UCI ML repository\n",
113
+ "df = pd.read_csv('SMSSpamCollection', sep='\\t', header=None, names=['label', 'message'])\n",
114
+ "\n",
115
+ "# Afficher les 5 premières lignes du dataset\n",
116
+ "df.head()"
117
+ ]
118
+ },
119
+ {
120
+ "cell_type": "markdown",
121
+ "id": "15e1439e",
122
+ "metadata": {},
123
+ "source": [
124
+ "### Netoyer les données "
125
+ ]
126
+ },
127
+ {
128
+ "cell_type": "code",
129
+ "execution_count": 3,
130
+ "id": "fb533887",
131
+ "metadata": {},
132
+ "outputs": [
133
+ {
134
+ "data": {
135
+ "text/html": [
136
+ "<div>\n",
137
+ "<style scoped>\n",
138
+ " .dataframe tbody tr th:only-of-type {\n",
139
+ " vertical-align: middle;\n",
140
+ " }\n",
141
+ "\n",
142
+ " .dataframe tbody tr th {\n",
143
+ " vertical-align: top;\n",
144
+ " }\n",
145
+ "\n",
146
+ " .dataframe thead th {\n",
147
+ " text-align: right;\n",
148
+ " }\n",
149
+ "</style>\n",
150
+ "<table border=\"1\" class=\"dataframe\">\n",
151
+ " <thead>\n",
152
+ " <tr style=\"text-align: right;\">\n",
153
+ " <th></th>\n",
154
+ " <th>label</th>\n",
155
+ " <th>message</th>\n",
156
+ " </tr>\n",
157
+ " </thead>\n",
158
+ " <tbody>\n",
159
+ " <tr>\n",
160
+ " <th>0</th>\n",
161
+ " <td>0</td>\n",
162
+ " <td>Go until jurong point, crazy.. Available only ...</td>\n",
163
+ " </tr>\n",
164
+ " <tr>\n",
165
+ " <th>1</th>\n",
166
+ " <td>0</td>\n",
167
+ " <td>Ok lar... Joking wif u oni...</td>\n",
168
+ " </tr>\n",
169
+ " <tr>\n",
170
+ " <th>2</th>\n",
171
+ " <td>1</td>\n",
172
+ " <td>Free entry in 2 a wkly comp to win FA Cup fina...</td>\n",
173
+ " </tr>\n",
174
+ " <tr>\n",
175
+ " <th>3</th>\n",
176
+ " <td>0</td>\n",
177
+ " <td>U dun say so early hor... U c already then say...</td>\n",
178
+ " </tr>\n",
179
+ " <tr>\n",
180
+ " <th>4</th>\n",
181
+ " <td>0</td>\n",
182
+ " <td>Nah I don't think he goes to usf, he lives aro...</td>\n",
183
+ " </tr>\n",
184
+ " </tbody>\n",
185
+ "</table>\n",
186
+ "</div>"
187
+ ],
188
+ "text/plain": [
189
+ " label message\n",
190
+ "0 0 Go until jurong point, crazy.. Available only ...\n",
191
+ "1 0 Ok lar... Joking wif u oni...\n",
192
+ "2 1 Free entry in 2 a wkly comp to win FA Cup fina...\n",
193
+ "3 0 U dun say so early hor... U c already then say...\n",
194
+ "4 0 Nah I don't think he goes to usf, he lives aro..."
195
+ ]
196
+ },
197
+ "execution_count": 3,
198
+ "metadata": {},
199
+ "output_type": "execute_result"
200
+ }
201
+ ],
202
+ "source": [
203
+ "# Convertir les labels en 0 (ham) et 1 (spam)\n",
204
+ "df['label'] = df['label'].map({'ham': 0, 'spam': 1})\n",
205
+ "\n",
206
+ "# Afficher les 5 premières lignes\n",
207
+ "df.head()"
208
+ ]
209
+ },
210
+ {
211
+ "cell_type": "code",
212
+ "execution_count": 4,
213
+ "id": "c4ea8a09",
214
+ "metadata": {},
215
+ "outputs": [
216
+ {
217
+ "data": {
218
+ "text/plain": [
219
+ "((5572, 8713), (5572,))"
220
+ ]
221
+ },
222
+ "execution_count": 4,
223
+ "metadata": {},
224
+ "output_type": "execute_result"
225
+ }
226
+ ],
227
+ "source": [
228
+ "# Convertir les messages en nombres\n",
229
+ "vectorizer = CountVectorizer()\n",
230
+ "X = vectorizer.fit_transform(df['message'])\n",
231
+ "\n",
232
+ "# Labels (0 ou 1)\n",
233
+ "y = df['label']\n",
234
+ "\n",
235
+ "# Afficher la taille des données\n",
236
+ "X.shape, y.shape"
237
+ ]
238
+ },
239
+ {
240
+ "cell_type": "markdown",
241
+ "id": "b1ccf31e",
242
+ "metadata": {},
243
+ "source": [
244
+ "`5572` est le nombre de messages converties & `8713` le nombre de caractéristiques pour identifier un Spam"
245
+ ]
246
+ },
247
+ {
248
+ "cell_type": "markdown",
249
+ "id": "efd4b561",
250
+ "metadata": {},
251
+ "source": [
252
+ "### Modélisation "
253
+ ]
254
+ },
255
+ {
256
+ "cell_type": "code",
257
+ "execution_count": 5,
258
+ "id": "aea723b8",
259
+ "metadata": {},
260
+ "outputs": [
261
+ {
262
+ "name": "stdout",
263
+ "output_type": "stream",
264
+ "text": [
265
+ "Précision du modèle : 98.57%\n"
266
+ ]
267
+ }
268
+ ],
269
+ "source": [
270
+ "# Séparer les données en entraînement (80%) et test (20%)\n",
271
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
272
+ "\n",
273
+ "# Créer et entraîner le modèle\n",
274
+ "model = MultinomialNB()\n",
275
+ "model.fit(X_train, y_train)\n",
276
+ "\n",
277
+ "# Prédire sur les données de test\n",
278
+ "y_pred = model.predict(X_test)\n",
279
+ "\n",
280
+ "# Évaluer la précision du modèle\n",
281
+ "accuracy = accuracy_score(y_test, y_pred)\n",
282
+ "print(f\"Précision du modèle : {accuracy * 100:.2f}%\")"
283
+ ]
284
+ },
285
+ {
286
+ "cell_type": "markdown",
287
+ "id": "f6eda2fa",
288
+ "metadata": {},
289
+ "source": [
290
+ "### Test"
291
+ ]
292
+ },
293
+ {
294
+ "cell_type": "code",
295
+ "execution_count": 6,
296
+ "id": "2d01ce1c",
297
+ "metadata": {},
298
+ "outputs": [
299
+ {
300
+ "name": "stdout",
301
+ "output_type": "stream",
302
+ "text": [
303
+ "SPAM ❌\n",
304
+ "HAM ✅\n"
305
+ ]
306
+ }
307
+ ],
308
+ "source": [
309
+ "def predict_spam(message):\n",
310
+ " message_transformed = vectorizer.transform([message])\n",
311
+ " prediction = model.predict(message_transformed)\n",
312
+ " return \"SPAM ❌\" if prediction[0] == 1 else \"HAM ✅\"\n",
313
+ "\n",
314
+ "# Tester avec un message\n",
315
+ "\n",
316
+ "print(predict_spam(\"Hey, you have winning cup. Give your account bank detail to keep your prize !\"))\n",
317
+ "print(predict_spam(\"Hey, well ? Ready for competition ?\"))\n"
318
+ ]
319
+ },
320
+ {
321
+ "cell_type": "code",
322
+ "execution_count": 7,
323
+ "id": "7e014dbc",
324
+ "metadata": {},
325
+ "outputs": [
326
+ {
327
+ "name": "stdout",
328
+ "output_type": "stream",
329
+ "text": [
330
+ "SPAM ❌\n",
331
+ "HAM ✅\n"
332
+ ]
333
+ }
334
+ ],
335
+ "source": [
336
+ "print(predict_spam(\"Congratulations! You've won a lottery. Claim your prize now!\"))\n",
337
+ "print(predict_spam(\"Don't forget our meeting tomorrow at 10 AM.\"))"
338
+ ]
339
+ },
340
+ {
341
+ "cell_type": "code",
342
+ "execution_count": 8,
343
+ "id": "c61d8311",
344
+ "metadata": {},
345
+ "outputs": [
346
+ {
347
+ "name": "stdout",
348
+ "output_type": "stream",
349
+ "text": [
350
+ "SPAM ❌\n"
351
+ ]
352
+ }
353
+ ],
354
+ "source": [
355
+ "print(predict_spam(\"Give me your credit card details to claim your prize!\"))"
356
+ ]
357
+ },
358
+ {
359
+ "cell_type": "code",
360
+ "execution_count": 9,
361
+ "id": "ef960679",
362
+ "metadata": {},
363
+ "outputs": [
364
+ {
365
+ "name": "stdout",
366
+ "output_type": "stream",
367
+ "text": [
368
+ "HAM ✅\n"
369
+ ]
370
+ }
371
+ ],
372
+ "source": [
373
+ "print(predict_spam(\"Hello friend, how are you doing today? , we are English class today, see you later!\"))"
374
+ ]
375
+ },
376
+ {
377
+ "cell_type": "code",
378
+ "execution_count": 10,
379
+ "id": "58f88820",
380
+ "metadata": {},
381
+ "outputs": [
382
+ {
383
+ "name": "stdout",
384
+ "output_type": "stream",
385
+ "text": [
386
+ "HAM ✅\n"
387
+ ]
388
+ }
389
+ ],
390
+ "source": [
391
+ "print(predict_spam(\"You are ugly , you need money, give your credit card details.\"))"
392
+ ]
393
+ },
394
+ {
395
+ "cell_type": "code",
396
+ "execution_count": 14,
397
+ "id": "8f4f505b",
398
+ "metadata": {},
399
+ "outputs": [
400
+ {
401
+ "data": {
402
+ "text/plain": [
403
+ "<Axes: xlabel='label', ylabel='count'>"
404
+ ]
405
+ },
406
+ "execution_count": 14,
407
+ "metadata": {},
408
+ "output_type": "execute_result"
409
+ },
410
+ {
411
+ "data": {
412
+ "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==",
413
+ "text/plain": [
414
+ "<Figure size 640x480 with 1 Axes>"
415
+ ]
416
+ },
417
+ "metadata": {},
418
+ "output_type": "display_data"
419
+ }
420
+ ],
421
+ "source": [
422
+ "sns.countplot(x='label', data=df)"
423
+ ]
424
+ },
425
+ {
426
+ "cell_type": "code",
427
+ "execution_count": null,
428
+ "id": "dba57e87",
429
+ "metadata": {},
430
+ "outputs": [],
431
+ "source": []
432
+ }
433
+ ],
434
+ "metadata": {
435
+ "kernelspec": {
436
+ "display_name": "base",
437
+ "language": "python",
438
+ "name": "python3"
439
+ },
440
+ "language_info": {
441
+ "codemirror_mode": {
442
+ "name": "ipython",
443
+ "version": 3
444
+ },
445
+ "file_extension": ".py",
446
+ "mimetype": "text/x-python",
447
+ "name": "python",
448
+ "nbconvert_exporter": "python",
449
+ "pygments_lexer": "ipython3",
450
+ "version": "3.12.7"
451
+ }
452
+ },
453
+ "nbformat": 4,
454
+ "nbformat_minor": 5
455
+ }