ailiteracynepal 🇳🇵
पाठ आकार

अध्याय ३ · खण्ड III · 30 मिनेट

नाम, ठाउँ, र एकाइ मानकीकरण

ध्यान र निर्णय चाहिने ढिलो काम जसले एक जिल्लाका चार हिज्जेलाई मोडेलले सिक्न मिल्ने एउटा स्तम्भमा बदल्छ। पाठ सफा गर्ने काम आफ्नै खण्ड लायक छ किनभने निर्णय सूक्ष्म छन् र फाइदा ठूलो छ।

सामान्य परियोजनाको सबै सफा गर्ने काममध्ये, सुरुआतीहरूले सबैभन्दा कम आँकलन गर्ने यही हो। पाँच वर्षमा बार्‍ह फरक अधिकारीले प्रविष्ट गरेका “जिल्ला नाम” को स्तम्भमा सत्तरीसातवटा वास्तविक जिल्लालाई औँल्याउने दुई सय फरक स्ट्रिङ हुनसक्छन्। तपाईंले त्यो नसुधारुन्जेल, हरेक group-by, हरेक join, हरेक गन्ती बिस्तारै फेरिने कारकले गलत हुन्छ। काम धैर्यवान्, आंशिक न्यायगत हो, र ठूलो डाउनस्ट्रिम फाइदा उत्पादन गर्छ। यो खण्डले अव्यवस्थालाई सफा स्तम्भमा बदल्ने ढाँचा हिँडाउँछ।

समस्याको आकार

कल्पना गर्नुहोस् — पाँच वर्षको डाटा प्रविष्टि फरक अधिकारीहरूले गरेर — एक जिल्लाको नामका यी एघार रूप जम्मा भएको स्तम्भ:

Morang
morang
MORANG
Morang District
Morang district
Morang Dist.
मोरङ
Morang जिल्ला
 Morang
Morang
Mrng

सबै एघार उही ठाउँलाई औँल्याउँछन्। कम्प्युटरलाई, यी एघार फरक स्ट्रिङ हुन्। groupby("district") लाई, यिनी एघार समूह बन्छन्, प्रत्येकमा कुल को अंश, र तपाईंको विश्लेषण चुपचाप बकवास हुन्छ।

तपाईंको काम सबै एघारलाई एकल क्यानोनिकल रूपमा नक्सा गर्ने हो। हामी "Morang" छानेर त्यसैमा टिकौं।

चार सफा गर्ने प्रहार

अधिकांश केस सम्हाल्ने पुनरावृत्त दृष्टिकोण:

प्रहार 1 — खाली ठाउँ र केस। सबैभन्दा सस्तो प्रहार, करिब आधा रूप समात्छ:

import pandas as pd

df["district"] = df["district"].astype(str).str.strip().str.lower()

यसपछि, Morang, morang, MORANG, Morang, Morang सबै morang हुन्छन्। हामी अन्त्यमा क्यानोनिकल रूप (Morang) मा फेरि पुँजीकरण गर्नेछौं।

प्रहार 2 — ज्ञात उपसर्ग र प्रत्यय। “District”, “Dist.”, “जिल्ला”, “Municipality” जस्ता कुरा हटाउनुहोस्:

suffixes_to_remove = [" district", " dist.", " जिल्ला", " municipality"]
for s in suffixes_to_remove:
    df["district"] = df["district"].str.replace(s, "", regex=False)
df["district"] = df["district"].str.strip()

प्रहार 1 + 2 पछि, Morang District, morang dist., Morang जिल्ला सबै morang हुन्छन्।

प्रहार 3 — स्पष्ट म्यापिङ। अनियमित केस शब्दकोशले सम्हाल्नुहोस्:

manual_mapping = {
    "मोरङ": "morang",
    "mrng": "morang",
    "morng": "morang",
    # ... तपाईंले भेट्दा थप्दै ...
}

df["district"] = df["district"].replace(manual_mapping)

यो एक-पटकका सुधार राख्ने ठाउँ हो — सङ्क्षेप, लिप्यन्तरण, सामान्य हिज्जे गल्ती। नयाँ केस भेट्दै बिस्तारै शब्दकोश बनाउनुहोस्।

प्रहार 4 — केसलाई क्यानोनिकल बनाउनुहोस्। सफा गरिएको लोवरकेस रूपलाई आधिकारिक पुँजीकरणमा नक्सा गर्नुहोस्:

canonical = {
    "morang": "Morang",
    "kaski": "Kaski",
    "kathmandu": "Kathmandu",
    # ... सबै 77 जिल्ला ...
}

df["district"] = df["district"].replace(canonical)

अब तपाईंको स्तम्भमा बढीमा 77 फरक मान छन्, प्रत्येक क्यानोनिकल रूपमा। groupby("district") अपेक्षाअनुसार चल्छ।

जब फजी मिल्ने काम ल्याउने

साँच्चै अनियमित केसका लागि — कर्णालीका लागि "Krcnj", हस्तलिखित टाइपो — सटीक मिल्ने भङ्ग हुन्छ। फजी मिल्ने ले कुनै पनि इनपुटका लागि नजिकको ज्ञात मान भेट्न दिन्छ।

pip install rapidfuzz
from rapidfuzz import process

canonical_list = ["Morang", "Kaski", "Kathmandu", "Karnali", "Sunsari", ...]

def best_match(name: str) -> str:
    match, score, _ = process.extractOne(name, canonical_list)
    return match if score > 80 else name

df["district_guessed"] = df["district"].apply(best_match)

