Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Lematização com Rotulagem POS | Seção
/
Processamento de Linguagem Natural

bookLematização com Rotulagem 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 classe gramatical (POS tagging) 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: a diferença no formato das tags de classe gramatical 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 classe gramatical 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 etiquetas 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 Lemmatizer do WordNet.

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

As constantes ADJ, VERB e outras vistas no código são provenientes 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 1. Capítulo 16

Pergunte à IA

expand

Pergunte à IA

ChatGPT

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

Seção 1. Capítulo 16
some-alt