ogx786 commited on
Commit
efe510a
·
verified ·
1 Parent(s): 3670588

Update make_data.py

Browse files
Files changed (1) hide show
  1. make_data.py +14 -562
make_data.py CHANGED
@@ -1,562 +1,14 @@
1
- import re
2
- import json
3
- import csv
4
- import pandas as pd
5
- from tqdm import tqdm
6
-
7
-
8
- # ============================================================
9
- # CONFIGURATION
10
- # ============================================================
11
-
12
- INPUT_FILE = "hbl_mongodb_export.txt"
13
-
14
- OUTPUT_FILE = "hbl_nadra_clean.csv"
15
-
16
-
17
- # Use for testing
18
- # Example:
19
- # LIMIT_ROWS = 2000
20
- #
21
- # Full dataset:
22
- LIMIT_ROWS = 2000
23
-
24
-
25
-
26
- FIELDS = [
27
- "name",
28
- "fatherName",
29
- "motherName",
30
- "address1",
31
- "address2",
32
- "placeOfBirth"
33
- ]
34
-
35
-
36
- # ============================================================
37
- # MONGODB SYNTAX CLEANING
38
- # ============================================================
39
-
40
- def clean_mongo_syntax(text):
41
-
42
- # ObjectId("xxx")
43
- text = re.sub(
44
- r'ObjectId\("([^"]+)"\)',
45
- r'"\1"',
46
- text
47
- )
48
-
49
-
50
- # ISODate("xxx")
51
- text = re.sub(
52
- r'ISODate\("([^"]+)"\)',
53
- r'"\1"',
54
- text
55
- )
56
-
57
-
58
- # NumberInt(200)
59
- text = re.sub(
60
- r'NumberInt\((\d+)\)',
61
- r'\1',
62
- text
63
- )
64
-
65
-
66
- return text
67
-
68
-
69
-
70
- # ============================================================
71
- # STREAM MONGODB DOCUMENTS
72
- # ============================================================
73
-
74
- def stream_mongodb_documents(path, limit=None):
75
-
76
- print("Reading MongoDB export...")
77
-
78
-
79
- count = 0
80
-
81
- buffer = ""
82
-
83
- inside_document = False
84
-
85
- brace_count = 0
86
-
87
-
88
-
89
- with open(
90
- path,
91
- "r",
92
- encoding="utf-8"
93
- ) as file:
94
-
95
-
96
- for line in file:
97
-
98
-
99
- line = line.rstrip()
100
-
101
-
102
- if not line:
103
- continue
104
-
105
-
106
-
107
- # document starts
108
- if line.startswith("{"):
109
-
110
- inside_document = True
111
-
112
- brace_count = 0
113
-
114
- buffer = ""
115
-
116
-
117
-
118
- if inside_document:
119
-
120
-
121
- buffer += line + "\n"
122
-
123
-
124
- brace_count += line.count("{")
125
-
126
- brace_count -= line.count("}")
127
-
128
-
129
-
130
- # complete document
131
-
132
- if brace_count == 0:
133
-
134
-
135
- cleaned = clean_mongo_syntax(
136
- buffer
137
- )
138
-
139
-
140
- try:
141
-
142
- obj = json.loads(
143
- cleaned
144
- )
145
-
146
-
147
- yield obj
148
-
149
-
150
- count += 1
151
-
152
-
153
- if limit and count >= limit:
154
-
155
- return
156
-
157
-
158
-
159
- except Exception as e:
160
-
161
- print(
162
- "\nSkipping invalid document:",
163
- e
164
- )
165
-
166
-
167
-
168
- inside_document = False
169
-
170
- buffer = ""
171
-
172
-
173
-
174
-
175
- # ============================================================
176
- # TEXT CLEANING
177
- # ============================================================
178
-
179
-
180
- def remove_unicode_artifacts(text):
181
-
182
- if not text:
183
-
184
- return ""
185
-
186
-
187
- text = str(text)
188
-
189
-
190
-
191
- # RTL/LTR marks
192
- text = re.sub(
193
- r"[\u202A-\u202E]",
194
- "",
195
- text
196
- )
197
-
198
-
199
-
200
- # zero width chars
201
-
202
- text = re.sub(
203
- r"[\u200B-\u200D\uFEFF]",
204
- "",
205
- text
206
- )
207
-
208
-
209
-
210
- return text
211
-
212
-
213
-
214
- def clean_urdu(text):
215
-
216
- if not text:
217
-
218
- return ""
219
-
220
-
221
-
222
- text = remove_unicode_artifacts(
223
- text
224
- )
225
-
226
-
227
- # normalize spaces only
228
-
229
- text = re.sub(
230
- r"\s+",
231
- " ",
232
- text
233
- )
234
-
235
-
236
- return text.strip()
237
-
238
-
239
-
240
-
241
- def clean_roman(text):
242
-
243
- if not text:
244
-
245
- return ""
246
-
247
-
248
-
249
- text = remove_unicode_artifacts(
250
- text
251
- )
252
-
253
-
254
-
255
- # uppercase
256
-
257
- text = text.upper()
258
-
259
-
260
-
261
- # remove punctuation
262
-
263
- text = re.sub(
264
- r"[.,،؛:()\[\]{}]",
265
- " ",
266
- text
267
- )
268
-
269
-
270
-
271
- # remove symbols
272
-
273
- text = re.sub(
274
- r"[^A-Z0-9\s]",
275
- "",
276
- text
277
- )
278
-
279
-
280
-
281
- # normalize spaces
282
-
283
- text = re.sub(
284
- r"\s+",
285
- " ",
286
- text
287
- )
288
-
289
-
290
-
291
- return text.strip()
292
-
293
-
294
-
295
- # ============================================================
296
- # PIPE FORMAT
297
- # ============================================================
298
-
299
-
300
- def create_pipe_format(data, cleaner):
301
-
302
- values = []
303
-
304
-
305
- for field in FIELDS:
306
-
307
-
308
- value = data.get(
309
- field,
310
- ""
311
- )
312
-
313
-
314
- value = cleaner(
315
- value
316
- )
317
-
318
-
319
- values.append(
320
- value
321
- )
322
-
323
-
324
-
325
- return "|".join(values)
326
-
327
-
328
-
329
- # ============================================================
330
- # PROCESS DOCUMENTS
331
- # ============================================================
332
-
333
-
334
- def process_documents(documents):
335
-
336
-
337
- rows = []
338
-
339
-
340
- stats = {
341
-
342
- "total":0,
343
- "success":0,
344
- "missing":0,
345
- "pipe_error":0
346
-
347
- }
348
-
349
-
350
-
351
- print(
352
- "Processing documents..."
353
- )
354
-
355
-
356
-
357
- for doc in tqdm(documents):
358
-
359
-
360
- stats["total"] += 1
361
-
362
-
363
-
364
- try:
365
-
366
-
367
- # keep only successful calls
368
-
369
- if doc.get("message") != "Success":
370
-
371
- continue
372
-
373
-
374
-
375
- if doc.get("statusCode") != 200:
376
-
377
- continue
378
-
379
-
380
-
381
- urdu_data = doc.get(
382
- "REQUEST_BODY",
383
- {}
384
- )
385
-
386
-
387
- roman_data = doc.get(
388
- "data",
389
- {}
390
- )
391
-
392
-
393
-
394
- if not urdu_data or not roman_data:
395
-
396
- stats["missing"] += 1
397
-
398
- continue
399
-
400
-
401
-
402
-
403
- urdu_text = create_pipe_format(
404
- urdu_data,
405
- clean_urdu
406
- )
407
-
408
-
409
-
410
- roman_text = create_pipe_format(
411
- roman_data,
412
- clean_roman
413
- )
414
-
415
-
416
-
417
-
418
- # check empty fields
419
-
420
- if (
421
- "" in urdu_text.split("|")
422
- or
423
- "" in roman_text.split("|")
424
- ):
425
-
426
- stats["missing"] += 1
427
-
428
- continue
429
-
430
-
431
-
432
-
433
- # pipe count validation
434
-
435
- if (
436
- urdu_text.count("|")
437
- !=
438
- roman_text.count("|")
439
- ):
440
-
441
- stats["pipe_error"] += 1
442
-
443
- continue
444
-
445
-
446
-
447
-
448
- rows.append(
449
- {
450
- "urdu":urdu_text,
451
- "roman":roman_text
452
- }
453
- )
454
-
455
-
456
- stats["success"] += 1
457
-
458
-
459
-
460
- except Exception:
461
-
462
- continue
463
-
464
-
465
-
466
-
467
- print("\nStatistics")
468
- print("----------------")
469
-
470
- for k,v in stats.items():
471
-
472
- print(
473
- f"{k}: {v}"
474
- )
475
-
476
-
477
-
478
- return rows
479
-
480
-
481
-
482
- # ============================================================
483
- # MAIN
484
- # ============================================================
485
-
486
-
487
- documents = stream_mongodb_documents(
488
- INPUT_FILE,
489
- LIMIT_ROWS
490
- )
491
-
492
-
493
-
494
- rows = process_documents(
495
- documents
496
- )
497
-
498
-
499
-
500
- df = pd.DataFrame(
501
- rows
502
- )
503
-
504
-
505
-
506
- print(
507
- "\nRemoving duplicates..."
508
- )
509
-
510
-
511
-
512
- before = len(df)
513
-
514
-
515
-
516
- df = df.drop_duplicates(
517
- subset=[
518
- "urdu",
519
- "roman"
520
- ]
521
- )
522
-
523
-
524
-
525
- print(
526
- "Duplicates removed:",
527
- before - len(df)
528
- )
529
-
530
-
531
-
532
- # shuffle
533
-
534
- df = df.sample(
535
- frac=1,
536
- random_state=42
537
- ).reset_index(
538
- drop=True
539
- )
540
-
541
-
542
-
543
- print(
544
- "Final dataset size:",
545
- len(df)
546
- )
547
-
548
-
549
-
550
- df.to_csv(
551
- OUTPUT_FILE,
552
- index=False,
553
- encoding="utf-8-sig",
554
- quoting=csv.QUOTE_ALL
555
- )
556
-
557
-
558
-
559
- print(
560
- "\nSaved:",
561
- OUTPUT_FILE
562
- )
 
