Ana içeriğe geç

Giriş10 dk

Metin ön işleme

Önkoşul:NLP'ye giriş

Kanca

  1. derste metnin sayıya çevrilmesi gerektiğini gördük. Ama sayıya çevirmeden ÖNCE, metni “temizlemek” gelenekseldir — küçük harfe çevirme, durak kelime çıkarma, gövde bulma. Bu ders, bu adımların HER BİRİNİN gizli bir riski olduğunu gösteriyor.

Sezgi

Metin ön işleme, ham metni modele vermeden önce “sadeleştirme” adımlarıdır. Fikir mantıklı görünüyor: gereksiz karmaşıklığı at, sadece “özü” bırak. Ama her sadeleştirme adımı, bilgi de KAYBEDEBİLİR — ve bazen kaybedilen bilgi tam da ihtiyacın olan şeydir.

Mekanizma

En zararsız adımlarla başlayalım:

Küçük harfe çevirme ve noktalama temizliği

# Ön işlemenin en temel adımları: küçük harfe çevirme ve noktalamayı temizleme.
# Amaç: "NLP" ve "nlp"yi, "iyi!" ve "iyi"yi AYNI kelime olarak tanımak.
def kucuk_harf_ve_noktalama_temizle(metin):
    metin = metin.lower()
    metin = re.sub(r"[^\wçğıöşü\s]", "", metin, flags=re.UNICODE)
    return metin

ornek = "Merhaba! Bu, NLP'nin İLK adımı: küçük harfe çevirme ve noktalama temizliği."
print(f"Orijinal:     {ornek}")
print(f"Temizlenmiş:  {kucuk_harf_ve_noktalama_temizle(ornek)}")
Orijinal:     Merhaba! Bu, NLP'nin İLK adımı: küçük harfe çevirme ve noktalama temizliği.
Temizlenmiş:  merhaba bu nlpnin ilk adımı küçük harfe çevirme ve noktalama temizliği

Şimdi daha riskli bir adım: durak kelime (stopword) çıkarma.

Durak kelime çıkarmanın gizli riski

# Durak kelimeler (stopwords): "bu", "ve", "ile" gibi sık geçen ama genelde az
# anlam taşıyan kelimeler. Çıkarmak veriyi küçültür -- ama RİSKLİDİR.
DURAK_KELIMELER = {"bu", "film", "çok", "hiç", "ve", "ile", "de", "da"}

def durak_kelime_cikar(kelimeler, durak_kume):
    return [k for k in kelimeler if k not in durak_kume]

cumle_negatif = "Bu film hiç iyi değil, çok kötü."
kelimeler = kucuk_harf_ve_noktalama_temizle(cumle_negatif).split()
print(f"\nDurak kelime çıkarmadan önce: {kelimeler}")

filtrelenmis = durak_kelime_cikar(kelimeler, DURAK_KELIMELER)
print(f"'değil' durak kelime SAYILMAZSA: {filtrelenmis}")

DURAK_KELIMELER_TEHLIKELI = DURAK_KELIMELER | {"değil"}
filtrelenmis_tehlikeli = durak_kelime_cikar(kelimeler, DURAK_KELIMELER_TEHLIKELI)
print(f"'değil' de durak kelime SAYILIRSA: {filtrelenmis_tehlikeli}")
print("\n'değil' çıkarılınca geriye SADECE ['iyi', 'kötü'] kalıyor -- cümlenin OLUMSUZ olduğu bilgisi")
print("tamamen kayboluyor. 1. dersteki bag-of-words sorununun AYNISI, farklı bir kılıkta.")

Durak kelime çıkarmadan önce: ['bu', 'film', 'hiç', 'iyi', 'değil', 'çok', 'kötü']
'değil' durak kelime SAYILMAZSA: ['iyi', 'değil', 'kötü']
'değil' de durak kelime SAYILIRSA: ['iyi', 'kötü']

'değil' çıkarılınca geriye SADECE ['iyi', 'kötü'] kalıyor -- cümlenin OLUMSUZ olduğu bilgisi
tamamen kayboluyor. 1. dersteki bag-of-words sorununun AYNISI, farklı bir kılıkta.

“değil” durak kelime sayılıp çıkarılınca, cümleden geriye SADECE ['iyi', 'kötü'] kalıyor — OLUMSUZLUK bilgisi tamamen kayboluyor. Çoğu kişi “durak kelimeler zaten anlamsız, çıkarmak güvenlidir” sanır. Yanlış, çünkü “değil”, “hiç”, “ne” gibi kelimeler SIK geçse de, cümlenin anlamını TERSİNE çevirebilir.

Matematik

