Les tokenizers rapides de la bibliothèque Transformers sont rapides, mais ils implémentent également des fonctionnalités
qui seront très utiles pour le pré-traitement et le post-traitement des données.
Jetons y un coup d'œil !
Voyons d'abord la sortie habituelle d'un tokenizer.
Nous obtenons des `input_ids` qui correspondent à des tokens, mais nous perdons beaucoup d'informations au cours du processus.
Par exemple, ici la tokenisation est la même pour les deux phrases, même si l'une a
plusieurs espaces de plus que l'autre.
Le simple fait d'avoir les identifiants d'entrée n'est donc pas suffisant si nous voulons faire correspondre certains tokens avec une étendue
de texte (ce que nous devrons faire lorsque nous aborderons la question-réponse par exemple).
Il est également difficile de savoir quand deux tokens appartiennent ou non au même mot : cela semble facile
quand on regarde simplement la sortie d'un tokenizer BERT, il suffit de chercher le ##. Mais
d'autres tokenizers ont différentes façons de tokeniser des parties de mots.
Par exemple, RoBERTa ajoute ce symbole spécial G pour marquer les tokens au début d'un mot,
et T5 utilise ce symbole spécial de soulignement dans le même but.
Heureusement, les tokenizers rapides gardent une trace du mot d'où provient chaque token, avec une
méthode `word_ids` que vous pouvez utiliser sur leurs sorties.
La sortie n'est pas nécessairement claire, mais assemblées dans un joli tableau comme celui-ci, nous pouvons
regarder la position du mot pour chaque token.
Mieux encore, les tokenisers rapides gardent une trace de l'étendue des caractères d'où provient chaque token,
et nous pouvons les obtenir en l'appelant sur un (ou plusieurs) texte en ajoutant l'argument `return_offsets_mapping=True`
.
Dans ce cas, nous pouvons voir comment nous sautons des positions entre le token `##s` et le super token, en
raison des multiples espaces dans la phrase initiale.
Pour ce faire, les tokenizers rapides stockent des informations supplémentaires à chaque étape de leur
pipeline interne.
Ce pipeline interne consiste en une normalisation, où nous appliquons un peu de nettoyage au texte,
comme la mise en minuscules ou la suppression des accents. La pré-tokénisation, où nous divisons
les textes en mots puis nous appliquons le modèle du tokenizer, c'est là que les
mots sont divisés en tokens avant de faire finalement le post-traitement, où des tokens spéciaux
sont ajoutés.
Du début à la fin du pipeline, le tokenizer garde une trace de chaque étendue de
texte qui correspond à chaque mot, puis à chaque token.
Nous verrons à quel point cela est utile lorsque nous aborderons les tâches suivantes : lors de la
modélisation d'un langage masqué, une variante qui obtient des résultats de pointe consiste à masquer tous les tokens d'un
mot donné au lieu de tokens choisis au hasard.
Cela nous obligera à utiliser les identifiants de mots que nous avons vus.
Lors de la classification des tokens, nous devrons convertir les étiquettes que nous avons sur les mots en
étiquettes sur chaque token.
Quant aux mappages de décalage, ils seront très utiles lorsque nous aurons besoin de convertir des positions de token
dans une phrase en une étendue de texte, ce que nous aurons besoin de savoir lorsque nous examinerons la réponse à une
question ou lors du regroupement des tokens correspondant à la même entité dans la classification de token.
Pour jeter un œil à ces tâches, consultez les vidéos en description !