Bild vom Autor
Wenn Sie NLP studiert haben, haben Sie vielleicht schon einmal den Begriff „Tokenisierung“ gehört. Dies ist ein wichtiger Schritt bei der Textvorverarbeitung, bei dem wir unsere Textdaten in etwas umwandeln, das Maschinen verstehen können. Dies geschieht, indem der Satz in kleinere Teile, sogenannte Token, zerlegt wird. Diese Token können Wörter, Teilwörter oder sogar Zeichen sein, je nach verwendetem Tokenisierungsalgorithmus. In diesem Artikel erfahren Sie, wie Sie die Hugging Face Tokenizers Library zur Vorverarbeitung unserer Textdaten verwenden.
Einrichten der Hugging Face Tokenizers-Bibliothek
Um die Hugging Face Tokenizers-Bibliothek verwenden zu können, müssen Sie sie zuerst installieren. Sie können dies mit pip tun:
Die Hugging Face-Bibliothek unterstützt verschiedene Tokenisierungsalgorithmen, aber die drei Haupttypen sind:
- Byte-Paar-Kodierung (BPE): Fügt die häufigsten Zeichenpaare oder Teilwörter iterativ zusammen und erstellt so ein kompaktes Vokabular. Wird von Modellen wie GPT-2 verwendet.
- Wortstück: Ähnlich wie BPE, konzentriert sich jedoch auf probabilistische Zusammenführungen (wählt nicht das am häufigsten vorkommende Paar, sondern dasjenige, das die Wahrscheinlichkeit des Korpus nach der Zusammenführung maximiert), wird häufig von Modellen wie BERT verwendet.
- Satzteil: Ein flexiblerer Tokenizer, der verschiedene Sprachen und Skripts verarbeiten kann und häufig mit Modellen wie ALBERT, XLNet oder dem Marian-Framework verwendet wird. Er behandelt Leerzeichen als Zeichen und nicht als Worttrennzeichen.
Die Hugging Face Transformers-Bibliothek bietet eine AutoTokenizer
Klasse, die automatisch den besten Tokenizer für ein bestimmtes vorab trainiertes Modell auswählen kann. Dies ist eine praktische Möglichkeit, den richtigen Tokenizer für ein bestimmtes Modell zu verwenden und kann aus dem transformers
Bibliothek. Im Rahmen unserer Diskussion über die Tokenizers-Bibliothek werden wir diesen Ansatz jedoch nicht verfolgen.
Wir verwenden die vorab trainierten BERT-base-uncased
Tokenizer. Dieser Tokenizer wurde mit denselben Daten und Techniken trainiert wie der BERT-base-uncased
Modell, was bedeutet, dass es zur Vorverarbeitung von Textdaten verwendet werden kann, die mit BERT-Modellen kompatibel sind:
# Import the required elements
from tokenizers import Tokenizer
from transformers import BertTokenizer
# Load the pre-trained BERT-base-uncased tokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
Tokenisierung einzelner Sätze
Lassen Sie uns nun einen einfachen Satz mit diesem Tokenizer kodieren:
# Tokenize a single sentence
encoded_input = tokenizer.encode_plus("That is pattern textual content to check tokenization.")
print(encoded_input)
Ausgabe:
{'input_ids': (101, 2023, 2003, 7099, 3793, 2000, 3231, 19204, 3989, 1012, 102), 'token_type_ids': (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 'attention_mask': (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)}
Um die Richtigkeit sicherzustellen, dekodieren wir die tokenisierte Eingabe:
tokenizer.decode(encoded_input("input_ids"))
Ausgabe:
(CLS) that is pattern textual content to check tokenization. (SEP)
In dieser Ausgabe sehen Sie zwei spezielle Token. (CLS)
markiert den Beginn der Eingabesequenz und (SEP)
markiert das Ende und weist auf eine einzelne Textsequenz hin.
Batch-Tokenisierung
Lassen Sie uns nun einen ganzen Textkorpus anstelle eines einzelnen Satzes tokenisieren, indem wir batch_encode_plus
:
corpus = (
"Good day, how are you?",
"I'm studying the right way to use the Hugging Face Tokenizers library.",
"Tokenization is an important step in NLP."
)
encoded_corpus = tokenizer.batch_encode_plus(corpus)
print(encoded_corpus)
Ausgabe:
{'input_ids': ((101, 7592, 1010, 2129, 2024, 2017, 1029, 102), (101, 1045, 2572, 4083, 2129, 2000, 2224, 1996, 17662, 2227, 19204, 17629, 2015, 3075, 1012, 102), (101, 19204, 3989, 2003, 1037, 10232, 3357, 1999, 17953, 2361, 1012, 102)), 'token_type_ids': ((0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), 'attention_mask': ((1, 1, 1, 1, 1, 1, 1, 1), (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1))}
Zum besseren Verständnis dekodieren wir den stapelkodierten Korpus wie im Fall eines einzelnen Satzes. Dadurch erhalten wir die Originalsätze, die entsprechend tokenisiert sind.
tokenizer.batch_decode(encoded_corpus("input_ids"))
Ausgabe:
('(CLS) good day, how are you? (SEP)',
'(CLS) i'm studying the right way to use the cuddling face tokenizers library. (SEP)',
'(CLS) tokenization is an important step in nlp. (SEP)')
Auffüllen und Abschneiden
Bei der Vorbereitung von Daten für Machine-Studying-Modelle ist es oft notwendig, sicherzustellen, dass alle Eingabesequenzen die gleiche Länge haben. Dies lässt sich mit zwei Methoden erreichen:
1. Polsterung
Das Auffüllen erfolgt durch Hinzufügen des speziellen Tokens (PAD)
am Ende der kürzeren Sequenzen, um die Länge der längsten Sequenz im Batch oder die vom Modell unterstützte maximale Länge zu erreichen, wenn max_length
definiert ist. Dies können Sie folgendermaßen tun:
encoded_corpus_padded = tokenizer.batch_encode_plus(corpus, padding=True)
print(encoded_corpus_padded)
Ausgabe:
{'input_ids': ((101, 7592, 1010, 2129, 2024, 2017, 1029, 102, 0, 0, 0, 0, 0, 0, 0, 0), (101, 1045, 2572, 4083, 2129, 2000, 2224, 1996, 17662, 2227, 19204, 17629, 2015, 3075, 1012, 102), (101, 19204, 3989, 2003, 1037, 10232, 3357, 1999, 17953, 2361, 1012, 102, 0, 0, 0, 0)), 'token_type_ids': ((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), 'attention_mask': ((1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0), (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0))}
Jetzt können Sie sehen, dass zusätzliche Nullen platziert werden, aber zum besseren Verständnis dekodieren wir, um zu sehen, wo der Tokenizer die (PAD)
Token:
tokenizer.batch_decode(encoded_corpus_padded("input_ids"), skip_special_tokens=False)
Ausgabe:
('(CLS) good day, how are you? (SEP) (PAD) (PAD) (PAD) (PAD) (PAD) (PAD) (PAD) (PAD)',
'(CLS) i'm studying the right way to use the cuddling face tokenizers library. (SEP)',
'(CLS) tokenization is an important step in nlp. (SEP) (PAD) (PAD) (PAD) (PAD)')
2. Kürzung
Viele NLP-Modelle haben eine Sequenz mit maximaler Eingabelänge. Die Kürzung funktioniert, indem das Ende der längeren Sequenz abgeschnitten wird, um diese maximale Länge zu erreichen. Dies reduziert den Speicherbedarf und verhindert, dass das Modell durch sehr große Eingabesequenzen überlastet wird.
encoded_corpus_truncated = tokenizer.batch_encode_plus(corpus, truncation=True, max_length=5)
print(encoded_corpus_truncated)
Ausgabe:
{'input_ids': ((101, 7592, 1010, 2129, 102), (101, 1045, 2572, 4083, 102), (101, 19204, 3989, 2003, 102)), 'token_type_ids': ((0, 0, 0, 0, 0), (0, 0, 0, 0, 0), (0, 0, 0, 0, 0)), 'attention_mask': ((1, 1, 1, 1, 1), (1, 1, 1, 1, 1), (1, 1, 1, 1, 1))}
Jetzt können Sie auch die batch_decode
Methode, aber zum besseren Verständnis drucken wir diese Informationen anders aus:
for i, sentence in enumerate(corpus):
print(f"Unique sentence: {sentence}")
print(f"Token IDs: {encoded_corpus_truncated('input_ids')(i)}")
print(f"Tokens: {tokenizer.convert_ids_to_tokens(encoded_corpus_truncated('input_ids')(i))}")
print()
Ausgabe:
Unique sentence: Good day, how are you?
Token IDs: (101, 7592, 1010, 2129, 102)
Tokens: ('(CLS)', 'good day', ',', 'how', '(SEP)')
Unique sentence: I'm studying the right way to use the Hugging Face Tokenizers library.
Token IDs: (101, 1045, 2572, 4083, 102)
Tokens: ('(CLS)', 'i', 'am', 'studying', '(SEP)')
Unique sentence: Tokenization is an important step in NLP.
Token IDs: (101, 19204, 3989, 2003, 102)
Tokens: ('(CLS)', 'token', '##ization', 'is', '(SEP)')
Dieser Artikel ist Teil unserer tollen Serie zum Thema „Hugging Face“. Wenn Sie mehr über dieses Thema erfahren möchten, finden Sie hier einige Referenzen, die Ihnen weiterhelfen:
Kanwal Mehreen Kanwal ist Ingenieurin für maschinelles Lernen und technische Autorin mit einer tiefen Leidenschaft für Datenwissenschaft und die Schnittstelle zwischen KI und Medizin. Sie ist Mitautorin des E-Books „Maximizing Productiveness with ChatGPT“. Als Google Era Scholar 2022 für APAC setzt sie sich für Vielfalt und akademische Exzellenz ein. Sie ist außerdem als Teradata Variety in Tech Scholar, Mitacs Globalink Analysis Scholar und Harvard WeCode Scholar anerkannt. Kanwal ist eine leidenschaftliche Verfechterin des Wandels und hat FEMCodes gegründet, um Frauen in MINT-Fächern zu stärken.