İçeriğe atla
SinaptikLabAI KNOWLEDGE PLATFORM
RehberOrtaTürkçe Doğal Dil İşleme

Türkçe metin için tokenleştirme ve normalizasyon kurmak

Türkçe metin hattı üç katmanda kurulur: önce Unicode normalizasyonu (NFC) ve görünmez karakter temizliği, sonra yerel duyarlı harf katlaması (I harfi ı'ya, i harfi İ'ye), en sonda göreve özel ek ayırma. Aksan ve şapka silme kaynağın üzerine değil ikinci bir arama alanına yazılır, çünkü kâr ile kar ya da hâlâ ile hala aynı dizide çakışmamalıdır. Kök bulucu yüzey biçimine değil, ünsüz yumuşamasını çözen bir çözümleyiciye dayanmalı; kitabı sözcüğünü kesmek kitab üretir ve hiçbir sözlükle eşleşmez.

ÖNKOŞULLAR

  • Kendi alanınızdan toplanmış, temizlenmemiş gerçek bir örnek derlem — kullanıcı arama sorguları da dâhil
  • Metin hattının çıktısını tüketen görevin yazılı tanımı: sözlüksel arama, anlamsal arama, sınıflandırma ya da model bağlamı
  • Dizini ve sorgu hattını birlikte yeniden üretme yetkisi ve bakım penceresi
  • Örnekleri doğrulayacak, Türkçe yazım kurallarına hâkim bir gözden geçiren

