Un coup en deux

PythonPythonBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce projet, vous allez apprendre à implémenter un subword tokenizer, qui est une étape cruciale dans les tâches de traitement du langage naturel. La tokenization est le processus consistant à diviser une chaîne de texte en unités plus petites, appelées tokens, qui peuvent être des mots individuels, des caractères ou des sous-mots. Ce projet se concentre sur la tokenization au niveau des sous-mots, qui est couramment utilisée en anglais et dans d'autres langues à base latine.

👀 Aperçu

['I','studied', 'in', 'LabEx', 'for', '1', '0', 'days', 'and', 'completed', 'the', '[UNK]', '[UNK]', 'course', '.']

🎯 Tâches

Dans ce projet, vous allez apprendre :

  • à implémenter une fonction de subword tokenizer qui effectue une tokenization au niveau des caractères en utilisant l'algorithme glouton du plus long motif correspondant d'abord
  • à tester le subword tokenizer avec un exemple fourni et à analyser la sortie
  • à comprendre l'algorithme de tokenization et son implantation

🏆 Réalisations

Après avoir terminé ce projet, vous serez capable de :

  • comprendre l'importance de la tokenization dans les tâches de traitement du langage naturel
  • implémenter un composant clé d'un pipeline de traitement du langage naturel
  • différencier entre la tokenization au niveau des caractères et la tokenization au niveau des sous-mots
  • appliquer l'algorithme glouton du plus long motif correspondant d'abord pour tokenizer le texte en sous-mots

Comprendre le processus de tokenization

Dans cette étape, vous allez apprendre sur le processus de tokenization et son importance dans les tâches de traitement du langage naturel.

La tokenization est le processus consistant à diviser une chaîne de texte en unités plus petites, appelées tokens. Ces tokens peuvent être des mots individuels, des caractères ou des sous-mots, selon la méthode de tokenization spécifique utilisée.

Dans les tâches de traitement du langage naturel, la plupart des modèles de machine learning ne prennent pas directement en charge les données sous forme de chaînes. Pour que les modèles puissent apprendre efficacement, les données sous forme de chaînes doivent être numérisées, ce qui est un processus appelé Tokenization. La tokenization est également la préparation pour la numérisation, et la numérisation nécessite une correspondance, qui est fournie par un tableau de correspondance.

La tokenization au niveau des caractères est une méthode qui divise les chaînes sur la base des symboles les plus petits d'une langue et est couramment utilisée dans la tokenization de l'anglais.

La tokenization au niveau des sous-mots est couramment utilisée en anglais et dans d'autres langues à base latine et est une amélioration par rapport à la tokenization au niveau des mots.

Implémentez le subword tokenizer

Dans cette étape, vous allez implémenter une fonction de subword tokenizer qui effectue une tokenization au niveau des caractères pour les mots anglais en utilisant l'algorithme glouton du plus long motif correspondant d'abord. Cette fonction supprime également tous les symboles, y compris les espaces, de la chaîne d'entrée.

Ouvrez le fichier subword_tokenizer.py dans votre éditeur de code. Ce fichier contient un squelette de la fonction subword_tokenizer(). Votre tâche est de compléter les parties manquantes de la fonction.

La fonction doit répondre aux exigences suivantes :

  1. La fonction doit prendre une chaîne de caractères en entrée. Cette fonction reçoit une chaîne contenant des caractères anglais, des chiffres et des ponctuations. La chaîne vous a été fournie et vous ne pouvez pas modifier le contenu de la chaîne.
  2. La fonction doit renvoyer le résultat de la tokenization sous forme d'une liste.

Voici le code complet de la fonction subword_tokenizer() :

import re

