Lematización con Etiquetado POS
El idioma inglés está lleno de palabras que pueden funcionar como múltiples categorías gramaticales con diferentes significados. Por ejemplo, "running" puede ser un verbo ("He is running.") o un sustantivo ("Running is fun.").
Como ya hemos visto, un lematizador solo puede reducir con precisión una palabra a su forma base si conoce la categoría gramatical de la palabra en el contexto dado. El etiquetado POS proporciona este contexto, haciendo que la lematización sea más precisa.
Lematización con Etiquetado POS en NLTK
Ya que estamos familiarizados con ambas técnicas por separado, es momento de combinarlas. Sin embargo, hay un aspecto importante a considerar, que es la diferencia en el formato de las etiquetas POS entre pos_tag y el formato que espera el WordNet Lemmatizer.
La función pos_tag de NLTK utiliza el conjunto de etiquetas Penn Treebank, que incluye una amplia variedad de etiquetas para una categorización gramatical detallada. El WordNet Lemmatizer, por otro lado, espera etiquetas POS en una forma simplificada que se alinea con la categorización propia de WordNet. Específicamente, solo diferencia entre sustantivos ('n'), verbos ('v'), adjetivos ('a' o 's' para adjetivos satélite) y adverbios ('r').
El proceso de mapeo implica convertir las etiquetas detalladas de Penn Treebank en categorías más amplias reconocidas por WordNet. Por ejemplo, tanto 'VBD' (verbo en pasado) como 'VBG' (gerundio o participio presente) de Penn Treebank se transforman en 'v' (verbo) cuando se utilizan en el Lemmatizer de WordNet.
Escribamos una función para este propósito:
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
Esta función simplemente verifica la primera letra de la etiqueta Penn Treebank: si es 'J', devuelve la etiqueta de WordNet para adjetivos; si es 'V', para verbos; si es 'R', para adverbios. En todos los demás casos, incluyendo cuando la etiqueta comienza con 'N' o no coincide con ninguna condición especificada, por defecto devuelve la etiqueta de WordNet para sustantivos.
Las constantes ADJ, VERB y otras que aparecen en el código provienen de WordNet. Sus valores son ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.
Con esta función, realicemos la lematización utilizando el etiquetado POS:
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))
Como puedes observar, primero realizamos el etiquetado POS utilizando la función pos_tag(), luego empleamos comprensión de listas para crear una lista de tokens lematizados aplicando el método lemmatize() con el token actual y la etiqueta correctamente formateada (usando nuestra función get_wordnet_pos(tag)) como argumentos. Intencionalmente no eliminamos las palabras vacías para demostrar que el código procesa eficazmente todos los tokens.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Awesome!
Completion rate improved to 3.45
Lematización con Etiquetado POS
Desliza para mostrar el menú
El idioma inglés está lleno de palabras que pueden funcionar como múltiples categorías gramaticales con diferentes significados. Por ejemplo, "running" puede ser un verbo ("He is running.") o un sustantivo ("Running is fun.").
Como ya hemos visto, un lematizador solo puede reducir con precisión una palabra a su forma base si conoce la categoría gramatical de la palabra en el contexto dado. El etiquetado POS proporciona este contexto, haciendo que la lematización sea más precisa.
Lematización con Etiquetado POS en NLTK
Ya que estamos familiarizados con ambas técnicas por separado, es momento de combinarlas. Sin embargo, hay un aspecto importante a considerar, que es la diferencia en el formato de las etiquetas POS entre pos_tag y el formato que espera el WordNet Lemmatizer.
La función pos_tag de NLTK utiliza el conjunto de etiquetas Penn Treebank, que incluye una amplia variedad de etiquetas para una categorización gramatical detallada. El WordNet Lemmatizer, por otro lado, espera etiquetas POS en una forma simplificada que se alinea con la categorización propia de WordNet. Específicamente, solo diferencia entre sustantivos ('n'), verbos ('v'), adjetivos ('a' o 's' para adjetivos satélite) y adverbios ('r').
El proceso de mapeo implica convertir las etiquetas detalladas de Penn Treebank en categorías más amplias reconocidas por WordNet. Por ejemplo, tanto 'VBD' (verbo en pasado) como 'VBG' (gerundio o participio presente) de Penn Treebank se transforman en 'v' (verbo) cuando se utilizan en el Lemmatizer de WordNet.
Escribamos una función para este propósito:
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
Esta función simplemente verifica la primera letra de la etiqueta Penn Treebank: si es 'J', devuelve la etiqueta de WordNet para adjetivos; si es 'V', para verbos; si es 'R', para adverbios. En todos los demás casos, incluyendo cuando la etiqueta comienza con 'N' o no coincide con ninguna condición especificada, por defecto devuelve la etiqueta de WordNet para sustantivos.
Las constantes ADJ, VERB y otras que aparecen en el código provienen de WordNet. Sus valores son ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.
Con esta función, realicemos la lematización utilizando el etiquetado POS:
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))
Como puedes observar, primero realizamos el etiquetado POS utilizando la función pos_tag(), luego empleamos comprensión de listas para crear una lista de tokens lematizados aplicando el método lemmatize() con el token actual y la etiqueta correctamente formateada (usando nuestra función get_wordnet_pos(tag)) como argumentos. Intencionalmente no eliminamos las palabras vacías para demostrar que el código procesa eficazmente todos los tokens.
¡Gracias por tus comentarios!