1
+ (venv) PS D:\AI\chatbot> python clean_data.py
2
+ urdu roman
3
+ 0 احسن احمد|سکندر احمد|سکندر احمد|مکان نمبر B-44... AHSAN AHMED|SIKANDAR AHMAD|SIKANDAR AHMAD|HOUS...
4
+ 1 محمد شان|غلام دراز خان|غلام دراز خان|آڑہ روڈ ح... MUHAMMAD SHAN|GHULAM DARAZ KHAN|GHULAM DARAZ K...
5
+ 2 اکبر پرویز|پرویز خالد شیخ|پرویز خالد شیخ|مکان ... AKBAR PERVEZ|PERVEZ KHALID SHEIKH|PERVEZ KHALI...
6
+ 3 رحمان حسن|رفاقت علی|رفاقت علی|ڈاک خانہ ونیکے ت... REHMAN HASSAN|RAFAQAT ALI|RAFAQAT ALI|POST OFF...
7
+ 4 ناصر شفیع|شفیع مسیح|شفیع مسیح|مکان نمبر 271،نع... NASIR SHAFI|SHAFI MASIH|SHAFI MASIH|HOUSE NUMB...
8
+
9
+ Urdu:
10
+ احسن احمد|سکندر احمد|سکندر احمد|مکان نمبر B-447،محلہ میمن،ٹنڈو آدم،ضلع سانگھڑ|مکان نمبر B-447،محلہ میمن،ٹنڈو آدم،ضلع سانگھڑ|ٹنڈو آدم,سانگھڑ
11
+
12
+ Roman:
13
+ AHSAN AHMED|SIKANDAR AHMAD|SIKANDAR AHMAD|HOUSE NUMBER B447 MOHALA MEMON TANDO ADAM DISTRICT SANGHAR|HOUSE NUMBER B447 MOHALA MEMON TANDO ADAM DISTRICT SANGHAR|TANDO ADAM SANGHAR
14
+ (venv) PS D:\AI\chatbot>