Pular para o conteúdo principal

Stemming e lematização em Python

Este tutorial aborda o stemming e a lematização de um ponto de vista prático usando o pacote Python Natural Language ToolKit (NLTK).
24 de abr. de 2024  · 12 min de leitura

O idioma inglês moderno é considerado um idioma fracamente flexionado. Isso significa que há muitas palavras em inglês derivadas de outra palavra; por exemplo, a palavra flexionada "normality" (normalidade) é derivada da palavra "norm" (norma), que é a forma raiz. Todos os idiomas flexionados consistem em palavras com formas de raiz comuns, mas o grau de flexão varia de acordo com o idioma. 

"Na morfologia linguística, a inflexão é um processo de formação de palavras, no qual uma palavra é modificada para expressar diferentes categorias gramaticais, como tempo verbal, caso, voz, aspecto, pessoa, número, gênero, humor, animacidade e definição."
-(Fonte: Wikipedia)

Ao trabalhar com texto, às vezes é necessário aplicar técnicas de normalização para que as palavras cheguem à sua forma original a partir de suas versões derivadas. Isso ajuda a reduzir a aleatoriedade e a aproximar as palavras do corpus do padrão predefinido, melhorando a eficiência do processamento, pois o computador tem menos recursos para lidar. 

Duas técnicas populares de normalização de texto no campo do Processamento de Linguagem Natural (PLN), a aplicação de técnicas computacionais para analisar e sintetizar a linguagem natural e a fala, são a stemização e a lematização. Os pesquisadores estudam essas técnicas há anos; os profissionais de PNL geralmente as utilizam para preparar palavras, textos e documentos para processamento posterior em várias tarefas. 

Este tutorial abordará o stemming e a lematização de um ponto de vista prático usando o pacote Python Natural Language ToolKit (NLTK).

Confira este DataCamp Workspace para acompanhar o código. 

Derivação 

Stemming é uma técnica usada para reduzir uma palavra flexionada ao seu radical. Por exemplo, as palavras "programação", "programador" e "programas" podem ser reduzidas ao radical comum da palavra "programa". Em outras palavras, "program" pode ser usado como sinônimo para as três palavras de inflexão anteriores. 

A execução dessa técnica de processamento de texto geralmente é útil para lidar com a escassez e/ou padronizar o vocabulário. Isso não só ajuda a reduzir a redundância, já que na maioria das vezes o radical da palavra e suas palavras flexionadas têm o mesmo significado, mas também permite que os modelos de PNL aprendam links entre palavras flexionadas e seu radical, o que ajuda o modelo a entender seu uso em contextos semelhantes. 

Os algoritmos de stemização funcionam pegando uma lista de prefixos e sufixos frequentes encontrados em palavras flexionadas e cortando o final ou o início da palavra. Isso pode, ocasionalmente, resultar em hastes de palavras que não são palavras reais; portanto, podemos afirmar que essa abordagem certamente tem seus prós, mas não deixa de ter suas limitações. 

Vantagens do Stemming

  • Desempenho aprimorado do modelo: O stemming reduz o número de palavras únicas que precisam ser processadas por um algoritmo, o que pode melhorar seu desempenho. Além disso, ele também pode fazer com que o algoritmo seja executado com mais rapidez e eficiência.
  • Agrupamento de palavras semelhantes: Palavras com significado semelhante podem ser agrupadas, mesmo que tenham formas distintas. Essa pode ser uma técnica útil em tarefas como a classificação de documentos, em que é importante identificar os principais tópicos ou temas em um documento. 
  • Mais fácil de analisar e entender: Como o stemming normalmente reduz o tamanho do vocabulário, é muito mais fácil analisar, comparar e entender os textos. Isso é útil em tarefas como a análise de sentimentos, em que o objetivo é determinar o sentimento de um documento. 

