NLP'ye giriş
Kanca
- kategoride (Derin Öğrenme: Görüntü) girdimiz hep sayıydı — piksel değeri, ölçüm. Yeni bir kategoriye başlıyoruz: Derin Öğrenme — NLP & LLM. Burada girdi metin, yani semboller. Bu tek fark, öğrendiğimiz her şeyi yeniden düşünmemizi gerektiriyor.
Sezgi
Doğal dil işleme (NLP), bilgisayarların insan dilini “anlamasını” sağlayan teknikler bütünüdür. Ama “anlamak” için önce metni sayılara çevirmek gerekir — ve bu çeviri, sanıldığından çok daha zor bir problemdir.
Mekanizma
Önce en temel gerçeği görelim: kelimelerle doğrudan matematik yapılamaz.
Kelimelerle doğrudan işlem
# Şimdiye kadarki her derste (istatistik, ML, DL Vision) girdimiz zaten sayıydı --
# piksel değeri, ölçüm, kategori kodu. Metin ise sembolik: "kedi" kelimesinin
# "köpek"ten "ne kadar büyük" olduğu gibi bir soru anlamsızdır.
kelime1 = "kedi"
kelime2 = "köpek"
try:
fark = kelime1 - kelime2
except TypeError as hata:
print(f"'{kelime1}' - '{kelime2}' denemesi hata verdi: {hata}")
print("\nSayılarla çıkarma, toplama, çarpma yapabiliriz -- ama kelimelerle doğrudan yapamayız.")
print("NLP'nin ilk ve en temel sorusu: metni, anlamını koruyarak sayılara nasıl çeviririz?")'kedi' - 'köpek' denemesi hata verdi: unsupported operand type(s) for -: 'str' and 'str'
Sayılarla çıkarma, toplama, çarpma yapabiliriz -- ama kelimelerle doğrudan yapamayız.
NLP'nin ilk ve en temel sorusu: metni, anlamını koruyarak sayılara nasıl çeviririz?Naif bir çözüm var: her kelimenin kaç kez geçtiğini saymak (“bag-of-words” — kelime çantası). Deneyelim:
Bag-of-words'ün kör noktası
# Naif bir çözüm: her kelimenin kaç kez geçtiğini say ("bag-of-words" -- kelime çantası).
def temizle_ve_ayir(cumle):
return cumle.lower().replace(",", "").replace(".", "").split()
def bow_vektor(kelimeler, kelime_dagarcigi):
sayim = Counter(kelimeler)
return [sayim.get(k, 0) for k in kelime_dagarcigi]
cumle_pozitif = "Bu film çok iyi, hiç kötü değil."
cumle_negatif = "Bu film hiç iyi değil, çok kötü."
kelimeler_p = temizle_ve_ayir(cumle_pozitif)
kelimeler_n = temizle_ve_ayir(cumle_negatif)
kelime_dagarcigi = sorted(set(kelimeler_p) | set(kelimeler_n))
vektor_p = bow_vektor(kelimeler_p, kelime_dagarcigi)
vektor_n = bow_vektor(kelimeler_n, kelime_dagarcigi)
print(f"Kelime dağarcığı: {kelime_dagarcigi}")
print(f"\n'{cumle_pozitif}' (olumlu anlam)")
print(f" -> {vektor_p}")
print(f"'{cumle_negatif}' (olumsuz anlam)")
print(f" -> {vektor_n}")
print(f"\nİki vektör birebir aynı mı? {vektor_p == vektor_n}")
print("Evet -- tamamen zıt anlamlı iki cümle, bag-of-words'te aynı sayı dizisine dönüşüyor!")
print("Sorun: bag-of-words, kelimelerin sırasını ve birbiriyle ilişkisini tamamen atıyor.")Kelime dağarcığı: ['bu', 'değil', 'film', 'hiç', 'iyi', 'kötü', 'çok']
'Bu film çok iyi, hiç kötü değil.' (olumlu anlam)
-> [1, 1, 1, 1, 1, 1, 1]
'Bu film hiç iyi değil, çok kötü.' (olumsuz anlam)
-> [1, 1, 1, 1, 1, 1, 1]
İki vektör birebir aynı mı? True
Evet -- tamamen zıt anlamlı iki cümle, bag-of-words'te aynı sayı dizisine dönüşüyor!
Sorun: bag-of-words, kelimelerin sırasını ve birbiriyle ilişkisini tamamen atıyor.Tamamen zıt anlamlı iki cümle, bag-of-words’te birebir aynı sayı dizisine dönüşüyor! Çoğu kişi “kelimeleri sayarsam, anlamı da yakalarım” sanır. Yanlış, çünkü bag-of-words kelimelerin sırasını ve birbiriyle ilişkisini tamamen atıyor — “hiç kötü değil” ile “hiç iyi değil” arasındaki fark, sadece kelime sırasında.
Matematik
Bag-of-words: en basit metin-sayı dönüşümü
| Sembol | Anlamı |
|---|---|
| Vektörün . bileşeni — . kelimenin cümlede kaç kez geçtiği | |
| Kelime dağarcığı | Tüm olası kelimelerin sabit bir listesi — vektörün her bileşeni bu listedeki bir kelimeye karşılık gelir |
Bu formül sıraya hiç bakmıyor — sadece sayıya. Bu kategorideki her ders, bu eksikliği gidermenin bir yolunu ekleyecek.
Kod
Bu kategori boyunca, bag-of-words’ün bu sınırlamasını aşan fikirleri tarihsel sırayla izleyeceğiz:
Kategorinin yol haritası
# Bu kategori, bag-of-words'ün bu sınırlamasını aşmak için geliştirilen fikirleri,
# tarihsel sırayla ve her birinin bir öncekini nasıl düzelttiğini izleyerek takip ediyor.
yol_haritasi = [
("Tokenization ve BPE", "Metni, modele verilecek PARÇALARA (token) ayırmak"),
("Word embedding", "Kelimeleri, ANLAMI yakalayan yoğun sayı vektörlerine çevirmek"),
("RNN / LSTM / GRU", "Kelime SIRASINI, bir 'hafıza' zinciriyle modellemek"),
("Attention", "Sırayı zincirle DEĞİL, DOĞRUDAN ilişkilerle modellemek"),
("Transformer", "Attention'ı, paralel çalışan tam bir mimariye dönüştürmek"),
("Büyük dil modelleri (LLM)", "Transformer'ı devasa veri ve ölçekle eğitmek"),
]
print("\nBu kategorinin yol haritası:")
for i, (isim, aciklama) in enumerate(yol_haritasi, 1):
print(f" {i}. {isim}: {aciklama}")
Bu kategorinin yol haritası:
1. Tokenization ve BPE: Metni, modele verilecek PARÇALARA (token) ayırmak
2. Word embedding: Kelimeleri, ANLAMI yakalayan yoğun sayı vektörlerine çevirmek
3. RNN / LSTM / GRU: Kelime SIRASINI, bir 'hafıza' zinciriyle modellemek
4. Attention: Sırayı zincirle DEĞİL, DOĞRUDAN ilişkilerle modellemek
5. Transformer: Attention'ı, paralel çalışan tam bir mimariye dönüştürmek
6. Büyük dil modelleri (LLM): Transformer'ı devasa veri ve ölçekle eğitmekNerede işe yarar
Bu kategoriyi takip ederken aklında tutman gereken üç şey:
- Her yeni fikir, bir öncekinin somut bir eksikliğini çözüyor. Tokenization, embedding’in nasıl girdi alacağını belirler; embedding, RNN’in girdisini oluşturur; RNN’in sınırları attention’ı, attention transformer’ı doğurur.
- 4. kategoride (DL Vision) öğrendiğin her şey (backprop, aktivasyon, optimizer, düzenlileştirme) burada da geçerli. Yeni olan, verinin yapısı — ızgara değil, dizi.
- Bu kategorinin sonunda, ChatGPT gibi sistemlerin (“büyük dil modelleri”) nasıl çalıştığını — büyülü değil, mekanik olarak — anlayacaksın.
Bu 3 hatayı yaparsın:
- Bag-of-words’ü “yeterince iyi” sanıp, kelime sırasının önemli olduğu görevlerde (duygu analizi, çeviri) kullanmaya devam etmek.
- NLP’yi “sadece kelime sayma” sanmak — gerçekte anlam, bağlam ve ilişkileri modellemekle ilgilidir.
- Bu kategorideki her yeni fikri bağımsız bir teknik sanmak — aslında hepsi aynı sorunun (sıra/ilişki kaybı) giderek daha iyi çözümleri.
Kendini test et
1. Notebook'ta 'Bu film çok iyi, hiç kötü değil' ve 'Bu film hiç iyi değil, çok kötü' cümleleri neden aynı bag-of-words vektörünü üretti?
- Cümleler aslında aynı anlama geliyor
- Bag-of-words, sadece hangi kelimelerin kaç kez geçtiğini sayar -- kelimelerin sırasını ve birbirleriyle ilişkisini tamamen göz ardı eder (doğru cevap)
- Kod hatalıydı
- Türkçe karakterler yanlış işlendi
Neden: İki cümle de aynı 7 kelimeyi (bu, film, çok, iyi, hiç, kötü, değil) birer kez içeriyor -- bag-of-words sadece bu sayımı yakaladığı için, "hiç...değil" kalıbının hangi kelimeyi olumsuzladığı bilgisi kayboluyor.
2. Metin verisini sayısal veriden (örn. piksel değerleri) temelde farklı kılan nedir?
- Metin her zaman daha büyük dosyalardır
- Metin semboliktir -- kelimeler arasında doğrudan aritmetik işlem (toplama, çıkarma) tanımlı değildir, önce anlamlı bir sayısal temsile çevrilmeleri gerekir (doğru cevap)
- Metin verisi hiçbir zaman sayısallaştırılamaz
- Aralarında temel bir fark yoktur
Neden: Piksel değerleri zaten sayıdır ve doğrudan matematiksel işlemlere uygundur; kelimeler ise semboldür -- 'kedi' - 'köpek' gibi bir işlem tanımsızdır, bu yüzden NLP'nin ilk adımı her zaman metni sayıya çevirmektir.
3. Bu kategorinin genel yapısı hakkında hangisi doğrudur?
- Her ders, öncekilerden bağımsız, ayrı bir teknik sunar
- Her yeni fikir (tokenization, embedding, RNN, attention, transformer), bir öncekinin somut bir eksikliğini çözerek üzerine inşa edilir (doğru cevap)
- Kategori, sadece ChatGPT'nin arayüzünü öğretir
- Kategorinin matematiksel bir temeli yoktur
Neden: Yol haritasında görüldüğü gibi, tokenization embedding'in girdisini hazırlar, embedding RNN'in girdisini oluşturur, RNN'in sınırları attention fikrini doğurur, attention transformer mimarisine dönüşür -- zincirleme bir ilerleme.
Özet
Özet
- NLP, insan dilini bilgisayarların işleyebileceği sayısal temsillere çevirip anlam çıkarmayı hedefler.
- Kelimelerle doğrudan aritmetik işlem yapılamaz -- önce sayısal bir temsile ihtiyaç vardır.
- Bag-of-words (kelime sayma), en basit temsildir ama kelime sırasını tamamen kaybeder.
- Zıt anlamlı cümleler bile bag-of-words'te aynı vektörü üretebilir -- bu, kategorinin ele alacağı temel sorundur.
- Bu kategori, tokenization'dan büyük dil modellerine kadar, her biri bir öncekinin eksikliğini gideren bir fikir zincirini izler.