Doğal Dil İşleme (NLP) Yazı Dizisi — Bölüm 2: Metin Temsili
Kelimelerden VektörlereBu görsel, Gemini ile üretilmiştir.“Dilde yalnızca farklar vardır.” — Ferdinand de Saussure, Cours de linguistique générale (1916)Bu Seri HakkındaBu yazı,…

Kelimelerden Vektörlere

“Dilde yalnızca farklar vardır.” — Ferdinand de Saussure, Cours de linguistique générale (1916)
Bu Seri Hakkında
Bu yazı, Doğal Dil İşleme (NLP) alanını temellerden ileri tekniklere kadar ele alan beş bölümlük bir yazı dizisinin ikinci parçasıdır.
Bölüm 1 — Metin Ön İşleme: Tokenizasyon, durak kelime temizleme, stemming vs. lemmatizasyon, Türkçe morfolojik analiz.
Bölüm 2 — Metin Temsili: Kelimelerden Vektörlere (bu yazı): Bag of Words, TF-IDF, Word2Vec, GloVe, FastText ve statik embedding’lerin evrimi.
Bölüm 3 — NLP Görevleri: POS tagging, NER, duygu analizi, metin sınıflandırma ve Türkçe NLP uygulamaları.
Bölüm 4 — Transformer Mimarisi: Attention mekanizması, Multi-Head Attention, BERT ve bağlamsal embedding’ler.
Bölüm 5 — Pratik NLP Pipeline’ı: Uçtan uca proje: Türkçe iş ilanı-CV eşleştirme sistemi.
Bir önceki bölümde metni parçalamayı, temizlemeyi ve köklere ulaşmayı öğrendik. Şimdi daha derin bir soruyla karşı karşıyayız: bu kelimeleri makinelerin anlayabileceği sayısal bir forma nasıl dönüştürürüz?
Giriş: İki Dünya Arasında Bir Köprü
İnsan zihni kelimelerle düşünür; makine ise sayılarla. Bu iki dünya arasında bir tercüman olmadan iletişim imkânsızdır. NLP’nin merkezinde, tam da bu tercümanlık görevi yatar: kelimeleri, cümleleri, paragrafları — dilin tüm zenginliğini — sayısal bir forma, yani vektörlere dönüştürmek.
Ancak “dönüştürmek” kelimesi burada yetersiz kalır. Çünkü mesele sadece bir eşleme yapmak değildir; anlamı koruyarak dönüştürmektir. “Güzel” ile “hoş” birbirine yakın, “güzel” ile “çirkin” birbirinden uzak olmalıdır. “Kral − erkek + kadın ≈ kraliçe” gibi ilişkiler, sayısal uzayda da korunmalıdır. İyi bir metin temsili, dilin anlamsal yapısının matematiğe sadık bir haritasıdır.
Saussure’ün yapısalcı dilbiliminin temel önerisi şuydu: bir kelimenin anlamı, o kelimenin kendisinde değil, diğer kelimelerle olan ilişkilerinde gizlidir. “Sıcak” kelimesini anlamak için “soğuk”u bilmemiz gerekir; “kral”ı anlamak için “kraliçe”, “erkek”, “kadın” kavramlarını. Anlam, yalıtılmış birimlerden değil, bir ilişkiler ağından doğar.
Bu felsefi önerme, onlarca yıl sonra NLP’nin matematiksel temelini oluşturacaktı. Word2Vec’in ünlü “kral − erkek + kadın ≈ kraliçe” denklemi, aslında Saussure’ün yapısalcılığının vektör uzayındaki cisimleşmesidir. Ancak bu noktaya ulaşmak kolay olmadı. Metin temsilinin evrimi, basit sayma yöntemlerinden derin sinir ağlarına uzanan, her adımda bir öncekinin sınırlamalarını aşan uzun bir yolculuktur. Bu yazıda o yolculuğu baştan sona izleyeceğiz.
1. One-Hot Encoding: Her Kelimeye Bir Kimlik
Metni sayılara dönüştürmenin en naif yolu, sözlükteki her kelimeye benzersiz bir birim vektör atamaktır. N kelimelik bir sözlükte, her kelime N boyutlu bir vektörle temsil edilir — ilgili pozisyonda 1, diğer her yerde 0. Bunu bir sınıfta yoklama çağrısına benzetebiliriz: her öğrencinin adı çağrıldığında yalnızca o öğrenci ayağa kalkar, diğerleri oturur. Her öğrenci benzersiz biçimde tanımlanır, ama öğrenciler arası ilişkiler — arkadaşlıklar, benzerlikler — tamamen kaybolur.
import numpy as np
from numpy.linalg import norm
vocabulary = ["makine", "öğrenme", "dil", "işleme", "derin"]
one_hot = {}
for i, word in enumerate(vocabulary):
vector = np.zeros(len(vocabulary))
vector[i] = 1
one_hot[word] = vector
# Kelimeler arası benzerlik?
cosine_sim = lambda a, b: np.dot(a, b) / (norm(a) * norm(b))
print(f"'makine' vs 'öğrenme': {cosine_sim(one_hot['makine'], one_hot['öğrenme'])}")
# Sonuç: 0.0 - Tüm çiftler birbirine eşit uzaklıkta!
One-hot encoding’in üç temel sorunu vardır:
Boyutsallık laneti: Gerçek bir dilde sözlük boyutu on binlerden yüz binlere çıkar. Her kelime 100.000 boyutlu seyrek bir vektörle temsil edilir — bu, bellek ve hesaplama açısından bir kabustur.
Anlamsal körlük: “Makine” ile “bilgisayar” arasındaki kosinüs benzerliği 0'dır — tıpkı “makine” ile “çiçek” arasındaki gibi. One-hot encoding, kelimeler arasındaki hiçbir anlamsal ilişkiyi yakalayamaz. Her kelime, uzaydaki diğer tüm kelimelerden eşit mesafededir.
Seyreklik (sparsity): Her vektörde yalnızca bir eleman sıfır değildir. Bu, belleğin büyük bölümünün boşa harcanması demektir.
One-hot encoding pratikte doğrudan kullanılmaz, ancak NLP’nin kavramsal başlangıç noktasıdır. Sonraki tüm yöntemler — BoW’dan Word2Vec’e, GloVe’dan BERT’e — bu sınırlamaları aşma çabası olarak doğmuştur.
2. Bag of Words (BoW): Kelime Torbası Modeli
Bag of Words, belge düzeyinde metin temsilinin en basit ve en sezgisel yöntemidir. Temel fikir şudur: bir belgeyi, içindeki kelimelerin frekanslarıyla temsil et. Kelime sırası, dilbilgisi, bağlam — hiçbiri önemli değildir. Kelimeler bir torbaya atılır ve sayılır.
Adını da bu metafordan alır: bir belgedeki tüm kelimeleri sıradan koparıp bir kumaş torbaya attığınızı hayal edin. Torbanın içinde kaç tane “makine” var, kaç tane “öğrenme” var — sadece bu sayılar belgenin temsilidir. Cümle yapısı, kelime sırası, nüanslar — hepsi torbanın dibinde kaybolur.
Bu kayıp önemsiz gibi görünebilir ama değildir. “Köpek adamı ısırdı” ile “Adam köpeği ısırdı” aynı BoW vektörüne sahiptir. Anlam tamamen farklı, temsil tamamen aynı. Yine de BoW’un basitliği ve hızı, onu birçok uygulama için yeterli kılar.
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
corpus = [
"makine öğrenmesi ile dil işleme",
"derin öğrenme ile görüntü işleme",
"doğal dil işleme ve makine öğrenmesi"
]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
df = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names_out(),
index=[f"Belge {i+1}" for i in range(len(corpus))])
print("Belge-Terim Matrisi:")
print(df)
Bu matris basit ama güçlü bir temsil sunar. Her satır bir belge, her sütun bir kelime, her hücre o kelimenin ilgili belgede kaç kez geçtiğini gösterir. İki belgenin benzerliğini ölçmek için bu vektörler arasındaki kosinüs benzerliğini hesaplamak yeterlidir.
BoW’un “yaygın kelimelere aşırı ağırlık” sorunu da dikkat çekicidir. “Ve”, “ile”, “bir” gibi kelimeler hemen her belgede yüksek frekans alır, ancak ayırt edici değildirler. Bir belgeyi benzersiz kılan kelimeler, genellikle nadir ama anlamlı olanlardır. Bu gözlem, bizi doğrudan TF-IDF’e götürür.
3. TF-IDF: Kelimenin Gerçek Değerini Ölçmek
TF-IDF (Term Frequency — Inverse Document Frequency), BoW’un frekans sayımına bir zeka katmanı ekler. Temel sorusu şudur: bir kelime sadece sık mı, yoksa gerçekten ayırt edici mi?
Bunu bir gazete metaforu ile anlatabiliriz. Her gazetenin her sayısında “ve”, “bir”, “olan” kelimeleri yüzlerce kez geçer — ama bunlar hiçbir haberi diğerinden ayırmaz. Buna karşılık “tsunami”, “deprem” veya “seçim” gibi kelimeler az sayıda haberde geçer ama o haberlerin kimliğini belirler. TF-IDF, tam olarak bu ayrımı matematiksel olarak yakalayan formüldür.
İki bileşenden oluşur:
TF (Term Frequency): Kelimenin belge içindeki frekansı. Bir kelime belgede ne kadar çok geçiyorsa, o belge için o kadar önemlidir.
IDF (Inverse Document Frequency): Kelimenin tüm corpus genelindeki nadirlığı. Bir kelime ne kadar az belgede geçiyorsa, o kadar ayırt edicidir.
TF-IDF(t, d) = TF(t, d) × IDF(t)
= (t'nin d'deki frekansı / d'deki toplam terim) × log(Toplam belge / t'yi içeren belge)
Bu formül zarif bir denge kurar: bir kelime belirli bir belgede sık geçiyor AMA diğer belgelerde nadir ise, yüksek TF-IDF skoru alır. Her yerde sıkça geçen kelimeler düşük IDF’e sahip olur ve doğal olarak baskılanır — durak kelime temizlemeye bile gerek kalmadan.
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
"yapay zeka ile müşteri hizmetleri otomasyonu sağlandı",
"müşteri memnuniyeti için yapay zeka çözümleri geliştirildi",
"derin öğrenme ile görüntü tanıma sistemleri kuruldu",
"yapay zeka destekli görüntü işleme uygulamaları yapıldı",
"müşteri deneyimi yapay zeka ile iyileştirildi"
]
tfidf = TfidfVectorizer()
X = tfidf.fit_transform(corpus)
feature_names = tfidf.get_feature_names_out()
# Her belgenin en ayırt edici 3 kelimesi
for i, doc in enumerate(corpus):
scores = X[i].toarray().flatten()
top_idx = scores.argsort()[-3:][::-1]
top_words = [(feature_names[j], round(scores[j], 3)) for j in top_idx]
print(f"Belge {i+1}: {top_words}")
# "yapay" ve "zeka" hemen her belgede geçtiği için düşük skor alır
TF-IDF ile Basit Bir Arama Motoru
TF-IDF’in en klasik uygulama alanı bilgi erişimidir. Google’dan önce, ilk arama motorlarının çoğu TF-IDF tabanlı sıralama kullanıyordu. Basit ama etkili bir arama motoru birkaç satırda kurulabilir:
from sklearn.metrics.pairwise import cosine_similarity
documents = [
"Python ile makine öğrenmesi projeleri geliştirme",
"JavaScript ve React ile web uygulamaları",
"Derin öğrenme ile doğal dil işleme teknikleri",
"Yapay zeka ile öneri sistemleri tasarımı",
]
tfidf = TfidfVectorizer()
doc_matrix = tfidf.fit_transform(documents)
def search(query, top_k=3):
query_vec = tfidf.transform([query])
scores = cosine_similarity(query_vec, doc_matrix).flatten()
for rank, idx in enumerate(scores.argsort()[-top_k:][::-1], 1):
if scores[idx] > 0:
print(f" {rank}. [{scores[idx]:.3f}] {documents[idx]}")
search("makine öğrenmesi ve derin öğrenme")
TF-IDF Hâlâ Geçerli mi?
Transformer çağında TF-IDF modası geçmiş gibi görünebilir, ama öyle değildir. Hız ve basitlik gerektiren uygulamalarda, yorumlanabilirliğin önemli olduğu durumlarda, anahtar kelime çıkarmada ve hibrit arama sistemlerinde hâlâ güçlü bir araçtır. Semantik arama yazımda detaylıca ele aldığım modern arama motorları, TF-IDF’in seyrek (sparse) temsilleriyle transformer’ların yoğun (dense) temsillerini birleştiren hibrit yaklaşımlar kullanır — çünkü her iki yöntemin de diğerinin yakalayamadığı güçlü yanları vardır.
Ancak TF-IDF’in temel sınırlaması değişmez: kelime sırasını görmezden gelir, anlamsal benzerliği yakalayamaz ve yüksek boyutlu seyrek matrisler üretir. “Mükemmel” ve “harika” anlamca yakın kelimelerdir ama TF-IDF’te birbirleriyle hiçbir ilişkileri yoktur. Bu sınırlamayı aşmak, bambaşka bir paradigma gerektiriyordu: kelimeleri seyrek, yüksek boyutlu vektörlerden çıkarıp yoğun, düşük boyutlu bir anlam uzayına taşımak.
4. Word2Vec: Anlam Uzayına Büyük Sıçrayış
2013 yılında Tomas Mikolov ve Google’daki ekibi, NLP tarihinin en etkili çalışmalarından birini yayımladı: Word2Vec. Bu çalışma, kelimeleri yüzlerce boyutlu yoğun vektörlerle temsil etme fikrini pratik ve ölçeklenebilir hale getirdi. Etkisi o kadar büyük oldu ki, “word embedding” kavramı Word2Vec ile neredeyse eşanlamlı hale geldi.
Word2Vec’in arkasındaki temel sezgi, dilbilimci J.R. Firth’ün 1957'deki ünlü gözlemine dayanır: “Bir kelimeyi, yanında durduğu kelimelerden tanırsın.” Bu, NLP’de dağılımsal hipotez (distributional hypothesis) olarak bilinir: benzer bağlamlarda geçen kelimeler, benzer anlamlara sahiptir.
Düşünün: “Kahvaltıda taze ____ yedik” cümlesinde boşluğa gelebilecek kelimeler birbirine anlamsal olarak yakındır — “simit”, “ekmek”, “poğaça”. Hiç “bilgisayar” gelmez. Word2Vec, tam da bu bağlamsal kalıplardan anlam öğrenir: yeterince büyük bir metin corpus’unda hangi kelimelerin hangi komşularla sık göründüğünü izleyerek, her kelime için bir anlam vektörü oluşturur.
4.1 İki Mimari: CBOW ve Skip-gram
Word2Vec iki farklı mimari sunar — ikisi de aynı sezgiye dayanır ama farklı yönlerden yaklaşır:
CBOW (Continuous Bag of Words): Çevredeki kelimelerden ortadaki kelimeyi tahmin eder. Penceredeki komşulara bakarak “burada hangi kelime olmalı?” sorusunu cevaplar. Sık geçen kelimeler için hızlı ve etkilidir.
Skip-gram: Ortadaki kelimeden çevresindeki kelimeleri tahmin eder. Tek bir kelimeye bakarak “bu kelimenin etrafında neler olmalı?” sorusunu cevaplar. Nadir kelimeler için daha iyi çalışır ve genellikle daha yüksek kaliteli vektörler üretir.
Bunu bir sosyal çevre analojisiyle düşünebiliriz: CBOW, bir kişinin arkadaş grubuna bakarak o kişiyi tahmin eder; Skip-gram ise bir kişiye bakarak arkadaş çevresini tahmin eder. Her iki durumda da öğrenilen şey aynıdır: insanların — kelimelerin — sosyal — bağlamsal — konumları.
from gensim.models import Word2Vec
sentences = [
["yapay", "zeka", "makine", "öğrenmesi", "alanında", "gelişmeler"],
["derin", "öğrenme", "sinir", "ağları", "ile", "çalışır"],
["doğal", "dil", "işleme", "metin", "analizi", "yapar"],
["makine", "öğrenmesi", "veri", "bilimi", "ile", "ilişkilidir"],
["transformer", "modelleri", "dil", "işlemede", "devrim", "yarattı"],
["sinir", "ağları", "derin", "öğrenme", "temelidir"],
["yapay", "zeka", "otomasyon", "ve", "teknoloji", "geleceği"],
["veri", "bilimi", "istatistik", "ve", "makine", "öğrenmesi"],
]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1,
sg=1, epochs=200, seed=42) # sg=1: Skip-gram
print("'dil' kelimesine en benzer:")
for word, score in model.wv.most_similar("dil", topn=5):
print(f" {word:15} → {score:.4f}")
4.2 Kelime Analojileri: Vektör Aritmetiğinin Büyüsü
Word2Vec’in yayımlandığında en çok dikkat çeken keşfi, öğrenilen vektörlerin lineer analoji özelliği göstermesiydi. Kelimeler arasındaki ilişkiler, basit vektör toplama ve çıkarma işlemleriyle ifade edilebiliyordu:
kral - erkek + kadın ≈ kraliçe
Paris - Fransa + İtalya ≈ Roma
gider - gitmek + gelmek ≈ gelir
Bu keşfin derin bir anlamı var: kelimeler, vektör uzayında rastgele değil, anlamlı geometrik ilişkiler içinde konumlanıyor. “Erkek” → “kadın” yönü ile “kral” → “kraliçe” yönü paraleldir — çünkü her ikisi de cinsiyet ekseni boyunca aynı dönüşümü temsil eder. “Fransa” → “Paris” yönü ile “İtalya” → “Roma” yönü paraleldir — çünkü her ikisi de ülke-başkent ilişkisini kodlar. Vektör uzayı, dilin anlamsal yapısının bir haritası haline gelmiştir.
2019'da ICML’de yayımlanan ve Best Paper Honourable Mention alan bir çalışma, bu analoji özelliğinin rastlantı olmadığını, kelime eş-oluşum (co-occurrence) istatistiklerinin matematiksel bir sonucu olduğunu kanıtladı.
import gensim.downloader as api
wv = api.load("glove-wiki-gigaword-50") # 50 boyutlu GloVe vektörleri
# king - man + woman = ?
result = wv.most_similar(positive=['king', 'woman'], negative=['man'], topn=1)
print(f"king - man + woman ≈ {result[0][0]} ({result[0][1]:.4f})") # queen
# Kelime çifti benzerlikleri
pairs = [("good", "great"), ("good", "bad"), ("dog", "cat"), ("dog", "car")]
for w1, w2 in pairs:
print(f" {w1:6} ↔ {w2:6} → {wv.similarity(w1, w2):.4f}")
4.3 Hiperparametre Rehberi
Word2Vec’in performansı hiperparametre seçimine oldukça duyarlıdır. Bu parametreleri bir teleskop ayarına benzetebiliriz — doğru odak noktası, görüntünün netliğini belirler:
vector_size (100–300): Daha yüksek boyut daha fazla bilgi taşır ama daha fazla veri gerektirir. 300 boyut, büyük corpus’lar için standart hale gelmiştir.
window (2–15): Küçük pencereler sözdizimsel benzerliği (sıfat komşuları), büyük pencereler tematik benzerliği (aynı konu) yakalar. Window=2 ile “güzel”e yakın kelimeler “çirkin”, “hoş” gibi sıfatlardır; window=10 ile “güzel”e yakın kelimeler “manzara”, “deniz”, “gün batımı” gibi tematik kelimeler olabilir.
min_count (1–10): Nadir kelimeleri filtreler. Büyük corpus’larda 5–10 gürültüyü azaltır.
5. GloVe: Global ve Lokal Bilginin Birleşimi
2014'te Stanford’dan Pennington, Socher ve Manning, Word2Vec’e alternatif bir yaklaşım geliştirdi: GloVe (Global Vectors for Word Representation).
Word2Vec ve GloVe arasındaki fark, bir şehri tanımanın iki farklı yoluna benzer. Word2Vec, sokaklarda yürüyerek — lokal bağlam pencerelerinden — öğrenir. Her adımda etrafınızdaki birkaç kelimeye bakarsınız. GloVe ise şehrin kuşbakışı haritasına — global eş-oluşum matrisine — bakarak öğrenir. Tüm kelimelerin tüm diğer kelimelerle ne sıklıkta birlikte göründüğünü bir matrise kaydeder ve bu matristeki istatistiksel kalıplardan kelime vektörlerini çıkarır.
GloVe’un temel öngörüsü şudur: iki kelimenin anlamsal ilişkisi, eş-oluşum istatistiklerinin oranlarında gizlidir. “Buz” ve “buhar” kelimelerini düşünün. “Katı” kelimesi “buz” ile çok daha sık eş-oluşurken “buhar” ile nadiren görünür — oran büyüktür. “Gaz” kelimesi ise tam tersine “buhar” ile sık, “buz” ile nadir eş-oluşur — oran küçüktür. “Su” ise ikisiyle de benzer sıklıkta geçer — oran 1'e yakındır. GloVe, bu oran kalıplarını doğrudan optimize eden bir maliyet fonksiyonu ile kelime vektörlerini öğrenir.
İlginç bir teorik sonuç, bu iki yaklaşımın görünürdeki farkına rağmen matematiksel olarak yakın olduğunu göstermiştir: Levy ve Goldberg (2014, NeurIPS), Word2Vec’in Skip-gram modelinin aslında kaydırılmış PMI (Pointwise Mutual Information) matrisinin örtük bir ayrıştırmasını yaptığını kanıtladı. Yani sokakta yürümek ile kuşbakışı bakmak, aynı şehrin farklı perspektiflerinden aynı haritayı çıkarmaktadır.
Pratikte, Word2Vec ve GloVe arasındaki performans farkı görev bazında değişir ve genellikle küçüktür. GloVe’un avantajı, önceden eğitilmiş yüksek kaliteli vektörlerin (6B, 42B, 840B token üzerinde) yaygın olarak erişilebilir olmasıdır.
6. FastText: Alt Kelime Bilgisi ile Zenginleştirme
2016'da Facebook AI Research (FAIR) tarafından geliştirilen FastText, Word2Vec’e önemli bir yenilik ekler: alt kelime (subword) bilgisi.
Word2Vec ve GloVe’un ortak bir kör noktası vardır: kelimeyi bir bütün olarak ele alırlar. Sözlükte olmayan bir kelimeyle karşılaştıklarında yapacak hiçbir şeyleri yoktur — sonuç ya bir hata ya da anlamsız bir [UNK] token'ıdır. Bu sorun, İngilizce gibi morfolojik olarak görece basit dillerde yönetilebilir düzeydedir. Ama Türkçe gibi sondan eklemeli (agglutinative) dillerde felaket boyutuna ulaşır. Tek bir kökten — "yap" — yüzlerce türetilmiş form oluşabilir: yapıyor, yapılabilir, yapamayacaktır, yaptırılabileceklermiş... Bunların hepsini sözlüğe almak pratik olarak imkânsızdır.
FastText bu sorunu zarif bir yolla çözer: her kelimeyi karakter n-gramlarına ayırır ve kelime vektörünü bu n-gramların vektörlerinin toplamından oluşturur. Örneğin “öğrenme” kelimesi (n=3 için) şu parçalara ayrılır: <öğ, öğr, ğre, ren, enm, nme, me>. Eğitim sırasında hiç görülmemiş bir kelime — "öğrenilebilir" — geldiğinde, FastText bu kelimenin n-gramlarına bakar. "öğr", "ren" gibi bildiği parçalar sayesinde kelimenin "öğrenme" ailesine ait olduğunu çıkarabilir ve mantıklı bir vektör üretebilir.
from gensim.models import FastText
sentences = [
["yapay", "zeka", "makine", "öğrenmesi", "alanında"],
["derin", "öğrenme", "sinir", "ağları", "kullanır"],
["doğal", "dil", "işleme", "metin", "analizi"],
["makine", "öğrenmesi", "veri", "bilimi", "ile"],
["transformer", "modelleri", "dil", "işleme", "devrim"],
]
ft_model = FastText(sentences, vector_size=100, window=5, min_count=1,
sg=1, min_n=3, max_n=6, epochs=200)
# Sözlükte olmayan kelimeler için bile vektör üretir
oov_words = ["öğrenilebilir", "makinesel", "zekâlı"]
for word in oov_words:
in_vocab = word in ft_model.wv.key_to_index
print(f" '{word}' → vektör üretildi (sözlükte: {in_vocab})")
# Üç kelime de sözlükte yok, ama anlamlı vektörleri var!
FastText ayrıca 157 dilde önceden eğitilmiş kelime vektörleri sunar — Türkçe dahil. Bu vektörler Wikipedia ve Common Crawl verileri üzerinde eğitilmiştir ve fasttext.cc adresinden indirilebilir. Türkçe gibi morfolojik olarak zengin dillerde Word2Vec yerine FastText tercih etmek, OOV sorununu büyük ölçüde azaltır.
7. Statik Embedding’lerin Büyük Sınırlaması: Bağlam Körlüğü
Word2Vec, GloVe ve FastText — hepsi NLP’de devrimci ilerlemeler sağladı. Kelimeleri ilk kez anlamlı bir geometrik uzayda konumlandırdılar; analojiler, benzerlikler, ilişkiler matematiksel olarak ifade edilebilir hale geldi. Ancak bu üç yöntem ortak bir temel sınırlamayı paylaşır: statik temsil. Her kelimeye, bağlam ne olursa olsun, tek bir sabit vektör atarlar.
Bu sınırlamanın boyutunu bir örnekle somutlaştıralım:
# Statik embedding'lerin bağlam körlüğü problemi
contexts = [
"Bankadan para çektim", # banka → finans kurumu
"Nehir bankında oturdum", # bank → nehir kıyısı
"Kan bankası acil kan arıyor", # banka → depolama merkezi
]
# Word2Vec/GloVe'da "banka" üç cümlede de AYNI vektörle temsil edilir.
turkish_polysemy = [
"Bu yüz çok güzel", # yüz → surat
"Yüz kişi geldi", # yüz → sayı (100)
"Nehri yüzerek geçtik", # yüz → yüzmek fiili
]
# Üç farklı anlam, tek bir vektör.
Dilbilimde bu olguya çokanlamlılık (polysemy) denir ve insan dilinin en temel özelliklerinden biridir. İnsan zihni bağlamdan hangi anlamın kastedildiğini anında çözer — “bankadan para çektim” dediğinizde hiç kimse nehir kıyısını düşünmez. Ama statik embedding’ler bu çözümlemeyi yapamaz; eğitim sırasında tüm bağlamların ortalamasını alarak tek bir “banka” vektörü oluştururlar. Bu, hem finans hem nehir hem depolama anlamlarının birbirine karıştığı bulanık bir temsil demektir.
Saussure’ün yapısalcılığı, anlamın bağlamdan doğduğunu söylüyordu. Statik embedding’ler bu önermeyi yalnızca eğitim sırasında dikkate alır; çıkarım sırasında bağlamı görmezden gelir. Bu çelişki, bağlamsal embedding’lerin — ELMo (2018), BERT (2018), GPT — doğuşunun nedenidir. Bu modeller aynı kelimeye farklı bağlamlarda farklı vektörler atayabilir. Bağlamsal embedding’ler, bu serinin 4. bölümünün konusu olacak.
Ancak statik embedding’lerin modası geçti demek haksızlık olur. Hız, basitlik, düşük hesaplama maliyeti ve yorumlanabilirlik önemli olduğunda hâlâ güçlü araçlardır. Özellikle büyük ölçekli sistemlerde ilk filtreleme katmanı olarak veya kaynak kısıtlı ortamlarda birincil temsil olarak kullanılmaya devam ederler.
8. Embedding’leri Görselleştirmek: Anlam Uzayını Görmek
Yüz boyutlu bir vektör uzayını doğrudan görselleştirmek imkânsızdır — insan algısı üç boyutla sınırlıdır. Ancak boyut indirgeme teknikleriyle bu yüksek boyutlu uzayı 2D’ye yansıtabilir ve anlamsal kümelenmeleri gözle görebiliriz.
PCA (Principal Component Analysis) varyansı en çok koruyan eksenlere projeksiyon yapar. Hızlıdır ama yerel yapıları kaybedebilir — uzak noktalar arası mesafeler korunur, yakın noktalar arası nüanslar kaybolabilir. t-SNE (t-Distributed Stochastic Neighbor Embedding) ise yerel komşuluk ilişkilerini korumaya odaklanır. Daha yavaştır ama kümelenmeleri çok daha etkileyici biçimde görselleştirir.
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import numpy as np
import gensim.downloader as api
glove = api.load("glove-wiki-gigaword-50")
word_groups = {
"Ülkeler": ["turkey", "germany", "france", "japan", "brazil", "egypt"],
"Şehirler": ["istanbul", "berlin", "paris", "tokyo", "cairo", "rome"],
"Bilim": ["physics", "chemistry", "biology", "mathematics", "science"],
"Teknoloji": ["computer", "software", "algorithm", "database", "network"],
}
words, vectors, colors = [], [], []
cmap = {"Ülkeler": "#e74c3c", "Şehirler": "#3498db",
"Bilim": "#2ecc71", "Teknoloji": "#9b59b6"}
for group, gwords in word_groups.items():
for w in gwords:
if w in glove:
words.append(w); vectors.append(glove[w]); colors.append(cmap[group])
vectors_2d = TSNE(n_components=2, random_state=42, perplexity=8).fit_transform(np.array(vectors))
plt.figure(figsize=(14, 10))
for i, w in enumerate(words):
plt.scatter(vectors_2d[i, 0], vectors_2d[i, 1], c=colors[i], s=120, alpha=0.8)
plt.annotate(w, (vectors_2d[i, 0]+0.5, vectors_2d[i, 1]+0.5), fontsize=9)
for group, color in cmap.items():
plt.scatter([], [], c=color, label=group, s=120)
plt.legend(fontsize=11); plt.title("Kelime Embedding'lerinin t-SNE Görselleştirmesi")
plt.grid(alpha=0.3); plt.tight_layout(); plt.show()
Bu görselleştirmede, anlamsal olarak ilişkili kelimelerin vektör uzayında birbirine yakın kümelendiğini görürsünüz. Ülkeler bir arada, şehirler bir arada, bilim terimleri bir arada. Ve dikkat çekici bir şekilde, ülke-şehir çiftleri (turkey-istanbul, france-paris, germany-berlin) kendi aralarında paralel vektörler oluşturur — bu, analoji özelliğinin gözle görülür geometrik karşılığıdır. Vektör uzayı, soyut bir matematik olmaktan çıkıp adeta bir “anlam atlası”na dönüşür.
9. Pratik Rehber: Hangi Yöntemi Ne Zaman Kullanalım?
Bu bölümde ele aldığımız yöntemlerin her biri farklı senaryolarda parlar. Doğru aracı seçmek, en gelişmiş aracı seçmekten daha önemlidir.
Yöntem Boyut Anlam Bağlam Hız Ne zaman? One-Hot N (sözlük) Yok Yok Çok hızlı Neredeyse hiç BoW N (sözlük) Yok Yok Çok hızlı Basit sınıflandırma, prototip TF-IDF N (sözlük) Kısmen Yok Hızlı Anahtar kelime çıkarma, arama, sınıflandırma Word2Vec 100–300 Var Yok (statik) Orta Kelime benzerliği, analoji, öznitelik GloVe 50–300 Var Yok (statik) Orta Word2Vec ile benzer, önceden eğitilmiş FastText 100–300 Var Yok (statik) Orta OOV kelimeler önemliyse, morfolojik diller BERT vb. 768+ Var Var (dinamik) Yavaş Anlam kritik görevler (Bölüm 4)
Hızlı prototip mi? → TF-IDF + basit sınıflandırıcı ile başlayın. Şaşırtıcı derecede iyi sonuçlar verebilir ve baseline olarak her zaman değerlidir.
Kelime düzeyinde anlam mı gerekiyor? → Önceden eğitilmiş Word2Vec veya GloVe vektörlerini kullanın.
Türkçe gibi morfolojik diller ve bilinmeyen kelimeler mi var? → FastText, alt kelime bilgisiyle OOV sorununu çözer.
Bağlam kritik mi? → BERT veya Sentence Transformers. Bu, serinin 4. bölümünün konusu.
Sonuç: Saussure’den Vektör Uzayına
Saussure “dilde yalnızca farklar vardır” dediğinde, anlamın kelimelerin kendisinde değil, aralarındaki ilişkilerde yaşadığını söylüyordu. Bu bölümde, bu öngörünün matematiksel karşılığını — kelimeler arası farkları ve benzerlikleri sayısal uzayda temsil etme çabasını — izledik.
Her yöntem, aslında Saussure’ün “farklar” ilkesine farklı bir matematiksel yaklaşım getirdi. One-hot encoding her kelimeyi eşit uzaklıkta konumlandırdı — farkları yakalamadığı için anlam taşıyamadı. BoW frekans farkları ekledi. TF-IDF bu farklara ayırt edicilik kattı — nadir kelimeler yüksek, yaygın kelimeler düşük skor aldı. Word2Vec ise devrim yaptı: kelimeleri, diğer kelimelerle olan bağlamsal farklarına göre yoğun bir uzayda konumlandırdı. “Kral − erkek + kadın ≈ kraliçe” denklemi, tam da Saussure’ün söylediğinin aritmetiğidir: anlam, farklar ve ilişkiler geometrisinden doğar.
Ancak hepsinin paylaştığı ortak sınırlama — bağlam körlüğü — çözümsüz kaldı. “Yüz” kelimesi, surat da olsa, sayı da olsa aynı vektörle temsil ediliyor. Statik embedding’ler, farkları yakalıyor ama aynı kelimenin farklı bağlamlardaki farklı anlamlarını ayırt edemiyor.
Bir sonraki bölümde, bu bilgiyi pratiğe dökeceğiz: POS tagging, Named Entity Recognition, duygu analizi ve metin sınıflandırma gibi temel NLP görevlerini kod örnekleriyle ele alacağız. Bölüm 4'te ise transformer mimarisinin bu bağlam sorununu nasıl çözdüğünü göreceğiz.
Kaynaklar
- Mikolov, T., Chen, K., Corrado, G. & Dean, J. (2013). “Efficient Estimation of Word Representations in Vector Space.” ICLR Workshop.
- Mikolov, T., Sutskever, I., Chen, K., Corrado, G. & Dean, J. (2013). “Distributed Representations of Words and Phrases and their Compositionality.” NeurIPS.
- Pennington, J., Socher, R. & Manning, C.D. (2014). “GloVe: Global Vectors for Word Representation.” EMNLP.
- Bojanowski, P., Grave, E., Joulin, A. & Mikolov, T. (2017). “Enriching Word Vectors with Subword Information.” TACL.
- Levy, O. & Goldberg, Y. (2014). “Neural Word Embedding as Implicit Matrix Factorization.” NeurIPS.
- Allen, C. & Hospedales, T. (2019). “Analogies Explained: Towards Understanding Word Embeddings.” ICML.
- Jurafsky, D. & Martin, J.H. (2025). Speech and Language Processing (3rd ed.) — Bölüm 6: Vector Semantics and Embeddings.
- Saussure, F. de (1916). Cours de linguistique générale.
Sonraki yazı: Bölüm 3 — NLP Görevleri — POS tagging, NER, duygu analizi, metin sınıflandırma ve Türkçe NLP uygulamaları.
Doğal Dil İşleme (NLP) Yazı Dizisi — Bölüm 2: Metin Temsili was originally published in Kariyer.net Tech on Medium, where people are continuing the conversation by highlighting and responding to this story.
Bu yazı ilk olarak Medium'da yayımlandı.
- nlp
- machine-learning
- llm
- deep-learning
Devamı