Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Tokenisierung und Byte-Pair-Encoding

Nach dieser Lektion: Ich kann einen kurzen Text mit Paar-Fusionen in Tokens zerlegen.

Lektion, 60 Min.2 BefehleJupyterLab-Lab für Data Science: pandas, Matplotlib und scikit-learn im Browser

Wie ein Sprachmodell Text liest

Tokenisierung zerlegt einen Text in Stücke, die Tokens heißen, und Byte-Pair-Encoding (BPE) ist der übliche Weg, diese Stücke zu wählen. Jeder Satz, den Sie in einen Chatbot tippen, wird so zerlegt, bevor das Modell ihn sieht.

Die Stücke bestimmen, wie viel Text hineinpasst, was mit seltenen Wörtern geschieht und was das Modell buchstabieren kann.

Am Ende dieser Lektion

Notiz

Ich kann einen kurzen Text mit Paar-Fusionen in Tokens zerlegen.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Tokenein Stück Text, das das Modell als Einheit behandeltsee
Vokabulardie Liste aller Tokens, die das Modell kennt
Paarzwei Tokens, die nebeneinander stehens e
Fusionein Paar zu einem neuen Token verbinden
Byte-Pair-EncodingTokens bauen, indem man immer wieder das häufigste Paar verbindet
Token-IDdie Zahl, die für ein Token steht

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Wörter oder Zeichen: zwei einfache Zerlegungen

Im Modul Verarbeitung natürlicher Sprache haben Sie Text in Wörter zerlegt. Ein Sprachmodell braucht aber ein festes Vokabular, und Wörter machen das schwer. Ein neues Wort, etwa ein Name, ein Tippfehler oder eine neue Zusammensetzung, ist einfach unbekannt.

Zeichen lösen das, denn ein paar Dutzend davon schreiben jedes Wort. Dafür wird ein Satz sehr lang, und lange Eingaben kosten mehr Rechenarbeit.

Durchgerechnetes Beispiel: ein Text, zwei Zerlegungen

Zerlegt inTokens in „see seerose rose see“VokabularKann es „rosen“ schreiben?
Wörter43: see, seerose, roseNein, das Wort ist unbekannt
Zeichen174: s, e, r, oNur mit dem neuen Buchstaben n

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Beide Arten von Tokens zählen

Code: python
text = "see seerose rose see"
woerter = text.split()

zeichen = []
for wort in woerter:
    for z in wort:
        zeichen.append(z)

wort_vokabular = []
for wort in woerter:
    if wort not in wort_vokabular:
        wort_vokabular.append(wort)

zeichen_vokabular = []
for z in zeichen:
    if z not in zeichen_vokabular:
        zeichen_vokabular.append(z)

print("Wort-Tokens:", len(woerter), "Vokabular:", wort_vokabular)
print("Zeichen-Tokens:", len(zeichen), "Vokabular:", zeichen_vokabular)
print("Ist rosen ein bekanntes Wort?", "rosen" in wort_vokabular)
# Fügen Sie das Wort rosen in den Text ein und starten Sie erneut.
# Welches Vokabular wächst, und um wie viel?

Byte-Pair-Encoding verbindet das häufigste Paar

Byte-Pair-Encoding liegt zwischen Wörtern und Zeichen. Man beginnt mit Zeichen und zählt jedes Paar benachbarter Tokens innerhalb eines Wortes. Das häufigste Paar wird zu einem neuen Token und kommt ins Vokabular. Bei Gleichstand gewinnt das zuerst gezählte Paar.

Dann zählt man neu und verbindet wieder. Häufige Wörter werden so kürzer. Seltene Wörter bleiben kleinere Stücke, also ist nie etwas unbekannt.

Durchgerechnetes Beispiel: die Paare zählen

PaarWo es vorkommtAnzahl
s esee, seerose (zweimal), rose, see5
e esee, seerose, see3
r oseerose, rose2
o sseerose, rose2
e rseerose1

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Die Paare im Lab zählen

Befehl
docker exec jupyter python3 -c "from collections import Counter; woerter = 'see seerose rose see'.split(); print(Counter(w[i:i + 2] for w in woerter for i in range(len(w) - 1)).most_common(3))"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Durchgerechnetes Beispiel: vier Fusionen

FusionNeues Tokenseeseeroserose
Startkeinss e es e e r o s er o s e
1: s e (5)sese ese e r o ser o se
2: se e (3)seeseesee r o ser o se
3: r o (2, zuerst gezählt)roseesee ro sero se
4: ro se (2)roseseesee roserose

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Die erste Fusion ausführen

Code: python
text = "see seerose rose see"
woerter = []
for wort in text.split():
    woerter.append(list(wort))

links = "s"
rechts = "e"
verschmolzen = []
for tokens in woerter:
    neu = []
    i = 0
    while i < len(tokens):
        # Das Paar wird ein Token, dann springen wir über beide.
        if i + 1 < len(tokens) and tokens[i] == links and tokens[i + 1] == rechts:
            neu.append(links + rechts)
            i = i + 2
        else:
            neu.append(tokens[i])
            i = i + 1
    verschmolzen.append(neu)
print(verschmolzen)
# Ändern Sie das Paar in "e" und "e" und starten Sie erneut.
# Wie viele Tokens hat das Wort rose jetzt?

Zusammengesetzte Wörter zerfallen in bekannte Teile

Nach vier Fusionen ist „seerose“ kein eigenes Token. Es besteht aus „see“ und „rose“, zwei Teilen, die das Vokabular schon kennt.

Das passt gut zum Deutschen. Ein neues Kompositum wie „Seerosenteich“ steht in keinem Wortvokabular. Mit BPE wird es aus häufigen Teilen gebaut, statt unbekannt zu sein.

Ein häufiger Fehler

Warnung

Viele denken, ein Token sei ein Wort. Mit Byte-Pair-Encoding ist ein häufiges Wort ein Token, ein seltenes aber mehrere. Zählen Sie darum Tokens und nicht Wörter, wenn Sie fragen, wie viel Text in ein Modell passt.

Jedes Token wird zu einer Zahl

Das Modell sieht nie Buchstaben. Jedes Token im Vokabular bekommt eine Token-ID, seinen Platz in der Liste. Nach den vier Fusionen heißt das Vokabular s, e, r, o, se, see, ro und rose, nummeriert von 0 bis 7.

So wird „seerose esse“ zu see, rose, e, s, se, also zu den IDs 5, 7, 1, 0, 4. Das sind fünf Tokens statt elf Zeichen.

Tokens in IDs umwandeln

Befehl
docker exec jupyter python3 -c "vokabular = ['s', 'e', 'r', 'o', 'se', 'see', 'ro', 'rose']; print([vokabular.index(t) for t in ['see', 'rose', 'e', 's', 'se']])"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Über dieses Lab und seinen Quellcode: JupyterLab-Lab für Data Science: pandas, Matplotlib und scikit-learn im Browser

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.