Natural Language Processing (NLP) - Fondements et applications

Auteur: Mohamed CHINY Durée necessaire pour le cours de Natural Language Processing (NLP) - Fondements et applications Niveau recommandé pour le cours de Natural Language Processing (NLP) - Fondements et applications Supports vidéo non disponibles pour ce cours Exercices de renforcement non disponibles pour ce cours Quiz disponible pour ce cours

Leçon 9: WordPiece: tokenisation en sous-mots pour mieux comprendre le langage

Toutes les leçons

Tokenisation WordPiece: gérer les mots rares ou inconnus

Construire un vocabulaire intelligent avec WordPiece

La tokenisation WordPiece est une méthode de segmentation des mots en sous-unités, conçue pour gérer efficacement les mots rares ou inconnus.

Contrairement au BPE (Byte Pair Encoding), qui se base sur la fréquence brute des paires de caractères, WordPiece ne choisit pas les sous-mots simplement parce qu’ils apparaissent souvent, mais parce qu’ils rendent le texte plus facile à représenter pour le modèle. En pratique, l’algorithme cherche à découper les mots de manière à ce que le vocabulaire couvre au mieux le corpus, tout en restant compact. Cela signifie qu’il privilégie les morceaux de mots qui permettent au modèle de comprendre et de prédire correctement le langage.

WordPiece est au cœur des modèles BERT et ses variantes qui reposent sur une compréhension fine du langage naturel. Grâce à WordPiece, BERT peut traiter des textes multilingues et gérer des mots nouveaux ou complexes en les décomposant en sous-mots connus. Cela contribue directement à la robustesse et à la précision de ses représentations contextuelles, ce qui constitue un élément clé dans l’évolution des modèles de langage modernes.

Mode de fonctionnement de la tokenisation WordPiece

