Contenu du cours
Introduction au NLP
Introduction au NLP
Lemmatisation avec Étiquetage POS
La langue anglaise est pleine de mots qui peuvent servir de multiples parties du discours 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 un mot à sa forme de base avec précision que s'il connaît la partie du discours du mot dans le contexte donné. Le marquage POS fournit à son tour ce contexte, rendant la lemmatisation plus précise.
Lemmatisation avec le marquage POS dans NLTK
Puisque nous sommes déjà familiers avec ces deux techniques séparément, il est temps de les combiner. Cependant, il y a un aspect important à prendre en considération, à savoir la différence de format des étiquettes POS entre pos_tag
et le format que le WordNet Lemmatizer attend.
Le processus de mappage implique de convertir les balises détaillées 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) de Penn Treebank seraient mappés à 'v'
(verbe) pour être utilisés avec le lemmatiseur WordNet.
Écrivons une fonction à cet effet :
Cette fonction vérifie simplement la première lettre de la balise Penn Treebank : si c'est 'J'
, elle renvoie la balise 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 la balise commence par 'N'
ou ne correspond à aucune condition spécifiée, elle renvoie par défaut la balise WordNet pour les noms. Ces ADJ
, VERB
, etc. ne sont que des constantes, où ADJ, ADJ_SAT, ADV, NOUN, VERB = "a", "s", "r", "n", "v"
.
Étant donné cette fonction, effectuons maintenant la lemmatisation avec l'étiquetage POS au préalable :
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))
Comme vous pouvez le voir, nous avons d'abord effectué le balisage POS en utilisant la fonction pos_tag()
, ensuite nous avons utilisé la compréhension de liste pour créer une liste de tokens lemmatisés en appliquant la méthode lemmatize()
avec le token actuel et l'étiquette correctement formatée (en utilisant notre fonction get_wordnet_pos(tag)
) comme arguments. Nous n'avons intentionnellement pas supprimé les mots vides pour démontrer que le code traite efficacement tous les tokens.
Swipe to start coding
Il est temps de combiner toutes les techniques de prétraitement de texte que nous avons apprises jusqu'à présent pour obtenir un texte lemmatisé sans les mots vides, étant donné le texte brut initial. Votre tâche est la suivante :
-
Convertir
text
en minuscules. -
Charger la liste des mots vides en anglais et la convertir en
set
. -
Initialiser un lemmatiseur.
-
Tokeniser la chaîne
text
. -
Filtrer les mots vides en utilisant la compréhension de liste.
-
Effectuer le balisage POS en utilisant la fonction respective.
-
Lemmatiser les tokens résultants en tenant compte de leurs étiquettes POS en utilisant la compréhension de liste.
Solution
Merci pour vos commentaires !
Lemmatisation avec Étiquetage POS
La langue anglaise est pleine de mots qui peuvent servir de multiples parties du discours 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 un mot à sa forme de base avec précision que s'il connaît la partie du discours du mot dans le contexte donné. Le marquage POS fournit à son tour ce contexte, rendant la lemmatisation plus précise.
Lemmatisation avec le marquage POS dans NLTK
Puisque nous sommes déjà familiers avec ces deux techniques séparément, il est temps de les combiner. Cependant, il y a un aspect important à prendre en considération, à savoir la différence de format des étiquettes POS entre pos_tag
et le format que le WordNet Lemmatizer attend.
Le processus de mappage implique de convertir les balises détaillées 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) de Penn Treebank seraient mappés à 'v'
(verbe) pour être utilisés avec le lemmatiseur WordNet.
Écrivons une fonction à cet effet :
Cette fonction vérifie simplement la première lettre de la balise Penn Treebank : si c'est 'J'
, elle renvoie la balise 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 la balise commence par 'N'
ou ne correspond à aucune condition spécifiée, elle renvoie par défaut la balise WordNet pour les noms. Ces ADJ
, VERB
, etc. ne sont que des constantes, où ADJ, ADJ_SAT, ADV, NOUN, VERB = "a", "s", "r", "n", "v"
.
Étant donné cette fonction, effectuons maintenant la lemmatisation avec l'étiquetage POS au préalable :
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))
Comme vous pouvez le voir, nous avons d'abord effectué le balisage POS en utilisant la fonction pos_tag()
, ensuite nous avons utilisé la compréhension de liste pour créer une liste de tokens lemmatisés en appliquant la méthode lemmatize()
avec le token actuel et l'étiquette correctement formatée (en utilisant notre fonction get_wordnet_pos(tag)
) comme arguments. Nous n'avons intentionnellement pas supprimé les mots vides pour démontrer que le code traite efficacement tous les tokens.
Swipe to start coding
Il est temps de combiner toutes les techniques de prétraitement de texte que nous avons apprises jusqu'à présent pour obtenir un texte lemmatisé sans les mots vides, étant donné le texte brut initial. Votre tâche est la suivante :
-
Convertir
text
en minuscules. -
Charger la liste des mots vides en anglais et la convertir en
set
. -
Initialiser un lemmatiseur.
-
Tokeniser la chaîne
text
. -
Filtrer les mots vides en utilisant la compréhension de liste.
-
Effectuer le balisage POS en utilisant la fonction respective.
-
Lemmatiser les tokens résultants en tenant compte de leurs étiquettes POS en utilisant la compréhension de liste.
Solution
Merci pour vos commentaires !