NLP'ye giriş
Kanca
- kategoride (Derin Öğrenme: Görüntü) girdimiz hep SAYIYDI — 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 SAYILARA ç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 YAPILAMAZ.
Kelimelerle doğrudan işlem
# Şimdiye kadarki HER derste (istatistik, ML, DL Vision) girdimiz zaten SAYIYDI --
# piksel değeri, ölçüm, kategori kodu. Metin ise SEMBOLİK: "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 İLK ve en temel sorusu: metni, ANLAMINI 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 İLK ve en temel sorusu: metni, ANLAMINI 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 BİREBİR AYNI mı? {vektor_p == vektor_n}")
print("EVET -- tamamen ZIT anlamlı iki cümle, bag-of-words'te AYNI sayı dizisine dönüşüyor!")
print("Sorun: bag-of-words, kelimelerin SIRASINI ve BİRBİRİYLE İLİŞKİSİNİ 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 BİREBİR AYNI mı? True
EVET -- tamamen ZIT anlamlı iki cümle, bag-of-words'te AYNI sayı dizisine dönüşüyor!
Sorun: bag-of-words, kelimelerin SIRASINI ve BİRBİRİYLE İLİŞKİSİNİ tamamen atıyor.TAMAMEN zıt anlamlı iki cümle, bag-of-words’te BİREBİR AYNI sayı dizisine dönüşüyor! Çoğu kişi “kelimeleri sayarsam, anlamı da yakalarım” sanır. Yanlış, çünkü bag-of-words kelimelerin SIRASINI ve BİRBİRİYLE İLİŞKİSİNİ 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 SIRAYA hiç bakmıyor — sadece SAYIYA. 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 TARİHSEL 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 BİRİNİN 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ÇERLİ. Yeni olan, verinin YAPISI — ızgara değil, DİZİ.
- Bu kategorinin sonunda, ChatGPT gibi sistemlerin (“büyük dil modelleri”) NASIL çalıştığını — büyülü değil, MEKANİK 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ĞIMSIZ bir teknik sanmak — aslında hepsi AYNI 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 AYNI bag-of-words vektörünü üretti?
- Cümleler aslında aynı anlama geliyor
- Bag-of-words, sadece HANGİ kelimelerin KAÇ kez geçtiğini sayar -- kelimelerin SIRASINI 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 SEMBOLİKTİR -- 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 SIRASINI 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.