Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Lematización con Etiquetado POS | Stemming y Lematización
Introducción al PLN

bookLematizació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.

Note
Estudiar más

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:

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

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.

question mark

¿Por qué es necesaria la función get_wordnet_pos al lematizar con WordNetLemmatizer de NLTK después del etiquetado POS?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 7

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Awesome!

Completion rate improved to 3.45

bookLematizació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.

Note
Estudiar más

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:

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

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.

question mark

¿Por qué es necesaria la función get_wordnet_pos al lematizar con WordNetLemmatizer de NLTK después del etiquetado POS?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 7
some-alt