Sıfırdan İleri Seviyeye Doğal Dil İşleme (NLP): Teoriden 3 Endüstriyel Derin Öğrenme Projesine
Bu yazı dizisinde, sadece teorik tanımlar yapıp geçmeyeceğiz. Doğal Dil İşleme A-Z™ yolculuğunda adım adım inşa ettiğimiz mantığı, matematiği ve kodu masaya yatıracağız.
Doğal Dil İşleme (NLP) Nedir ve Neden Bu Kadar Heyecan Verici?
Yazılım dünyasında büyürken hepimiz aynı mantıkla kod yazmayı öğrendik: If/Else, döngüler, tipler ve kesin kural kümesi. C++, Java veya Python fark etmeksizin makine dilleri son derece disiplinlidir. Bir virgül unutsanız kod çalışmaz; çünkü makine dili yoruma kapalıdır, deterministiktir.
Peki ya her gün konuştuğumuz, mesajlaştığımız, duygularımızı aktardığımız diller? Türkçe, İngilizce veya Japonca... İnsan dili (Doğal Dil), doğası gereği büyüleyici olduğu kadar tam bir kaos barındırır. Aynı kelime farklı bir cümlede bambaşka bir anlama gelebilir; tonlama değiştiğinde ironi ortaya çıkar; gramer kuralları yöreden yöreye esnetilir. İnsanlar konuşurken lafın yarısını söyler, gerisini karşı tarafın kendi hayat tecrübeleriyle tamamlamasını bekler.
İşte Doğal Dil İşleme (NLP - Natural Language Processing), tam da bu kaotik ve belirsiz insan dilini, matematikten ve kurallardan anlayan bilgisayarlara öğretme sanatıdır. Bilgisayar bilimi, yapay zeka ve dil biliminin (linguistics) tam kesişim noktasında yer alır.
+-------------------------------------------------+
| YAPAY ZEKA |
| +-------------------------------------------+ |
| | BİLGİSAYAR BİLİMİ | |
| | +-------------------------------------+ | |
| | | DİL BİLİMİ (Linguistics) | | |
| | | | | |
| | | [ DOĞAL DİL İŞLEME ] | | |
| | +-------------------------------------+ | |
| +-------------------------------------------+ |
+-------------------------------------------------+
Kural Tabanlı Sistemlerden Derin Öğrenme Devrimine
NLP yeni bir alan değil, fakat yaşadığı kırılmalar inanılmaz. Tarihsel gelişimine baktığımızda üç büyük dönem görürüz:
- 1960’lar - Kural Tabanlı (Rule-Based) DönemMIT'de geliştirilen meşhur ELIZA chatbot'unu düşünün. Belirlenmiş gramer kurallarıyla bir terapist gibi davranıp cümle kalıplarını soruya dönüştürüyordu. Başarılıydı fakat esnekliği sıfırdı. Kuralların dışına çıkıldığı an sistem çöküyordu.
- 1980’ler & 2000’ler - İstatistiksel DönemKelime frekansları, N-Gram modelleri ve Olasılıksal yaklaşımlar (Naive Bayes, HMM) sahneye çıktı. Sistemler artık sadece kurallara değil, veri içerisindeki kelime dizilim olasılıklarına bakıyordu.
- 2010 ve Sonrası - Derin Öğrenme DevrimiVerinin patlaması ve GPU gücünün artmasıyla Word Embeddings (Word2Vec, GloVe) ve Yinelenen Sinir Ağları (RNN, LSTM, GRU) sahneye çıktı. Artık makineler kelimeleri sadece kelime olarak değil, uzayda birbirine yakın anlam vektörleri olarak kavramaya başladı.
Günümüzde Google Translate'in bir insan çevirmen kalitesine yaklaşması, Siri ve Alexa gibi asistanların hayatımıza girmesi ya da büyük dil modellerinin (LLM) sorularımıza insan gibi yanıt vermesi bu son devrimin eseridir.
Bu Rehberde Seni Ne Bekliyor?
Metin temizlemeden (NLTK) başlayacak, kelimelerin matematiksel vektör uzayındaki yolculuğuna (Word2Vec & GloVe) uğrayacak, ardışık verilerin hafızası olan derin öğrenme mimarilerine (RNN/LSTM/GRU) dalış yapacağız. Ve en önemlisi, öğrendiklerimizi rafa kaldırmayıp endüstriyel ölçekte 3 dev projeyle taçlandıracağız:
- 245.000+ Gerçek Yorumla Türkçe Duygu Analizi (Sentiment Analysis)
- 470.000+ Cümlelik Uçtan Uca İngilizce-Türkçe Seq2Seq Makine Çevirisi (NMT)
- Görseli Metne Dönüştüren Multimodal Image Captioning (VGG16 + GRU)
Metin Ön İşleme ve Klasik NLP Temelleri (NLTK)
Derin öğrenme modelleri ne kadar güçlü olursa olsun, altın kural hiç değişmez: "Garbage in, garbage out" (Çöp girerse, çöp çıkar). Ham metin verisi; noktalama işaretleri, büyük/küçük harf karmaşaları, yazım hataları ve dilbilgisel gürültülerle doludur. Bir bilgisayara metni beslemeden önce onu arındırmak, parçalamak ve standart bir formata getirmek zorundayız.
Bu aşamada Python'ın en köklü ve analitik NLP kütüphanesi olan NLTK (Natural Language Toolkit) sahneye çıkıyor.
+------------------+ +------------------+ +--------------------+ +------------------+ | HAM METIN | --> | TOKENIZATION | --> | STOP WORDS REMOVAL | --> | STEM / LEMMA | | "Driving fast!" | | ["Driving","..."]| | ["Driving","fast"] | | ["drive","fast"] | +------------------+ +------------------+ +--------------------+ +------------------+
1. Tokenization: Metni Atomlarına Ayırmak
Tokenization, bir metni daha küçük birimlere (token) bölme işlemidir. İki temel seviyede yapılır: Word Tokenization (Metni kelimelere ve noktalama işaretlerine ayırır) ve Sentence Tokenization (Paragrafı cümle bazında böler).
Peki neden standart bir Python .split(' ') fonksiyonu kullanmıyoruz? Çünkü string bölme işlemleri noktalama işaretlerini kelimeye yapıştırır. NLTK ise kurallara dayalı özel algoritmalarıyla noktalama işaretlerini ayrıştırır:
from nltk.tokenize import sent_tokenize, word_tokenize
text = "Alan Turing, bilgisayar biliminin kurucusu sayılır. Turing testi oldukça önemlidir!"
# Cümle Bazlı Tokenization
print(sent_tokenize(text))
# Output: ['Alan Turing, bilgisayar biliminin kurucusu sayılır.', 'Turing testi oldukça önemlidir!']
# Kelime Bazlı Tokenization
print(word_tokenize(text))
# Output: ['Alan', 'Turing', ',', 'bilgisayar', 'biliminin', 'kurucusu', 'sayılır', '.', 'Turing', 'testi', 'oldukça', 'önemlidir', '!']
2. Stop Words (Etkisiz Kelimeler) Filtreleme
Bir dilde cümle akışını bağlayan fakat tek başlarına analiz için yüksek anlam taşımayan kelimeler vardır: "is, and, the, but" (İngilizce) veya "galiba, ama, aslında, çünkü, bu" (Türkçe). Kelime frekansı çıkardığınızda listenin ilk 10 sırasında hep bu kelimeler yer alır. Modellerin gereksiz kalabalıkla yorulmasını önlemek için ön işleme adımında bu kelimeleri temizleriz:
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
stop_words = set(stopwords.words('english'))
words = word_tokenize("Fazil Say is a famous Turkish pianist and composer.")
# Stop words temizliği
filtered_words = [w for w in words if w.lower() not in stop_words]
print(filtered_words)
# Output: ['Fazil', 'Say', 'famous', 'Turkish', 'pianist', 'composer', '.']
3. Kök Bulma: Stemming vs. Lemmatization
NLP'deki en kritik yol ayrımlarından biri de kelimeleri yalın hallerine getirmektir. Örneğin "driving", "drives", "driver" ifadelerinin özünde aynı kavramı işaret ettiğini makineye öğretmemiz gerekir. Burada iki farklı yaklaşım karşımıza çıkar:
Stemming (Porter Stemmer)
Stemming, kelimenin sonundaki ekleri acımasızca kesen kural tabanlı (heuristic) bir yöntemdir. PorterStemmer, kelimenin morfolojik veya sözlük anlamıyla ilgilenmez; sadece kelime sonundaki bilinen ek kalıplarını budar.
- Avantajı: Çok hızlıdır, karmaşık sözlük analizleri yapmaz.
- Dezavantajı: Bazen ortaya sözlükte karşılığı olmayan gövde metinleri çıkarır.
Lemmatization (WordNet)
Lemmatization ise kelimenin sözlükteki gerçek köküne (Lemma) iner. Arka planda bir dilbilgisi veritabanı (WordNet) ve morfolojik analiz kullanır.
- Avantajı: Anlamsal olarak %100 doğru sözlük kökünü bulur. Düzensiz kelimeleri (örn: children -> child) başarıyla dönüştürür.
- Dezavantajı: Stemming'e göre daha yavaştır. Ayrıca kelimenin cümle içindeki türünü (İsim mi, Fiil mi?) belirtmenizi ister.
4. Cümlenin Ögeleri (POS Tagging) ve Varlık İsmi Tanıma (NER)
Metni sadece temizlemek yetmez; gramer yapısını da çözümlemek gerekir.
- Part-of-Speech (POS) Tagging: Cümledeki her kelimenin dilbilgisel türünü etiketler (Özel Isim: NNP, Fiil: VB, Sıfat: JJ vb.).
- Named Entity Recognition (NER): Metindeki kişi (PERSON), organizasyon (ORGANIZATION), lokasyon (LOCATION), tarih veya para birimi gibi özel varlıkları tespit eder.
import nltk
from nltk.tokenize import word_tokenize
text = "Steve Jobs founded Apple Inc. in California."
tokens = word_tokenize(text)
# POS Tagging
pos_tags = nltk.pos_tag(tokens)
print(pos_tags)
# [('Steve', 'NNP'), ('Jobs', 'NNP'), ('founded', 'VBD'), ('Apple', 'NNP'), ('Inc.', 'NNP'), ('in', 'IN'), ('California', 'NNP')]
# Named Entity Recognition (NER)
ner_tree = nltk.ne_chunk(pos_tags)
print(ner_tree)
# (S (PERSON Steve/NNP Jobs/NNP) founded/VBD (ORGANIZATION Apple/NNP Inc./NNP) in/IN (GPE California/NNP))
Gördüğünüz gibi NLTK, Steve Jobs'ı bir PERSON (Kişi), Apple Inc.'i bir ORGANIZATION (Şirket) ve California'yı bir GPE (Jeopolitik Varlık) olarak doğru bir şekilde sınıflandırdı.
Kelimelerin Matematiksel Temsili (Word Embeddings) — Word2Vec & GloVe
Metin ön işleme adımlarını tamamladık, fakat önümüzde aşılması gereken devasa bir engel var: Bilgisayarlar kelimeleri anlayamaz, sadece sayılarla ve matrislerle işlem yapabilir.
Metinleri sayısal temsil etmenin en ilkel yolu One-Hot Encoding tekniğidir. Sözlükteki her kelime için sözlük boyutu uzunluğunda bir vektör oluşturulur ve kelimenin indeksine 1, diğer tüm elemanlara 0 yazılır.
Sözlük: ["elma", "portakal", "uçak", "fiyat", "ücret"] (Boyut: 5)
elma -> [1, 0, 0, 0, 0]
portakal -> [0, 1, 0, 0, 0]
uçak -> [0, 0, 1, 0, 0]
[ DENSE VECTOR SPACE ]
^ (meyve boyutu)
| * elma
| * portakal
+-------------------> (finans boyutu)
* fiyat
* ücret
One-Hot Encoding'in Çöküş Nedenleri: Gerçek hayat projelerinde 500.000 kelimelik bir korpus kullandığınızda, her kelime için 500.000 elemanlı ve %99.99'u sıfırlardan oluşan devasa matrislerle çalışmanız gerekir. Hafıza anında kilitlenir. İkincisi, Anlamsal İlişki Kaybıdır. Lineer cebirden bildiğimiz üzere, dik (orthogonal) One-Hot vektörlerinin iç çarpımı (dot product) her zaman 0 çıkar: $fiyat \cdot ücret = 0$. Bilgisayar anlamsal bağı tamamen kaybeder.
İşte bu sorunu çözmek için kelimeleri yüksek boyutlu seyrek (sparse) vektörler yerine, düşük boyutlu ve yoğun (dense) vektör uzayına haritalayan Word Embedding (Kelime Gömme) teknikleri geliştirilmiştir.
1. Saymaya Dayalı Yöntemler ve SVD (Singular Value Decomposition)
Word2Vec öncesinde, kelimelerin birlikte bulunma frekanslarını (Co-occurrence Matrix) sayarak anlamsal vektörler türetiliyordu. Ardından Lineer Cebir'in en temel yöntemlerinden SVD (Tekil Değer Ayrışımı) kullanılarak bu matrisin boyutu 100 veya 300 gibi yoğun vektörlere düşürülüyordu.
- Avantajı: İstatistiksel veriyi bir kez toplayıp global bilgi elde etmek hızlıdır.
- Dezavantajı: Matris çok büyüdüğünde SVD hesaplaması son derece ağırdır ve "the, is, and" gibi etkisiz kelimelere aşırı yüksek ağırlık verme eğilimindedir.
2. Word2Vec (Mikolov et al., Google 2013)
Google araştırmacısı Tomas Mikolov ve ekibi, NLP dünyasını kökünden değiştiren Word2Vec algoritmasını duyurdu. Word2Vec'in arkasındaki temel felsefe şudur: "Bir kelimeyi, birlikte takıldığı arkadaşlarından tanırsınız." (Distributional Semantics).
Word2Vec, kelime anlamını tahmin etmek için gözetimsiz (unsupervised) bir sinir ağı yaklaşımı kullanır. İki farklı mimariye sahiptir: CBOW (Continuous Bag-of-Words) ve Skip-gram. CBOW, etraftaki bağlam kelimelerini girdi olarak alıp ortadaki hedef kelimeyi tahmin eder. Skip-gram ise, ortadaki hedef kelimeyi alıp etrafındaki bağlam kelimelerini tahmin etmeye çalışır.
CBOW (Context -> Target) SKIP-GRAM (Target -> Context)
Context Words Context Words
[w(t-2)] \ / [w(t-2)]
[w(t-1)] --\ +-------+ Target Word /-- [w(t-1)]
-->| Model |--> [w(t)] [w(t)] -->| Model |
[w(t+1)] --/ +-------+ \-- [w(t+1)]
[w(t+2)] / \ [w(t+2)]
Skip-gram algoritmasında hedef $w_{c}$ kelimesi verildiğinde, $m$ pencere boyutundaki bağlam kelimesi $w_{o}$'nun bulunma olasılığı Softmax fonksiyonu ile hesaplanır:
Formülün payda kısmına dikkat edin: Tüm sözlükteki ($V$) kelimelerin toplamı alınmaktadır. Sözlükte 500.000 kelime varsa, her bir kelime tahmini için 500.000 üslü çarpım toplamak eğitimi imkansız derecede yavaşlatır. Bu sorunu çözmek için Negative Sampling geliştirilmiştir.
Gensim ile Hürriyet Veri Seti Üzerinde Word2Vec Eğitimi
Teorik altyapıyı uygulamaya dökelim. 400.000'den fazla haber cümlesinden oluşan Türkçe Hürriyet veri seti üzerinde kendi Word2Vec modelimizi eğitelim:
from gensim.models import Word2Vec
# Word2Vec Modelinin Tanımlanması ve Eğitimi
model = Word2Vec(
sentences=corpus,
vector_size=100, # Kelime vektör boyutu
window=5, # Sağ ve soldan 5 kelimelik pencere
min_count=5, # En az 5 kez geçen kelimeleri al
sg=1, # 1: Skip-gram, 0: CBOW
workers=4 # Paralel işlemci sayısı
)
print("Hollanda kelimesine en yakın kavramlar:")
print(model.wv.most_similar('hollanda', topn=5))
# Output: [('belçika', 0.82), ('almanya', 0.80), ('danimarka', 0.78), ('fransa', 0.76)]
print("\nPazartesi kelimesine en yakın kavramlar:")
print(model.wv.most_similar('pazartesi', topn=5))
# Output: [('salı', 0.89), ('çarşamba', 0.87), ('perşembe', 0.85), ('cuma', 0.84)]
Model hiçbir coğrafya veya takvim bilgisi verilmeden, sadece kelimelerin cümle içindeki dizilim istatistiklerinden "Hollanda"nın diğer Avrupa ülkeleriyle, "Pazartesi"nin ise haftanın günleriyle anlamsal ilişkisini kusursuz şekilde çözmüştür!
3. GloVe (Global Vectors for Word Representation - Stanford 2014)
Word2Vec harika iş çıkarır ancak pencere tabanlı yerel (local) tahmin yaptığı için tüm metnin global istatistiklerini tam anlamıyla değerlendiremez. Stanford araştırmacıları bu iki dünyayı birleştirerek GloVe modelini geliştirdi. GloVe, küresel kelime birlikte-bulunma (co-occurrence) matrisinin logaritmasını optimize eder:
Kelime Vektörleriyle Vektör Matematiği
Gelişmiş önceden eğitilmiş (Pre-trained) GloVe matrislerini yükleyip kelimeler uzayında lineer matematiksel işlemler uygulayabiliriz:
from gensim.models import KeyedVectors
model = KeyedVectors.load_word2vec_format('glove.6B.100d.word2vec.txt', binary=False)
# King - Man + Woman = Queen Matematiği
result = model.most_similar(positive=['king', 'woman'], negative=['man'], topn=1)
print(result)
# Output: [('queen', 0.86)]
# Başkent Ülke Analojisi: Ankara - Turkey + Germany = Berlin
result = model.most_similar(positive=['ankara', 'germany'], negative=['turkey'], topn=1)
print(result)
# Output: [('berlin', 0.85)]
4. t-SNE ile Kelime Uzayını Görselleştirme
Yüzlerce boyuttan oluşan bu vektörleri gözümüzle canlandırmak imkansızdır. t-SNE (t-Distributed Stochastic Neighbor Embedding) algoritması, yüksek boyutlu vektörler arasındaki mesafeyi koruyarak onları 2 boyutlu bir grafiğe indirgememizi sağlar.
+-----------------------------------------+ | | | * hamburg * stuttgart | | * berlin | | * köln | | | | * temmuz | | * ağustos | | * haziran | +-----------------------------------------+
Grafiğe baktığımızda Alman şehirlerinin (berlin, hamburg, köln) bir kümede, ay isimlerinin (temmuz, ağustos, haziran) ise tamamen farklı bir anlamsal kümede toplandığını net bir şekilde görürüz.
Ardışık Veri ve Derin Öğrenme Mimarileri (RNN, LSTM, GRU)
Geleneksel yapay sinir ağları (ANN / MLP) resim sınıflandırma gibi problemlerde harikalar yaratır. Ancak iş metinlere, ses kayıtlarına ya da borsa grafiklerine geldiğinde çuvallarlar. Neden mi? Çünkü geleneksel ağların hafızası yoktur. Her girdiyi (input) birbirinden bağımsız kabul ederler. Oysa dilde kelimelerin sıralaması hayati önem taşır: "Ali Veli'ye borç verdi." ile "Veli Ali'ye borç verdi." cümleleri aynı kelimeleri içerir ama anlamları tamamen zıttır.
Bir cümleyi okurken her kelimeyi zihnimizde bir önceki kelimenin yarattığı bağlamla (context) değerlendiririz. Metin işlerken sinir ağlarımızın da zamansal bir dizilimi takip edebilen bir hafızaya ihtiyacı vardır.
1. Recurrent Neural Networks (RNN) Mimarisi
Yinelenen Sinir Ağları (RNN), döngüsel yapısı sayesinde kendi çıktısını bir sonraki adıma girdi olarak besleyen ağlardır. Bu sayede bir kelime işlenirken, geçmişte işlenen kelimelerin bilgisi Hidden State ($h_t$) adı verilen gizli bir durum vektöründe saklanır.
h_(t-1) h_t h_(t+1)
| ^ ^
v | |
+----+ +----+ +----+
--->| |---->| |------>| |----> ... (Hidden State Akışı)
+----+ +----+ +----+
^ ^ ^
| | |
x_(t-1) x_t x_(t+1)
("Ali") ("borç") ("verdi")
Matematiksel olarak adım adım hesaplama şu şekilde gerçekleşir:
2. Basit RNN'in Kronik Problemi: Exploding & Vanishing Gradient
Basit (Vanilla) RNN fikri teoride muazzam görünse de pratikte uzun cümlelerde tamamen çöker. Sebebi ise türev zincir kuralından kaynaklanan Gradyan Problemleridir: Geriye yayılım (Backpropagation Through Time - BPTT) sırasında, $W_{hh}$ ağırlık matrisi her adımda defalarca kendisiyle çarpılır:
- Exploding Gradient (Patlayan Gradyan): $W_{hh}$ değerleri 1'den büyükse, gradyanlar üssel olarak büyür ve NaN / kararsız model hatalarına yol açar. (Çözümü: Gradient Clipping ile türevlere üst sınır koymak).
- Vanishing Gradient (Kaybolan Gradyan): $W_{hh}$ değerleri 1'den küçükse (ve $\tanh$ türevi 1'den küçük olduğundan), geriye gittikçe türevler sıfıra yaklaşır. Ağ, cümlenin başındaki kelimeleri unutur.
3. Çözüm: LSTM (Long Short-Term Memory) ve GRU
Vanishing Gradient sorununu kökten çözmek için hücre içerisine özel kapı (gate) mekanizmaları eklenmiştir.
c_(t-1) --------------------------> (x) ------> (+) -------------> c_t (Cell State)
^ ^
| |
+-------+ +--------+
| |
h_(t-1) ----+---------> [ Forget ] [ Input ] [ Candidate ] [ Output ]
| Gate Gate Cell Gate
x_t ----+------------->[σ] [σ] [tanh] [σ]
| | | |
+----------+-----------+ v
(x) -------> h_t
^
[tanh]
LSTM bilginin bozulmadan akmasını sağlayan otoban benzeri bir Cell State ($c_t$) ve 3 temel kapı içerir: Forget Gate (Unutma Kapısı), Input Gate (Girdi Kapısı), Output Gate (Çıktı Kapısı).
GRU ise LSTM'in hafifletilmiş ve daha modern versiyonudur. Cell State ve Hidden State'i tek bir $h_t$ vektöründe birleştirir. Düzgün kapı sayısı sayesinde daha az parametre içerir, daha hızlı eğitilir ve küçük/orta ölçekli veri setlerinde LSTM ile neredeyse birebir aynı performansı gösterir.
4. Kodlama: Keras ile GRU Katmanları Oluşturma
Pratikte Keras/TensorFlow kullanarak ardışık GRU katmanlarını nasıl tanımlıyoruz?
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, GRU, Dense
model = Sequential([
# 1. Embedding Katmanı: Kelime indekslerini 50 boyutlu yoğun vektörlere çevirir.
Embedding(input_dim=10000, output_dim=50, input_length=59),
# 2. Çok Katmanlı GRU Mimarisi
GRU(units=16, return_sequences=True),
GRU(units=8, return_sequences=True),
# Son GRU katmanında 'return_sequences=False' yapılır; tek bir özet vektör üretilir.
GRU(units=4, return_sequences=False),
# Sınıflandırma Çıktısı (Örn: İkili Sınıflandırma için Sigmoid)
Dense(units=1, activation='sigmoid')
])
model.summary()
Endüstriyel Boyutta 3 Büyük NLP Projesi
Proje 1: Hepsiburada 245K+ Yorum ile Türkçe Duygu Analizi (Sentiment Analysis)
Serimizin ilk büyük uygulamasında, e-ticaret dünyasının en kritik problemlerinden birine odaklanıyoruz: Müşteri Yorumlarından Otomatik Duygu Analizi (Sentiment Analysis). Geliştireceğimiz model, yazılan ham müşteri yorumunu okuyacak ve saniyeler içinde yorumun Pozitif (1) mi yoksa Negatif (0) mi olduğuna karar verecek.
- Veri Seti: 245.000+ dengeli müşteri yorumu ve yıldız puanları (1-2 Bıçak/Negatif, 4-5 Pozitif).
- Mimari: Embedding Layer -> 3 Katlı GRU (CuDNNGRU) -> Dense (Sigmoid).
- Sonuç: Test setinde %95 başarı oranı. Çelişkili ve karmaşık yorumlar üzerindeki çıkarım performansı.
Yorumların uzunlukları birbirinden farklıdır. Ancak sinir ağları sabit boyutlu matrisler bekler. Kısa cümlelerin başına 0 eklemek (padding), uzun cümleleri ise kesmek (truncating) gerekir. İdeal dizi uzunluğunu matematiksel olarak şu şekilde belirliyoruz:
# Özel Test Yorumları ve Çıkarım (Inference)
custom_reviews = [
"Bu ürün çok iyi, herkese tavsiye ederim.", # Pozitif
"Tasarımı harika ancak kargo çok geç geldi ve ürün açılmıştı.", # Karmaşık / Negatif
"Kötü yorumlar gözümü korkutmuştu ancak hiçbir sorun yaşamadım." # Çelişkili / Pozitif
]
# Tahmin (Predictions)
# 1. "Bu ürün çok iyi, herkese tavsiye ederim." -> 0.9921 (POZİTİF)
# 2. "Tasarımı harika ancak kargo çok geç geldi..." -> 0.0312 (NEGATİF) (Harika kelimesine kanmadı)
# 3. "Kötü yorumlar gözümü korkutmuştu..." -> 0.9845 (POZİTİF)
Modelimiz 10'da 10 yaparak Türkçe dil kalıplarını ve cümle akışını ne kadar iyi öğrendiğini kanıtladı.
Proje 2: NMT - İngilizce-Türkçe Seq2Seq Makine Çevirisi
Dile dayalı yapay zekanın gerçek gücü, bir dildeki kavramsal anlamı alıp tamamen farklı gramer kurallarına sahip başka bir dilde yeniden inşa edebilmesidir. Kasım 2016'da Google Translate'in kural tabanlı sistemlerden derin öğrenmeye geçişiyle hayatımızda devrim yaratan teknoloji tam olarak budur.
GİRDİ (İngilizce): "The weather is nice today"
│
▼
[ ENCODER (GRU Ağı) ]
│
Düşünce Vektörü (Thought Vector)
│
▼
[ DECODER (GRU Ağı) ]
│
▼
ÇIKTI (Türkçe): "<start> bugün hava güzel <end>"
Encoder (Kodlayıcı), İngilizce cümleyi işler ve anlamsal bağlamını özetleyen sabit boyutlu bir Düşünce Vektörü (Thought Vector) üretir. Decoder (Çözücü) ise bu düşünce vektörünü başlangıç durumu (Initial State) olarak alır ve adım adım Türkçe kelimeler üreterek cümleyi inşa eder.
Çeviri modellerinde padding yaparken kritik bir teknik fark uygularız: Encoder için Pre-Padding (İngilizce cümlelerin başına sıfır ekleriz ve cümleyi ters çeviririz), Decoder için Post-Padding (Türkçe cümlelerin sonuna sıfır ekleriz).
# Çeviri Testleri ve Çıkarım
# Girdi: "This summer I went to Japan."
# Çeviri: "Bu yaz Japonya'ya gittim." (Mükemmel çeviri!)
# Girdi: "Which road goes to the airport?"
# Çeviri: "Hangi yol havaalanına gider?"
Model, daha önce veri setinde birebir hiç görmediği İngilizce kalıpları bile Türkçe dilbilgisi kurallarına uygun biçimde ögelerine ayırarak çevirmeyi başardı!
Proje 3: Multimodal Image Captioning (Görseli Metne Dönüştürme)
Bu projede amacımız, ağa sadece piksel matrislerinden oluşan bir görsel (image) beslemek ve ağın resmi analiz edip içeriğini doğru bir İngilizce cümleyle tarif etmesini (text generation) sağlamaktır. COCO Dataset (118K+ görsel) kullandık.
GÖRSEL (İmge)
[ 224x224x3 Piksel ]
│
▼
[ ENCODER: VGG16 (CNN) ] --> (FC2 Katmanından 4096-D Öznitelik Çıkarımı)
│
Düşünce Vektörü
│
▼
[ DECODER: GRU (NLP) ] --> (Kelime Kelime Metin Üretimi)
│
▼
ÜRETİLEN METİN: "<start> a giraffe standing next to a tree <end>"
Sıfırdan evrişimli sinir ağı (CNN) eğitmek hem devasa GPU gücü gerektirir hem de haftalar sürer. Bu yüzden, 1.000 farklı nesne sınıfı üzerinde milyonlarca resimle önceden eğitilmiş VGG16 mimarisini kullanıyoruz. VGG16'nın son sınıflandırma katmanını kesip fırlatıyoruz ve bir önceki tam bağlı katmandan (FC2) 4096 boyutlu bir öznitelik vektörü (Transfer Value) elde ediyoruz.
Önbellekleme (Caching): 118.000 görseli 20 epoch boyunca tekrar tekrar VGG16 ağından geçirmek, standart bir bilgisayarda günlerce sürebilir. Bu yüzden harika bir yazılım mühendisliği optimizasyonu uyguluyoruz: Eğitime başlamadan önce tüm veri setindeki 118.000 görseli VGG16 ağından sadece 1 kez geçiriyoruz ve çıkan vektörleri diske kaydediyoruz. Bu kritik adım sayesinde eğitim süresini 20 kat hızlandırıyoruz!
# Görsel Açıklama Tahminleri (Test Çıktıları)
# 1. Görsel: Ağacın yanında duran ve yaprak yiyen zürafa fotoğrafı.
# Model Çıktısı: "a giraffe standing next to a tree in a forest"
# 3. Görsel: Masa üzerinde duran dilimlenmiş pizza.
# Model Çıktısı: "a pizza sitting on top of a wooden table"
Modelimiz sadece nesneleri tek tek tespit etmekle kalmadı (pizza, table); nesneler arasındaki mekansal ilişkiyi (sitting on top of) ve eylemleri kusursuz biçimde anlamlandırıp dil kurallarına uygun bir İngilizce cümle üretti!
Sonuç ve Gelecek Vizyonu
Bu uzun ve teknik yolculukta sıfırdan başlayıp NLP dünyasının en uç noktalarına kadar ulaştık. Adım adım katettiğimiz mesafeyi hatırlayalım:
- Metin Ön İşleme (NLTK)Metinleri temizlemeyi, köklerine inmeyi (Stemming/Lemmatization) ve dilbilgisel yapılarını çözmeyi gördük.
- Kelime Vektörleri (Word Embeddings)Kelimeleri 300 boyutlu anlamsal uzaylara taşıyıp Word2Vec ve GloVe ile kelime matematiği ($King - Man + Woman = Queen$) yaptık.
- Derin Öğrenme Mimarileri (RNN, LSTM, GRU)Ardışık verilerin hafızasını, kapı mekanizmalarını ve vanilya RNN'in kaybolan gradyan problemlerini çözdük.
- Endüstriyel ProjelerHepsiburada (245K+ Yorum): %95 başarıyla Türkçe Duygu Analizi. Seq2Seq NMT (470K+ Cümle): Uçtan uca İngilizce-Türkçe Makine Çevirisi. Multimodal Image Captioning: VGG16 ve GRU entegrasyonu ile görsellerden otomatik açıklama cümlesi üretimi.
Gelecekte Bizi Ne Bekliyor?
Bu eğitim boyunca kurduğumuz RNN, LSTM ve GRU mimarileri ardışık veri işlemenin temelleridir. Bu sağlam temelin üzerine inşa edilen günümüz modern NLP dünyası ise artık Attention Mekanizmaları (Dikkat Mimarileri) ve Transformer (BERT, GPT, T5) mimarileriyle yönetiliyor.
Kavramsal anlamı vektörlere dönüştürme ve dizisel verileri işleme mantığını kavradığınıza göre, Transformer ve Büyük Dil Modelleri (LLM) dünyasına adım atmak sizin için çocuk oyuncağı olacaktır.
Rasittekin18/Natural-Language-Processing-NLP-
