EUniversitetLaboration· ca 60 min· sandlåda på servern
Labb: byte-pair encoding från grunden
Träna en BPE-tokeniserare på en liten korpus, tokenisera ny text med de lärda sammanslagningarna och se avvägningen mellan ordförrådsstorlek och sekvenslängd.
Teori
Börja med tecken. Räkna alla intilliggande par, slå ihop det vanligaste till en ny symbol, upprepa N gånger. Tokenisering av ny text tillämpar sammanslagningarna i samma ordning.
Deluppgifter
- par-statistik —
pair_counts(words)där words är dict {tuple-av-symboler: antal} → dict {(a,b): antal}. - merge —
merge(words, pair)slår ihop paret i alla ord. - träna och tokenisera —
train(text, n_merges)returnerar listan av merges;encode(text, merges)returnerar tokens.
Godkänt när: tokens_per_char <= 0.6
Startkoden
körs i en isolerad sandlåda på servernfrom collections import Counter
def words_from(text):
"""Ord → tuple av tecken med slutmarkör, med frekvens."""
c = Counter(text.split())
return {tuple(w) + ("</w>",): n for w, n in c.items()}
def pair_counts(words):
# TODO: räkna intilliggande symbolpar viktade med ordets frekvens
...
def merge(words, pair):
# TODO: ersätt varje förekomst av pair (a, b) med "ab" i alla ord
...
def train(text, n_merges=50):
words = words_from(text)
merges = []
for _ in range(n_merges):
# TODO: hitta vanligaste paret, slå ihop, spara
...
return merges
def encode(text, merges):
# TODO: för varje ord: börja med tecken + </w>, tillämpa merges i ordning
...
Du skriver koden, tester du inte ser avgör om den håller. Skapa ett gratis konto för att köra labben.
Prova diagnosenSkapa konto gratisFörväntade resultat
Efter 50 merges på korpusen: tokens per tecken ≤ 0,6 på ny text, vanliga ord blir en token.
Vanliga fel
- Slår ihop fler än ett par per iteration.
- Tillämpar merges i fel ordning vid encode.
- Ordslutmarkör (
</w>) saknas → 'is' i 'this' och 'is' blandas.