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

NotE-postalar büyük/küçük harfe duyarsız

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:

  1. isBlank(value) — Hücre boş mu? Boşsa "BOŞ" etiketi.
  2. 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, org vb.)
  3. 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.

UyarıBu basit bir regex

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.

UyarıBu yöntemin sı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"].value

Bu kod ne yapıyor?

  • value — şu anki kolonun değeri (full_name).
  • cells["birth_date"].value — aynı satırın birth_date hü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ı:

  1. Daha eksiksiz olanı tut (boş alan az olan).
  2. Daha tutarlı/standart olanı tut.
  3. 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ı.

İpucu“Yanlışlıkla yanlış satırı sildim!”

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.

UyarıVeri silmek geri dönüşü olan ama büyük bir karar

OpenRefine’da geri alabilirsin, ama dosyayı kapatınca geri dönüş zorlaşır. Şu prensibi her zaman uygula:

  1. Orijinal CSV’yi her zaman sakla. Üzerine yazma.
  2. Temizlenmiş veriyi yeni bir dosyaya export et.
  3. 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.

Başa dön