GEREKEN ARAÇLAR

  • Unicode normalizasyonu ve yerel duyarlı harf dönüşümü destekleyen bir çalışma zamanı
  • Türkçe biçimbilim çözümleyicisi veya kural tabanlı kök bulucu kütüphanesi
  • Modelinizin kullandığı alt sözcük tokenleştiricisinin aynısı
  • Analiz zinciri yapılandırılabilen bir metin arama dizini
  • Altın çift kümesini koşturacak küçük bir regresyon test çatısı
  1. 01

    Hattın çıktısını tüketen görevi yaz

    Sözlüksel arama, gömme modeli ve sınıflandırıcı farklı normalizasyon ister; hangi alanın ham kalacağına ve hangi alanın katlanacağına bu görev kararı verir.

    Tek bir kanonik temiz metin alanı yoktur. Normalizasyon, metni tüketen görevin kayıplarını kabul edebileceği yere kadar götürmektir; bir görev için kazanç olan işlem diğeri için bilgi kaybıdır. Küçük harfe çevrilmiş, noktalaması sökülmüş bir metin BM25 tarafında eşleşmeyi artırır ama gömme modeline verildiğinde modelin eğitildiği dağılımdan uzaklaşır.

    Tüketen görevKatlanabilirKorunmalı
    Sözlüksel arama (BM25)Harf büyüklüğü, aksan (ayrı alanda), yaygın eklerOlumsuzluk sözcükleri, sayılar, birimler
    Anlamsal arama ve gömmeGörünmez karakter, fazladan boşluk, bozuk kodlamaBüyük harf ve noktalama; model bunları sinyal olarak kullanır
    SınıflandırmaHarf büyüklüğü, bağlantı ve kullanıcı adı gürültüsüOlumsuzluk ve alana özgü terimler
    Model bağlamıYalnızca kodlama ve boşluk temizliğiÖzel adlar, noktalama, satır yapısı
    Aynı belgeden birden fazla alan üretmek, tek bir alanı herkese uydurmaya çalışmaktan ucuzdur.
  2. 02

    Unicode temizliğini tek geçişte kur

    Tüm metni NFC biçimine getir, sıfır genişlikli ve yumuşak tire gibi görünmez karakterleri at, tipografik tırnak ile tireleri tek biçime indir.

    Aynı görünen iki dize farklı baytlardan oluşabilir: NFC biçiminde tek kod noktasıyla yazılan bir harf, NFD biçiminde taban harf artı birleşen işaret olarak durur. Dizin bir biçimi, sorgu diğerini kullanıyorsa eşleşme sessizce kaybolur; hata mesajı yoktur, yalnızca sonuç gelmez. Kural basittir: metin sisteme girdiği noktada tek bir biçime sabitlenir ve bu biçim sorgu hattında da uygulanır.

    • Yumuşak tire (U+00AD): PDF ve ofis dosyalarından gelir, sözcüğü ortadan böler ve göze görünmez.
    • Sıfır genişlikli karakterler (U+200B–U+200D, U+2060, U+FEFF): kopyalanmış web metninin klasik kalıntısı.
    • Kırılmasız boşluk (U+00A0): boşlukla aynı görünür, sözcük bölücüde farklı davranır.
    • Tipografik kesme işareti (U+2019) ile ASCII kesme işareti: Ankara'da iki farklı biçimde dizine girer.
    • Uzun tire (U+2013, U+2014): başlıklarda ve listelerde karışık kullanılır, tek biçime indirilmeli.
    python
    import re
    import unicodedata
    
    GORUNMEZ = re.compile('[\u00ad\u200b\u200c\u200d\u2060\ufeff]')
    BOSLUK = re.compile('[\u00a0\u2007\u202f]')
    
    def temizle(metin: str) -> str:
        metin = unicodedata.normalize('NFC', metin)
        metin = GORUNMEZ.sub('', metin)
        metin = BOSLUK.sub(' ', metin)
        metin = metin.replace('\u2019', "'").replace('\u2018', "'")
        return metin.replace('\u2013', '-').replace('\u2014', '-')

    Doğrulama adımı: temizlikten önce ve sonra belgelerin kaçının değiştiğini sayın. Beklenmedik biçimde büyük bir kısmı değişiyorsa sorun normalizasyonda değil, daha yukarıda — ayrıştırıcıda veya kodlama tahmininde — duruyordur ve orada çözülmelidir.

  3. 03

    Harf katlamasını yerel duyarlı yap

    Küçük ve büyük harf dönüşümünü Türkçe yerelle çağır; yerelsiz çevirim I harfini noktalı i yapar ve İ harfinden geriye görünmez bir birleşen nokta bırakır.

    Türkçede noktalı ve noktasız i iki ayrı harftir ve büyük-küçük eşleşmeleri çapraz gider: I ile ı, i ile İ. Unicode'un varsayılan harf dönüşümü bu çifti bilmez; yerel bilgisi verilmediğinde I harfini noktalı i'ye indirir. İ harfini küçülttüğünde ise ortaya i artı birleşen nokta (U+0307) çıkar. Ekranda hiçbir fark görünmez, karşılaştırmada dizeler eşit değildir.

    Girdi ve yönYerelsiz sonuçTürkçe yerelle sonuçNe bozulur
    İSTANBUL, küçültmei + U+0307 + stanbulistanbulGörünmeyen birleşen nokta tam eşleşmeyi kırar
    IŞIK, küçültmeişikışıkSözcük başka bir dizeye dönüşür
    iki, büyütmeIKIİKİÖzel ad ve başlık biçimi bozulur
    sıkı, büyütmeSIKISIKIBu satırda fark yok; her girdi sorun çıkarmaz
    Sorun her sözcükte görünmediği için testler yanlış güven verir; test kümesine mutlaka i ve I taşıyan örnekler konur.
    python
    # Python'da yerele duyarlı bir lower() yok; dönüşümden önce çifti elle eşleyin.
    TR_KUCUK = str.maketrans({'I': 'ı', 'İ': 'i'})
    TR_BUYUK = str.maketrans({'ı': 'I', 'i': 'İ'})
    
    def kucult(metin: str) -> str:
        return metin.translate(TR_KUCUK).lower()
    
    def buyut(metin: str) -> str:
        return metin.translate(TR_BUYUK).upper()
    
    # JavaScript tarafında: metin.toLocaleLowerCase('tr')
  4. 04

    Aksan katlamasını ayrı alana yaz

    Şapkalı ve Türkçeye özgü harfleri ASCII'ye indirgemek anlam ayrımını siler; katlanmış biçimi kaynağın üzerine değil, düşük ağırlıklı ikinci bir arama alanına yaz.

    Katlamaya bir ihtiyaç vardır: kullanıcılar arama kutusuna sıklıkla ASCII yazar, acik ya da kagit arar. Ama aynı işlem belgenin kendisine uygulandığında geri dönüşü olmayan bir bilgi kaybı olur. Çözüm iki alandır: özgün metin olduğu gibi durur, katlanmış biçim ayrı bir alana yazılır ve sorgu iki alanda birden aranır — özgün alan yüksek, katlanmış alan düşük ağırlıkla.

    ÖzgünASCII katlanmışÇakıştığı sözcükKaybolan ayrım
    kârkarkarKazanç ile yağış
    hâlâhalahalaZaman zarfı ile akrabalık adı
    yaşyasyasYaş ile matem
    şişsissisŞişkinlik ile sis
    Dört çift de gerçek metinlerde yan yana geçiyor; finans, hukuk ve sağlık derlemlerinde ilk ikisi özellikle sık.
    1. 01metin: ham hâliyle saklanır, hiçbir katlama uygulanmaz.
    2. 02metin_arama: NFC ve Türkçe yerelle küçültülmüş biçim; birincil eşleşme alanı.
    3. 03metin_ascii: aksan ve şapka katlanmış biçim; yalnızca yedek eşleşme için, düşük ağırlıkla.
    4. 04Sorgu yalnızca metin_arama ve metin_ascii alanlarına gönderilir; metin alanı gösterim ve yeniden işleme için saklanır, eşleşmeye hiç girmez.

    Doğrulama adımı: yukarıdaki çiftleri sorgu olarak koşturun. kâr araması kâr geçen belgeyi, kar araması kar geçen belgeyi ilk sıraya koymalı. İkisi de aynı sonucu veriyorsa ağırlıklandırma çalışmıyor ya da katlanmış alan birincil alan hâline gelmiştir.

  5. 05

    Cümle ve sözcük sınırlarını Türkçeye göre çiz

    Kesme işaretiyle ayrılan özel ad eklerini, nokta içeren kısaltmaları ve virgüllü ondalıkları tanıyan bir bölücü kur; genel amaçlı bölücü Türkçe metni yanlış keser.

    Türkçede kesme işareti özel ada gelen eki ayırır: Ankara'da, TBMM'nin, 2026'da. Varlık adını bulmak isteyen her hat bu sınırı doğru çizmek zorunda; aksi hâlde dizine Ankara'da diye bir varlık girer ve Ankara sorgusu onu bulamaz. Kesme işaretinin iki farklı kod noktasıyla yazılabildiğini hatırlayın: bölücüden önce ikinci adımdaki birleştirme çalışmış olmalı.

    • Kısaltmalar: Dr., Sn., vb., md., bkz. — nokta cümle sonu sanılır ve cümle ortadan kesilir.
    • Sayılar: 1.000,50 biçiminde binlik nokta ve ondalık virgül; bölücü burada üç parça üretmemeli.
    • Tarihler: 15.09.2026 tek bir belirteçtir, üç cümle değil.
    • Madde numaraları: md. 7/b, 3.2.1 gibi diziler bölünürse atıf izlenemez hâle gelir.
    • Sıra sayıları: cümle sonundaki 3. ifadesi hem sıra sayısı hem cümle sonu olabilir; bağlama bakılmalı.
  6. 06

    Ek ayırma stratejisine karar ver

    Yüzey biçimine kör bir kök bulucu uygulama: kitabı sözcüğünü kesmek kitab üretir ve sözlükle eşleşmez; ünsüz yumuşamasını çözen bir çözümleyici gerekir.

    Türkçe eklemeli bir dildir: tek kökten ev, evler, evlerin, evlerinde, evlerimizden gibi çok sayıda yüzey biçimi üretilir. Buna ünsüz yumuşaması eklenir — kitap kökü ek aldığında kitabı olur, ağaç kökü ağacı olur. Ek listesini sondan soyan bir kök bulucu bu değişimi geri alamaz ve sözlükte bulunmayan bir gövde döndürür. Sözcük belirsizliği de cabası: yüzü sözcüğü yüz kökünün üç farklı anlamına da bağlanabilir.

    YaklaşımNe yaparNe zaman yeterRiski
    Sabit uzunlukta kesmeSözcüğün ilk n harfini alırKüçük bir dizinde hızlı taban çizgisiFarklı kökleri aynı gövdeye indirger
    Kural tabanlı kök bulucuBilinen ek listesini sondan soyarEk çeşitliliği dar, alan terimleri sabitÜnsüz yumuşamasını çözmez
    Biçimbilim çözümleyiciOlası çözümlemeleri üretir, bağlama göre seçerSözlüksel eşleşme ve varlık çıkarımı kritikseKurulum ve bakım maliyeti yüksek
    Hiç ayırmamakYüzey biçimini alt sözcük tokenleştiricisine bırakırGirdi gömme modeline ya da dil modeline gidiyorsaBM25 tarafında eşleşme kaybı
    Karar, hattın hangi ucunu beslediğinize bağlı; iki ucu birden besliyorsanız iki alan üretmek tek stratejiyi zorlamaktan iyidir.
  7. 07

    Alt sözcük tokenleştiricisini kendi derleminde ölç

    Modelin kendi tokenleştiricisini kendi metnine uygula ve sözcük başına düşen token sayısını ölç; bu oran parça boyutunu ve bağlam bütçesini doğrudan belirler.

    Eklemeli yapı uzun yüzey biçimleri üretir ve çok dilli sözlüklerde bu biçimlerin çoğu tek bir birleştirmeye karşılık gelmez; sonuçta Türkçe metin genellikle İngilizceden daha fazla alt sözcüğe bölünür. Ne kadar fazla? Bunu tokenleştiriciyi ve derlemi bilmeden söylemek mümkün değil, başka bir projenin oranı da sizi bağlamaz. Ölçün: hesap on dakika sürer ve sonrasındaki bütün bütçe kararlarının girdisi olur.

    python
    # Kendi derleminizde ölçün; başka bir derlemin oranı sizinkini temsil etmez.
    sozcuk = 0
    token = 0
    
    for metin in derlem:
        sozcuk += len(metin.split())
        token += len(tokenlestirici.encode(metin))
    
    print('sözcük başına token:', round(token / sozcuk, 2))
    • Parça boyutu: token cinsinden sınır koyduğunuz için, oran değişince parçaların kapsadığı metin miktarı değişir.
    • Bağlam bütçesi: aynı sayıda parça, Türkçe metinde bağlam penceresinden daha fazla yer kaplar.
    • Kesilme riski: uzun tablo ve madde listelerinin p95 token uzunluğunu ayrıca ölçün; ortalama burada yanıltır.

    Bir uyarı: bu ölçümü yaparken modele giden metne agresif normalizasyon uygulamayın. Küçültülmüş, noktalaması sökülmüş metin hem token sayımını değiştirir hem de modelin özel adları ve yapıyı görmesini engeller. Ölçüm, üretimde modele gidecek metnin aynısıyla yapılır.

  8. 08

    Altın çift kümesi kur ve normalizasyonu sürümle

    Çakışan sözcük çiftlerinden bir regresyon kümesi oluştur; normalizasyon her değiştiğinde hem dizini hem sorgu hattını aynı sürüm numarasıyla yeniden üret.

    Normalizasyon, dizinleme zamanı ile sorgu zamanı arasındaki bir sözleşmedir. Sözleşmenin bir tarafı değişip diğeri kalırsa sistem hata vermez, yalnızca bazı sorgular sessizce sonuçsuz döner. Bu yüzden normalizasyon sürümü dizindeki her belgeye yazılır: karışık sürümlü veri, sorguya değil belgeye bakarak tespit edilebilir hâle gelir.

    • Harf büyüklüğü çiftleri: İstanbul / istanbul / İSTANBUL / ISTANBUL.
    • Şapka çiftleri: kâr / kar, hâlâ / hala, hikâye / hikaye.
    • Kesme işareti biçimleri: Ankara'da metninin iki farklı kesme işaretiyle yazılmış hâlleri.
    • Görünmez karakter: içine yumuşak tire sıkışmış bir sözcük.
    • Sayı ve tarih: 1.000,50 ve 15.09.2026 tek belirteç olarak kalıyor mu.
    json
    {
      "normalizasyon_surumu": 3,
      "adimlar": ["nfc", "gorunmez-karakter", "tr-kucult", "kesme-ayir"],
      "ascii_alani": true,
      "dizin_yeniden_uretildi": "2026-09-15"
    }

    Doğrulama adımı: altın çift kümesini sürekli tümleştirme hattına bağlayın. Normalizasyon koduna dokunan her değişiklik bu kümeyi koşturmadan birleştirilemesin; kümedeki bir çift kırıldığında değişiklik değil, yeniden dizinleme planı tartışılsın.