def subword_tokenizer(text, vocab) -> list:
    """
    Tokenize le texte d'entrée en sous-mots sur la base d'un vocabulaire fourni.

    Args:
    - text (str): Texte d'entrée à tokenizer.
    - vocab (list): Liste de vocabulaire contenant des sous-mots.

    Returns:
    - list: Liste de tokens de sous-mots.
    """

    def is_in_vocab(word) -> bool:
        """
        Vérifie si un mot donné est dans le vocabulaire.

        Args:
        - word (str): Mot à vérifier.

        Returns:
        - bool: True si le mot est dans le vocabulaire, False sinon.
        """
        return word in vocab

    def find_longest_match(word) -> tuple:
        """
        Trouve le sous-mot correspondant le plus long pour un mot donné dans le vocabulaire.

        Args:
        - word (str): Mot pour lequel trouver une correspondance.

        Returns:
        - tuple: Un tuple contenant le sous-mot correspondant le plus long et la partie restante du mot.
        """
        for i in range(len(word), 0, -1):
            subword = word[:i]
            if is_in_vocab(subword):
                return subword, word[i:]
        return "[UNK]", ""

    tokens = []
    ## Supprime les caractères non alphanumériques et divise le texte en mots
    words = re.findall(r"\b\w+\b", text)

    for word in words:
        while word:
            subword, remaining = find_longest_match(word)
            tokens.append(subword)
            word = remaining

    return tokens


if __name__ == "__main__":
    ## Utilisation exemple :
    vocab = [
        "I",
        "studied",
        "in",
        "LabEx",
        "for",
        "1",
        "0",
        "days",
        "and",
        "completed",
        "the",
        "course",
    ]
    text = "I studied in LabEx for 10 days and completed the TensorFlow Serving course."

    tokenization_result = subword_tokenizer(text, vocab)
    print(tokenization_result)

Testez le subword tokenizer

Dans cette étape, vous allez tester la fonction subword_tokenizer() avec l'exemple fourni et vérifier la sortie.

Exécutez le script subword_tokenizer.py dans votre terminal :

python3 subword_tokenizer.py

La sortie devrait être similaire à la suivante :

['I','studied', 'in', 'LabEx', 'for', '1', '0', 'days', 'and', 'completed', 'the', '[UNK]', '[UNK]', 'course', '.']

Observez la sortie et assurez-vous que le processus de tokenization fonctionne comme prévu. La fonction devrait tokenizer le texte d'entrée en une liste de sous-mots, où les mots inconnus sont représentés par le jeton [UNK].

Comprendre l'algorithme de tokenization

Dans cette étape, vous approfondirez l'implémentation de la fonction subword_tokenizer() et vous comprendrez l'algorithme de tokenization.

La fonction subword_tokenizer() utilise un algorithme glouton du plus long motif correspondant d'abord pour tokenizer le texte d'entrée. Voici comment fonctionne l'algorithme :

  1. La fonction supprime d'abord tous les caractères non alphanumériques du texte d'entrée et divise le texte en mots individuels.
  2. Pour chaque mot, la fonction essaie de trouver le sous-mot correspondant le plus long dans le vocabulaire fourni.
  3. Si un sous-mot est trouvé dans le vocabulaire, il est ajouté à la liste de tokens. Si aucun sous-mot n'est trouvé, le jeton [UNK] est ajouté à la liste.
  4. Le processus continue jusqu'à ce que tous les mots du texte d'entrée aient été tokenisés.

La fonction is_in_vocab() est une fonction d'aide qui vérifie si un mot donné est présent dans le vocabulaire fourni.

La fonction find_longest_match() est le cœur de l'algorithme de tokenization. Elle itère sur le mot, en commençant par le sous-mot le plus long possible, et vérifie si le sous-mot actuel est dans le vocabulaire. Si une correspondance est trouvée, elle renvoie le sous-mot et la partie restante du mot. Si aucune correspondance n'est trouvée, elle renvoie le jeton [UNK] et une chaîne de caractères vide.

Comprendre l'algorithme de tokenization vous aidera à améliorer davantage le subword tokenizer ou à l'adapter à différents cas d'utilisation.

✨ Vérifier la solution et pratiquer

Sommaire

Félicitations ! Vous avez terminé ce projet. Vous pouvez pratiquer plus de laboratoires dans LabEx pour améliorer vos compétences.