Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Lemmatisation Avec Étiquetage des POS | Racine et Lemmatisation
Introduction au TALN

bookLemmatisation Avec Étiquetage des POS

La langue anglaise regorge de mots pouvant remplir plusieurs fonctions grammaticales avec des significations différentes. Par exemple, « running » peut être un verbe (« He is running. ») ou un nom (« Running is fun. »).

Comme nous l'avons déjà vu, un lemmatiseur ne peut réduire correctement un mot à sa forme de base que s'il connaît la catégorie grammaticale du mot dans le contexte donné. L'étiquetage des parties du discours (POS tagging) fournit ce contexte, rendant la lemmatisation plus précise.

Lemmatisation avec POS Tagging dans NLTK

Puisque nous connaissons déjà ces deux techniques séparément, il est temps de les combiner. Cependant, il existe un aspect important à prendre en compte, à savoir la différence de format des étiquettes POS entre pos_tag et le format attendu par le WordNet Lemmatizer.

Note
Approfondir

La fonction pos_tag de NLTK utilise le jeu d'étiquettes Penn Treebank, qui comprend un large éventail d'étiquettes pour une catégorisation grammaticale détaillée. Le WordNet Lemmatizer, quant à lui, attend des étiquettes POS dans une forme simplifiée correspondant à la catégorisation propre à WordNet. Plus précisément, il ne distingue qu'entre les noms ('n'), les verbes ('v'), les adjectifs ('a' ou 's' pour les adjectifs satellites) et les adverbes ('r').

Le processus de correspondance consiste à convertir les étiquettes détaillées du Penn Treebank en catégories plus larges reconnues par WordNet. Par exemple, à la fois 'VBD' (verbe au passé) et 'VBG' (gérondif ou participe présent) du Penn Treebank sont transformés en 'v' (verbe) lorsqu'ils sont utilisés dans le Lemmatizer de WordNet.

Écrivons une fonction pour cet objectif :

from nltk.corpus import wordnet as wn


def get_wordnet_pos(treebank_tag):
    if treebank_tag.startswith('J'):
        return wn.ADJ
    elif treebank_tag.startswith('V'):
        return wn.VERB
    elif treebank_tag.startswith('R'):
        return wn.ADV
    else:
        # Default to noun if no match is found or starts with 'N'
        return wn.NOUN  

Cette fonction vérifie simplement la première lettre de l’étiquette Penn Treebank : si c’est 'J', elle retourne l’étiquette WordNet pour les adjectifs ; si c’est 'V', pour les verbes ; si c’est 'R', pour les adverbes. Pour tous les autres cas, y compris lorsque l’étiquette commence par 'N' ou ne correspond à aucune condition spécifiée, elle retourne par défaut l’étiquette WordNet pour les noms.

Les constantes ADJ, VERB et autres que vous voyez dans le code proviennent de WordNet. Leurs valeurs sont ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.

Avec cette fonction, procédons à la lemmatisation avec l’étiquetage des parties du discours :

123456789101112131415161718192021222324252627282930313233
from nltk.stem import WordNetLemmatizer from nltk.tokenize import word_tokenize from nltk import pos_tag from nltk.corpus import wordnet as wn import nltk nltk.download('wordnet') nltk.download('averaged_perceptron_tagger_eng') nltk.download('punkt_tab') # Initialize the lemmatizer lemmatizer = WordNetLemmatizer() # Function to map NLTK's POS tags to the format used by the WordNet lemmatizer def get_wordnet_pos(treebank_tag): if treebank_tag.startswith('J'): return wn.ADJ elif treebank_tag.startswith('V'): return wn.VERB elif treebank_tag.startswith('R'): return wn.ADV else: # Default to noun if no match is found or starts with 'N' return wn.NOUN text = "The leaves on the tree were turning a bright red, indicating that fall was leaving its mark." text = text.lower() tokens = word_tokenize(text) tagged_tokens = pos_tag(tokens) # Lemmatize each token with its POS tag lemmatized_tokens = [lemmatizer.lemmatize(token, get_wordnet_pos(tag)) for token, tag in tagged_tokens] print("Original text:", text) print("Lemmatized text:", ' '.join(lemmatized_tokens))
copy

Comme vous pouvez le constater, nous avons d'abord effectué l'étiquetage des parties du discours (POS tagging) à l'aide de la fonction pos_tag(), puis nous avons utilisé une compréhension de liste pour créer une liste de tokens lemmatisés en appliquant la méthode lemmatize() avec le token courant et l'étiquette correctement formatée (en utilisant notre fonction get_wordnet_pos(tag)) comme arguments. Nous n'avons pas supprimé intentionnellement les mots vides afin de démontrer que le code traite efficacement tous les tokens.

question mark

Pourquoi la fonction get_wordnet_pos est-elle nécessaire lors de la lemmatisation avec le WordNetLemmatizer de NLTK après l'étiquetage des parties du discours (POS tagging) ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 7

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Awesome!

