Python ile Veri Düzeltme
Ali İlteriş Keskin
Posted on January 22, 2022
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)
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"}
]
Umarım yazı işinize yaramıştır. Anlamadığınız yerleri ya da isteklerinizi, önerilerinizi bana iletbilirsiniz. Keyifli
haftalar dilerim :)
Yararlandığım Kaynaklar
Posted on January 22, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
September 24, 2024
December 20, 2023