Hoppa till innehållet
AI-grafen
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

  1. par-statistik — pair_counts(words) där words är dict {tuple-av-symboler: antal} → dict {(a,b): antal}.
  2. merge — merge(words, pair) slår ihop paret i alla ord.
  3. 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å servern
from 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 gratis

Fö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.