E-posta ve Yinelenen Kayıtlar
Son iki büyük temizlik işi: e-postaları doğrulamak ve yinelenen (duplicate) kayıtları silmek. Bu sırada önemli — duplicate’leri en sona bıraktık çünkü diğer alanlar temizlenmeden duplicate algoritması doğru çalışmaz.
email — E-posta Doğrulama
E-postada problem “düzeltmek” değil, geçersizleri tespit edip karar vermek. Çünkü pedro@ gibi yarım bir e-postada eksik kısmı bilemeyiz — gmail.com mı, hotmail.com mı?
1. Standartlaştırma
Önce küçük harfe çevirip boşlukları temizle:
email ▼ → Edit cells → Common transforms → To lowercase
AYSE@HOTMAIL.COM ile ayse@hotmail.com aynı adres. Ama bilgisayar string karşılaştırmasında bunları farklı görür. Standart: hep küçük harfe çevir.
email ▼ → Edit cells → Common transforms → Trim leading and trailing whitespace
Bu, ID 2’deki MARIA.GARCIA@HOTMAIL.COM (başında/sonunda boşluk) gibi değerleri temizler.
2. Geçerlilik Kontrolü
E-postaların geçerli olup olmadığını anlamak için Custom Text Facet ile akıllı bir kontrol kuralım:
email ▼ → Facet → Custom text facet…
if(isBlank(value),
"BOŞ",
if(value.match(/[^@]+@[^@]+\.[^@]+/) != null,
"GEÇERLİ",
"GEÇERSİZ"))Bu kod ne yapıyor?
İki katmanlı if:
isBlank(value)— Hücre boş mu? Boşsa"BOŞ"etiketi.value.match(/[^@]+@[^@]+\.[^@]+/)— Regex ile e-posta deseni eşleşmesi var mı?[^@]+—@olmayan bir veya daha fazla karakter (kullanıcı adı kısmı)@— bir adet@işareti[^@]+— yine@olmayan karakterler (domain ismi)\.— bir adet.(kaçışlı, çünkü regex’te.özel anlamlı)[^@]+— uzantı (com,orgvb.)
- Eşleşme varsa
"GEÇERLİ", yoksa"GEÇERSİZ".
OK bas. Sol panelde 3 etiket görünür:
GEÇERLİ ~28
GEÇERSİZ ~6
BOŞ ~1
GEÇERSİZ etiketine tıkla — sadece bozuk e-postalar tabloda görünür.
Gerçek e-posta doğrulaması RFC 5322 standardına göre yapılır ve çok daha karmaşıktır. Bizim regex’imiz birşey@birşey.uzantı formatına bakıyor — bu çoğu durum için yeterli ama kenar durumlarda yanılabilir. Sıkı doğrulama için sunucu tarafında mailgun, truemail gibi kütüphaneler vardır.
3. Geçersizleri Ne Yapacaksın?
Bu iş kararı, teknik karar değil. Üç yol var:
- Düzelt: Tahmin makulse düzelt.
carlos@@gmail.com→carlos@gmail.com(çift@’tan birini sil),emma.johnson@gmail→emma.johnson@gmail.com(TLD ekle, gmail için makul tahmin). - Boşalt: Domain’i tahmin etmek riskli olduğunda boş bırak.
pedro@,henrik@,lisa.chen@,anna.schmidt@için domain bilemiyoruz. - İşaretle:
INVALID:öneki ekle ve sonra ilgili kullanıcıya geri dön.
Önerim:
| E-posta | Karar |
|---|---|
carlos@@gmail.com |
carlos@gmail.com (çift @ tek olur) |
emma.johnson@gmail |
emma.johnson@gmail.com (TLD ekle) |
anna.schmidt@, pedro@, lisa.chen@, henrik@ |
Boşalt |
GEÇERSİZ facet seçiliyken her hücreye çift tıklayıp düzeltebilirsin.
Yinelenen Kayıtlar
Bu veri setinde 5 duplicate çift olduğunu biliyorsan, hadi onları bulalım.
1. Önce full_name Kolonunu Standartlaştır
full_name kolonunda büyük/küçük harf karmaşası var (John Smith, maria garcia, RAJESH Kumar…). Cluster ve duplicate facet’in işe yaraması için önce Title Case yapalım:
full_name ▼ → Edit cells → Common transforms → To titlecase
maria garcia → Maria Garcia, RAJESH Kumar → Rajesh Kumar, François DUBOIS → François Dubois olur.
2. İsim Cluster
full_name ▼ → Edit cells → Cluster and edit…
fingerprint yöntemi ile başla. Bu adımda yazım varyantları (örneğin Olga Petrova ile Olga petrova) tek gruba düşer.
Her grup için doğru yazımı seç ve Merge selected & Re-Cluster.
3. Duplicate Tespit — İki Yöntem
Yöntem A: E-posta Üzerinden Duplicate Facet
email ▼ → Facet → Customized facets → Duplicates facet
Sol panelde true / false çıkar:
true→ bu satırın e-postası tabloda birden fazla geçiyor (yani duplicate var)false→ bu e-posta tek
true’ya tıkla. Sadece duplicate satırlar görünür.
E-posta her zaman doğru duplicate ölçütü olmayabilir — birden fazla kişi aynı e-postayı paylaşabilir (kurumsal hesap), ya da bazı satırlarda e-posta hiç yok (ID 13 boştu). Daha sağlam bir yöntem ad+doğum tarihi kombinasyonu.
Yöntem B: Ad + Doğum Tarihi Kombosu (daha güvenli)
Custom text facet açalım:
full_name ▼ → Facet → Custom text facet
value + "_" + cells["birth_date"].valueBu kod ne yapıyor?
value— şu anki kolonun değeri (full_name).cells["birth_date"].value— aynı satırınbirth_datehücresinin değeri.- İki değeri
_ile birleştir, “isim_doğumtarihi” anahtarı oluştur.
Sol panelde her benzersiz “isim_tarih” kombinasyonu görünür. Yanında sayı varsa (örneğin John Smith_1985-03-12 (2)) birden fazla satır bu kombinasyona sahip — yani duplicate.
4. Hangi Satırı Silmeli?
Duplicate çiftinden birini tutmak, diğerini silmek gerekiyor. Karar kuralları:
- Daha eksiksiz olanı tut (boş alan az olan).
- Daha tutarlı/standart olanı tut.
- Eşitse: küçük ID’yi tut (önce kaydedilmiş, hem mantıklı hem keyfi).
Bu veri setindeki duplicate’ler:
| Tutulan | Silinen | Sebep |
|---|---|---|
| ID 1 (John Smith) | ID 14 | Aynı bilgi, küçük ID |
| ID 6 (Carlos Reyes) | ID 5 | ID 6 daha eksiksiz (tam doğum tarihi var) |
| ID 10 (Rajesh Kumar) | ID 24 | Eş değer, küçük ID |
| ID 13 (Olga Petrova) | ID 34 | E-posta ID 34’te var ama ID 13’ün e-postası temizlenebilir |
| ID 4 (Anna Schmidt) | ID 31 | Aynı bilgi, küçük ID |
5. Silme İşlemi (Star + Facet by Star)
OpenRefine’da seçili satırları toplu silmek için yıldız (star) yöntemi kullanılır:
Adım 1: Silinecekleri yıldızla.
Tabloda her satırın solunda iki küçük sembol var: yıldız (★) ve bayrak (⚐). Silmek istediğin satırların yıldızına tek tek tıkla.
Bu örnekte silinecek ID’ler: 5, 14, 24, 31, 34.
Adım 2: Yıldızlı satırları filtrele.
Sağ üstteki All ▼ → Facet → Facet by star
Sol panelde true / false çıkar. true’ya tıkla — sadece yıldızlı satırlar görünür.
Adım 3: Sil.
All ▼ → Edit rows → Remove matching rows
5 satır silinir. Tabloda 30 satır kalmalı.
Endişelenme: Undo / Redo sekmesinden geri al. OpenRefine’ın en sevdiğim özelliklerinden biri, hiçbir işlem geri dönüşsüz değil.
6. Kontrol
email ▼ → Facet → Customized facets → Duplicates facet → true artık görünmemeli (ya da boş olmalı). Eğer hâlâ true çıkıyorsa, gözden kaçan duplicate var demektir.
Aynı kontrolü full_name üzerinde de yapabilirsin.
OpenRefine’da geri alabilirsin, ama dosyayı kapatınca geri dönüş zorlaşır. Şu prensibi her zaman uygula:
- Orijinal CSV’yi her zaman sakla. Üzerine yazma.
- Temizlenmiş veriyi yeni bir dosyaya export et.
- Silme işlemleri öncesi kaç satır olduğunu not al, sonrasında kontrol et.
Bu eğitimde 35 → 30 satıra inmesi beklenen bir sonuç. Eğer farklı sayı görüyorsan bir şey yanlış olmuş demektir.
Tüm temizlik bitti! Sonraki bölümde export ve işleminin tekrarlanabilir bir şekilde nasıl saklanacağını göreceğiz.