Python ile Metin Normalizasyonu: Türkçe Karakter Tuzaklarından Kurtulun

Programlamaya yeni başladığınızda, bir metni küçük harfe çevirmek için .lower() fonksiyonunu kullanmanın yeterli olduğunu sanırsınız. Ancak işin içine Türkçe karakterler girdiğinde, özellikle “İ” ve “I” harfleri, birçok yazılımcının kabusu olan beklenmedik hatalara yol açar. “İSTANBUL” kelimesini küçük harfe çevirdiğinizde karşınıza çıkan sonuç her zaman beklediğiniz “istanbul” olmayabilir.

Metin Normalizasyonu Nedir ve Neden Önemlidir?

Metin normalizasyonu (text normalization), ham metin verilerini standart bir formata dönüştürme işlemidir. Bu işlem, özellikle Doğal Dil İşleme (NLP – Natural Language Processing) projelerinin, arama motorlarının ve veri analiz araçlarının temel taşını oluşturur.

Düşünün ki bir kullanıcı arama kutusuna “İSTANBUL” yazdı, bir diğeri ise “istanbul” yazdı. Eğer sisteminiz bu iki girişi aynı anlamda görmezse, kullanıcıya yanlış sonuçlar dönebilir. İşte burada “normalizasyon” devreye girer. Amacımız; noktalama işaretlerini temizlemek, gereksiz boşlukları yok etmek ve en önemlisi dilin kendi kurallarına uygun şekilde büyük/küçük harf dönüşümleri yapmaktır.

Kodun Anatomisi

Bu projede, Python’ın standart kütüphanesini kullanarak dilsel hassasiyeti yüksek bir temizleme hattı (pipeline) oluşturduk. Sistemin kalbinde üç ana yapı bulunuyor:

1. Dilsel Büyük/Küçük Harf Dönüşümü

Python’ın yerel .lower() ve .upper() metodları, İngilizce odaklıdır. Türkçe’deki noktalı “İ” ve noktasız “I” ayrımını doğru yönetemezler. Bu yüzden turkish_lower ve turkish_upper adında iki yardımcı fonksiyon tasarladık. Bu fonksiyonlar, yerel dönüşümden önce .replace() metodunu kullanarak karakterleri manuel olarak eşleştirir.

2. Düzenli İfadeler (Regular Expressions) ile Temizlik

Metindeki gürültüyü (noktalama işaretleri, özel karakterler) temizlemek için re modülünü kullandık. [^\w\s] deseni sayesinde, alfanümerik olmayan ve boşluk dışındaki tüm karakterleri tek seferde siliyoruz. Ayrıca, isteğe bağlı olarak rakamları da temizleyebileceğimiz bir bayrak (remove_digits) ekledik.

3. Boşluk Sıkıştırma

Kullanıcılar bazen kelimeler arasına yanlışlıkla birden fazla boşluk veya tab karakteri bırakabilir. re.sub(r"\s+", " ", cleaned) ifadesi ile tüm ardışık boşlukları tek bir boşluğa indirgeyip metni standart hale getiriyoruz.

import re

def turkish_lower(text: str) -> str:
    # Büyük noktalı İ -> küçük i, Büyük noktasız I -> küçük ı
    return text.replace("İ", "i").replace("I", "ı").lower()

def normalize_text(raw_text: str, remove_digits: bool = False) -> str:
    if not raw_text: return ""
    
    # 1. Dilsel küçük harf dönüşümü
    cleaned = turkish_lower(raw_text)
    
    # 2. Noktalama ve gürültü temizliği
    pattern = r"[^\w\s]|\d" if remove_digits else r"[^\w\s]"
    cleaned = re.sub(pattern, "", cleaned, flags=re.UNICODE)
    
    # 3. Boşlukları normalize et
    return re.sub(r"\s+", " ", cleaned).strip()

# Örnek kullanım
text = "İSTANBUL, IŞIKLARI ve 2026 yılı!"
print(f"Ham: {text}")
print(f"Temiz: {normalize_text(text, remove_digits=True)}")
# Çıktı: istanbul ışıkları ve yılı

Nasıl Çalıştırılır?

Bu proje herhangi bir dış kütüphane gerektirmez, sadece Python 3.12+ yüklü bir sistemde çalışır.

  1. Proje klasörüne gidin:cd 27_text_normalization
  2. Betiği çalıştırın:python main.py

Sistem, konsola hem standart .lower() yönteminin hatalarını hem de geliştirdiğimiz normalizasyon motorunun doğru sonuçlarını yazdıracaktır.

Ne Öğrendik?

Bu proje ile şu kritik kavramları uygulamalı olarak gördük:

  • Unicode ve Yerelleştirme: Yazılımların sadece İngilizce değil, dünya dillerinin kurallarına (özellikle Türkçe’deki I/ı-İ/i ayrımına) uygun geliştirilmesi gerektiğini anladık.
  • Düzenli İfadeler (Regex): re modülünün, karmaşık metin temizleme işlemlerini nasıl birkaç satıra indirdiğini deneyimledik.
  • Veri Ön İşleme (Preprocessing): Veriyi analiz etmeden önce onu “temizleme” ve “standartlaştırma” aşamasının, analiz sonuçlarının doğruluğu için ne kadar kritik olduğunu gördük.
  • Bayrak (Flag) Kullanımı: Fonksiyonlara eklenen parametrelerle (örneğin remove_digits), tek bir fonksiyonun farklı ihtiyaçlara cevap verebilmesini sağladık.

Kaynaklar ve Sonraki Adımlar

Eğer bu konu ilginizi çektiyse, şunları araştırarak kendinizi geliştirebilirsiniz:

  • NLTK (Natural Language Toolkit): Python’ın en güçlü NLP kütüphanesi.
  • Spacy: Endüstriyel seviyede metin işleme araçları.
  • Stemming ve Lemmatization: Kelimelerin köklerine inme teknikleri.

Ahmet Aksoy

Not: Bu yazıda incelediğimiz kodu ve benzer projelerin kaynak kodlarını https://github.com/ahmetax/practical-python-examples adresinde bulabilirsiniz.


python, python programlama, python öğren, yazılım, kod, metin normalizasyonu, nlp, regex, düzenli ifadeler, veri temizleme, başlangıç seviyesi

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir