Tokenization
- Makine Öğrenmesi kursu
- Uzman
- Ders 19/44
- 5 dk
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 parcaHugging 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
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
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.
aday = kelime[bas:son] if bas == 0 else "____" + kelime[bas:son]
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] |