Prenons l’exemple "petit chat" pour détailler le fonctionnement de la tokenisation WordPiece étape par étape:
  1. Segmentation initiale
    La phrase est d’abord découpée en unités de base (caractères avec le préfixe ## pour indiquer une continuation du mot):
    [‘p’, ’##e’, ’##t’, ’##i’, ’##t’, ’c’, ’##h’, ’##a’, ’##t’]
  2. Vocabulaire de départ
    Le vocabulaire contient les symboles élémentaires (sans répétition):
    [‘p’, ’##e’, ’##t’, ’##i’, ’c’, ’##h’, ’##a’]
  3. Construction des paires candidates
    On forme toutes les paires consécutives:
    (‘p’, ’##e’), (’##e’, ’##t’), (’##t’, ’##i’), (’##i’, ’##t’),
    (’##t’, ’c’), (’c’, ’##h’), (’##h’, ’##a’), (’##a’, ’##t’)
  4. Calcul des scores
    Pour chaque paire, on applique la formule:
    \(Score(x,y)=\frac{\mathrm{fréquence\ de\ la\ paire\ (x,y)}}{\mathrm{fréquence(x)}\times \mathrm{fréquence(y)}}\)
    Exemple:

    La paire (‘p’, ’##e’) apparaît 1 fois.
    Fréquence de ‘p’ = 1, fréquence de ’##e’ = 1.
    Donc:
    \(Score(p,\# \# e)=\frac{1}{1\times 1}=1\)

    Pour (‘##e’, ’##t’) :
    Fréquence de la paire = 1, fréquence de ’##e’ = 1, fréquence de ’##t’ = 3.
    Donc:
    \(Score(\# \# e,\# \# t)=\frac{1}{1\times 3}\approx 0,33\)
    On calcule ainsi pour toutes les paires...
  5. Fusion de la meilleure paire
    La paire avec le score le plus élevé est retenue. Ici, (‘p’, ’##e’) → fusion en pe.
  6. Nouvelle séquence
    La liste devient:
    [‘pe’, ’##t’, ’##i’, ’##t’, ’c’, ’##h’, ’##a’, ’##t’]
  7. Itérations successives
    On répète le processus (construction de nouvelles paires, calcul des scores, fusion) jusqu’à obtenir des sous-mots stables comme petit et chat.


Le résultat final dépend du corpus et des fréquences observées: si les mots "petit" et "chat" apparaissent souvent dans les données d’entraînement, WordPiece les fusionnera en tokens entiers, ce qui donnera une représentation comme ["petit", "chat"]. En revanche, si ces mots sont rares, la tokenisation pourra rester plus fine, par exemple ["pe", "##tit", "ch", "##at"].

Si le vocabulaire appris par WordPiece contient déjà les tokens ["petit", "chat"], alors lorsqu’on rencontre un mot nouveau comme "chaton", l’algorithme va le découper en sous-mots connus. Comme "chat" est déjà présent dans le vocabulaire, il sera utilisé directement, puis WordPiece cherchera à compléter le reste du mot avec des sous-unités disponibles. Dans ce cas, "on" n’existe pas forcément comme mot entier, mais peut être représenté par le sous-mot "##on" (le préfixe ## indiquant qu’il s’agit d’une continuation d’un mot).

Ainsi, "chaton" sera tokenisé en ["chat", "##on"].

Mise en pratique de la tokenisation WordPiece

Tokenisation WordPiece avec la bibilothèque BertTokenizer

Le BertTokenizer est l’outil de la bibliothèque Hugging Face qui permet de préparer un texte pour le modèle BERT en appliquant la méthode de tokenisation WordPiece. Ce tokenizer est directement lié au vocabulaire appris par BERT lors de son entraînement: chaque token est ensuite converti en un identifiant numérique, ce qui permet au modèle de traiter le texte sous une forme qu’il comprend.

Je propose cet exemple:
from transformers import BertTokenizer # Bibliothèque de Hugging Face

# Charger le tokenizer BERT pré-entraîné
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

text = "A tokenizer is in charge of preparing the inputs for a model"

# Tokenisation WordPiece
tokens = tokenizer.tokenize(text)
print("Tokens:", tokens)

# Convertir les tokens en IDs
token_ids = tokenizer.convert_tokens_to_ids(tokens)
print("Token IDs:", token_ids)
On commence par importer la classe BertTokenizer de la bibliothèque Transformers de Hugging Face, qui fournit des outils pré-entraînés pour le traitement du langage naturel:
from transformers import BertTokenizer
Ensuite, on charge le tokenizer associé au modèle bert-base-uncased, c’est-à-dire une version de BERT entraînée sur un grand corpus en anglais, avec tous les mots en minuscules:
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
Il est utile de rappeler qu’il existe d’autres versions (comme bert-base-cased, bert-large, ou encore bert-multilingual) adaptées à différents besoins et langues, chacune avec son propre vocabulaire et tokenizer.
La phrase (variable text) sera découpée en sous-mots selon les règles de WordPiece.
tokens = tokenizer.tokenize(text)
On obtient la liste des tokens, où les morceaux de mots rares ou inconnus sont représentés avec le préfixe ##.

Enfin, on transforme chaque token en un identifiant numérique correspondant à sa position dans le vocabulaire de BERT:
token_ids = tokenizer.convert_tokens_to_ids(tokens)
Ces identifiants sont ceux que le modèle utilise réellement pour traiter le texte et générer des représentations contextuelles.

L'exécution du code produit ce résultat:
Tokens: ['a', 'token', '##izer', 'is', 'in', 'charge', 'of', 'preparing', 'the', 'inputs', 'for', 'a', 'model']

Token IDs: [1037, 19204, 17629, 2003, 1999, 3715, 1997, 8225, 1996, 20407, 2005, 1037, 2944]
Le résultat montre comment WordPiece découpe les mots en sous-unités. Par exemple, le mot 'tokenizer' est séparé en ['token', '##izer'], ce qui permet au modèle de réutiliser des tokens fréquents et de compléter avec une continuation (##izer).

Cette segmentation garantit que même des mots complexes ou rares peuvent être représentés à partir de sous-mots connus, assurant une couverture efficace du vocabulaire pour BERT.