Gövde bulma: bir kelimeyi köküne indirgemek
govde(w)=weko¨yle ki w=ko¨k+ek\text{govde}(w) = w \setminus \text{ek} \quad \text{öyle ki } w = \text{kök} + \text{ek}
SembolAnlamı
wwGirdi kelimesi (örn. “kitaplarımdan”)
ekKelimenin sonundaki, bilinen bir çekim eki
Aşırı gövdeleme (over-stemming)Eki OLMAYAN bir kelimenin sonunun, yanlışlıkla ek SANILIP kırpılması

Türkçe, İngilizce’den çok daha fazla ek alabildiği (agglutinative — sondan eklemeli) için, basit kural tabanlı gövde bulma Türkçede ÖZELLİKLE zorlaşır.

Kod

Basit bir gövde bulma fonksiyonu yazıp SINIRLARINI görelim:

Gövde bulma ve Türkçenin zorlukları

# Gövde bulma (stemming): bir kelimeyi "kök" haline indirgemek -- örn. "kitaplarımdan" -> "kitap".
# Basit (öğretici amaçlı) bir sürüm yazalım: bilinen ekleri UZUNDAN KISAYA dener.
EKLER = [
    "larından", "lerinden", "larımız", "lerimiz", "lardan", "lerden",
    "ından", "inden", "ımdan", "imden", "ların", "lerin",
    "dan", "den", "ıma", "ime", "ımı", "imi", "ına", "ine",
    "da", "de", "ta", "te", "lar", "ler", "ım", "im", "a", "e", "ı", "i",
]

def basit_govde_bul(kelime):
    for ek in EKLER:
        if kelime.endswith(ek) and len(kelime) - len(ek) >= 2:
            return kelime[: -len(ek)]
    return kelime

kitap_formlari = ["kitap", "kitaplar", "kitabım", "kitabımı", "kitaplarımdan", "kitaba"]
print("\n'kitap' kelimesinin farklı çekimleri:")
for k in kitap_formlari:
    print(f"  {k:<16} -> {basit_govde_bul(k)}")
print("\n'kitabım'/'kitabımı', 'kitap' DEĞİL 'kitab' köküne iniyor -- Türkçe'nin p->b YUMUŞAMASI")
print("basit ek kırpmayla ÇÖZÜLEMEZ. 'kitaplarımdan' da tam 'kitap'a inmiyor -- ÜST ÜSTE binen ekler")
print("(çoklu ek yığını), basit kural tabanlı gövde bulmayı ZORLAYAN, Türkçeye ÖZGÜ bir problem.")

'kitap' kelimesinin farklı çekimleri:
  kitap            -> kitap
  kitaplar         -> kitap
  kitabım          -> kitab
  kitabımı         -> kitab
  kitaplarımdan    -> kitaplar
  kitaba           -> kitab

'kitabım'/'kitabımı', 'kitap' DEĞİL 'kitab' köküne iniyor -- Türkçe'nin p->b YUMUŞAMASI
basit ek kırpmayla ÇÖZÜLEMEZ. 'kitaplarımdan' da tam 'kitap'a inmiyor -- ÜST ÜSTE binen ekler
(çoklu ek yığını), basit kural tabanlı gövde bulmayı ZORLAYAN, Türkçeye ÖZGÜ bir problem.

“kitabım” ve “kitabımı”, “kitap” değil “kitab” köküne iniyor — Türkçenin p→b YUMUŞAMASI, basit ek kırpmayla çözülemiyor. Şimdi daha ciddi bir hata türüne bakalım:

Aşırı gövdeleme (over-stemming)

# Daha da ciddi bir sorun: gövde bulma, İNFLEKSİYON OLMAYAN kelimeleri de yanlışlıkla kırpabilir.
temel_kelimeler = ["masa", "kola", "kedi", "lira"]
print("\nHİÇ çekimlenmemiş (zaten kök olan) kelimeler:")
for k in temel_kelimeler:
    print(f"  {k:<10} -> {basit_govde_bul(k)}  (YANLIŞ -- kelimenin SONU, bir ek SANILIP kırpıldı)")
print("\nBu, 'over-stemming' (aşırı gövdeleme) denen klasik bir hata -- kural tabanlı gövde bulmanın")
print("EN büyük riski. Bu yüzden modern NLP, kural tabanlı gövde bulma yerine 3. derste göreceğimiz")
print("İSTATİSTİKSEL alt-kelime (subword) yöntemlerini (BPE gibi) tercih ediyor.")

HİÇ çekimlenmemiş (zaten kök olan) kelimeler:
  masa       -> mas  (YANLIŞ -- kelimenin SONU, bir ek SANILIP kırpıldı)
  kola       -> kol  (YANLIŞ -- kelimenin SONU, bir ek SANILIP kırpıldı)
  kedi       -> ked  (YANLIŞ -- kelimenin SONU, bir ek SANILIP kırpıldı)
  lira       -> lir  (YANLIŞ -- kelimenin SONU, bir ek SANILIP kırpıldı)

