riyageorge commited on
Commit
c9a87cd
·
1 Parent(s): ef54a66

Upload 3 files

Browse files
lstm_smsspam_model.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d2dcb7b3b2911e84a301b8a74f6ae4af3bfa7878cac61939e3269c02c1f5b8bc
3
+ size 1775224
lstm_smsspam_model.ipynb ADDED
@@ -0,0 +1,413 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "#### SMS spam detection model using LSTM and glove embeddings"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "code",
12
+ "execution_count": 1,
13
+ "metadata": {},
14
+ "outputs": [],
15
+ "source": [
16
+ "import pandas as pd\n",
17
+ "from numpy import asarray\n",
18
+ "from numpy import zeros\n",
19
+ "import seaborn as sns\n",
20
+ "import matplotlib.pyplot as plt\n",
21
+ "import tensorflow as tf\n",
22
+ "from sklearn.model_selection import train_test_split\n",
23
+ "from sklearn.metrics import classification_report, confusion_matrix, accuracy_score\n",
24
+ "import pickle"
25
+ ]
26
+ },
27
+ {
28
+ "cell_type": "code",
29
+ "execution_count": 2,
30
+ "metadata": {},
31
+ "outputs": [],
32
+ "source": [
33
+ "def getGloveEmbeddings(glovefolderpath):\n",
34
+ " print(\"---------------------- Getting Glove Embeddings -------------------------\\n\")\n",
35
+ " embeddings_dictionary = dict()\n",
36
+ " glove_file = open(f\"{glovefolderpath}\", encoding=\"utf8\")\n",
37
+ " for line in glove_file:\n",
38
+ " records = line.split()\n",
39
+ " word = records[0]\n",
40
+ " vector_dimensions = asarray(records[1:], dtype='float32')\n",
41
+ " embeddings_dictionary [word] = vector_dimensions\n",
42
+ " glove_file.close()\n",
43
+ " print(\"---------------------- -------------------------\\n\")\n",
44
+ " return embeddings_dictionary"
45
+ ]
46
+ },
47
+ {
48
+ "cell_type": "code",
49
+ "execution_count": 3,
50
+ "metadata": {},
51
+ "outputs": [],
52
+ "source": [
53
+ "glove_folder=r'D:/STUDY/Sem3/deeplearning/glove.6B/glove.6B.50d.txt'\n",
54
+ "maxlen = 50"
55
+ ]
56
+ },
57
+ {
58
+ "cell_type": "code",
59
+ "execution_count": 4,
60
+ "metadata": {},
61
+ "outputs": [],
62
+ "source": [
63
+ "dataset = pd.read_csv('SMSSpamCollection.txt',sep='\\t',names=['label','message'])"
64
+ ]
65
+ },
66
+ {
67
+ "cell_type": "code",
68
+ "execution_count": 5,
69
+ "metadata": {},
70
+ "outputs": [],
71
+ "source": [
72
+ "dataset['label'] = dataset['label'].map( {'spam': 1, 'ham': 0} )\n",
73
+ "X = dataset['message'].values\n",
74
+ "y = dataset['label'].values"
75
+ ]
76
+ },
77
+ {
78
+ "cell_type": "code",
79
+ "execution_count": 6,
80
+ "metadata": {},
81
+ "outputs": [],
82
+ "source": [
83
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)"
84
+ ]
85
+ },
86
+ {
87
+ "cell_type": "code",
88
+ "execution_count": 7,
89
+ "metadata": {},
90
+ "outputs": [],
91
+ "source": [
92
+ "tokeniser = tf.keras.preprocessing.text.Tokenizer()\n",
93
+ "tokeniser.fit_on_texts(X_train)\n",
94
+ "\n",
95
+ "# Save the tokenizer using pickle\n",
96
+ "with open('lstm_smsspam_tokenizer.pickle', 'wb') as handle:\n",
97
+ " pickle.dump(tokeniser, handle, protocol=pickle.HIGHEST_PROTOCOL)\n",
98
+ "\n",
99
+ "X_train = tokeniser.texts_to_sequences(X_train)\n",
100
+ "X_test = tokeniser.texts_to_sequences(X_test)\n",
101
+ "vocab_size = len(tokeniser.word_index) + 1\n",
102
+ "X_train = tf.keras.preprocessing.sequence.pad_sequences(X_train, padding='post', maxlen=maxlen)\n",
103
+ "X_test = tf.keras.preprocessing.sequence.pad_sequences(X_test, padding='post', maxlen=maxlen)"
104
+ ]
105
+ },
106
+ {
107
+ "cell_type": "code",
108
+ "execution_count": 8,
109
+ "metadata": {},
110
+ "outputs": [
111
+ {
112
+ "name": "stdout",
113
+ "output_type": "stream",
114
+ "text": [
115
+ "---------------------- Getting Glove Embeddings -------------------------\n",
116
+ "\n",
117
+ "---------------------- -------------------------\n",
118
+ "\n"
119
+ ]
120
+ }
121
+ ],
122
+ "source": [
123
+ "embeddings_dictionary=getGloveEmbeddings(glove_folder)\n",
124
+ "embedding_matrix = zeros((vocab_size, maxlen))\n",
125
+ "for word, index in tokeniser.word_index.items():\n",
126
+ " embedding_vector = embeddings_dictionary.get(word)\n",
127
+ " if embedding_vector is not None:\n",
128
+ " embedding_matrix[index] = embedding_vector"
129
+ ]
130
+ },
131
+ {
132
+ "cell_type": "code",
133
+ "execution_count": 9,
134
+ "metadata": {},
135
+ "outputs": [],
136
+ "source": [
137
+ "model=tf.keras.models.Sequential([\n",
138
+ " tf.keras.layers.Embedding(input_dim=vocab_size,output_dim= maxlen, weights=[embedding_matrix], input_length=maxlen , trainable=False),\n",
139
+ " tf.keras.layers.LSTM(maxlen),\n",
140
+ " tf.keras.layers.Dense(1, activation='sigmoid')\n",
141
+ "]) "
142
+ ]
143
+ },
144
+ {
145
+ "cell_type": "code",
146
+ "execution_count": 10,
147
+ "metadata": {},
148
+ "outputs": [
149
+ {
150
+ "name": "stdout",
151
+ "output_type": "stream",
152
+ "text": [
153
+ "Model: \"sequential\"\n",
154
+ "_________________________________________________________________\n",
155
+ " Layer (type) Output Shape Param # \n",
156
+ "=================================================================\n",
157
+ " embedding (Embedding) (None, 50, 50) 375100 \n",
158
+ " \n",
159
+ " lstm (LSTM) (None, 50) 20200 \n",
160
+ " \n",
161
+ " dense (Dense) (None, 1) 51 \n",
162
+ " \n",
163
+ "=================================================================\n",
164
+ "Total params: 395351 (1.51 MB)\n",
165
+ "Trainable params: 20251 (79.11 KB)\n",
166
+ "Non-trainable params: 375100 (1.43 MB)\n",
167
+ "_________________________________________________________________\n",
168
+ "None\n"
169
+ ]
170
+ }
171
+ ],
172
+ "source": [
173
+ "print(model.summary())"
174
+ ]
175
+ },
176
+ {
177
+ "cell_type": "code",
178
+ "execution_count": 11,
179
+ "metadata": {},
180
+ "outputs": [],
181
+ "source": [
182
+ "early_stop = tf.keras.callbacks.EarlyStopping(monitor='accuracy', mode='min', patience=10)"
183
+ ]
184
+ },
185
+ {
186
+ "cell_type": "code",
187
+ "execution_count": 12,
188
+ "metadata": {},
189
+ "outputs": [],
190
+ "source": [
191
+ "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])"
192
+ ]
193
+ },
194
+ {
195
+ "cell_type": "code",
196
+ "execution_count": 13,
197
+ "metadata": {},
198
+ "outputs": [
199
+ {
200
+ "name": "stdout",
201
+ "output_type": "stream",
202
+ "text": [
203
+ "Epoch 1/50\n",
204
+ "98/98 [==============================] - 4s 18ms/step - loss: 0.4414 - accuracy: 0.8683 - val_loss: 0.4173 - val_accuracy: 0.8538\n",
205
+ "Epoch 2/50\n",
206
+ "98/98 [==============================] - 1s 12ms/step - loss: 0.3887 - accuracy: 0.8689 - val_loss: 0.4154 - val_accuracy: 0.8538\n",
207
+ "Epoch 3/50\n",
208
+ "98/98 [==============================] - 1s 12ms/step - loss: 0.3772 - accuracy: 0.8689 - val_loss: 0.2920 - val_accuracy: 0.8538\n",
209
+ "Epoch 4/50\n",
210
+ "98/98 [==============================] - 1s 12ms/step - loss: 0.1656 - accuracy: 0.9433 - val_loss: 0.1561 - val_accuracy: 0.9526\n",
211
+ "Epoch 5/50\n",
212
+ "98/98 [==============================] - 1s 12ms/step - loss: 0.1173 - accuracy: 0.9654 - val_loss: 0.1311 - val_accuracy: 0.9590\n",
213
+ "Epoch 6/50\n",
214
+ "98/98 [==============================] - 1s 12ms/step - loss: 0.1005 - accuracy: 0.9657 - val_loss: 0.1243 - val_accuracy: 0.9654\n",
215
+ "Epoch 7/50\n",
216
+ "98/98 [==============================] - 1s 12ms/step - loss: 0.0860 - accuracy: 0.9715 - val_loss: 0.1189 - val_accuracy: 0.9679\n",
217
+ "Epoch 8/50\n",
218
+ "98/98 [==============================] - 1s 12ms/step - loss: 0.0850 - accuracy: 0.9737 - val_loss: 0.1192 - val_accuracy: 0.9654\n",
219
+ "Epoch 9/50\n",
220
+ "98/98 [==============================] - 1s 12ms/step - loss: 0.0748 - accuracy: 0.9760 - val_loss: 0.1159 - val_accuracy: 0.9654\n",
221
+ "Epoch 10/50\n",
222
+ "98/98 [==============================] - 1s 12ms/step - loss: 0.0666 - accuracy: 0.9808 - val_loss: 0.1291 - val_accuracy: 0.9667\n",
223
+ "Epoch 11/50\n",
224
+ "98/98 [==============================] - 1s 12ms/step - loss: 0.0658 - accuracy: 0.9801 - val_loss: 0.1123 - val_accuracy: 0.9692\n"
225
+ ]
226
+ }
227
+ ],
228
+ "source": [
229
+ "history=model.fit(x=X_train,\n",
230
+ " y=y_train,\n",
231
+ " epochs=50,\n",
232
+ " callbacks=[early_stop],\n",
233
+ " validation_split=0.2\n",
234
+ " )"
235
+ ]
236
+ },
237
+ {
238
+ "cell_type": "code",
239
+ "execution_count": 14,
240
+ "metadata": {},
241
+ "outputs": [],
242
+ "source": [
243
+ "def c_report(y_true, y_pred):\n",
244
+ " print(\"Classification Report\")\n",
245
+ " print(classification_report(y_true, y_pred))\n",
246
+ " acc_sc = accuracy_score(y_true, y_pred)\n",
247
+ " print(f\"Accuracy : {str(round(acc_sc,2)*100)}\")\n",
248
+ " return acc_sc\n",
249
+ "def plot_confusion_matrix(y_true, y_pred):\n",
250
+ " mtx = confusion_matrix(y_true, y_pred)\n",
251
+ " sns.heatmap(mtx, annot=True, fmt='d', linewidths=.5, cmap=\"Blues\", cbar=False)\n",
252
+ " plt.ylabel('True label')\n",
253
+ " plt.xlabel('Predicted label')\n",
254
+ " plt.show()"
255
+ ]
256
+ },
257
+ {
258
+ "cell_type": "code",
259
+ "execution_count": 15,
260
+ "metadata": {},
261
+ "outputs": [
262
+ {
263
+ "name": "stdout",
264
+ "output_type": "stream",
265
+ "text": [
266
+ "53/53 [==============================] - 1s 4ms/step\n",
267
+ "Classification Report\n",
268
+ " precision recall f1-score support\n",
269
+ "\n",
270
+ " 0 0.97 1.00 0.99 1448\n",
271
+ " 1 0.97 0.83 0.90 224\n",
272
+ "\n",
273
+ " accuracy 0.97 1672\n",
274
+ " macro avg 0.97 0.92 0.94 1672\n",
275
+ "weighted avg 0.97 0.97 0.97 1672\n",
276
+ "\n",
277
+ "Accuracy : 97.0\n"
278
+ ]
279
+ },
280
+ {
281
+ "data": {
282
+ "image/png": "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",
283
+ "text/plain": [
284
+ "<Figure size 640x480 with 1 Axes>"
285
+ ]
286
+ },
287
+ "metadata": {},
288
+ "output_type": "display_data"
289
+ }
290
+ ],
291
+ "source": [
292
+ "preds = (model.predict(X_test) > 0.5).astype(\"int32\")\n",
293
+ "c_report(y_test, preds)\n",
294
+ "plot_confusion_matrix(y_test, preds)"
295
+ ]
296
+ },
297
+ {
298
+ "cell_type": "code",
299
+ "execution_count": 16,
300
+ "metadata": {},
301
+ "outputs": [
302
+ {
303
+ "name": "stderr",
304
+ "output_type": "stream",
305
+ "text": [
306
+ "d:\\STUDY\\Sem3\\deeplearning\\DLENV\\lib\\site-packages\\keras\\src\\engine\\training.py:3079: UserWarning: You are saving your model as an HDF5 file via `model.save()`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')`.\n",
307
+ " saving_api.save_model(\n"
308
+ ]
309
+ }
310
+ ],
311
+ "source": [
312
+ "# Save the model\n",
313
+ "model.save('lstm_smsspam_model.h5')"
314
+ ]
315
+ },
316
+ {
317
+ "cell_type": "code",
318
+ "execution_count": 17,
319
+ "metadata": {},
320
+ "outputs": [],
321
+ "source": [
322
+ "lstm_smsspam_model=tf.keras.models.load_model('lstm_smsspam_model.h5')"
323
+ ]
324
+ },
325
+ {
326
+ "cell_type": "code",
327
+ "execution_count": 18,
328
+ "metadata": {},
329
+ "outputs": [],
330
+ "source": [
331
+ "def predict_sms_sentiment(message):\n",
332
+ " sequence = tokeniser.texts_to_sequences([message])\n",
333
+ " sequence = tf.keras.preprocessing.sequence.pad_sequences(sequence, padding='post', maxlen=maxlen)\n",
334
+ " prediction = lstm_smsspam_model.predict(sequence)[0, 0]\n",
335
+ " if prediction > 0.5:\n",
336
+ " return 'Spam'\n",
337
+ " else:\n",
338
+ " return 'Not spam'\n",
339
+ "\n"
340
+ ]
341
+ },
342
+ {
343
+ "cell_type": "code",
344
+ "execution_count": 19,
345
+ "metadata": {},
346
+ "outputs": [
347
+ {
348
+ "name": "stdout",
349
+ "output_type": "stream",
350
+ "text": [
351
+ "1/1 [==============================] - 0s 499ms/step\n",
352
+ "The message is classified as: Not spam\n"
353
+ ]
354
+ }
355
+ ],
356
+ "source": [
357
+ "# Example usage:\n",
358
+ "sample_message = \"Check out this amazing offer!\"\n",
359
+ "result = predict_sms_sentiment(sample_message)\n",
360
+ "print(f\"The message is classified as: {result}\")"
361
+ ]
362
+ },
363
+ {
364
+ "cell_type": "code",
365
+ "execution_count": 20,
366
+ "metadata": {},
367
+ "outputs": [
368
+ {
369
+ "name": "stdout",
370
+ "output_type": "stream",
371
+ "text": [
372
+ "1/1 [==============================] - 0s 23ms/step\n",
373
+ "The message is classified as: Spam\n"
374
+ ]
375
+ }
376
+ ],
377
+ "source": [
378
+ "# Example usage:\n",
379
+ "sample_message = \"BangBabes Ur order is on the way. U SHOULD receive a Service Msg 2 download UR content. If U do not, GoTo wap. bangb. tv on UR mobile internet/service menu\"\n",
380
+ "result = predict_sms_sentiment(sample_message)\n",
381
+ "print(f\"The message is classified as: {result}\")"
382
+ ]
383
+ },
384
+ {
385
+ "cell_type": "code",
386
+ "execution_count": null,
387
+ "metadata": {},
388
+ "outputs": [],
389
+ "source": []
390
+ }
391
+ ],
392
+ "metadata": {
393
+ "kernelspec": {
394
+ "display_name": "DLENV",
395
+ "language": "python",
396
+ "name": "python3"
397
+ },
398
+ "language_info": {
399
+ "codemirror_mode": {
400
+ "name": "ipython",
401
+ "version": 3
402
+ },
403
+ "file_extension": ".py",
404
+ "mimetype": "text/x-python",
405
+ "name": "python",
406
+ "nbconvert_exporter": "python",
407
+ "pygments_lexer": "ipython3",
408
+ "version": "3.10.11"
409
+ }
410
+ },
411
+ "nbformat": 4,
412
+ "nbformat_minor": 2
413
+ }
lstm_smsspam_tokenizer.pickle ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:396cfc85560227160d9b6ee7b9cabd78445fb71d79cb5bfba780b736f3bf5af2
3
+ size 290462