Lematização com Marcação de POS
A língua inglesa possui muitas 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 corretamente uma palavra à sua forma base 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 etiquetas de classe gramatical entre pos_tag e o formato que o WordNet Lemmatizer espera.
A função pos_tag do NLTK utiliza o conjunto de etiquetas Penn Treebank, que inclui uma ampla variedade de etiquetas para categorização gramatical detalhada. O WordNet Lemmatizer, por outro lado, espera etiquetas de classe gramatical em um formato simplificado que se alinha à 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 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 esta função, realize a lematização com marcação de classe gramatical:
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 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. Intencionalmente, não removemos as stop words para demonstrar que o código processa efetivamente todos os tokens.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 3.45
Lematização com Marcação de POS
Deslize para mostrar o menu
A língua inglesa possui muitas 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 corretamente uma palavra à sua forma base 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 etiquetas de classe gramatical entre pos_tag e o formato que o WordNet Lemmatizer espera.
A função pos_tag do NLTK utiliza o conjunto de etiquetas Penn Treebank, que inclui uma ampla variedade de etiquetas para categorização gramatical detalhada. O WordNet Lemmatizer, por outro lado, espera etiquetas de classe gramatical em um formato simplificado que se alinha à 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 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 esta função, realize a lematização com marcação de classe gramatical:
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 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. Intencionalmente, não removemos as stop words para demonstrar que o código processa efetivamente todos os tokens.
Obrigado pelo seu feedback!