SIK DÜŞÜLEN TUZAKLAR

  • Tek bir yerelsiz küçültme çağrısı

    Yerel verilmeden yapılan küçültme İSTANBUL metnini i artı birleşen nokta ile başlayan bir dizeye çevirir. Ekranda fark görünmez, karşılaştırmada dizeler eşit değildir ve sorgu boş döner.

  • Aksanı kaynağın üzerine silmek

    kâr ile kar aynı dizeye indiğinde ayrım geri getirilemez; belgeyi yeniden ayrıştırmadan telafi yoktur. Katlanmış biçim her zaman ek bir alan olmalı, ham metnin yerine geçmemeli.

  • Kök bulucuyu yüzey biçimine uygulamak

    kitabı sözcüğünden ekleri soyan bir bulucu kitab döndürür. Sözlük kitap der, eşleşme olmaz ve kayıp yalnızca o köke bağlı sorgularda görünür — yani ortalamada kaybolur.

  • Olumsuzluk sözcüklerini durak listesine koymak

    değil, yok ve hiç atıldığında bir cümle ile onun tersi aynı belirteç kümesine iner. Sınıflandırıcı doğruluk oranını korur ama tam ters etiketleri güvenle üretmeye başlar.

  • Normalizasyonu değiştirip dizini yenilememek

    Sorgu hattı yeni kuralla, dizindeki belgeler eski kuralla üretilmiş olur. Sistem sağlıklı görünür; yalnızca bir kısım sorgu sonuç döndürmez ve nedeni kayıtlarda iz bırakmaz.

