Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Lematização com Marcação de Pos | Stemming e Lematização
Introdução ao PLN

bookLematização com Marcação de Pos

A língua inglesa é repleta de palavras que podem atuar como múltiplas classes gramaticais com significados diferentes. Por exemplo, "running" pode ser um verbo ("He is running.") ou um substantivo ("Running is fun.").

Como já vimos, um lematizador só pode reduzir uma palavra à sua forma base de maneira precisa se souber a classe gramatical da palavra no contexto dado. A marcação de POS fornece esse contexto, tornando a lematização mais precisa.

Lemmatização com POS Tagging no NLTK

Como já estamos familiarizados com ambas as técnicas separadamente, é hora de combiná-las. No entanto, há um aspecto importante a ser considerado, que é a diferença no formato das tags de POS entre pos_tag e o formato que o WordNet Lemmatizer espera.

Note
Estude Mais

A função pos_tag do NLTK utiliza o conjunto de tags Penn Treebank, que inclui uma ampla variedade de tags para categorização gramatical detalhada. O WordNet Lemmatizer, por outro lado, espera tags de POS em um formato simplificado que se alinha com a categorização do próprio WordNet. Especificamente, ele diferencia apenas entre substantivos ('n'), verbos ('v'), adjetivos ('a' ou 's' para adjetivos satélites) e advérbios ('r').

O processo de mapeamento envolve converter as tags detalhadas do Penn Treebank em categorias mais amplas reconhecidas pelo WordNet. Por exemplo, tanto 'VBD' (verbo no passado) quanto 'VBG' (gerúndio ou particípio presente) do Penn Treebank são convertidos para 'v' (verbo) quando utilizados no WordNet Lemmatizer.

Vamos escrever uma função para esse 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 função simplesmente verifica a primeira letra da tag Penn Treebank: se for 'J', retorna a tag do WordNet para adjetivos; se for 'V', para verbos; se for 'R', para advérbios. Para todos os outros casos, incluindo quando a tag começa com 'N' ou não corresponde a nenhuma condição especificada, o padrão é retornar a tag do WordNet para substantivos.

As constantes ADJ, VERB e outras que você vê no código são retiradas do WordNet. Seus valores são ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.

Com essa função, vamos realizar a lematização com POS tagging:

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 pode ser observado, primeiro realizamos a marcação de classes gramaticais (POS tagging) utilizando a função pos_tag(). Em seguida, utilizamos list comprehension para criar uma lista de tokens lematizados aplicando o método lemmatize() com o token atual e a tag corretamente formatada (usando nossa função get_wordnet_pos(tag)) como argumentos. Optamos por não remover as stop words para demonstrar que o código processa efetivamente todos os tokens.

question mark

Por que a função get_wordnet_pos é necessária ao lematizar com o WordNetLemmatizer do NLTK após a marcação de classes gramaticais?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 7

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Suggested prompts:

Can you explain why mapping POS tags is necessary for lemmatization?

What would happen if we didn't provide the correct POS tag to the lemmatizer?

Can you show more examples of lemmatization with different sentences?

Awesome!

Completion rate improved to 3.45

bookLematização com Marcação de Pos

Deslize para mostrar o menu

A língua inglesa é repleta de palavras que podem atuar como múltiplas classes gramaticais com significados diferentes. Por exemplo, "running" pode ser um verbo ("He is running.") ou um substantivo ("Running is fun.").

Como já vimos, um lematizador só pode reduzir uma palavra à sua forma base de maneira precisa se souber a classe gramatical da palavra no contexto dado. A marcação de POS fornece esse contexto, tornando a lematização mais precisa.

Lemmatização com POS Tagging no NLTK

Como já estamos familiarizados com ambas as técnicas separadamente, é hora de combiná-las. No entanto, há um aspecto importante a ser considerado, que é a diferença no formato das tags de POS entre pos_tag e o formato que o WordNet Lemmatizer espera.

Note
Estude Mais

A função pos_tag do NLTK utiliza o conjunto de tags Penn Treebank, que inclui uma ampla variedade de tags para categorização gramatical detalhada. O WordNet Lemmatizer, por outro lado, espera tags de POS em um formato simplificado que se alinha com a categorização do próprio WordNet. Especificamente, ele diferencia apenas entre substantivos ('n'), verbos ('v'), adjetivos ('a' ou 's' para adjetivos satélites) e advérbios ('r').

O processo de mapeamento envolve converter as tags detalhadas do Penn Treebank em categorias mais amplas reconhecidas pelo WordNet. Por exemplo, tanto 'VBD' (verbo no passado) quanto 'VBG' (gerúndio ou particípio presente) do Penn Treebank são convertidos para 'v' (verbo) quando utilizados no WordNet Lemmatizer.

Vamos escrever uma função para esse 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 função simplesmente verifica a primeira letra da tag Penn Treebank: se for 'J', retorna a tag do WordNet para adjetivos; se for 'V', para verbos; se for 'R', para advérbios. Para todos os outros casos, incluindo quando a tag começa com 'N' ou não corresponde a nenhuma condição especificada, o padrão é retornar a tag do WordNet para substantivos.

As constantes ADJ, VERB e outras que você vê no código são retiradas do WordNet. Seus valores são ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.

Com essa função, vamos realizar a lematização com POS tagging:

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 pode ser observado, primeiro realizamos a marcação de classes gramaticais (POS tagging) utilizando a função pos_tag(). Em seguida, utilizamos list comprehension para criar uma lista de tokens lematizados aplicando o método lemmatize() com o token atual e a tag corretamente formatada (usando nossa função get_wordnet_pos(tag)) como argumentos. Optamos por não remover as stop words para demonstrar que o código processa efetivamente todos os tokens.

question mark

Por que a função get_wordnet_pos é necessária ao lematizar com o WordNetLemmatizer do NLTK após a marcação de classes gramaticais?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 7
some-alt