DEV Community

Cover image for Python ile Veri Düzeltme
Ali İlteriş Keskin
Ali İlteriş Keskin

Posted on

Python ile Veri Düzeltme

Herkese selamlar, bu yazımda Python ile bozuk verileri düzeltme konusundan bahsedeceğim. Uzun süredir yeni yazı
yazamıyorum. Bu yüzden kendimi kötü hissediyorum. Bu yazı son çözdüğüm sorunun özeti şeklinde olacak. Şu sıralar
heybooster bir yarışma sürecinde olduğu için yoğun çalışmamız gereken
bir dönemdeyiz. Ne var ki, fırsat bulduğumda bir şeyler üretmeye çalışıyorum. Tabi eski motivasyonum olmadığı için
pek sık yazı yazamıyorum. Bu yazıyı pazar günü tembelliği ile keyifle yazıyorum :) Geçtiğimiz günlerde ev arkadaşımın
bir sorundan bahsetmesi üzerine bugünkü yazı konum çıkmıştı bile. Sorunu hızlıca çözdükten sonra bu günü bekledim
yazıyı yazmak için :)


Sorun ve Çözüm

Sorun şuydu ki, elimizde bozuk şehir isimleri vardı ve bunları düzeltmemiz gerekiyordu. Bunun için planımız
temiz veriler ile elimizdeki bozuk veriyi karşılaştırmak ve benzerlik oranı belli bir katsayının üzerine çıktığında
bozuk veriyi temiz veri ile değiştirmekti. Bunun için iki tane stringi kıyaslayan bir script yazmamız gerekiyordu.

Özetle, elimizdeki tüm düzgün şehir isimleri ile bozuk bir şehir ismini kıyaslayıp benzerlik katsayısına
göre düzeltecektik. Bunu nasıl yapcağımızı araştırırken Pythondaki difflib
ile karşılaştık. Sonrasında düzgün şehir isimlerinin olduğu bir repo bulduk.
Yapılacak çok az şey kalmıştı aslında. Bozuk test verileri oluşturup, bu bozuk verileri tek tek düzgün veri setiyle kıyaslamamız
yeterli olacaktı. Ve orataya aşağıdaki kod çıktı.


difflib.SequenceMatcher Ratcliff/Obershelp algoritmasını
kullanır ve benzerliği eşleşen karakter sayısının iki dizedeki toplam karakter sayısına bölünmesiyle hesaplar.


main.py

from difflib import SequenceMatcher
from city import cities

examples = ["An kara", "EskIşehir", "izmİr", "İst An bül"] # bozuk veri listesi

def format_variable(city): # bozuk veriyi formatlayan fonksiyon
    return city.lower().replace(' ', '')


def similar(broken_city, normal_city): # iki verinin benzerlik oranını veren fonksyion
    return SequenceMatcher(None, broken_city, normal_city).ratio()


def main(example): # bozuk verinin, normal veri ile karşılaştırıldığı fonksiyon
    data = format_variable(example)
    for ct in cities:
        similar_rate = similar(data, ct['name'].lower())
        if similar_rate > 0.8: 
            data = ct['name'].lower()
            print("Corrected Data: ", data)


for example in examples:
    main(example)
Enter fullscreen mode Exit fullscreen mode

Kullanıdğım şehir listesini de aşağıya ekliyorum. Böylece kodu direkt deneyebilirsiniz.

city.py