process.extractOne ले नजिकको मिलान र 0 देखि 100 सम्मको स्कोर फिर्ता दिन्छ। थ्रेसहोल्ड (यहाँ > 80) ले मिलान स्वीकार गर्न कति आक्रामक हुने नियन्त्रण गर्छ। तल राख्दा बढी टाइपो समात्छ तर बढी झुटा सकारात्मक पनि।

सुरक्षित ढाँचा: मिलान लागू गर्नुअघि समीक्षा गर्नुहोस्:

review = df[df["district"] != df["district_guessed"]][["district", "district_guessed"]].drop_duplicates()
print(review)

तालिका पढ्नुहोस्। हरेक फजी मिलान हातले स्वीकार वा अस्वीकार गर्नुहोस्। अनि लागू गर्नुहोस्। दुई घण्टा समीक्षाले महिनौंको गलत आरोपण बचाउँछ।

विक्रेता र उत्पादन नाम मानकीकरण

उही ढाँचा ठाउँभन्दा बाहिर लागू हुन्छ। विक्रेता नामको स्तम्भ:

Khalti
khalti
KHALTI
Khalti Inc.
Khalti Pvt. Ltd.
खल्ती

उही चार-प्रहार दृष्टिकोण:

  1. खाली ठाउँ + लोवरकेस।
  2. प्रत्यय हटाउनुहोस् (" inc.", " pvt. ltd.")।
  3. स्पष्ट म्याप ("खल्ती""khalti")।
  4. क्यानोनिकल रूप ("khalti""Khalti")।

सीप क्षेत्रहरूमा सर्छ — जिल्ला नाम, विक्रेता नाम, उत्पादन SKU, विद्यालय ID।

एकाइ मानकीकरण

अलि फरक तर समान महत्त्वको समस्या: एकाइ मिसाउने स्तम्भ।

loan_amount
50000
5 lakh
500000
5,00,000     (भारतीय गन्ती — 5 लाख)
0.5 million
500000.00

छ पङ्क्ति, सबै उही रकम। उपचार एकाइ स्पष्ट रूपमा पार्स गर्ने हो:

import re

def parse_amount(s: str) -> float:
    if pd.isna(s):
        return None
    s = str(s).lower().strip()
    s = s.replace(",", "")    # सबै अल्पविराम विभाजक हटाउनुहोस् (भारतीय + पश्चिमी)
    # "lakh" र "million" प्रत्यय सम्हाल्नुहोस्
    if "lakh" in s:
        return float(re.sub(r"[^\d.]", "", s)) * 100000
    if "million" in s:
        return float(re.sub(r"[^\d.]", "", s)) * 1000000
    if "crore" in s:
        return float(re.sub(r"[^\d.]", "", s)) * 10000000
    try:
        return float(s)
    except ValueError:
        return None

df["loan_amount_npr"] = df["loan_amount"].apply(parse_amount)

अब छै पङ्क्ति float 500000.0 बन्छन्। मूल स्तम्भ पुन: जाँच गर्न संरक्षित छ; नयाँ स्तम्भ डाउनस्ट्रिम विश्लेषणले प्रयोग गर्ने हो।

“क्यानोनिकल” को अर्थबारे छोटो टिप्पणी

डाटा काममा क्यानोनिकल शब्दको अर्थ “हामीले प्रयोग गर्न सहमत भएको एउटा रूप” हो। तपाईं — निर्माता — क्यानोनिकल रूप छान्नुहुन्छ। छनोट हुनुपर्छ:

  1. स्पष्ट। "Morang" क्यानोनिकल छ किनभने यसको अर्थ राख्ने एउटा मात्र ठाउँ छ।
  2. पुन: प्रयोगयोग्य। अन्य प्रणालीले पनि प्रयोग गर्ने रूप छान्नुहोस्; यदि डाउनस्ट्रिम उपभोक्ताले "Morang District" अपेक्षा गर्छन् भने, त्यो प्रयोग गर्नुहोस्।
  3. कागजात गरिएको। परियोजनाको data/README.md मा छनोट लेख्नुहोस्। भविष्यको तपाईं, र तपाईंको डाटा पढ्ने जुनसुकैलाई थाहा हुनुपर्छ।

एक पटक एक स्तम्भका लागि एक क्यानोनिकल-म्यापिङ प्रहार लेखेपछि, तपाईंले सबैका लागि ढाँचा लेख्नुभयो। पहिलो पटक ध्यानले गर्नुहोस् र पुन: प्रयोग गर्नुहोस्।

आफ्नो बुझाइ जाँच्नुहोस्

Quick check

जिल्ला स्तम्भमा नेपालका 77 जिल्ला औँल्याउने 240 अद्वितीय स्ट्रिङ छन्। खाली ठाउँ हटाउने, लोवरकेसिङ, र 'District' प्रत्यय हटाएपछि, तपाईं अझै 110 अद्वितीय मान देख्नुहुन्छ। सबैभन्दा उपयोगी अर्को चरण के हो?

Quick check

ऋण रकम स्तम्भमा `'5 lakh'`, `'500000'`, `'5,00,000'`, र `'0.5 million'` मान छन्। सफा गर्ने कामको सबैभन्दा सटीक विवरण के हो?

अब के आउँछ

तपाईं अब नेपालमा भेट्ने झन्डै कुनै पनि डाटासेट लोड, पार्स, र सामान्यीकरण गर्न सक्नुहुन्छ। अध्याय 4 अर्को कदम लिन्छ: तपाईंले भर्खर सफा गरेको डाटा बुझ्नेवितरण हेर्ने, आउटलायर भेट्ने, मोडेल नजिक पुग्नुअघि तालिकाको सही प्रश्न सोध्ने। सफा गर्नाले तपाईंलाई डाटासेट दियो। बुझाइले तपाईंलाई डाटासेटको अर्थ बताउँछ — र विश्वास गर्ने कि नगर्ने।