Desvantagens do Stemming

  • Excesso de hasteamento / Falsos positivos: Isso ocorre quando um algoritmo de stemização reduz palavras flexionadas separadas para o mesmo radical de palavra, mesmo que não estejam relacionadas; por exemplo, o algoritmo Porter Stemmer faz a stemização de "universal", "university" e "universe" para o mesmo radical de palavra. Embora sejam etimologicamente relacionados, seus significados nos dias de hoje são de domínios muito diferentes. Tratá-los como sinônimos reduzirá a relevância nos resultados de pesquisa. 
  • Substrato / Falsos negativos: Isso ocorre quando um algoritmo de stemização reduz as palavras flexionadas a diferentes tipos de palavras, mas elas deveriam ser as mesmas. Por exemplo, o algoritmo Porter Stemmer não reduz as palavras "alumnus", "alumnae" e "alumni" ao mesmo radical de palavra, embora elas devam ser tratadas como sinônimos. 
  • Desafios linguísticos: À medida que a morfologia, a ortografia e a codificação de caracteres do idioma de destino se tornam mais complicadas, fica mais difícil projetar stemmers; por exemplo, um stemmer italiano é mais complicado do que um stemmer inglês porque há um número maior de inflexões verbais. Um stemmer russo é ainda mais complexo devido ao maior número de declinações de substantivos.

Lemmatização

A lematização é outra técnica usada para reduzir as palavras flexionadas à sua palavra raiz. Ele descreve o processo algorítmico de identificação do "lema" (forma do dicionário) de uma palavra flexionada com base em seu significado pretendido. 

Ao contrário da stemização, a lematização se baseia na determinação precisa da parte da fala pretendida e do significado de uma palavra com base em seu contexto. Isso significa que ele leva em consideração onde a palavra flexionada se enquadra em uma frase, bem como no contexto mais amplo em torno dessa frase, como frases vizinhas ou até mesmo um documento inteiro.

"A lematização geralmente se refere a fazer as coisas corretamente com o uso de um vocabulário e a análise morfológica das palavras, normalmente com o objetivo de remover apenas as terminações flexionais e retornar a forma básica ou de dicionário de uma palavra, que é conhecida como lema"

- (Fonte: Grupo de PNL de Standford)

Em outras palavras, lematizar um documento normalmente significa "fazer as coisas corretamente", pois envolve o uso de um vocabulário e a realização de uma análise morfológica das palavras para remover apenas as terminações flexionais e retornar a forma básica ou de dicionário de uma palavra, que é conhecida como "lema". Por exemplo, você pode esperar que um algoritmo de lematização mapeie "runs", "running" e "ran" para o lema "run".  

Vantagens da lematização

  • Precisão: A lematização não se limita a cortar palavras, como ocorre nos algoritmos de stemização. A análise das palavras é realizada com base no POS da palavra para levar o contexto em consideração ao produzir lemas. Além disso, a lematização faz com que palavras reais do dicionário sejam produzidas.

Desvantagens da lematização 

  • Consome muito tempo: Em comparação com o stemming, a lematização é um processo lento e demorado. Isso ocorre porque a lematização envolve a realização de análise morfológica e a derivação do significado das palavras de um dicionário. 

Comece a aprender Python de graça

Introduction to Natural Language Processing in Python

BeginnerSkill Level
4 hr
124.3K learners
Learn fundamental natural language processing techniques using Python and how to apply them to extract insights from real-world text data.
See DetailsRight Arrow

Exemplos práticos de stemização e lematização em Python com NLTK

Agora você tem uma visão geral da lematização e da formação de tronco. Nesta seção, vamos colocar a mão na massa e demonstrar exemplos de ambas as técnicas usando Python e uma biblioteca chamada NLTK. 

Uma breve introdução ao pacote Python NLTK

O Natural Language Tool Kit (NLTK) é uma biblioteca Python usada para criar programas capazes de processar linguagem natural. A biblioteca pode executar diferentes operações, como tokenização, stemização, classificação, análise, marcação, raciocínio semântico, análise de sentimentos e muito mais.