Bu, 'over-stemming' (aşırı gövdeleme) denen klasik bir hata -- kural tabanlı gövde bulmanın
EN büyük riski. Bu yüzden modern NLP, kural tabanlı gövde bulma yerine 3. derste göreceğimiz
İSTATİSTİKSEL alt-kelime (subword) yöntemlerini (BPE gibi) tercih ediyor.

“masa” (zaten kök bir kelime) yanlışlıkla “mas”a kırpılıyor — kelimenin SONU, olmayan bir ek SANILIYOR.

Nerede işe yarar

Bu risklerin farkında olmak, pratikte hangi ön işleme adımlarını KULLANACAĞINI belirler:

  • Duygu analizi gibi görevlerde durak kelime listesini DİKKATLİCE seç — olumsuzlama kelimelerini (değil, hiç, ne) ASLA çıkarma.
  • Kural tabanlı gövde bulma, basit/hızlı ama HATAYA açıktır — modern sistemler bunun yerine 3. derste göreceğimiz istatistiksel alt-kelime (subword) yöntemlerini tercih eder.
  • Ön işleme, GÖREVE göre değişir — bir arama motorunda agresif sadeleştirme faydalı olabilirken, bir çeviri modelinde her ayrıntı önemlidir.

Bu 3 hatayı yaparsın:

  1. Standart bir durak kelime listesini SORGULAMADAN kullanıp olumsuzlama kelimelerini kaybetmek.
  2. Kural tabanlı gövde bulmayı “kesin doğru” sanıp aşırı gövdeleme hatalarını fark etmemek.
  3. Her NLP görevinde AYNI ön işleme adımlarını uygulamak — doğru ön işleme, GÖREVE bağlıdır.

Kendini test et

1. Notebook'ta 'değil' kelimesi durak kelime sayılıp çıkarıldığında ne oldu?
  1. Cümlenin anlamı değişmedi
  2. Cümlenin OLUMSUZ olduğu bilgisi tamamen kayboldu -- geriye kalan ['iyi', 'kötü'] kelimeleri, sanki cümle olumluymuş gibi bir izlenim veriyor (doğru cevap)
  3. Kod hata verdi
  4. 'değil' zaten cümlede yoktu

Neden: 'değil', cümledeki 'iyi' kelimesini olumsuzlayan kritik bir kelimeydi; durak kelime olarak çıkarılınca bu olumsuzlama bilgisi kayboldu ve geriye kalan kelimeler yanıltıcı hale geldi.

2. 'masa' kelimesinin gövde bulma sonrası yanlışlıkla 'mas'a dönüşmesi hangi hatayı gösteriyor?
  1. Kod hatası
  2. Aşırı gövdeleme (over-stemming) -- kelimenin SONU, aslında orada olmayan bir çekim eki SANILIP yanlışlıkla kırpılıyor (doğru cevap)
  3. 'masa' kelimesi Türkçede yoktur
  4. Bu doğru bir sonuçtur

Neden: 'masa' zaten kök bir kelimedir, hiçbir çekim eki almamıştır; basit kural tabanlı gövde bulma, sonundaki 'a' harfini bir DATİF eki sanıp yanlışlıkla kırpıyor -- bu, aşırı gövdelemenin klasik bir örneğidir.

3. Neden Türkçede kural tabanlı gövde bulma İngilizceden daha zordur?
  1. Türkçe daha az kelime içerir
  2. Türkçe sondan eklemeli (agglutinative) bir dildir -- bir kelime üst üste birçok ek alabilir ve ünsüz yumuşaması gibi ses değişimleri basit ek kırpmayla çözülemez (doğru cevap)
  3. Türkçede durak kelime yoktur
  4. Aralarında hiçbir fark yoktur

Neden: Notebook'ta 'kitaplarımdan' gibi çoklu ek yığınları ve 'kitabım' gibi p→b ünsüz yumuşaması örnekleri gösterdiği gibi, Türkçenin zengin ek yapısı basit kural tabanlı yaklaşımları zorluyor.

Özet

Özet

  • Küçük harfe çevirme ve noktalama temizliği genelde güvenli, düşük riskli adımlardır.
  • Durak kelime çıkarma RİSKLİDİR -- özellikle "değil", "hiç" gibi olumsuzlama kelimeleri anlamı tersine çevirebilir.
  • Gövde bulma (stemming), bir kelimeyi köküne indirger ama Türkçenin zengin ek yapısında sıkça hata yapar.
  • Aşırı gövdeleme, çekim eki OLMAYAN kelimelerin bile yanlışlıkla kırpılmasıdır.
  • Doğru ön işleme adımları GÖREVE bağlıdır -- evrensel bir "doğru" ön işleme tarifi yoktur.
Sonraki adım: Tokenization ve BPE →