Lemmatisation 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.
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 :
123456789101112131415161718192021222324252627282930313233from 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))
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.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
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
Lemmatisation 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.
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 :
123456789101112131415161718192021222324252627282930313233from 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))
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.
Merci pour vos commentaires !