A versão mais recente é o NLTK 3.8.1 e requer as versões 3.7, 3.8, 3.9, 3.10 ou 3.11 do Python, mas você não precisa se preocupar com isso, pois ele vem pré-instalado no DataCamp Workspace - basta importar o nltk e pronto. 

Exemplo de Stemming em Python

Um dos algoritmos de stemização mais populares é chamado de "stemizador Porter". O stemmer de Porter foi proposto pela primeira vez por Martin Porter em um artigo de 1980 intitulado "An algorithm for suffix stripping" (Um algoritmo para remoção de sufixos). O artigo se tornou um dos algoritmos mais comuns para stemização em inglês.

Vamos ver como isso funciona:

import nltk
from nltk.stem import PorterStemmer
nltk.download("punkt")
​
# Initialize Python porter stemmer
ps = PorterStemmer()
​
# Example inflections to reduce
example_words = ["program","programming","programer","programs","programmed"]
​
# Perform stemming
print("{0:20}{1:20}".format("--Word--","--Stem--"))
for word in example_words:
   print ("{0:20}{1:20}".format(word, ps.stem(word)))

"""
--Word--            --Stem--            
program             program             
programming         program             
programer           program             
programs            program             
programmed          program

"""

Este é um exemplo bastante simples; esperávamos esses resultados do nosso stemmer porter, conforme mencionado na seção "Stemming" acima. 

Vamos tentar um exemplo mais complicado:

import string
from nltk.tokenize import word_tokenize

example_sentence = "Python programmers often tend like programming in python because it's like english. We call people who program in python pythonistas."

# Remove punctuation
example_sentence_no_punct = example_sentence.translate(str.maketrans("", "", string.punctuation))

# Create tokens
word_tokens = word_tokenize(example_sentence_no_punct)

# Perform stemming
print("{0:20}{1:20}".format("--Word--","--Stem--"))
for word in word_tokens:
    print ("{0:20}{1:20}".format(word, ps.stem(word)))

"""
--Word--            --Stem--            
Python              python              
programmers         programm            
often               often               
tend                tend                
like                like                
programming         program             
in                  in                  
python              python              
because             becaus              
its                 it                  
like                like                
english             english             
We                  we                  
call                call                
people              peopl               
who                 who                 
program             program             
in                  in                  
python              python              
pythonistas         pythonista
"""

Aqui você pode ver que algumas das palavras de saída não fazem parte do dicionário de inglês (por exemplo, "becaus", "people" e "programm"). Outro aspecto a ser observado é que o contexto não é levado em consideração. Por exemplo, "programadores" é um substantivo no plural, mas foi reduzido a "programa", que pode ser um substantivo ou um verbo - em outras palavras, as palavras-raiz são ambíguas. 

Exemplo de lematização em Python

A motivação por trás dos lematizadores sensíveis ao contexto foi melhorar o desempenho em palavras não vistas e ambíguas. Em nosso exemplo de lematização, usaremos um lematizador popular chamado WordNet lemmatizer. 

O Wordnet é um banco de dados lexical grande, gratuito e disponível publicamente para o idioma inglês, com o objetivo de estabelecer relações semânticas estruturadas entre as palavras.

Vamos ver em ação:

from nltk.stem import WordNetLemmatizer
nltk.download("wordnet")
nltk.download("omw-1.4")
​
# Initialize wordnet lemmatizer
wnl = WordNetLemmatizer()
​
# Example inflections to reduce
example_words = ["program","programming","programer","programs","programmed"]
​
# Perform lemmatization
print("{0:20}{1:20}".format("--Word--","--Lemma--"))
for word in example_words:
   print ("{0:20}{1:20}".format(word, wnl.lemmatize(word, pos="v")))

