Python ile Veri Düzeltme
Tags: python, datascience, programming
Published: 2022-01-22 23:08:46

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](https://heybooster.ai) 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](https://github.com/buurak)
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](https://docs.python.org/3/library/difflib.html)
ile karşılaştık. Sonrasında düzgün şehir isimlerinin olduğu bir [repo](https://github.com/volkansenturk/turkiye-iller-ilceler) 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](https://xlinux.nist.gov/dads/HTML/ratcliffObershelp.html) 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**
```python
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)
```

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

**city.py**
```python
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"}
]
```

---

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

---


**Yararlandığım Kaynaklar**

* [https://python.org/](https://python.org/)
* [https://docs.python.org/3/library/difflib.html](https://docs.python.org/3/library/difflib.html)
* [https://github.com/volkansenturk/turkiye-iller-ilceler](https://github.com/volkansenturk/turkiye-iller-ilceler)
* [https://ilteriskeskin.github.io/posts/python-veri-duzeltme/](https://ilteriskeskin.github.io/posts/python-veri-duzeltme/)