Makine Öğrenmesi
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.
Örnek çözümü göster
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])
Kendini test et
-
WordPiece'te "##lar" ne anlama gelir?
- Cümle sonu
- Bir kelimenin başı olmayan, devam parçası
- Yorum satırı
- Bilinmeyen kelime
Cevabı göster
Bir kelimenin başı olmayan, devam parçası — ## önekli parça, önceki parçaya bitişik yazılır.
-
Kelime içi parçayı işaretle.
aday = kelime[bas:son] if bas == 0 else "____" + kelime[bas:son]
Cevabı göster
aday = kelime[bas:son] if bas == 0 else "##" + kelime[bas:son]
-
Tokenizasyonu eşleştir.
- oyuncular
- oyun ##cu ##lar
- güzeldi
- güzel ##di
- kötüydü
- kötü ##ydi
- masa
- [UNK]
Sıradaki ders: Fine-tuning