Lematizaçã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.
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:
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. Optamos por não remover 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
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
Lematizaçã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.
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:
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. Optamos por não remover as stop words para demonstrar que o código processa efetivamente todos os tokens.
Obrigado pelo seu feedback!