"""
--Word--            --Lemma--           
program             program             
programming         program             
programer           programer           
programs            program             
programmed          program
"""   

As palavras de entrada passadas ao nosso lematizador permanecerão inalteradas se não puderem ser encontradas no WordNet. Isso significa que o contexto deve ser fornecido, o que é feito fornecendo o valor do parâmetro de parte da fala, pos, em wordnet_lemmatizer.lemmatize.

Observe que a palavra "programmer" (programador) não foi reduzida para "program" (programa) pelo nosso lematizador: isso se deve ao fato de termos dito ao nosso lematizador para usar apenas verbos com haste. 

Vamos passar nosso lematizador por algo mais complicado para ver como ele se sai...

example_sentence = "Python programmers often tend like programming in python because it's like english. We call people who program in python pythonistas."
​
# Remove punctuation
example_sentence_no_punct = example_sentence.translate(str.maketrans("", "", string.punctuation))
​
word_tokens = word_tokenize(example_sentence_no_punct)
​
# Perform lemmatization
print("{0:20}{1:20}".format("--Word--","--Lemma--"))
for word in word_tokens:
   print ("{0:20}{1:20}".format(word, wnl.lemmatize(word, pos="v")))
"""
--Word--            --Lemma--           
Python              Python              
programmers         programmers         
often               often               
tend                tend                
like                like                
programming         program             
in                  in                  
python              python              
because             because             
its                 its                 
like                like                
english             english             
We                  We                  
call                call                
people              people              
who                 who                 
program             program             
in                  in                  
python              python              
pythonistas         pythonistas 
"""

Todas as palavras retornadas pelo algoritmo de lematização estão no dicionário de inglês - menos "pythonistas", que é mais um termo informal usado para se referir a programadores de python. 

Stemming vs Lemmatization

Você já viu como implementar as duas técnicas, mas como elas se comparam? 

Stemming e lematização são técnicas de processamento de texto que visam reduzir palavras flexionadas a uma raiz básica comum. Apesar da correlação no objetivo geral, as duas técnicas não são as mesmas. 

As principais diferenças entre stemização e lematização estão na forma como cada técnica chega ao objetivo de reduzir as palavras flexionadas a uma raiz básica comum. 

Os algoritmos de stemização tentam encontrar as raízes da base comum de várias flexões cortando as terminações ou inícios da palavra. O chop se baseia em uma lista de prefixos e sufixos comuns que normalmente podem ser encontrados em palavras flexionadas. Esse ato de natureza não discriminatória de cortar palavras pode ocasionalmente levar à descoberta de hastes de palavras significativas, mas outras vezes não. 

Por outro lado, os algoritmos de lematização tentam encontrar raízes de base comuns em palavras flexionadas por meio de uma análise morfológica. Para reduzir as flexões com precisão, é necessário manter um dicionário detalhado para que o algoritmo possa pesquisar e vincular uma palavra flexionada ao seu lema.

"Os dois também podem diferir no fato de que a stemização comumente colapsa palavras derivadas relacionadas, enquanto a lematização comumente colapsa apenas as diferentes formas flexionais de um lema."

- Fonte: PNL de Stanford, livro de RI.

A abordagem heurística bruta adotada pelos algoritmos de stemização geralmente significa que eles são rápidos e eficientes, mas nem sempre precisos. Por outro lado, os algoritmos de lematização sacrificam a velocidade e a eficiência em prol da precisão, resultando, assim, em raízes de base significativas. 

Por exemplo, um algoritmo de stemming pode reduzir "saw" para "s". Um algoritmo de lematização considerará se "saw" é um substantivo (a ferramenta manual para cortar) ou um verbo (ver) com base no contexto em que é usado antes de decidir retornar um lema - se for um substantivo, ele retornará "saw" e, se for um verbo, retornará "see".

Esses pontos já devem estar bem claros para você, então aqui vai a pergunta de um milhão de dólares: "Devo usar stemming ou lematização para o pré-processamento de texto?" 