KONTROL LİSTESİ

  • Her metin alanı için hangi normalizasyonun uygulandığı yazılı ve alan adından okunabiliyor
  • Tüm metin girişte NFC'ye getiriliyor ve görünmez karakterler ayıklanıyor
  • Harf katlaması hem uygulama kodunda hem dizin analiz zincirinde Türkçe yerelle yapılıyor
  • ASCII katlanmış biçim ayrı alanda ve düşük ağırlıkta; özgün metin korunuyor
  • Kesme işareti, kısaltma, virgüllü sayı ve tarih örnekleri bölücüde test edildi
  • Durak sözcük listesi olumsuzluk taşıyan sözcükleri içermiyor
  • Sözcük başına token oranı kendi derleminizde ölçüldü ve parça boyutuna yansıtıldı
  • Altın çift kümesi sürekli tümleştirmede koşuyor ve normalizasyon sürümü belgelere yazılıyor

Maddelerin tamamı işaretlenmeden kurulum üretime alınmamalı.

Sık sorulan sorular

Türkçe metni küçük harfe çevirirken neden I harfi sorun çıkarıyor?

Çünkü Türkçede noktalı ve noktasız i ayrı harflerdir ve büyük-küçük eşleşmeleri çaprazdır: I ile ı, i ile İ. Unicode'un varsayılan dönüşümü bunu bilmez; I harfini noktalı i'ye indirir ve İ harfinden geriye görünmez bir birleşen nokta bırakır. Çözüm, dönüşümü Türkçe yerelle çağırmak ya da dönüşümden önce bu iki harfi elle eşlemek.

