Türkçe BPE Tokenizer
Türkçe metin için sıfırdan eğitilmiş, byte-level BPE tokenizer.
Neden?
Genel amaçlı tokenizer'lar Türkçe'yi verimsiz bölüyor. Türkçe sondan eklemeli bir dil — ev, evler, evlerimiz, evlerimizden aynı kökten türüyor. İngilizce ağırlıklı bir sözlük bu ekleri tanımadığı için kelimeleri gereksiz parçalara ayırıyor ve aynı metin çok daha fazla token tutuyor.
Ölçümler
300 Türkçe metin parçası üzerinde:
| Tokenizer | Sözlük | Fertility (token/kelime) |
|---|---|---|
| Bu tokenizer | 24.433 | 1.425 |
| gpt2 | 50.257 | 3.877 |
Fertility düşük olması iyidir: aynı metni daha az token ile temsil eder. Bu tokenizer, gpt2'nin yarısı kadar sözlükle Türkçe'de 2,7 kat daha verimli.
Pratik anlamı: aynı bağlam penceresine yaklaşık 2,7 kat daha fazla Türkçe metin sığar, eğitim ve çıkarım maliyeti buna oranla düşer.
Bölütleme örnekleri
"İnsanların isimlerini hatırlamak, onlara değer verdiğinizi gösterir."
→ 9 token: İnsanların | isimlerini | hatırlamak | , | onlara | değer | verdiğinizi | gösterir | .
"Eleştirmek yerine karşımızdakini anlamaya çalışmak ilişkileri güçlendirir."
→ 10 token: Eleştir | mek | yerine | karşımız | dakini | anlamaya | çalışmak | ilişkileri | güçlendirir | .
Sık kullanılan kelimeler tek token; türetilmiş biçimler kök ve ek olarak bölünüyor.
Teknik Detaylar
- Model: BPE (Byte-Pair Encoding)
- Pre-tokenizer: ByteLevel (
add_prefix_space=False) - Decoder: ByteLevel
- Sözlük boyutu: 24.433
- Minimum frekans: 2
- Korpus: ~1,7 MB Türkçe metin
ByteLevel kullanıldığı için bilinmeyen karakter sorunu yok — her bayt temsil edilebilir. ç ğ ı İ ö ş ü dahil tüm Türkçe karakterler encode/decode döngüsünden kayıpsız geçer (6/6 test başarılı).
Özel Tokenlar
| Token | Amaç |
|---|---|
<|endoftext|> |
Dizi sonu / başlangıcı |
<|pad|> |
Dolgu |
<|unk|> |
Bilinmeyen (ByteLevel sayesinde pratikte kullanılmaz) |
<|im_start|> |
Sohbet mesajı başlangıcı |
<|im_end|> |
Sohbet mesajı sonu |
<|think|> |
Akıl yürütme bloğu başlangıcı |
<|/think|> |
Akıl yürütme bloğu sonu |
Kullanım
from transformers import PreTrainedTokenizerFast
tok = PreTrainedTokenizerFast.from_pretrained("ssilistre/turkish-bpe-tokenizer")
ids = tok.encode("İnsanların isimlerini hatırlamak önemlidir.")
print(len(ids), tok.decode(ids))
Doğrudan tokenizers kütüphanesiyle:
from tokenizers import Tokenizer
tok = Tokenizer.from_pretrained("ssilistre/turkish-bpe-tokenizer")
print(tok.encode("Merhaba dünya").tokens)
Sınırlamalar
- Küçük korpus. ~1,7 MB metinle eğitildi. Daha büyük ve çeşitli bir korpus, özellikle nadir kelimelerde daha iyi bölütleme verirdi.
- Dar alan. Korpus insan ilişkileri ve iletişim konularından oluşuyor. Teknik, hukuki ya da tıbbi metinlerde fertility yükselir.
- Hedeflenen sözlük boyutuna ulaşılmadı. 32.000 istendi, korpus bu büyüklükte anlamlı birleşme üretmeye yetmediği için 24.433'te durdu.
- Mevcut modellerle uyumsuz. Sıfırdan eğitildiği için hazır bir modelin gömme katmanıyla eşleşmez. Kullanmak için model ya sıfırdan eğitilmeli ya da gömme katmanı yeniden boyutlandırılmalı.