Completion rate improved to 3.45

bookLemmatisation Avec Étiquetage des POS

Glissez pour afficher le menu

La langue anglaise regorge de mots pouvant remplir plusieurs fonctions grammaticales avec des significations différentes. Par exemple, « running » peut être un verbe (« He is running. ») ou un nom (« Running is fun. »).

Comme nous l'avons déjà vu, un lemmatiseur ne peut réduire correctement un mot à sa forme de base que s'il connaît la catégorie grammaticale du mot dans le contexte donné. L'étiquetage des parties du discours (POS tagging) fournit ce contexte, rendant la lemmatisation plus précise.

Lemmatisation avec POS Tagging dans NLTK

Puisque nous connaissons déjà ces deux techniques séparément, il est temps de les combiner. Cependant, il existe un aspect important à prendre en compte, à savoir la différence de format des étiquettes POS entre pos_tag et le format attendu par le WordNet Lemmatizer.

Note
Approfondir

La fonction pos_tag de NLTK utilise le jeu d'étiquettes Penn Treebank, qui comprend un large éventail d'étiquettes pour une catégorisation grammaticale détaillée. Le WordNet Lemmatizer, quant à lui, attend des étiquettes POS dans une forme simplifiée correspondant à la catégorisation propre à WordNet. Plus précisément, il ne distingue qu'entre les noms ('n'), les verbes ('v'), les adjectifs ('a' ou 's' pour les adjectifs satellites) et les adverbes ('r').

Le processus de correspondance consiste à convertir les étiquettes détaillées du Penn Treebank en catégories plus larges reconnues par WordNet. Par exemple, à la fois 'VBD' (verbe au passé) et 'VBG' (gérondif ou participe présent) du Penn Treebank sont transformés en 'v' (verbe) lorsqu'ils sont utilisés dans le Lemmatizer de WordNet.

Écrivons une fonction pour cet objectif :

from nltk.corpus import wordnet as wn


def get_wordnet_pos(treebank_tag):
    if treebank_tag.startswith('J'):
        return wn.ADJ
    elif treebank_tag.startswith('V'):
        return wn.VERB
    elif treebank_tag.startswith('R'):
        return wn.ADV
    else:
        # Default to noun if no match is found or starts with 'N'
        return wn.NOUN  

Cette fonction vérifie simplement la première lettre de l’étiquette Penn Treebank : si c’est 'J', elle retourne l’étiquette WordNet pour les adjectifs ; si c’est 'V', pour les verbes ; si c’est 'R', pour les adverbes. Pour tous les autres cas, y compris lorsque l’étiquette commence par 'N' ou ne correspond à aucune condition spécifiée, elle retourne par défaut l’étiquette WordNet pour les noms.

Les constantes ADJ, VERB et autres que vous voyez dans le code proviennent de WordNet. Leurs valeurs sont ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.

Avec cette fonction, procédons à la lemmatisation avec l’étiquetage des parties du discours :

123456789101112131415161718192021222324252627282930313233
from nltk.stem import WordNetLemmatizer from nltk.tokenize import word_tokenize from nltk import pos_tag from nltk.corpus import wordnet as wn import nltk nltk.download('wordnet') nltk.download('averaged_perceptron_tagger_eng') nltk.download('punkt_tab') # Initialize the lemmatizer lemmatizer = WordNetLemmatizer() # Function to map NLTK's POS tags to the format used by the WordNet lemmatizer def get_wordnet_pos(treebank_tag): if treebank_tag.startswith('J'): return wn.ADJ elif treebank_tag.startswith('V'): return wn.VERB elif treebank_tag.startswith('R'): return wn.ADV else: # Default to noun if no match is found or starts with 'N' return wn.NOUN text = "The leaves on the tree were turning a bright red, indicating that fall was leaving its mark." text = text.lower() tokens = word_tokenize(text) tagged_tokens = pos_tag(tokens) # Lemmatize each token with its POS tag lemmatized_tokens = [lemmatizer.lemmatize(token, get_wordnet_pos(tag)) for token, tag in tagged_tokens] print("Original text:", text) print("Lemmatized text:", ' '.join(lemmatized_tokens))
copy

Comme vous pouvez le constater, nous avons d'abord effectué l'étiquetage des parties du discours (POS tagging) à l'aide de la fonction pos_tag(), puis nous avons utilisé une compréhension de liste pour créer une liste de tokens lemmatisés en appliquant la méthode lemmatize() avec le token courant et l'étiquette correctement formatée (en utilisant notre fonction get_wordnet_pos(tag)) comme arguments. Nous n'avons pas supprimé intentionnellement les mots vides afin de démontrer que le code traite efficacement tous les tokens.

question mark

Pourquoi la fonction get_wordnet_pos est-elle nécessaire lors de la lemmatisation avec le WordNetLemmatizer de NLTK après l'étiquetage des parties du discours (POS tagging) ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 7
some-alt