Türkçe arama için şapkalı harfleri kaldırmalı mıyım?

Kaldırın ama kaynağın üzerine değil. Kullanıcılar ASCII yazdığı için katlanmış bir alana ihtiyaç var; aynı işlem özgün metne uygulandığında kâr ile kar, hâlâ ile hala birbirine karışır ve ayrım geri getirilemez. Doğru kurulum iki alandır: özgün alan yüksek ağırlıkla, katlanmış alan yedek eşleşme için düşük ağırlıkla aranır.

Türkçe için kök bulma mı lemmatizasyon mu kullanmalıyım?

Hattın hangi ucunu beslediğine bakın. Sözlüksel arama ve varlık çıkarımı yapıyorsanız ünsüz yumuşamasını çözen bir biçimbilim çözümleyicisi gerekir; kural tabanlı kök bulucu kitabı sözcüğünü kitab yapar ve sözlükle eşleşmez. Metin bir gömme modeline ya da dil modeline gidiyorsa ek ayırmaya hiç girmeyin; alt sözcük tokenleştiricisi bu işi zaten yapar.

Türkçe metin İngilizceden daha fazla token harcıyor mu?

Çoğu çok dilli tokenleştiricide evet, çünkü eklemeli yapı uzun yüzey biçimleri üretir ve bu biçimler sözlükte tek parça olarak yer almaz. Oranın büyüklüğü tokenleştiriciye ve alana göre değişir, başka bir projenin sayısı sizi bağlamaz. Kendi derleminizde sözcük başına token sayısını ölçün; bu oran parça boyutunun ve bağlam bütçesinin doğrudan girdisidir.

Kaynaklar

  1. 01Unicode Standard Annex #15: Unicode Normalization Forms — Unicode Consortium · Dokümantasyon
  2. 02Yazım Kılavuzu — düzeltme işareti ve kesme işareti kuralları — Türk Dil Kurumu · Dokümantasyon
  3. 03Sinaptik Research — Türkçe metin hattı uygulama notları — Sinaptik Lab · Teknik rapor

BUILD

Bu rehberi kurumunuzda uygulayalım mı?

Aynı mimariyi kendi verinizle kurmak için discovery oturumundan üretime kadar birlikte ilerliyoruz.