Kısayol: Ctrl + Enter. Tüm hesaplamalar sunucuda saf PHP ile, harici kütüphane olmadan yapılır.
Doğal Dil İşleme (NLP) hattı
Bilgisayar metni doğrudan anlayamaz; metni önce temizleyip parçalara ayırır, sonra sayılara (vektörlere) dönüştürür. Tüm klasik NLP yöntemleri ve modern LLM'ler bu temel fikir üzerine kuruludur.
1 · Metni temsil etmek Klasik NLP
- Ön İşleme: metni temizleme adımları
- Kelime Bulutu: frekansın görsel hâli
- Bag of Words: kelime sayım vektörleri
- TF-IDF: önemli kelimeleri ağırlıklandırma
- N-gram: kelime sırasını yakalama
2 · Metinleri karşılaştırmak Analiz
- Benzerlik: kosinüs ve Jaccard ile belge benzerliği
- Zipf Yasası: dilin istatistiksel yapısı
- Kelime Vektörleri: "bir kelimeyi arkadaşlarından tanırsın" — dağılımsal anlam
3 · Metin üretmek LLM
- Dil Modeli: sonraki kelimeyi tahmin etme
- Softmax & Sıcaklık: olasılıktan seçime
- BPE: GPT'nin metni parçalama yöntemi
- Dikkat: Transformer'ın kalbi
- LLM Nasıl Çalışır: uçtan uca mimari
Klasik NLP ile LLM karşılaştırması
| Özellik | Klasik (BoW / TF-IDF / n-gram) | Modern (Embedding / Transformer / LLM) |
|---|---|---|
| Temsil | Seyrek (sparse) vektör: sözlük boyutu kadar, çoğu 0 | Yoğun (dense) vektör: yüzlerce–binlerce boyut, anlam taşır |
| Kelime sırası | BoW'da yok, n-gram'da yalnızca yerel | Konum kodlaması + dikkat ile tüm bağlam |
| Anlam | "araba" ile "otomobil" tamamen farklı sütunlar | Eş anlamlılar vektör uzayında birbirine yakın |
| Bilinmeyen kelime | Sözlükte yoksa kaybolur (OOV sorunu) | Alt-kelime (BPE) tokenları ile her kelime temsil edilir |
| Veri / hesap | Az veri, hızlı, açıklanabilir | Çok büyük veri, GPU, milyarlarca parametre |
| Kullanım | Spam filtresi, arama, anahtar kelime çıkarımı | Sohbet, çeviri, özetleme, kod yazma, soru cevaplama |
Kavram sözlüğü
Korpus: Üzerinde çalışılan metin koleksiyonu.
Belge (doküman): Korpustaki tek bir metin birimi (burada her satır).
Token: Metnin en küçük işlenen parçası (kelime, alt-kelime veya karakter).
Sözlük (vocabulary): Korpustaki benzersiz tokenların kümesi.
Durak kelime (stopword): "ve, bu, bir" gibi çok sık geçip az anlam taşıyan kelimeler.
Kök bulma (stemming): Ekleri atarak kelimeyi köküne indirgeme (kitaplar → kitap).
Vektör: Metnin sayısal temsili; makine öğrenmesi modellerinin girdisi.
Embedding: Kelimenin anlamını taşıyan yoğun vektör.
Logit: Modelin her token için ürettiği ham puan; softmax ile olasılığa çevrilir.
Bağlam penceresi: Modelin tek seferde görebildiği en fazla token sayısı.
🧹 Metin ön işleme nedir?
Ham metin gürültülüdür: büyük/küçük harf farkları, noktalama, anlamsız sık kelimeler, aynı kelimenin farklı çekimleri vardır. Ön işleme bu gürültüyü azaltıp sözlüğü küçültür.
- Küçük harf: "Model" ve "model" aynı token olur. Türkçede
I→ı,İ→ikuralına dikkat edilir. - Noktalama temizliği: harf ve rakam dışındaki karakterler atılır.
Türkiye'nin→türkiye - Tokenizasyon: metin boşluklardan kelimelere bölünür.
- Stopword çıkarma: "ve, bir, bu, için" gibi kelimeler atılır.
- Kök bulma: "modelleri → model", "kelimeler → kelime".
değil gibi olumsuzluk kelimeleri stopword sayılıp atılırsa anlam tersine dönebilir! Stopword listesi göreve göre seçilmelidir.Adım adım dönüşüm
Token sayısı her adımda nasıl azalıyor?
Çıkarılan durak kelimeler
Kök bulma eşleşmeleri
☁️ Kelime bulutu (Word Cloud)
Kelimenin büyüklüğü, metinde kaç kez geçtiğiyle orantılıdır. Kelimenin üzerine gelince sayısını görebilirsiniz. Stopword'leri açıp kapatarak farkı karşılaştırın.
En sık 20 kelime
Frekans tablosu
🎒 Bag of Words (Kelime Torbası)
Her belge, sözlükteki kelimelerin kaç kez geçtiğini gösteren bir vektöre dönüştürülür. Kelimeler bir torbaya atılmış gibidir; sıra kaybolur.
Artıları: basit, hızlı, açıklanabilir. Spam filtreleme ve metin sınıflandırmada hâlâ güçlü bir temel yöntemdir.
Eksileri:
- Kelime sırası kaybolur: "köpek adamı ısırdı" ile "adam köpeği ısırdı" neredeyse aynı vektör olur.
- Seyreklik: sözlük büyüdükçe vektörlerin çoğu 0 olur.
- Anlam yok: "güzel" ile "harika" arasında ilişki kurulamaz.
Doküman-terim matrisi
1 · Belgeler ve tokenları
2 · Sözlük (vocabulary)
3 · Vektör gösterimi
⚖️ TF-IDF (Terim Sıklığı × Ters Belge Sıklığı)
BoW'da "model" gibi her belgede geçen kelimeler baskın çıkar. TF-IDF, bir kelimeye belgede sık, korpusta nadir olduğu ölçüde yüksek ağırlık verir.
- Her belgede geçen kelime → IDF düşük → önemsiz
- Tek belgede geçen kelime → IDF yüksek → o belgeyi ayırt eden kelime
IDF değerleri (yüksek = nadir = ayırt edici)
Her belgenin en ayırt edici 5 kelimesi
TF-IDF matrisi (ısı haritası)
TF matrisi (normalize terim sıklığı)
🔗 N-gram
Art arda gelen n tokenlık diziler. BoW'un kaybettiği yerel sırayı kısmen geri kazandırır.
- Unigram (n=1): "doğal", "dil", "işleme"
- Bigram (n=2): "doğal dil", "dil işleme"
- Trigram (n=3): "doğal dil işleme"
N-gramlar hem öznitelik (feature) olarak hem de n-gram dil modellerinde (bkz. 🔮 Dil Modeli sekmesi) kullanılır. n büyüdükçe bağlam artar ama veri seyrekleşir.
Kayan pencere (ilk belge)
En sık n-gramlar
Tablo
📐 Belge benzerliği
Belgeler vektöre dönüştükten sonra aralarındaki açı ile benzerlik ölçülür.
TF-IDF + kosinüs klasik arama motorlarının temelidir. LLM tabanlı sistemlerde (RAG, semantik arama) aynı kosinüs formülü embedding vektörleri üzerinde kullanılır.
Benzerlik matrisi
En benzer belge çiftleri
Belgeler
📉 Zipf Yasası
Doğal dillerde bir kelimenin frekansı, sıklık sıralamasındaki yeriyle ters orantılıdır. En sık kelime ikinciden yaklaşık 2 kat, üçüncüden 3 kat fazla geçer.
- Birkaç kelime çok sık geçer (genelde stopword'ler).
- Kelimelerin büyük çoğunluğu yalnızca 1–2 kez geçer (hapax legomena).
- Bu yüzden stopword çıkarmak metni çok küçültür, nadir kelimeler ise seyreklik sorunu yaratır.
Sıra – frekans (log-log)
İlk 30 kelime · r × f sabite yakın mı?
🧬 Kelime vektörleri (Embedding)
Dağılımsal hipotez (Firth, 1957): "Bir kelimeyi, çevresindeki kelimelerden tanırsın." Benzer bağlamlarda geçen kelimeler benzer anlama sahiptir.
Word2Vec, GloVe ve LLM'lerin embedding katmanları aynı fikrin sinir ağlarıyla öğrenilmiş hâlidir. LLM'lerde her token binlerce boyutlu bir vektördür.
2 boyutlu kelime uzayı (PCA)
Nokta büyüklüğü = frekans. Birbirine yakın noktalar, benzer bağlamlarda geçen kelimelerdir. (PCA bilgiyi sıkıştırdığı için tam komşuluk sağdaki listede daha doğrudur.)
En yakın kelimeler (kosinüs)
Eş-geçiş matrisi (ilk 15 kelime)
🔮 Dil modeli: sonraki kelimeyi tahmin et
Bir dil modeli, bir kelime dizisinin olasılığını hesaplar. Zincir kuralı ile bu, her adımda sonraki kelimenin olasılığına indirgenir:
N-gram modeli yalnızca son n−1 kelimeye bakar (Markov varsayımı) ve olasılığı sayarak bulur:
Bağlam korpusta hiç yoksa daha kısa bağlama geri çekilir (backoff).
İpucu: "Masal" örneğini seçip bağlama küçük yazın.
Sonraki kelime olasılıkları
Üretilen metin
Kelimenin üzerine gelince olasılığı, kullanılan n-gram derecesi ve aday sayısı görünür. Düşük sıcaklıkta metin korpusu ezberden tekrarlar, yüksek sıcaklıkta daha rastgele ve "yaratıcı" olur.
Modelin sayım tablosu (en sık n-gramlar)
🌡️ Softmax, sıcaklık, Top-k ve Top-p
LLM her adımda sözlükteki her token için bir puan (logit) üretir. Softmax bu puanları toplamı 1 olan olasılıklara çevirir.
- T < 1: dağılım sivrileşir, model daha kararlı ve tekrarcı olur (T→0: hep en olası token, greedy).
- T = 1: modelin öğrendiği orijinal dağılım.
- T > 1: dağılım düzleşir, daha yaratıcı ve rastgele olur.
- Top-k: yalnızca en olası k token arasından seç.
- Top-p (nucleus): kümülatif olasılığı p'ye ulaşan en küçük token kümesinden seç.
"Kedi süt ___" cümlesi için sonraki token dağılımı
Açık renkli çubuklar T=1'deki orijinal dağılımı gösterir. Gri çubuklar top-k veya top-p filtresiyle elenen tokenlardır.
Logitler (düzenlenebilir) ve hesap tablosu
✂️ Byte Pair Encoding (BPE)
GPT, LLaMA ve benzeri modeller metni kelimelere değil alt-kelime (subword) tokenlarına böler. BPE bu sözlüğü veriden öğrenir:
- Sık kelimeler tek token olur:
dil - Nadir kelimeler parçalanır:
model + leri - Bilinmeyen kelime (OOV) sorunu ortadan kalkar.
- Türkçe gibi eklemeli dillerde ekler ayrı token olarak öğrenilir.
Tokenizasyon sonucu
Sözlük büyümesi
Öğrenilen birleştirme kuralları (sırayla)
Korpustaki sık kelimeler nasıl bölündü?
🎯 Öz-dikkat (Self-Attention)
Transformer'da her token, cümledeki diğer tokenlara ne kadar dikkat edeceğine kendisi karar verir. Böylece "o" zamirinin "kedi"yi işaret ettiği öğrenilebilir.
- Her token çifti için Q·K benzerlik puanı hesaplanır.
- √dk ile ölçeklenir (sayılar patlamasın diye).
- Her satıra softmax uygulanır → dikkat ağırlıkları.
- V vektörleri bu ağırlıklarla toplanır → bağlamlı yeni temsil.
Maskeli (causal) dikkat: GPT gibi üretici modellerde bir token yalnızca kendinden öncekilere bakabilir; geleceği göremez.
Çok başlı dikkat: Gerçek modellerde bu işlem paralel olarak onlarca "baş"ta yapılır; her baş farklı bir ilişki türünü (özne-yüklem, zamir-isim…) öğrenir.
Dikkat ağırlıkları ısı haritası
Satır = dikkat eden token (Query), sütun = dikkat edilen token (Key). Bir satıra tıklayın.
"o" tokenı kime dikkat ediyor?
🤖 Büyük Dil Modeli (LLM) nasıl çalışır?
ChatGPT, Claude, Gemini ve LLaMA gibi modeller decoder-only Transformer mimarisindedir. Temel görevleri tektir: verilen metnin devamındaki tokenı tahmin etmek. Bu işlem her yeni token için tekrarlanır (otoregresif üretim).
Bir tokenın yolculuğu
Eğitim aşamaları
Bu laboratuvardaki karşılıkları
| Tokenizer | ✂️ BPE Tokenizer sekmesi |
| Embedding | 🧬 Kelime Vektörleri sekmesi |
| Öz-dikkat | 🎯 Dikkat sekmesi |
| Sonraki token tahmini | 🔮 Dil Modeli sekmesi (n-gram versiyonu) |
| Softmax / örnekleme | 🌡️ Softmax & Sıcaklık sekmesi |
Önemli kavramlar
Modelin tek seferde görebildiği en fazla token sayısı. Pencerenin dışında kalan bilgi "unutulur".
Model, olasılığı yüksek görünen ama gerçekte yanlış bilgi üretebilir; çünkü amacı doğruluk değil, akla yatkın devam üretmektir.
Retrieval-Augmented Generation: soruya benzer belgeler embedding + kosinüs benzerliği ile bulunur ve modele bağlam olarak verilir.
Talimat, örnek (few-shot) ve bağlam vererek modelin çıktısını yönlendirmek.
Modelin öğrenilen ağırlıkları. Büyük modellerde milyarlarca parametre bulunur.
Türkçe gibi eklemeli dillerde bir kelime çoğu zaman birden fazla tokena bölünür; bu, maliyeti ve bağlam kullanımını artırır.
🏷️ Metin sınıflandırma ve baseline disiplini
- Naive Bayes: kelimelerin sınıf içinde bağımsız olduğunu varsayar; çok hızlı, az veride güçlü.
- Lojistik Regresyon: her kelimeye sınıf başına ağırlık öğrenir; olasılık verir.
- Lineer SVM: sınıflar arasındaki marjı en büyütür; seyrek metin verisinde çok başarılıdır.
- Çoğunluk sınıfı: hep en sık sınıfı söyler. Modeliniz bunu geçemiyorsa bir şeyler yanlıştır.
Veri seti ve bölme
📋 Sonuç tablosu (test kümesi)
Eğitim ve test macro-F1 arasındaki büyük fark aşırı öğrenmeye (overfitting) işaret eder. Küçük veri setlerinde modeller eğitim verisini ezberler.
🔬 Model detayı
Satır = gerçek sınıf, sütun = tahmin. Bir hücreye tıklayınca o hatalar aşağıda filtrelenir.
🐞 Hata analizi
🔑 Sınıfların en belirleyici kelimeleri
✍️ Yeni bir cümleyi sınıflandır
📏 Perplexity ve yumuşatma (smoothing)
Perplexity, dil modelinin görmediği test metnine ne kadar şaşırdığını ölçer. Düşük = daha iyi. Sezgisel olarak: model her adımda ortalama kaç seçenek arasında kararsız kalıyor?
Sıfır olasılık sorunu: Testte eğitimde hiç görülmemiş bir bigram varsa MLE olasılığı 0 olur ve PP = ∞. Yumuşatma bu yüzden gereklidir:
Korpus: sayfanın üstündeki metin kutusu. Anlamlı sonuç için uzun bir metin seçin (ör. "Haber korpusu").
📋 Perplexity karşılaştırma tablosu
Yöntem × tokenizasyon (log ölçek)
Add-k: k değeri perplexity'yi nasıl etkiliyor? (kelime başına)
k çok büyükse görülmemiş olaylara fazla olasılık dağıtılır, çok küçükse görülmemiş bigramlar ağır cezalandırılır. En iyi k normalde bir doğrulama (validation) kümesinde seçilir, test kümesinde değil!
Test cümlelerinde token olasılıkları
Renk koyuluğu = olasılık. Dalgalı alt çizgi = eğitimde hiç görülmemiş bigram.
🔎 BM25 (Okapi Best Matching 25)
Arama motorlarının (Elasticsearch, Lucene, Solr) varsayılan sıralama fonksiyonu. TF-IDF'in iki zayıflığını düzeltir:
- Terim frekansı doyması: Bir kelimenin 10. kez geçmesi, 1. kez geçmesi kadar bilgi taşımaz. k1 bu doymayı ayarlar.
- Belge uzunluğu normalizasyonu: Uzun belgeler kelimeleri doğal olarak daha çok içerir. b bu cezayı ayarlar.
- k1 = 0 → yalnızca var/yok (ikili). k1 büyüdükçe TF-IDF'e yaklaşır. Tipik: 1.2–2.0
- b = 0 → uzunluk yok sayılır. b = 1 → tam normalizasyon. Tipik: 0.75
Belgeler: sayfanın üstündeki metin kutusundaki satırlar. "Haber korpusu" örneği arama için idealdir.
Sorgu terimleri
BM25 skorunun terimlere dağılımı (ilk 10 belge)
🥇 BM25 sıralaması
TF-IDF (kosinüs) sıralaması
Terim frekansı doyması (k1)
TF-IDF'te skor frekansla doğrusal artar; BM25'te k1+1 değerine doğru doyar.
Belge uzunluğu normalizasyonu (b)
Aynı terim frekansında (tf = 2) belge uzadıkça skor düşer. Düşüşün şiddeti b ile artar.
📓 Hafta 2 ödev rehberi
Bu sayfa ödevin nasıl yapılacağını anlatır. Teslim edilecek notebook'u Python'da siz yazacaksınız. Site, kavramları görmek ve notebook'taki sonuçlarınızı kontrol etmek içindir. (Sitedeki algoritmalar sklearn ile aynı formülleri kullanır; eğitim algoritmalarındaki küçük farklar nedeniyle sayılar birebir aynı çıkmayabilir.)
1 · Notebook + tablo + hata analizi
- Veriyi yükle, sınıf dağılımını göster.
train_test_split(..., stratify=y, random_state=42)- Önce
DummyClassifier(strategy="most_frequent") - Pipeline:
TfidfVectorizer+ NB / LR / LinearSVC - Aynı modeller BoW ve (1,2)-gram ile de
- Tek bir sonuç tablosu: accuracy, macro-P/R/F1
- En iyi modelin confusion matrix'i
- En az 10 yanlış örneği incele, hataları kategorilere ayır
Sitede: 🏷️ Sınıflandırma sekmesi
2 · Perplexity: kelime vs lemma vs subword
- Korpusu cümlelere böl, train/test ayır.
- Üç tokenizasyon: kelime, lemma (Zemberek / Stanza / spaCy-tr), subword (SentencePiece veya HF tokenizers BPE).
- Her biri için bigram modeli + yumuşatma (Laplace ve add-k).
- PP'yi hem token hem kelime başına raporla.
- OOV oranını ve sözlük boyutunu tabloya ekle.
- Yorum: hangisi neden daha iyi? Karşılaştırma adil mi?
Sitede: 📏 Perplexity sekmesi
3 · Proje veri setinde baseline
- Proje verini aynı formata getir (metin + etiket).
- Aynı bölme, aynı Dummy + TF-IDF + LR/SVM baseline.
- macro-F1'i raporla; sınıf dengesizliğine bak.
- En iyi pipeline'ı kaydet:
joblib.dump(pipe, "baseline.joblib") - Yükleyip tek bir cümle ile test et:
joblib.load(...)
Sitede: kendi CSV'ni 🏷️ Sınıflandırma sekmesine yükleyip ön deneme yapabilirsin.
⚠️ Sık yapılan hatalar
- Veri sızıntısı: vektörleştiriciyi tüm veriye fit etmek. → Pipeline kullan, sadece
X_trainilefit. - Test kümesinde ayar yapmak: k, C, α gibi hiperparametreleri test sonucuna bakarak seçmek. → Doğrulama kümesi veya cross-validation.
- Yalnızca accuracy: dengesiz veride %90 accuracy, azınlık sınıfı hiç bilinmeden de elde edilebilir. → macro-F1.
- Seed vermemek: sonuçlar her çalıştırmada değişir, tekrarlanamaz. →
random_state=42 - Baseline'sız sonuç: "%70 aldım" tek başına anlamsız. Çoğunluk sınıfı ne kadar alıyor?
- Stopword körlüğü: duygu analizinde "değil", "hiç" gibi kelimeleri atmak anlamı ters çevirebilir.
- PP karşılaştırma hatası: farklı tokenizasyonların token-başına PP'sini doğrudan kıyaslamak.
🧾 Rapor tablosu şablonu
| Model | Temsil | n-gram | Accuracy | Macro-F1 | Not |
|---|---|---|---|---|---|
| Dummy | — | — | … | … | alt sınır |
| MultinomialNB | TF-IDF | (1,1) | … | … | |
| LogisticRegression | TF-IDF | (1,2) | … | … | |
| LinearSVC | TF-IDF | (1,2) | … | … |
Hata analizi kategorileri (örnek)
- Olumsuzluk / ironi ("güzel ama dayanıksız")
- Konu örtüşmesi ("hastanede yapay zeka": sağlık mı, teknoloji mi?)
- Eğitimde görülmemiş kelimeler (OOV)
- Etiket hatası / belirsiz etiket
- Çok kısa metin, bilgi yetersiz