Yayın: 5 Temmuz 2025
Byte Pair Encoding (BPE), GPT ve BERT gibi modern dil modellerini destekleyen bir alt-kelime tokenizasyon algoritmasıdır. Başlangıçta veri sıkıştırma için tasarlanmış olan BPE, artık NLP için vazgeçilmez bir tekniktir.
Algoritma basittir: bireysel karakterlerden başlayıp en sık kullanılan bitişik çiftleri iteratif olarak birleştirin ve hedef kelime hazine boyutuna ulaşana kadar devam edin. Bu, karakter seviyesi ayrıntı ile kelime seviyesi semantik arasında denge sağlar.
Geleneksel tokenizasyon yaklaşımlarının önemli sınırları vardır:
Özellikle Japonca için BPE, yaygın kanji kombinasyonlarını, edatları ve gramer kalıplarını açık dilbilimsel bilgi gerektirmeden otomatik olarak öğrenebildiği için özellikle değerlidir.
BPE'nin Japonca metinle adım adım nasıl çalıştığını görelim:
Adım 0 / 5
Japonca haber makaleleri içeren Livedoor News Corpus'unu kullandım - tokenizer eğitimi için mükemmel:
# Japonca haber külliyatını indirme ve okuma
import tarfile
import urllib.request
import os
filename = "ldcc-20140209.tar.gz"
if not os.path.exists(filename):
print("İndiriliyor...")
urllib.request.urlretrieve("https://www.rondhuit.com/download/ldcc-20140209.tar.gz", filename)
text = ""
articles = []
article_count_limit = 1000
with tarfile.open(filename, "r") as tar:
for member in tar.getmembers():
if member.isfile() and member.name.endswith(".txt"):
file_content = tar.extractfile(member).read().decode("utf-8")
lines = file_content.split("\n")
if len(lines) >= 4: # URL, tarih, başlığı atla
content = "\n".join(lines[3:]).strip()
if content:
articles.append(content)
text += content + "\n\n"
print(f"Toplam metin uzunluğu: {len(text):,}")
print(f"Makale sayısı: {len(articles):,}")
print(f"İlk kelime hazine boyutu: {len(set(text)):,}")
BPE algoritması iki ana fonksiyondan oluşur: sık çiftleri bulma ve birleştirme:
def get_pairs(tokens):
"""Bitişik karakter çiftlerini ve frekanslarını bul"""
pairs = defaultdict(int)
for i in range(len(tokens) - 1):
pairs[(tokens[i], tokens[i + 1])] += 1
return pairs
def merge_tokens(tokens, pair):
"""En sık kullanılan çifti tek token'a birleştir"""
new_tokens = []
i = 0
while i < len(tokens):
if (i < len(tokens) - 1 and
tokens[i] == pair[0] and tokens[i + 1] == pair[1]):
new_tokens.append(pair[0] + pair[1]) # Çifti birleştir
i += 2
else:
new_tokens.append(tokens[i])
i += 1
return new_tokens
Bireysel karakterlerden başlayıp en sık çiftleri iteratif olarak birleştiriyoruz:
# Karakter seviyesi token'larla başlat
tokens = list(text) # Ayrı karakterlere böl
vocab = set(tokens)
target_vocab_size = 5000
while len(vocab) < target_vocab_size:
# En sık kullanılan bitişik çifti bul
pairs = get_pairs(tokens)
if not pairs:
break
best_pair = max(pairs, key=pairs.get)
# Bu çiftin tüm örneklerini birleştir
tokens = merge_tokens(tokens, best_pair)
vocab.add("".join(best_pair))
if merge_count % 100 == 0:
print(f"Birleştirme {merge_count}: kelime hazine {len(vocab)}, token {len(tokens)}")
Birleştirme # | Birleştirilen Çift | Yeni Token | Frekans |
---|---|---|---|
1 | 最 + 近 | 最近 | 847 |
2 | T + V | TV | 523 |
3 | で + も | でも | 412 |
4 | 人 + 気 | 人気 | 389 |
5 | 者 + の | 者の | 301 |
Eğitim sonrasında, BPE kelime hazinesini yeni metni tokenize etmek için uygulayabiliriz:
def tokenize_with_bpe(text):
"""Öğrenilen BPE birleştirmelerini yeni metne uygula"""
tokens = list(text) # Karakterlerden başla
changed = True
while changed:
changed = False
new_tokens = []
i = 0
while i < len(tokens):
# Bitişik çiftin kelime hazinesinde olup olmadığını kontrol et
if (i < len(tokens) - 1 and
tokens[i] + tokens[i + 1] in vocab):
new_tokens.append(tokens[i] + tokens[i + 1])
i += 2
changed = True
else:
new_tokens.append(tokens[i])
i += 1
tokens = new_tokens
return tokens
Sonuçlar BPE'nin Japonca metin için etkinliğini gösteriyor:
# Eğitim Sonuçları:
Toplam metin uzunluğu: 659,423
Makale sayısı: 1,000
İlk kelime hazine boyutu: 2,913
BPE sonrası kelime hazine boyutu: 5,000
# Sıkıştırma Sonuçları:
Orijinal karakter sayısı: 659,423
BPE token'ları: 379,352
Sıkıştırma: %42.5
659,423
karakter
379,352
BPE token
%42.5
azalma
Eğitilmiş BPE modelimizle bir Japonca cümlenin nasıl tokenize edildiğine dair örnek:
Orijinal: 最近TVでも人気者のお笑いコンビ「しずる」のメンバーで...
BPE Token'ları:
BPE'nin herhangi bir dilbilimsel ön işleme olmadan "最近" (yakın zamanda), "人気" (popüler) ve "者の" (kişinin) gibi anlamlı alt-kelime birimlerini otomatik olarak öğrendiğine dikkat edin!
Japonca tokenizasyon için benzersiz zorluklar sunar:
Eksiksiz uygulama GitHub'da interaktif Jupyter notebook olarak mevcut. Şunları yapabilirsiniz:
BPE, karakter seviyesi sağlamlık ile kelime seviyesi semantik arasında mükemmel denge sağlar. Basit başlayıp veri-odaklı birleştirme yoluyla karmaşıklık inşa ederek hem kompakt hem de anlamlı kelime hazineleri oluşturur.
Özellikle Japonca metin için BPE'nin dil kalıplarını otomatik olarak keşfetme yeteneği, onu modern NLP uygulamaları için ideal bir seçim yapar. Anlamsal anlamı korurken elde ettiğimiz %42.5 sıkıştırma, etkinliğini göstermektedir.
Dil modelleri, makine çeviri sistemleri veya metin analiz araçları geliştiriyorsanız, BPE'yi anlamak ve uygulamak herhangi bir dille, özellikle Japonca gibi morfolojik olarak zengin dillerle çalışırken vazgeçilmezdir.
Bu blog İngilizce'den LLM ile çevrilmiştir. Herhangi bir belirsizlik durumunda İletişim sayfasından bana ulaşabilirsiniz.
Yorum bırak
Yorumlar
Şuan yorum yok.
Diğer bloglara bak
2025/07/07
Q-Learning: İnteraktif Pekiştirmeli Öğrenmenin Temeli
2025/07/06
Optimizasyon Algoritmaları: SGD, Momentum ve Adam
2024/06/19
Svelte ve JavaScript ile Basit ve Dinamik Bir Tooltip Yaratma Yöntemi
2024/06/17
JavaScript ile Tokyo'nun İnteraktif Haritasını Oluşturun
2024/06/14
Matplotlib'de Japonca Karakter Sorununu Çözme Yöntemi
2024/06/13
Kitap İncelemesi | Ötekiyle Konuşmak by Malcolm Gladwell
2024/06/07
Japonca'da En Sık Kullanılan 3.000 Kanji
2024/06/07
VSCode'da Regex Kullanarak Replace Yapma Yöntemi
2024/06/06
Svelte'de Readable Store Kullanmayın
2024/06/05
Dosyaları Gzip ve Pako ile Sıkıştırarak Web Sitesinin Yükleme Hızını Artırın
2024/05/31
Web Sayfasında Farenin Uzerinde Oldugu Kelimeyi JavaScript ile Bulun
2024/05/29
Svelte ve SVG ile Interaktif Harita Oluşturun
2024/05/28
Kitap İncelemesi | Geleneklere Uymayanlar Dünyayı Nasıl İleri Taşıyor? by Adam Grant & Sheryl Sandberg
2024/05/27
Javascript Kullanarak Sudoku Nasıl Çözülür?
2024/05/26
Web Siteme Gelen Trafiği Bir Ayda Nasıl 10 Kat Artırdım?
2024/05/24
Hayat Bisiklet Sürmek Gibidir
2024/05/19
JavaScript'te Backtracking Algoritması ile Tamamlanmış Sudoku Oluşturun
2024/05/16
Tailwind Neden Harikadır ve Web Geliştirmeyi Nasıl Kolay Hale Getirir?
2024/05/15
Python ve Git Hooks ile Otomatik Olarak Site Haritası Oluşturma
2024/05/14
Kitap İncelemesi | Çok Yönlü - Başarı İçin Neden Çok Şeyle İlgilenmeliyiz? by David Epstein
2024/05/13
Svelte ve SvelteKit nedir?
2024/05/12
SvelteKit ile Internationalization (Çoklu Dil Desteği)
2024/05/11
Svelte'de Caching ile Deploy Süresini Azaltın
2024/05/10
Svelte ve Intersection Oberver ile Lazy-Load
2024/05/10
Genetik Algoritma İle Hisse Senedi Portföyü Optimizasyonu
2024/05/09
ShapeFile Formatini SVG Formatina Degistirme Yontemi
2024/05/08
Svelte'de Reaktivite: Variables, Binding, ve Key Fonksiyonu
2024/05/07
Kitap İncelemesi | Savaş Sanatı - Sun Tzu
2024/05/06
Specialistlik Bitti. Yaşasın Generalistlik!
2024/05/03
2018 Milletvekili Seçimlerinde Yaşa Göre Parti Eğilimi
2024/05/01
Python Selenium Ile Secmen Veritabani Olusturma
2024/04/30
Svelte ve Tailwind Ile Infinite Scroll Yapma Yontemi
2024/04/29
1 Yıl İçerisinde Japonca Konuşabilmek
2024/04/25
Svelte ve Tailwind ile Kullanıma Hazır Web Sitesi Şablonu
2024/01/29
Tembel Muhendisler Kotu Urunler Yapar
2024/01/28
Mukemmellik Uzerine
2024/01/28
MacBook'ta PDF'i PNG'ye Cevirme Yontemi
2023/12/31
2023'u Kapatiyoruz: Bu Yil Okunan 24 Kitap
2023/12/30
Python PIL Kullarak Foto Kolaji Yapma Yontemi
2024/01/09
Site Ziyaretcilerinin Alet ve Tarayicilarini Tespit Etme Yontemi
2024/01/19
ChatGPT Cevap Anatomisi