Posts Python ile Veri Düzeltme
Post
Cancel

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

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
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

This post is licensed under CC BY 4.0 by the author.