2. Bölüm · Uygulamalı Doğal Dil İşleme
scikit-learn ile aynı sayıları elde edebilirsinizBu bölümde kullanacağımız modeller sayısal girdilerle çalışır. Metni bu modellere verebilmek için karakter dizilerini sayısal bir temsile dönüştürmemiz gerekir.
Ön işleme, hangi bilginin modele ulaşacağını belirlediği için modelleme sürecinin bir parçasıdır.
arızalandı;, Pompa ve P-101'in ayrı birimler olarak korunuyor; başka bir metinde arızalandı, pompa veya P-101 geçseydi farklı token’lar sayılacaktıPompa ile pompa aynı biçime mi dönüştürülsün? Noktalı virgül korunsun mu, çıkarılsın mı? P-101'in içindeki ek korunsun mu?Normalleştirme kararları, token sınırlarını belirlemekten ayrı işlemlerdir. Yararlı bir ayrımı silip silmediklerini göreve göre değerlendirmek gerekir.
| İşlem | Olası yararı | Olası kaybı veya maliyeti |
|---|---|---|
| Küçük harfe çevirme | Pompa = pompa: iki sütun tek sütunda birleşir, sayımları toplanır |
AŞ (anonim şirket) ile aş (yemek) aynı biçime dönüşür; str.lower() Türkçeye özgü I–ı ve İ–i eşlemelerini uygulamaz |
| Noktalama işaretlerini çıkarma | seçilen işaretleri çıkararak arızalandı; biçimini arızalandı ile eşleştirebilir |
ayrım gözetmeden silmek P-101 gibi tanımlayıcıları, ondalık gösterimleri ve URL’leri değiştirebilir |
| Stop word çıkarma | listedeki kelimeleri sayımın dışında bırakır: bu bölümün derleminde bütün token’ların %43,9’u | listede not bulunuyorsa olumsuzluk bilgisi kaybolabilir |
| Gövdeleme (stemming) | farklı kelime biçimlerini ortak bir çıktıda birleştirebilir: Porter replaced kelimesini replac yapar |
farklı kelimeleri yanlışlıkla birleştirebilir: university de universe de univers olur |
| Lemmatizasyon | kelimeyi uygun sözlük biçimiyle eşleştirmeyi amaçlar: gidiyorum için gitmek |
sözlük, kurallar, sözcük türü veya bağlam bilgisi gerektirebilir; belirsiz biçimlerde hata yapabilir |
Bu tablo, işlem hattını (pipeline) kendiniz kurduğunuz durumlar içindir. Metni ön eğitimli bir modele verecekseniz, modelin eğitim sırasında kullandığı tokenizer’a ve ön işleme varsayımlarına uymanız gerekir.
Öneriler bir başlangıç noktasıdır: uygun seçenekleri doğrulama verisinde karşılaştırın ve son değerlendirme için test kümesini ayrı tutun.
str.lower() metodu Unicode’un varsayılan küçük harf eşlemesini uygular; Türkçe için bir yerel ayar parametresi almaz. Türkçede iki ayrı eşleme vardır: I → ı ve İ → ii ile değil, U+0069 + U+0307 ile başlarCountVectorizer, İSTANBUL girdisinden stanbul token’ını üretirÖn işleme düzeltildiğinde sözlüğün ve ona bağlı modellerin de yeniden oluşturulması gerekebilir.
| Ne yapar | Örnekler | |
|---|---|---|
| Gövdeleme (Porter) | çekim veya yapım eklerine yönelik kurallar uygular; sonucun sözlükte bulunan bir kelime olmasını garanti etmez | replaced → replac; university ve universe → univers |
| Lemmatizasyon | kelimeyi sözlükteki temel biçimiyle eşleştirmeyi amaçlar: fiiller mastar hâliyle, isimler yalın hâliyle | gidiyorum → gitmek; left için bağlam gerekebilir |
| Snowball Türkçe gövdeleyicisi | bu kitapta kullanılan gövdeleyici | kitaplarımızdan → kitap; kullanıyorum → kullanıyor; kullandık → kulla |
kullanıyorum ile kullandık biçimlerini birleştirmezPorter 1980
scikit-learn’ün İngilizce stop word listesinde 318 madde bulunur; bu bölümdeki 20 Newsgroups ölçümünde, kullanılan tokenleştirme kuralıyla bunların 311’i derlemde görülürnot gibi görev açısından önemli bir kelime çıkarılırsa, anlamı ayırt etmek için gereken bilgi kaybolabilirStop word çıkarırken bilgi kaybını değerlendirin. Çıkarmanın yararlı olup olmadığı göreve bağlıdır.
Alt kelime yöntemlerini, onları kullanan ön eğitimli modellerle birlikte 8. bölümde ele alacağız. Şimdilik kelimelerle devam ediyoruz.
İkisi de gözleme dayanan yaklaşık ilişkilerdir; tokenleştirmenin nasıl yapılacağını tek başlarına belirlemezler.
Lü, Zhang ve Zhou 2010
pompa yüz kez geçiyorsa bu, bir tür ve yüz token demektir\[f(r) \propto r^{-\alpha}\]
| sıra | geçiş sayısı |
|---|---|
| 1 | 106.425 |
| 2 | 62.043 |
| 10 | 26.985 |
| 97 | 3.027 |
| 1.113 | 221 |
| 10.352 | 13 |
| 77.121 | 1 |
Doğruyu veriden kestirilmiş bir model olarak değil, dağılımın biçimini özetleyen bir referans olarak alın.
CountVectorizer’ın varsayılan ayarlarıyla min_df=2, 101.631 sütunun 62.208’ini (%61) siler; silinen sütunlar token geçişlerinin yalnızca %3,4’ünü taşır. İngilizce stop word listesi ise 309 sütun siler, ama bu sütunlar geçişlerin %43’ünü taşırSayılar bu derleme ve bu eşiğe aittir; filtrenin başarıyı nasıl etkilediği ayrıca ölçülmelidir.
\[|V(N)| \approx K N^{\beta}\]
Heaps yasası, bu büyümeyi belirli bir aralıkta yaklaşık olarak modelleyen ampirik bir düzenliliktir; kanıtlanmış bir teorem değildir.
Heaps 1978 · Manning, Raghavan ve Schütze 2008
Bu sayımda en sık ikinci token 'ax: 62.043 kez geçiyor ve to, a ve of’un önünde. Bu, doğal dilde kullanılan bir kelime değil.
roman.bmp adlı bir dosyayı on dört parça hâlinde taşıyan gönderilerin 3–14. parçaları; satırlar >'AX>'AX>'AX biçimindeEn sık token’ların listesine bakmak, ağırlıklandırmadan önce veri ve ön işleme sorunlarını fark etmenin basit bir yoludur.
'ax örneğinde derlem toplamı yüksek, terimi içeren belge sayısı ise düşüktürscikit-learn’ün varsayılan token_pattern ayarı aynı belgelerden ax token’ını üretir; ax bu ayarla da 62.387 geçişle the’dan sonra ikinci sıradadırTF-IDF, her belgedeki terim sıklığını (TF), terimin kaç belgede bulunduğundan hesaplanan IDF ağırlığıyla birleştirir.
arızalandı→0, pompa→4, yine→8pompa = [0 0 0 0 1 0 0 0 0][1 0 0 0 1 0 0 0 1][1,51 0 … 1,51 … 1,00][0,64 0 … 0,64 … 0,42]Gösterilen her sayı, kodun d1 = "pompa yine arızalandı" için fiilen ürettiği sayı.
pompa, vana’ya tam olarak salmastra’ya olduğu kadar benzerdirOne-hot burada kelime anlamını temsil etmenin nihai yolu değil, bir ara yapıdır. Öğrenilen yoğun vektörler, yani embedding’ler 3. bölümün konusu.
yine dört belgenin hepsinde geçiyor: her karşılaştırmaya katkı veriyor ama hiçbir şeyi ayırt etmiyor. vana bir kez geçiyor ve d3’ü ayırt eden tek şey o. Ham sayımlar ikisine aynı muameleyi yaparBir terime yüksek ağırlık vermek için iki şey isteriz:
scikit-learn bu sayımı belge uzunluğuna bölmezTF-IDF, bu iki sorunun cevaplarının çarpımıdır. “TF-IDF” tek başına bir şartname değildir: bir sayıyı raporlarken hangi varyantı kullandığınızı yazın.
\[\mathrm{idf}(t) = \ln\!\left(\frac{n}{\mathrm{df}(t)}\right)\]
İkinci gerekçe bilgi kuramından gelir: belgelerin eşit olasılıkla seçildiği bir modelde \(\log(n/\mathrm{df})\), seçilen belgenin terimi içermesi olayının öz bilgisidir.
Spärck Jones 1972 · Robertson 2004
\[\mathrm{idf}(t) = \ln\!\left(\frac{1 + n}{1 + \mathrm{df}(t)}\right) + 1\]
\[\mathrm{idf}(\texttt{pompa}) = \ln\!\left(\frac{1+4}{1+2}\right) + 1 = 0{,}511 + 1 = 1{,}511 \qquad \mathrm{idf}(\texttt{yine}) = \ln\!\left(\frac{1+4}{1+4}\right) + 1 = 1\]
Bu, scikit-learn’ün birebir formülüdür; başka kütüphaneler ayrıntıda farklılaşır ve “sayılarım neden tutmuyor” sorusunun sık rastlanan kaynaklarından biri budur.
yine dört belgenin hepsinde geçiyor ve tam olarak 1,0 tabanına oturuyor; tek bir belgeye özgü her kelime 1,9163 alıyorAğırlık, kelimenin kaç belgede geçtiğinin monoton azalan bir fonksiyonudur. Terimin içerik kelimesi olup olmadığını değil, belgeler arasındaki yaygınlığını gösterir.
\[\lVert v \rVert_2 = \sqrt{1{,}5108^2 + 1{,}5108^2 + 1{,}0000^2} \approx 2{,}3591 \qquad \frac{1{,}5108}{2{,}3591} = 0{,}6404 \qquad \frac{1{,}0000}{2{,}3591} = 0{,}4239\]
pompa yine arızalandı: üç konum sıfırdan farklı, her birinin sayımı 1 ve her biri kendi IDF’siyle çarpılıyorTfidfVectorizer sonucu, gösterilen dört ondalık basamakta uyuşuyorVektörü kendi uzunluğuna, \(\lVert v \rVert_2\)’ye bölmek L2 normalleştirmedir.
Benzer terimleri benzer oranlarda kullanan, biri 20, diğeri 2.000 kelimelik iki belgeyi, yalnızca biri uzun diye neden birbirinden uzak görmek isteyelim?
scikit-learn 0 kosinüs döndürür; bu bir uzlaşımdır: bu satırları sayın ve ayrı işleyinscikit-learn’ün varsayılanıdır; başka araçlarda formül ve normalleştirme tercihleri değişebilirKarşılaştırmada yalnızca yön, yani ağırlıklı terim bileşimi kalır. Sınıflandırma başarısına etkisini ise doğrulama verisiyle ölçeriz.
Salton ve Buckley 1988
\[\cos(a, b) = \frac{a \cdot b}{\lVert a \rVert \, \lVert b \rVert} = \sum_{i} a_i b_i \quad \text{(ikisi de zaten birim uzunluktaysa)}\]
\[\cos(\text{d1}, \text{d3}) = \underbrace{0{,}6404 \times 0{,}5729}_{\texttt{arızalandı}} + \underbrace{0{,}4239 \times 0{,}3792}_{\texttt{yine}} = 0{,}3669 + 0{,}1607 = 0{,}528\]
arızalandı, %30’unu yine sağlıyor; üstelik iki kelime de her iki belgede tam olarak birer kez geçiyor. Ham sayımlarda ikisi eşit katkı verirdiOrtak kelimelerden hangisinin kanıt sayılacağına ağırlıklandırma karar verir.
yine. TF-IDF, ortak yine teriminin göreli katkısını azaltarak bu puanı 0,11’e indiriyorKosinüs, iki vektör arasındaki açının kosinüsüdür. Anlamsal benzerliğin kalibre edilmiş bir yüzdesi değildir; oysa onu “%26 benzer” diye raporlamak bunu ima eder.
| İki kelime üzerinde ham sayım vektörü olarak çift | Ham sayımlarda Öklid uzaklığı | L2 normalleştirmesinden sonra |
|---|---|---|
| A (2, 1) ile B (20, 10) | 20,12 — uzakta, ama B, A’nın tam 10 katı | aynı nokta |
| A (2, 1) ile C (1, 4) | 3,16 — en yakını, ama C’nin terim oranları farklı | 49,4°’lik bir açı: \(\cos = 0{,}651\), uzaklık 0,836 |
Kosinüs yalnızca yöne bakar: terimlerin birbirine oranını karşılaştırır, toplam miktarını değil. Klasik metin işleme hatlarının karşılaştırmadan önce normalleştirmesinin sebebi bu.
Temsil aşamasında atılan bilgi, daha güçlü bir sınıflandırıcıyla geri getirilemez.
Bağlam uzunluğu arttıkça öznitelik uzayı hızla büyür; uzun menzilli ve bağlama duyarlı ilişkiler için daha genel temsillere ihtiyaç duyarsınız.
değil de diğerleri gibi bir özniteliktir; kelime torbasının geri getiremediği şey neyin olumsuzlandığıdırdeğil varsa — ki bazı hazır Türkçe listelerde bulunur — iki vektör birebir aynı hâle gelir (kosinüs 1)pompa arızalandı ile pompa bozuldu, pompa dışında hiçbir şey paylaşmazOlumsuzluğun kararı değiştirdiği görevlerde stop word listesini ayrıca denetlemek gerekir.
Dört haber grubu, 2.327 eğitim belgesi, 1.550 test belgesi, lojistik regresyon; hiperparametre araması yapılmadı.
Bu tablo bir mekanizma gösterimi ve bir baseline karşılaştırmasıdır. Küçük farkları evrensel bir üstünlük olarak okumayın.
sublinear_tf aynı yönü işaret ediyor (0,843’e karşı 0,831): ham sayımı \(1 + \log(\text{tf})\) ile değiştirir; IDF için kurduğumuz aralık sıkıştırma argümanının terim frekansı tarafına uygulanmış hâliscikit-learn’ün kendi belgelendirmesi stop_words='english' ayarını sorunlu olarak niteliyor. Stop word’ler sonucunuz için önemliyse listeyi kendiniz yazın ve ekrana basın.
| Karşılaştırma | Yalnızca ilki doğru | Yalnızca ikincisi doğru | p |
|---|---|---|---|
| TF-IDF ile ham sayım | 119 | 20 | 2,4 × 10⁻¹⁸ |
| TF-IDF + stop word ile TF-IDF | 86 | 52 | 0,0048 |
| TF-IDF + bigram ile TF-IDF | 17 | 35 | 0,018 |
| TF-IDF + sublinear tf ile TF-IDF | 29 | 11 | 0,0064 |
Dört karşılaştırma yapıldığı için Bonferroni düzeltmesiyle eşik 0,05/4 = 0,0125 olur. TF-IDF, stop word ve sublinear_tf farkları bu eşiğin altında kalıyor; bigram farkı kalmıyor.
McNemar 1947
C’ye bağlıydı ve eşit ayar bütçesinde tersine dönüyorAktarılabilir olan ders sıralama değil, yöntem.
| Kelime torbası neden ayakta kaldı | Neden yeterli değil |
|---|---|
| Küçük bir seyrek matris. Bu örnekte 2.327 belgenin matrisi 2,8 MB. GPU gerekmez | Kelime sırası yok. pompa arızalandı, vana sağlam ile vana arızalandı, pompa sağlam aynı vektör |
Okunabilir. Model kendi özniteliklerini adlandırır — gun, orbit, doctor |
Eş anlamlılık yok. araba ile otomobil, araba ile muz kadar ilgisizdir |
| Güçlü baseline. Burada 0,853; önce 3. bölümde ortalaması alınmış embedding’leri yendi, sonra 4. bölümde Türkçe veride tekrar yendi | Çok anlamlılık yok. yüz için tek sütun var; surat mı, sayı mı, fiil mi, fark etmez |
| Kendi verinizin ötesinde eğitim verisi gerekmez. Ön eğitimli hiçbir şey, indirilen hiçbir şey, tedarikçi yok | Sözlük dışı terimler yeni belgelerde görülebilir |
| Sabit hatla tekrarlanabilir. Aynı girdi aynı çıktıyı verir | Olumsuzlamanın kapsamı yok. Torbanın geri getiremediği şey neyin olumsuzlandığıdır |
Tablonun iki sütunu aynı temsilin güçlü yanlarını ve sınırlılıklarını gösteriyor. Hangi tarafın ağır bastığı, görevin gereksinimlerine bağlıdır.
| Nerede | Bu bölümdeki fikrin uygulamadaki hâli |
|---|---|
| Uber’de talep yönlendirme | 2018’de anlatılan COTA: metni temizle, token’lara ayır, stop word’leri at, lemmatizasyon uygula, TF-IDF hesapla, LSA ile boyut indir; bu vektörlerden hesaplanan kosinüs benzerliği random forest tabanlı bir eşleşme modeline gider |
| Arama sıralaması | Lucene — dolayısıyla Elasticsearch ve OpenSearch — belgeleri varsayılan olarak BM25 ile puanlar |
| Google’ın metin sınıflandırma rehberi | karşılaştırdığı kodlamalar arasında en doğru sonucu TF-IDF n-gram’larının verdiğini bildiriyor |
| Melez erişim (hybrid retrieval) | yoğun embedding aramasıyla seyrek BM25 araması birleştirilir: seyrek yarı birebir eşleşmeleri yakalar |
| İstenmeyen içerik ve kötüye kullanım filtreleme | ilk hat filtresi olarak seyrek öznitelikler; feature hashing terimleri sabit sayıda sütuna eşler |
| Yakın kopya tespiti | simhash parmak izleri; shingle kümeleri üzerinde MinHash — shingle, sabit uzunlukta bir kelime penceresidir |
Metin sınıflandırma ve sözcüksel erişim gibi uygun görevlerde, TF-IDF tabanlı bir karşılaştırma modelini değerlendirmeye dâhil edin.
\[\mathrm{BM25}(q, d) = \sum_{t \in q} \mathrm{idf}(t) \cdot \frac{c(t,d)\,(k_1 + 1)}{c(t,d) + k_1\!\left(1 - b + b\,\frac{|d|}{\mathrm{avgdl}}\right)}\]
BM25Similarity sınıfında varsayılanlar \(k_1 = 1{,}2\) ve \(b = 0{,}75\) değerleridirL2 normalleştirmesinin ele aldığı aynı derdi — uzun belgeler sırf uzunluklarıyla kazanmasın — başka bir formülle ve açma-kapama anahtarı yerine ayar düğmesiyle çözüyor; ikisi aynı işlem değil.
Robertson ve Zaragoza 2009
TF-IDF matrisinizin 200.000 sütunu ve 5.000 satırı var. Endişelenmeli misiniz?
p ≫ n problemidirmin_df ile öznitelik sayısını azaltmaktırmin_df=5, sözlüğü 32.318’den 6.281’e indiriyor — sütunların %81’i gidiyor. Silinen sütunlar token kullanımlarının %11,6’sını taşıyorIDF eğitim kümesinde mi yoksa bütün veride mi hesaplanmalı?
scikit-learn’de: eğitimde fit_transform, testte transform. fit_transform’u iki kez çağırmak gerçek ve yaygın bir hatadırBir kelime her belgede geçiyor. TF-IDF ağırlığı nedir?
scikit-learn’ün düzleştirilmiş formülünde \(\mathrm{df} = n\) olunca IDF çarpanı \(\ln\frac{1+n}{1+n} + 1 = 1\) olur; normalleştirmeden önceki TF-IDF değeri terimin TF değeridirsmooth_idf=False seçildiğinde de scikit-learn dışarıdaki \(+1\) terimini korur: IDF bu ayarda da 1 olur; sonuç ders kitabı formülüyle aynı değildirBelge vektörlerini neden normalleştiriyoruz da öznitelik sütunlarını normalleştirmiyoruz?
float64 dizide yaklaşık 601,6 MB gerektirirStandardScaler(with_mean=False) seyrek yapıyı koruyabilirArama motorunuz “P-101” parça numarası için hiçbir şey döndürmüyor. Neden?
scikit-learn’ün varsayılan token_pattern kalıbı en az iki kelime karakteri ister ve tireyi aşmaz: P-101 sessizce 101’e döndüget_feature_names_out() çıktısını yazdırın ve okuyun2026’da kelime torbası ne zaman doğru seçimdir?
Aşağıdaki koşullardan birkaçının bir arada bulunması kelime torbası baseline’ını özellikle çekici kılar:
Bölümün mülakat sorularından beşi. Bölüm, soruları neyi sınadıklarına göre gruplar.
Açıkça dile getirilmesi gereken kural: ön işleme göreve göre seçilmelidir; varsayılan diye uygulanmamalıdır.
Belge-terim matrisiniz 10⁶ × 10⁵. Bu matrisi nasıl saklar, onunla nasıl çalışırsınız?
float64 olarak yalnızca matrisin veri alanı 800 GB ederÇevrimdışı iyi, üretimde kötü çalışan bir metin sınıflandırıcı eğittiniz. Hata ayıklama sürecinizi anlatın.
TfidfVectorizer, sözlüğü ve IDF vektörü dâhil?| Amacınız | Başlangıç kaynakları |
|---|---|
| Otuz dakikam var | 3Blue1Brown videosu, scikit-learn metin öznitelikleri sayfası |
| TF-IDF ve bilgi erişimi tarafını derinleştirmek istiyorum | Manning ve arkadaşlarının IR kitabı (idf ve BM25 sayfaları), scikit-learn belgeleri |
| Akademik referans istiyorum | Jurafsky & Martin, özgün makaleler (Zipf, Heaps) |
CountVectorizer eğitin, get_feature_names_out() çıktısını yazdırın ve en az iki yanlış token bulunTfidfVectorizer ile doğrulayınmin_df=5 ile TF-IDFBölüm: Veri Olarak Metin. Laboratuvar, notebooks deposundaki bölüm notebook’unu izliyor: tr/chapters/02-metin-veri/02-metin-veri.ipynb.
Uygulamalı Doğal Dil İşleme · Applied NLP