File size: 62,990 Bytes
5879a10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": [],
      "gpuType": "T4"
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "source": [
        "# LSTM"
      ],
      "metadata": {
        "id": "l9vkq1kvsWn0"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Imports"
      ],
      "metadata": {
        "id": "Ps_SnZslesHt"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import time\n",
        "import joblib\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "import tensorflow as tf\n",
        "\n",
        "from tensorflow.keras.preprocessing.text import Tokenizer\n",
        "from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
        "\n",
        "from tensorflow.keras.models import Sequential\n",
        "from tensorflow.keras.layers import (\n",
        "    Embedding,\n",
        "    LSTM,\n",
        "    Dense,\n",
        "    Dropout,\n",
        "    SpatialDropout1D,\n",
        "    Input\n",
        ")\n",
        "\n",
        "from tensorflow.keras.callbacks import (\n",
        "    EarlyStopping,\n",
        "    ModelCheckpoint,\n",
        "    ReduceLROnPlateau\n",
        ")\n",
        "\n",
        "from sklearn.metrics import (\n",
        "    accuracy_score,\n",
        "    precision_score,\n",
        "    recall_score,\n",
        "    f1_score,\n",
        "    roc_auc_score,\n",
        "    confusion_matrix,\n",
        "    classification_report,\n",
        "    ConfusionMatrixDisplay\n",
        ")"
      ],
      "metadata": {
        "id": "1OrUe3_Dd4Vh"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "x_train = joblib.load(\"/content/x_train.pkl\")\n",
        "x_test = joblib.load(\"/content/x_test.pkl\")\n",
        "\n",
        "y_train = joblib.load(\"/content/y_train.pkl\")\n",
        "y_test = joblib.load(\"/content/y_test.pkl\")"
      ],
      "metadata": {
        "id": "vzYgMugWd3yz"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"x_train:\", x_train.shape)\n",
        "print(\"x_test :\", x_test.shape)\n",
        "\n",
        "print(\"y_train:\", y_train.shape)\n",
        "print(\"y_test :\", y_test.shape)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "e8AWpW-zsKK6",
        "outputId": "8cb72de2-b114-4638-981c-0a5df95b4173"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "x_train: (1274150,)\n",
            "x_test : (318538,)\n",
            "y_train: (1274150,)\n",
            "y_test : (318538,)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Train Missing:\", x_train.isna().sum())\n",
        "print(\"Test Missing :\", x_test.isna().sum())"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "mJvlio_bsKIq",
        "outputId": "1ac85cdd-c2be-46c1-da53-270001d21b7c"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Missing: 0\n",
            "Test Missing : 0\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Tokenizer"
      ],
      "metadata": {
        "id": "MCombP8humm9"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "VOCAB_SIZE = 50000\n",
        "\n",
        "tokenizer = Tokenizer(\n",
        "    num_words=VOCAB_SIZE,\n",
        "    oov_token=\"<OOV>\"\n",
        ")"
      ],
      "metadata": {
        "id": "OQHenEKEsKGV"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "tokenizer.fit_on_texts(x_train)"
      ],
      "metadata": {
        "id": "JfTDyZ6psKD2"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "joblib.dump(tokenizer, \"tokenizer.pkl\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "WZcO6sCBsKBG",
        "outputId": "c2b97edc-21ed-462d-e4bf-dbc3ee949844"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "['tokenizer.pkl']"
            ]
          },
          "metadata": {},
          "execution_count": 7
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Text ---> Sequences"
      ],
      "metadata": {
        "id": "EvcFck9TwZUv"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "x_tr_seq = tokenizer.texts_to_sequences(x_train)\n",
        "x_te_seq = tokenizer.texts_to_sequences(x_test)"
      ],
      "metadata": {
        "id": "g-jDOeHqsJ-o"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "Frjygx0TsJ8L"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "seq_len = [len(seq) for seq in x_tr_seq]\n",
        "\n",
        "print(\"Maximum Length :\", max(seq_len))\n",
        "print(\"Minimum Length :\", min(seq_len))\n",
        "print(\"Average Length :\", np.mean(seq_len))\n",
        "print(\"Median Length  :\", np.median(seq_len))\n",
        "print(\"95th Percentile:\", np.percentile(seq_len, 95))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "UmQSp1VAsJ5g",
        "outputId": "ac2d6d41-9d06-4c80-e79b-cee62a56c1ea"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Maximum Length : 56\n",
            "Minimum Length : 1\n",
            "Average Length : 7.173818624180827\n",
            "Median Length  : 7.0\n",
            "95th Percentile: 14.0\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "8nfFjc1SsJ29"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Pad the Seqences"
      ],
      "metadata": {
        "id": "sixzdhuKxy0h"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "MAX_LENGTH = 20\n",
        "\n",
        "x_tr_pad = pad_sequences(\n",
        "    x_tr_seq,\n",
        "    maxlen=MAX_LENGTH,\n",
        "    padding=\"post\",\n",
        "    truncating=\"post\"\n",
        ")\n",
        "\n",
        "x_te_pad = pad_sequences(\n",
        "    x_te_seq,\n",
        "    maxlen=MAX_LENGTH,\n",
        "    padding=\"post\",\n",
        "    truncating=\"post\"\n",
        ")"
      ],
      "metadata": {
        "id": "jQ-zxn-isJ0c"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(x_tr_pad.shape)\n",
        "print(x_te_pad.shape)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "SJsgGBonsJvR",
        "outputId": "5175a97c-c148-466b-a8b4-2a06e3ffcc8f"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "(1274150, 20)\n",
            "(318538, 20)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "A6UTTybVsJso"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "4qDNSuxtsJpz"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Model"
      ],
      "metadata": {
        "id": "ZebEGtVtzHzx"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "VOCAB_SIZE = 50000\n",
        "EMBEDDING_DIM = 128\n",
        "\n",
        "model = Sequential([\n",
        "    Input(\n",
        "        shape=(MAX_LENGTH,)\n",
        "    ),\n",
        "\n",
        "    Embedding(\n",
        "        input_dim=VOCAB_SIZE,\n",
        "        output_dim=EMBEDDING_DIM,\n",
        "    ),\n",
        "    SpatialDropout1D(0.2),\n",
        "\n",
        "    LSTM(\n",
        "        128,\n",
        "        dropout=0.2,\n",
        "        recurrent_dropout=0.2\n",
        "    ),\n",
        "\n",
        "    Dense(\n",
        "        64,\n",
        "        activation=\"relu\"\n",
        "    ),\n",
        "    Dropout(0.3),\n",
        "    Dense(\n",
        "        1,\n",
        "        activation=\"sigmoid\"\n",
        "    )\n",
        "])"
      ],
      "metadata": {
        "id": "mrBR29F_sJnH"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "model.summary()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 334
        },
        "id": "XWiv-DmVsJiJ",
        "outputId": "90f32915-4edd-45a8-8469-7cefb436028d"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "\u001b[1mModel: \"sequential\"\u001b[0m\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
              "┃\u001b[1m \u001b[0m\u001b[1mLayer (type)                   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape          \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
              "┑━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
              "β”‚ embedding (\u001b[38;5;33mEmbedding\u001b[0m)           β”‚ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m20\u001b[0m, \u001b[38;5;34m128\u001b[0m)        β”‚     \u001b[38;5;34m6,400,000\u001b[0m β”‚\n",
              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
              "β”‚ spatial_dropout1d               β”‚ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m20\u001b[0m, \u001b[38;5;34m128\u001b[0m)        β”‚             \u001b[38;5;34m0\u001b[0m β”‚\n",
              "β”‚ (\u001b[38;5;33mSpatialDropout1D\u001b[0m)              β”‚                        β”‚               β”‚\n",
              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
              "β”‚ lstm (\u001b[38;5;33mLSTM\u001b[0m)                     β”‚ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m)            β”‚       \u001b[38;5;34m131,584\u001b[0m β”‚\n",
              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
              "β”‚ dense (\u001b[38;5;33mDense\u001b[0m)                   β”‚ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m)             β”‚         \u001b[38;5;34m8,256\u001b[0m β”‚\n",
              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
              "β”‚ dropout (\u001b[38;5;33mDropout\u001b[0m)               β”‚ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m)             β”‚             \u001b[38;5;34m0\u001b[0m β”‚\n",
              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
              "β”‚ dense_1 (\u001b[38;5;33mDense\u001b[0m)                 β”‚ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m)              β”‚            \u001b[38;5;34m65\u001b[0m β”‚\n",
              "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
              "┃<span style=\"font-weight: bold\"> Layer (type)                    </span>┃<span style=\"font-weight: bold\"> Output Shape           </span>┃<span style=\"font-weight: bold\">       Param # </span>┃\n",
              "┑━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
              "β”‚ embedding (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Embedding</span>)           β”‚ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">20</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)        β”‚     <span style=\"color: #00af00; text-decoration-color: #00af00\">6,400,000</span> β”‚\n",
              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
              "β”‚ spatial_dropout1d               β”‚ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">20</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)        β”‚             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> β”‚\n",
              "β”‚ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">SpatialDropout1D</span>)              β”‚                        β”‚               β”‚\n",
              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
              "β”‚ lstm (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LSTM</span>)                     β”‚ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)            β”‚       <span style=\"color: #00af00; text-decoration-color: #00af00\">131,584</span> β”‚\n",
              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
              "β”‚ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                   β”‚ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>)             β”‚         <span style=\"color: #00af00; text-decoration-color: #00af00\">8,256</span> β”‚\n",
              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
              "β”‚ dropout (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>)               β”‚ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>)             β”‚             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> β”‚\n",
              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
              "β”‚ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                 β”‚ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>)              β”‚            <span style=\"color: #00af00; text-decoration-color: #00af00\">65</span> β”‚\n",
              "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m6,539,905\u001b[0m (24.95 MB)\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">6,539,905</span> (24.95 MB)\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m6,539,905\u001b[0m (24.95 MB)\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">6,539,905</span> (24.95 MB)\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Compile"
      ],
      "metadata": {
        "id": "AwAvOcPA1oQN"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "model.compile(\n",
        "    optimizer='adam',\n",
        "    loss=\"binary_crossentropy\",\n",
        "    metrics=[\n",
        "        \"accuracy\",\n",
        "        tf.keras.metrics.Precision(name=\"precision\"),\n",
        "        tf.keras.metrics.Recall(name=\"recall\")\n",
        "    ]\n",
        ")"
      ],
      "metadata": {
        "id": "HJlrikASsJfg"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "O8NifrsMsJdI"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "early_stop = EarlyStopping(\n",
        "    monitor=\"val_loss\",\n",
        "    patience=3,\n",
        "    restore_best_weights=True,\n",
        "    verbose=1\n",
        ")\n",
        "checkpoints = ModelCheckpoint(\n",
        "    \"best_model.keras\",\n",
        "    monitor=\"val_accuracy\",\n",
        "    save_best_only=True,\n",
        "    verbose=1\n",
        ")\n",
        "reduce_lr = ReduceLROnPlateau(\n",
        "    monitor=\"val_loss\",\n",
        "    factor=0.5,\n",
        "    patience=2,\n",
        "    min_lr=1e-6,\n",
        "    verbose=1\n",
        ")"
      ],
      "metadata": {
        "id": "AzUc0NVIsJau"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Training"
      ],
      "metadata": {
        "id": "Wlyn34aj3oDA"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.utils import validation\n",
        "start = time.time()\n",
        "\n",
        "history = model.fit(\n",
        "    x_tr_pad,\n",
        "    y_train,\n",
        "    validation_split=0.2,\n",
        "    epochs=10,\n",
        "    batch_size=512,\n",
        "    callbacks=[\n",
        "        early_stop,\n",
        "        checkpoints,\n",
        "        reduce_lr\n",
        "    ],\n",
        "    verbose=1\n",
        ")\n",
        "end = time.time()\n",
        "print(f\"Training Time: {(end-start)/60:.2f} Minutes\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "kReOXN6LsJYn",
        "outputId": "e65150ab-06fe-46ef-e748-a1c8dd774e9e"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch 1/10\n",
            "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 82ms/step - accuracy: 0.7399 - loss: 0.5163 - precision: 0.7453 - recall: 0.7173\n",
            "Epoch 1: val_accuracy improved from None to 0.78913, saving model to best_model.keras\n",
            "\n",
            "Epoch 1: finished saving model to best_model.keras\n",
            "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m179s\u001b[0m 86ms/step - accuracy: 0.7698 - loss: 0.4823 - precision: 0.7717 - recall: 0.7663 - val_accuracy: 0.7891 - val_loss: 0.4493 - val_precision: 0.7778 - val_recall: 0.8099 - learning_rate: 0.0010\n",
            "Epoch 2/10\n",
            "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 81ms/step - accuracy: 0.7967 - loss: 0.4381 - precision: 0.7965 - recall: 0.7969\n",
            "Epoch 2: val_accuracy improved from 0.78913 to 0.79325, saving model to best_model.keras\n",
            "\n",
            "Epoch 2: finished saving model to best_model.keras\n",
            "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m195s\u001b[0m 84ms/step - accuracy: 0.7964 - loss: 0.4384 - precision: 0.7951 - recall: 0.7987 - val_accuracy: 0.7933 - val_loss: 0.4453 - val_precision: 0.8063 - val_recall: 0.7723 - learning_rate: 0.0010\n",
            "Epoch 3/10\n",
            "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 80ms/step - accuracy: 0.8081 - loss: 0.4171 - precision: 0.8044 - recall: 0.8144\n",
            "Epoch 3: val_accuracy improved from 0.79325 to 0.79373, saving model to best_model.keras\n",
            "\n",
            "Epoch 3: finished saving model to best_model.keras\n",
            "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m203s\u001b[0m 85ms/step - accuracy: 0.8066 - loss: 0.4199 - precision: 0.8039 - recall: 0.8109 - val_accuracy: 0.7937 - val_loss: 0.4453 - val_precision: 0.7762 - val_recall: 0.8258 - learning_rate: 0.0010\n",
            "Epoch 4/10\n",
            "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 79ms/step - accuracy: 0.8173 - loss: 0.3994 - precision: 0.8139 - recall: 0.8231\n",
            "Epoch 4: val_accuracy improved from 0.79373 to 0.79448, saving model to best_model.keras\n",
            "\n",
            "Epoch 4: finished saving model to best_model.keras\n",
            "\n",
            "Epoch 4: ReduceLROnPlateau reducing learning rate to 0.0005000000237487257.\n",
            "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m166s\u001b[0m 83ms/step - accuracy: 0.8152 - loss: 0.4032 - precision: 0.8114 - recall: 0.8212 - val_accuracy: 0.7945 - val_loss: 0.4457 - val_precision: 0.7865 - val_recall: 0.8087 - learning_rate: 0.0010\n",
            "Epoch 5/10\n",
            "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 79ms/step - accuracy: 0.8294 - loss: 0.3765 - precision: 0.8254 - recall: 0.8359\n",
            "Epoch 5: val_accuracy did not improve from 0.79448\n",
            "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m201s\u001b[0m 83ms/step - accuracy: 0.8283 - loss: 0.3783 - precision: 0.8241 - recall: 0.8345 - val_accuracy: 0.7924 - val_loss: 0.4627 - val_precision: 0.7882 - val_recall: 0.7999 - learning_rate: 5.0000e-04\n",
            "Epoch 5: early stopping\n",
            "Restoring model weights from the end of the best epoch: 2.\n",
            "Training Time: 15.72 Minutes\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "3-EX7i2csJWD"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "y_prob = model.predict(x_te_pad)\n",
        "y_pred = (y_prob > 0.5).astype(int)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "WLkouK_fsJT_",
        "outputId": "ff917286-b49e-4b3c-de86-2f880da57131"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\u001b[1m9955/9955\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m153s\u001b[0m 15ms/step\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "y_pred = y_pred.ravel()"
      ],
      "metadata": {
        "id": "1Bx1coEQsJRp"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(f\"Accuracy : {accuracy_score(y_test, y_pred):.4f}\")\n",
        "print(f\"Precision: {precision_score(y_test, y_pred):.4f}\")\n",
        "print(f\"Recall   : {recall_score(y_test, y_pred):.4f}\")\n",
        "print(f\"F1 Score : {f1_score(y_test, y_pred):.4f}\")\n",
        "print(f\"ROC AUC  : {roc_auc_score(y_test, y_prob):.4f}\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "39c8TmjXsJPI",
        "outputId": "0581cab8-6aef-4571-aa9a-11a1e305fd2b"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Accuracy : 0.7920\n",
            "Precision: 0.8045\n",
            "Recall   : 0.7715\n",
            "F1 Score : 0.7877\n",
            "ROC AUC  : 0.8753\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Classification Report:\\n\")\n",
        "\n",
        "print(classification_report(y_test, y_pred))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "4z3tYl-OsJMo",
        "outputId": "7f3159b6-af16-40ec-9ba4-bd6f9c6ea37f"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Classification Report:\n",
            "\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.78      0.81      0.80    159267\n",
            "           1       0.80      0.77      0.79    159271\n",
            "\n",
            "    accuracy                           0.79    318538\n",
            "   macro avg       0.79      0.79      0.79    318538\n",
            "weighted avg       0.79      0.79      0.79    318538\n",
            "\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.metrics import ConfusionMatrixDisplay\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "ConfusionMatrixDisplay.from_predictions(\n",
        "    y_test,\n",
        "    y_pred,\n",
        "    cmap=\"Blues\"\n",
        ")\n",
        "\n",
        "plt.title(\"LSTM Confusion Matrix\")\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 472
        },
        "id": "I1MTSsDXsJKL",
        "outputId": "ecf84330-1e9f-40af-8558-6cec2603091e"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 2 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "model.save(\"lstm_sentiment.keras\")"
      ],
      "metadata": {
        "id": "iO8CfQ5wsJHy"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "model.save(\"best_lstm.keras\")\n",
        "joblib.dump(history.history, \"history.pkl\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "O32y6s71sJFQ",
        "outputId": "7ee9c0ca-560f-4790-e0f2-fa80074f1a65"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "['history.pkl']"
            ]
          },
          "metadata": {},
          "execution_count": 23
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "rjjC2euYsJAx"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "gNHRcmGnsI-D"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "_B8533AZsI7v"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "U_wCt3INsI5J"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "1-lxanohsI08"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "M8v7NDmIsGrs"
      },
      "outputs": [],
      "source": []
    }
  ]
}