File size: 57,084 Bytes
c161b3b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## __Exploratory Data Analysis__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "## importing libraries\n",
    "\n",
    "import numpy as numpy\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "import sys\n",
    "import os\n",
    "\n",
    "import re\n",
    "import nltk\n",
    "from nltk.corpus import stopwords\n",
    "from nltk.stem import PorterStemmer\n",
    "from nltk.stem import WordNetLemmatizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>row</th>\n",
       "      <th>col</th>\n",
       "      <th>latitude</th>\n",
       "      <th>longitude</th>\n",
       "      <th>Map Data</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>18.89433</td>\n",
       "      <td>72.784597</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>18.89433</td>\n",
       "      <td>72.794102</td>\n",
       "      <td>Prongs Reef is a Natural;</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>18.89433</td>\n",
       "      <td>72.803607</td>\n",
       "      <td>United Services Club Golf Course is a Leisure ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>18.89433</td>\n",
       "      <td>72.813112</td>\n",
       "      <td>Indian Meterological Department is a Commercia...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>18.89433</td>\n",
       "      <td>72.822617</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   row  col  latitude  longitude  \\\n",
       "0    0    0  18.89433  72.784597   \n",
       "1    0    1  18.89433  72.794102   \n",
       "2    0    2  18.89433  72.803607   \n",
       "3    0    3  18.89433  72.813112   \n",
       "4    0    4  18.89433  72.822617   \n",
       "\n",
       "                                            Map Data  \n",
       "0                                                NaN  \n",
       "1                         Prongs Reef is a Natural;   \n",
       "2  United Services Club Golf Course is a Leisure ...  \n",
       "3  Indian Meterological Department is a Commercia...  \n",
       "4                                                NaN  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_folder = os.path.join(os.path.dirname(os.getcwd()), 'data')\n",
    "data_file = os.path.join(data_folder, 'MMR_DATA.csv')\n",
    "df = pd.read_csv(data_file)\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>row</th>\n",
       "      <th>col</th>\n",
       "      <th>latitude</th>\n",
       "      <th>longitude</th>\n",
       "      <th>Map Data</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>18.89433</td>\n",
       "      <td>72.784597</td>\n",
       "      <td></td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>18.89433</td>\n",
       "      <td>72.794102</td>\n",
       "      <td>Prongs Reef is a Natural;</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>18.89433</td>\n",
       "      <td>72.803607</td>\n",
       "      <td>United Services Club Golf Course is a Leisure ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>18.89433</td>\n",
       "      <td>72.813112</td>\n",
       "      <td>Indian Meterological Department is a Commercia...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>18.89433</td>\n",
       "      <td>72.822617</td>\n",
       "      <td></td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   row  col  latitude  longitude  \\\n",
       "0    0    0  18.89433  72.784597   \n",
       "1    0    1  18.89433  72.794102   \n",
       "2    0    2  18.89433  72.803607   \n",
       "3    0    3  18.89433  72.813112   \n",
       "4    0    4  18.89433  72.822617   \n",
       "\n",
       "                                            Map Data  \n",
       "0                                                     \n",
       "1                         Prongs Reef is a Natural;   \n",
       "2  United Services Club Golf Course is a Leisure ...  \n",
       "3  Indian Meterological Department is a Commercia...  \n",
       "4                                                     "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## filling the NaN values in the Map Data Column with empty string\n",
    "\n",
    "df['Map Data'] = df['Map Data'].fillna('')\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1225"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_len_explore = df.copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Map Data</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td></td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Prongs Reef is a Natural;</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>United Services Club Golf Course is a Leisure ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Indian Meterological Department is a Commercia...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td></td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                            Map Data\n",
       "0                                                   \n",
       "1                         Prongs Reef is a Natural; \n",
       "2  United Services Club Golf Course is a Leisure ...\n",
       "3  Indian Meterological Department is a Commercia...\n",
       "4                                                   "
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## dropping the columns that are not needed for the analysis\n",
    "\n",
    "df_len_explore = df_len_explore.drop(columns=['row', 'col', 'latitude', 'longitude'])\n",
    "df_len_explore.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "791"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## dropping the rows with 0 string length and string length > 5000\n",
    "\n",
    "df_len_explore = df_len_explore[df_len_explore['Map Data'].str.len() > 0]\n",
    "df_len_explore = df_len_explore[df_len_explore['Map Data'].str.len() < 5000]\n",
    "len(df_len_explore)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Discarded rows:  434 / 1225\n"
     ]
    }
   ],
   "source": [
    "print('Discarded rows: ', len(df) - len(df_len_explore), '/', len(df))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Mean string length:  834.7509481668774\n",
      "80th  percentile string length:  1560.0\n"
     ]
    }
   ],
   "source": [
    "## mean of the string length\n",
    "\n",
    "print('Mean string length: ', df_len_explore['Map Data'].str.len().mean())\n",
    "print('80th  percentile string length: ', df_len_explore['Map Data'].str.len().quantile(0.8))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.lines.Line2D at 0x1c5b27a9790>"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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9913nw4ePBi0jw4dOsjlcgUts2fPDuWwAABAIxfSnZvnzZunBx98UPfff79SUlLqHJOYmKhXX331nPupqKhQjx499OCDD2rUqFFB244fP64tW7boV7/6lXr06KGjR4/qoYce0u23365NmzYFjX366ac1YcKEwHOPxxPKYQEAgEYupOCze/fu846JjIzUuHHjzjlm6NChGjp0aJ3bYmNjtXr16qB1L774oq677jodOHBA7dq1C6z3eDxKTk6+gMoBAICThXSpa8GCBVqyZEmt9UuWLNHrr79+yUWdTWlpqVwul+Li4oLWz549W61bt9a1116rOXPmqLq6+pz78fv98vl8QQsAAGj8Qgo+OTk5SkhIqLU+MTFRv/nNby65qLqcPHlSjz/+uMaMGaOYmJjA+p///OdavHix1q1bp0mTJuk3v/mNpk2bds595eTkKDY2NrCkp6eHpWYAAGAvIV3qOnDggDp27Fhrffv27XXgwIFLLupMVVVV+u///m8ZhqF58+YFbcvOzg78uXv37oqMjNSkSZOUk5Mjt9td5/6mT58e9Dqfz0f4sdqzz0rHj0vR0VZXYrlnb31Wx6uOK7oZvQAAs4UUfBITE7V9+3Z16NAhaP1nn32m1q1bm1FXwHeh56uvvtLatWuDzvbUJSMjQ9XV1dq/f786d+5c5xi3233WUASL3HOP1RXYxj3d6AUAhEtIwWfMmDH6+c9/Lo/Ho5tuukmSlJeXp4ceekh33323acV9F3p2796tdevWXVCo2rZtm5o0aaLExETT6gAAAI1DSMHn17/+tfbv368BAwYoIuL0LmpqanTfffdd1Byf8vJy7dmzJ/B837592rZtm+Lj45WSkqIf/ehH2rJli5YvX65Tp06p+D/f4xQfH6/IyEjl5+dr48aN6t+/vzwej/Lz8zV16lTde++9atWqVSiHBgAAGjGXYRhGqC/etWuXPvvsM0VFRalbt25q3779Rb1+/fr16t+/f63148aN01NPPVXnPCJJWrdunfr166ctW7bopz/9qf71r3/J7/erY8eO+vGPf6zs7OyLupTl8/kUGxur0tLS815Ku1gdnlhRa93+2cNNfY9GoaBAqq6WIiKks1yidIqCbwpUXVOtiCYR6pzg7F4AwLmE8vv7koJPY0HwsYG2bU9/O3tamlRYaHU1lmqb21beMq/SPGkqzHZ2LwDg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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "## plotting lenth of strings in the Map Data Column, mean and 75th percentile\n",
    "\n",
    "df_len_explore['Map Data'].str.len().plot(kind='hist', bins=100)\n",
    "plt.axvline(df_len_explore['Map Data'].str.len().mean(), color='red', linestyle='dashed', linewidth=2)\n",
    "plt.axvline(df_len_explore['Map Data'].str.len().quantile(0.80), color='green', linestyle='dashed', linewidth=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Same visualization, post cleaning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[nltk_data] Downloading package stopwords to C:\\Users\\Akhil\n",
      "[nltk_data]     PC\\AppData\\Roaming\\nltk_data...\n",
      "[nltk_data]   Package stopwords is already up-to-date!\n",
      "[nltk_data] Downloading package wordnet to C:\\Users\\Akhil\n",
      "[nltk_data]     PC\\AppData\\Roaming\\nltk_data...\n",
      "[nltk_data]   Package wordnet is already up-to-date!\n"
     ]
    }
   ],
   "source": [
    "nltk.download('stopwords')\n",
    "nltk.download('wordnet')\n",
    "\n",
    "stop_words = set(stopwords.words('english'))\n",
    "stemmer = PorterStemmer()\n",
    "lemmatizer = WordNetLemmatizer()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "## cleaning the strings, stemming and lemmatizing\n",
    "\n",
    "def clean_text(text):\n",
    "    text = re.sub(r'[^\\w\\s]', '', text)\n",
    "    text = text.lower()\n",
    "    text = [word for word in text.split() if word not in stop_words]\n",
    "    text = [stemmer.stem(word) for word in text] \n",
    "    text = [lemmatizer.lemmatize(word) for word in text]\n",
    "    return ' '.join(text)\n",
    "\n",
    "df_len_explore['Map Data'] = df_len_explore['Map Data'].apply(clean_text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Mean string length:  596.3046776232617\n",
      "80th  percentile string length:  1114.0\n"
     ]
    }
   ],
   "source": [
    "print('Mean string length: ', df_len_explore['Map Data'].str.len().mean())\n",
    "print('80th  percentile string length: ', df_len_explore['Map Data'].str.len().quantile(0.8))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.lines.Line2D at 0x1c5b5e37b00>"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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ubk6evSokpKSJEnp6ek6fvy4tm7dql7/ORSybt06VVVVKS0tzc5ScTGWL5dOnpSaNJFuu83uamyz/OvlOll+Uk0aNdFtV4bvOACA1WwNOyUlJf5ZGknat2+ftm/frri4OMXFxWnmzJkaNWqUEhMTtXfvXj3xxBPq2LGjBg8eLEm66qqrNGTIEE2cOFHz5s1TeXm5pkyZorvvvptvYtUnDz4o5eVJKSlSbq7d1djmweUPKq84TymeFOVmhu84AIDVbD2MtWXLFl177bW69tprJUmZmZm69tpr9cwzzygiIkI7duzQ7bffriuvvFITJkxQr1699P7778vtdvv3sXDhQnXp0kUDBgzQ0KFD1adPH7322mt2dQkAAIQYW2d2+vXrJ2PMObf/7//+7wX3ERcXp0WLFllZFgAAcJB6dYIyAADAxSLsAAAARyPsAAAARyPsAAAARyPsAAAARyPsAAAARyPswH7Nmkkez+nbMNYsspk8kR41iwzvcQAAq9Wrn4uAQ331ld0VhISvpjAOAFAXmNkBAACORtgBAACORtgBAACOxjk7sN/jj0vHjknNm0uzZ9tdjW0e/+fjOnbqmJo3bq7Zg8J3HADAaoQd2O/tt6W8PCklJazDzts731ZecZ5SPCmEHQCwEIexAACAoxF2AACAoxF2AACAoxF2AACAoxF2AACAoxF2AACAoxF2AACAoxF2AACAo3FRQdhv2DCpsFCKi7O7ElsN6zRMhacKFdc4vMcBAKxG2IH9Xn3V7gpCwqvDGQcAqAscxgIAAI5G2AEAAI4WVNj597//bXUdAAAAdSKosNOxY0f1799ff/7zn3Xq1Cmra0K46d1bat369G0Y6/1ab7We01q9XwvvcQAAqwUVdj799FN1795dmZmZSkxM1AMPPKCPP/7Y6toQLgoKpLy807dhrKCkQHnFeSooCe9xAACrBRV2fvCDH+j3v/+9Dh48qDfeeEP5+fnq06ePunbtqjlz5ujIkSNW1wkAABCUSzpBuWHDhho5cqSWLFmiX//619qzZ48ee+wxpaam6t5771V+fr5VdQIAAATlksLOli1b9JOf/ERJSUmaM2eOHnvsMe3du1erV6/WwYMHNWLECKvqBAAACEpQYWfOnDnq1q2bfvjDH+rgwYN666239M033+j5559X+/btddNNN2nBggX69NNPz7ufTZs2afjw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de7cWZL09ddfKyIiQj179vS3c7lc1lQJAAAQpKDCzvDhw+XxePTmm2+qefPmkk5faPC+++7TTTfdpEcffdTSIuFwY8dK330nxcdLCxfaXY1txi4dq+9OfKf4qHgtHBm+4wAAVgsq7Pz2t7/VP//5T3/QkaTmzZvr+eef16BBgwg7uDgbN0p5eVJKit2V2Grj/o3KK85Tiie8xwEArBbUCcper1dHjhyptv7IkSMqLi6u9X42bdqk4cOHKzk5WS6XS8uWLQvYbozRM888o6SkJDVp0kQDBw7U7t27A9oUFhZq7Nixio6OVmxsrCZMmKCSkpJgugUAABwoqLBz55136r777tPSpUuVm5ur3Nxc/c///I8mTJigkSNH1no/paWl6tGjh+bOnVvj9hdeeEF/+MMfNG/ePG3evFlNmzbV4MGDderUKX+bsWPH6osvvtDq1au1fPlybdq0SZMmTQqmWwAAwIGCOow1b948PfbYYxozZozKy8tP76hhQ02YMEGzZ8+u9X4yMjKUkZFR4zZjjF588UU9/fTTGjFihCTprbfeUqtWrbRs2TLdfffd2rVrl1atWqVPPvlEvXv3liS99NJLGjp0qH7zm98oOTk5mO4BAAAHCWpmJyoqSi+//LKOHj3q/2ZWYWGhXn75ZTVt2tSSwvbt26eCggINHDjQvy4mJkZpaWnKzs6WJGVnZys2NtYfdCRp4MCBatCggTZv3nzOfft8Pnm93oAFAAA40yVdVDA/P1/5+fnq1KmTmjZtKmOMVXWpoKBAktTqrJ8QaNWqlX9bQUGBEhISArY3bNhQcXFx/jY1ycrKUkxMjH9JTU21rG4AABBaggo7R48e1YABA3TllVdq6NChys/PlyRNmDChXnwTa/r06SoqKvIv3377rd0lAQCAOhJU2Jk6daoaNWqkAwcOKCoqyr/+rrvu0qpVqywpLDExUZJ06NChgPWHDh3yb0tMTNThw4cDtldUVKiwsNDfpiZut1vR0dEBCwAAcKagws4///lP/frXv1br1q0D1nfq1EnffPONJYW1b99eiYmJWrt2rX+d1+vV5s2blZ6eLklKT0/X8ePHtXXrVn+bdevWqaqqSmlpaZbUAQAA6regvo1VWloaMKNzRmFhodxud633U1JSoj179vjv79u3T9u3b1dcXJzatGmjRx55RM8//7w6deqk9u3b6xe/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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_len_explore['Map Data'].str.len().plot(kind='hist', bins=100)\n",
    "plt.axvline(df_len_explore['Map Data'].str.len().mean(), color='red', linestyle='dashed', linewidth=2)\n",
    "plt.axvline(df_len_explore['Map Data'].str.len().quantile(0.80), color='green', linestyle='dashed', linewidth=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original data length:                     1225\n",
      "Number of blanks:                         407\n",
      "Number of strings with length > 5000:     27\n",
      "Number of useful rows:                    791\n"
     ]
    }
   ],
   "source": [
    "## Final Summary\n",
    "\n",
    "print('Original data length:                    ', len(df))\n",
    "print('Number of blanks:                        ', len(df) - len(df[df['Map Data'].str.len() > 0]))\n",
    "print('Number of strings with length > 5000:    ', len(df[df['Map Data'].str.len() > 5000]))\n",
    "print('Number of useful rows:                   ', len(df_len_explore))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Post cleaning data length:        791\n",
      "Avg string length:                596.3046776232617\n",
      "Median string length:             192.0\n",
      "25th percentile string length:    43.5\n",
      "80th percentile string length:    1114.0\n"
     ]
    }
   ],
   "source": [
    "print('Post cleaning data length:       ', len(df_len_explore))\n",
    "print('Avg string length:               ', df_len_explore['Map Data'].str.len().mean())\n",
    "print('Median string length:            ', df_len_explore['Map Data'].str.len().median())\n",
    "print('25th percentile string length:   ', df_len_explore['Map Data'].str.len().quantile(0.25))   \n",
    "print('80th percentile string length:   ', df_len_explore['Map Data'].str.len().quantile(0.8))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Highly uneven string length distribution.\n",
    "- 33% of the total data is useless, ie. blank rows\n",
    "- 25% of the strings have length less than 45 characters\n",
    "- 50% of the strings have length less than 200 characters\n",
    "- 30% of the strings have length between 200 - 1100 characters (huge variation)\n",
    "- 20% of the strings have length greater than 1100 characters\n",
    "- about 5% of strings are longer than 5000 characters (wont be used in training)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "## function to clean the given data frame\n",
    "\n",
    "def clean_text(text):\n",
    "    text = re.sub(r'[^\\w\\s]', '', text)\n",
    "    text = text.lower()\n",
    "    text = [word for word in text.split() if word not in stop_words]\n",
    "    text = [stemmer.stem(word) for word in text] \n",
    "    text = [lemmatizer.lemmatize(word) for word in text]\n",
    "    return ' '.join(text)\n",
    "\n",
    "def clean_data(df):\n",
    "    df['Map Data'] = df['Map Data'].fillna('')\n",
    "    df = df[df['Map Data'].str.len() > 0]\n",
    "    df = df[df['Map Data'].str.len() < 5000]\n",
    "    df['Map Data'] = df['Map Data'].apply(clean_text)\n",
    "    return df"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}