Como a maioria das coisas relacionadas a software, isso depende. 

Você se preocupa com velocidade e eficiência? Se for o caso, escolha stemming. 

O contexto é importante para seu aplicativo? Se você respondeu "sim", use a lematização. 

A técnica a ser usada depende totalmente do aplicativo em que você está trabalhando e dos seus objetivos para o projeto. Talvez você queira fazer experimentos com as duas técnicas e comparar os resultados para ver qual abordagem produziu os resultados mais alinhados com as metas do seu projeto. 

Algo que não abordamos muito neste tutorial é como os algoritmos de lematização são criados; isso ocorre porque há várias bibliotecas (como SpaCy, NLTK etc.) compatíveis com diferentes idiomas. No entanto, se você tivesse que criar seu próprio lematizador para um idioma não disponível (ou seja, Akan), precisaria de um bom conhecimento e compreensão do idioma de destino para criar um lematizador. Os algoritmos de stemização são muito mais fáceis de criar para esses cenários.

Encerramento

Em resumo, stemming e lematização são técnicas usadas para processamento de texto em NLP. Ambos têm o objetivo de reduzir as flexões a palavras-raiz de base comum, mas cada um adota uma abordagem diferente ao fazer isso. A abordagem de stemming é muito mais rápida do que a lematização, mas é mais rudimentar e, ocasionalmente, pode levar a raízes de base comum sem significado. Como alternativa, a lematização é muito mais precisa do que a stemização em termos de encontrar palavras significativas no dicionário e leva em consideração o contexto. 

Temas

Saiba mais sobre Python e Processamento de Linguagem Natural

curso

Introduction to Natural Language Processing in Python

4 hr
126.7K
Learn fundamental natural language processing techniques using Python and how to apply them to extract insights from real-world text data.
Ver DetalhesRight Arrow
Iniciar curso
Ver maisRight Arrow
Relacionado

blog

O que é processamento de linguagem natural (NLP)? Um guia abrangente para iniciantes

Explore o mundo transformador do Processamento de Linguagem Natural (PLN) com o guia abrangente do DataCamp para iniciantes. Mergulhe nos principais componentes, técnicas, aplicativos e desafios da PNL.
Matt Crabtree's photo

Matt Crabtree

11 min

tutorial

Tutorial de análise de sentimentos com NLTK para iniciantes

Tutorial de análise de sentimentos com NLTK (Natural Language Toolkit) em Python. Aprenda a criar e desenvolver análises de sentimentos usando Python. Siga etapas específicas para realizar a mineração e análise de textos e fazer o processamento de linguagem natural.
Moez Ali's photo

Moez Ali

13 min

tutorial

Entendendo a classificação de textos em Python

Descubra o que é a classificação de texto, como ela funciona e os casos de uso bem-sucedidos. Explore exemplos de ponta a ponta de como criar um pipeline de pré-processamento de texto seguido de um modelo de classificação de texto em Python.
Moez Ali's photo

Moez Ali

12 min

tutorial

Otimização em Python: Técnicas, pacotes e práticas recomendadas

Este artigo ensina a você sobre otimização numérica, destacando diferentes técnicas. Ele discute os pacotes Python, como SciPy, CVXPY e Pyomo, e fornece um notebook DataLab prático para você executar exemplos de código.
Kurtis Pykes 's photo

Kurtis Pykes

19 min

tutorial

Tutorial de manipulação de dados categóricos de aprendizado de máquina com Python

Aprenda os truques comuns para lidar com dados categóricos e pré-processá-los para criar modelos de aprendizado de máquina!
Moez Ali's photo

Moez Ali

28 min

tutorial

Introdução ao k-Means Clustering com o scikit-learn em Python

Neste tutorial, saiba como aplicar o k-Means Clustering com o scikit-learn em Python

Kevin Babitz

21 min

See MoreSee More