CodeBlanks Logo Icon CodeBlanks

Tokenization

BERT, kelimeleri alt kelime (subword) tokenlerine ayırır.

Alt-kelime tokenizasyonu

Tüm kelimeleri sözlüğe koymak imkânsızdır (özellikle Türkçe gibi eklemeli dillerde). BERT WordPiece kullanır: kelime, sözlükteki en uzun parçalara bölünür; kelime içi parçalar ## ile işaretlenir:

"oyuncular"  ->  ["oyun", "##cu", "##lar"]
"güzeldi"    ->  ["güzel", "##di"]

Böylece ~30 000 parçalık bir sözlük, sınırsız sayıda kelimeyi kapsar; hiçbir parça bulunamazsa [UNK] kullanılır.

Açgözlü en uzun eşleşme

Algoritma soldan başlar, sözlükte bulunan en uzun ön parçayı alır, sonra kalan kısımda aynısını ## önekiyle tekrarlar:

def wordpiece(kelime):
    parca, bas = [], 0
    while bas < len(kelime):
        son = len(kelime)
        while son > bas:
            aday = kelime[bas:son] if bas == 0 else "##" + kelime[bas:son]
            if aday in sozluk:
                break
            son -= 1
        if son == bas:
            return ["[UNK]"]
        parca.append(aday)
        bas = son
    return parca

Hugging Face'te bunun hızlı (Rust ile yazılmış) sürümünü AutoTokenizer.from_pretrained(...) verir.

Uygulama WordPiece

Verilen sözlükle wordpiece(kelime) fonksiyonunu yaz. "oyuncular film güzeldi masa" cümlesinin her kelimesini parçala, tüm parçaları tek listede birleştirip yazdır. Ardından parçaların kimliklerini yazdır.

Başlangıç kodu

model.py
sozluk = {"[PAD]": 0, "[UNK]": 1, "[CLS]": 2, "[SEP]": 3, "[MASK]": 4,
          "film": 5, "çok": 6, "güzel": 7, "##di": 8, "oyun": 9, "##cu": 10,
          "##lar": 11, "iyi": 12, "kötü": 13, "##ydi": 14}
metin = "oyuncular film güzeldi masa"

# buraya yaz

Örnek çözüm

model.py
sozluk = {"[PAD]": 0, "[UNK]": 1, "[CLS]": 2, "[SEP]": 3, "[MASK]": 4,
          "film": 5, "çok": 6, "güzel": 7, "##di": 8, "oyun": 9, "##cu": 10,
          "##lar": 11, "iyi": 12, "kötü": 13, "##ydi": 14}
metin = "oyuncular film güzeldi masa"

def wordpiece(kelime):
    parca, bas = [], 0
    while bas < len(kelime):
        son = len(kelime)
        while son > bas:
            aday = kelime[bas:son] if bas == 0 else "##" + kelime[bas:son]
            if aday in sozluk:
                break
            son -= 1
        if son == bas:
            return ["[UNK]"]
        parca.append(aday)
        bas = son
    return parca

parcalar = [p for k in metin.split() for p in wordpiece(k)]
print(parcalar)
print([sozluk[p] for p in parcalar])

Beklenen çıktı

['oyun', '##cu', '##lar', 'film', 'güzel', '##di', '[UNK]']
[9, 10, 11, 5, 7, 8, 1]

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 WordPiece'te "##lar" ne anlama gelir?

  • Cümle sonu
  • Bir kelimenin başı olmayan, devam parçası Doğru cevap
  • Yorum satırı
  • Bilinmeyen kelime

Açıklama: ## önekli parça, önceki parçaya bitişik yazılır.

2 Kelime içi parçayı işaretle.

Soru
aday = kelime[bas:son] if bas == 0 else "____" + kelime[bas:son]
Cevap
aday = kelime[bas:son] if bas == 0 else "##" + kelime[bas:son]

Açıklama: BERT'in WordPiece önekidir.

3 Tokenizasyonu eşleştir.

Kavram Anlamı
oyuncular oyun ##cu ##lar
güzeldi güzel ##di
kötüydü kötü ##ydi
masa [UNK]

Uzman bölümündeki tüm dersler