cities = [
{"id":"15","name":"BURDUR"},
{"id":"26","name":"ESKİŞEHİR"},
{"id":"18","name":"ÇANKIRI"},
{"id":"80","name":"OSMANİYE"},
{"id":"41","name":"KOCAELİ"},
{"id":"27","name":"GAZİANTEP"},
{"id":"31","name":"HATAY"},
{"id":"38","name":"KAYSERİ"},
{"id":"29","name":"GÜMÜŞHANE"},
{"id":"54","name":"SAKARYA"},
{"id":"16","name":"BURSA"},
{"id":"69","name":"BAYBURT"},
{"id":"17","name":"ÇANAKKALE"},
{"id":"57","name":"SİNOP"},
{"id":"74","name":"BARTIN"},
{"id":"503","name":"MAĞUSA (KIBRIS)"},
{"id":"33","name":"MERSİN"},
{"id":"51","name":"NİĞDE"},
{"id":"42","name":"KONYA"},
{"id":"60","name":"TOKAT"},
{"id":"2","name":"ADIYAMAN"},
{"id":"6","name":"ANKARA"},
{"id":"66","name":"YOZGAT"},
{"id":"52","name":"ORDU"},
{"id":"53","name":"RİZE"},
{"id":"1","name":"ADANA"},
{"id":"40","name":"KIRŞEHİR"},
{"id":"76","name":"IĞDIR"},
{"id":"45","name":"MANİSA"},
{"id":"21","name":"DİYARBAKIR"},
{"id":"64","name":"UŞAK"},
{"id":"501","name":"LEFKOŞE (KIBRIS)"},
{"id":"5","name":"AMASYA"},
{"id":"24","name":"ERZİNCAN"},
{"id":"32","name":"ISPARTA"},
{"id":"502","name":"GİRNE (KIBRIS)"},
{"id":"23","name":"ELAZIĞ"},
{"id":"78","name":"KARABÜK"},
{"id":"30","name":"HAKKARİ"},
{"id":"36","name":"KARS"},
{"id":"67","name":"ZONGULDAK"},
{"id":"68","name":"AKSARAY"},
{"id":"44","name":"MALATYA"},
{"id":"10","name":"BALIKESİR"},
{"id":"20","name":"DENİZLİ"},
{"id":"49","name":"MUŞ"},
{"id":"73","name":"ŞIRNAK"},
{"id":"48","name":"MUĞLA"},
{"id":"59","name":"TEKİRDAĞ"},
{"id":"39","name":"KIRKLARELİ"},
{"id":"56","name":"SİİRT"},
{"id":"28","name":"GİRESUN"},
{"id":"63","name":"ŞANLIURFA"},
{"id":"9","name":"AYDIN"},
{"id":"72","name":"BATMAN"},
{"id":"13","name":"BİTLİS"},
{"id":"3","name":"AFYONKARAHİSAR"},
{"id":"8","name":"ARTVİN"},
{"id":"4","name":"AĞRI"},
{"id":"77","name":"YALOVA"},
{"id":"50","name":"NEVŞEHİR"},
{"id":"61","name":"TRABZON"},
{"id":"58","name":"SİVAS"},
{"id":"7","name":"ANTALYA"},
{"id":"37","name":"KASTAMONU"},
{"id":"47","name":"MARDİN"},
{"id":"46","name":"KAHRAMANMARAŞ"},
{"id":"25","name":"ERZURUM"},
{"id":"75","name":"ARDAHAN"},
{"id":"81","name":"DÜZCE"},
{"id":"55","name":"SAMSUN"},
{"id":"19","name":"ÇORUM"},
{"id":"65","name":"VAN"},
{"id":"14","name":"BOLU"},
{"id":"43","name":"KÜTAHYA"},
{"id":"11","name":"BİLECİK"},
{"id":"34","name":"İSTANBUL"},
{"id":"79","name":"KİLİS"},
{"id":"62","name":"TUNCELİ"},
{"id":"12","name":"BİNGÖL"},
{"id":"22","name":"EDİRNE"},
{"id":"71","name":"KIRIKKALE"},
{"id":"70","name":"KARAMAN"},
{"id":"35","name":"İZMİR"}
]
Enter fullscreen mode Exit fullscreen mode

Umarım yazı işinize yaramıştır. Anlamadığınız yerleri ya da isteklerinizi, önerilerinizi bana iletbilirsiniz. Keyifli
haftalar dilerim :)


Yararlandığım Kaynaklar

Discussion (0)