Stemming (ou estemização) é uma das várias técnicas de normalização de texto que convertem dados de texto brutos em um formato legível para tarefas de processamento de linguagem natural.
Stemming é uma técnica de pré-processamento de texto em processamento de linguagem natural (PLN). Especificamente, trata-se do processo de reduzir a forma flexionada de uma palavra ao “radical” ou forma raiz, também conhecido como “lema” em linguística.1 É um dos dois métodos principais (o outro é a lematização) que reduz as variantes flexionais dentro de um conjunto de dados de texto para um lexema morfológico. Ao fazer isso, o stemming visa melhorar o processamento de texto em aprendizado de máquina e sistemas de recuperação de informações.
As máquinas processam a linguagem principalmente com base na forma. Isso se aplica desde funções de pesquisa e localização até modelos deep learning. Muitos pesquisadores argumentam que os computadores não conseguem entender o significado da linguagem, embora essa questão ainda seja fonte de debate2. De todo modo, é verdade que os modelos de aprendizado de máquina precisam ser treinados para reconhecer palavras diferentes como variantes morfológicas de uma palavra base. Por exemplo, em mecanismos de pesquisa ou catálogos de bibliotecas, os usuários podem enviar uma consulta com uma palavra (por exemplo, investir), mas esperam resultados que usem qualquer forma flexionada da palavra (por exemplo, invista, investimento, investimentos etc.). Ao reduzir as formas derivacionais das palavras a uma palavra-raiz, o stemming ajuda os sistemas de recuperação de informações a equiparar palavras morfologicamente relacionadas.3
Em muitas tarefas de mineração de texto, inclusive classificação de texto, agrupamento, indexação e outras, o stemming melhora a precisão ao reduzir a dimensionalidade dos algoritmos de aprendizado de máquina e agrupar palavras de acordo com o conceito. A redução da dimensionalidade dos algoritmos pode melhorar a precisão e exatidão dos modelos estatísticos de PLN, como modelos de tópicos e incorporação de palavras.4 Dessa forma, o stemming melhora a precisão na execução de várias tarefas de PLN, como a análise de sentimentos ou rotulação de classes gramaticais, atuando como uma etapa importante no desenvolvimento de grandes modelos de linguagem.
O stemming é um estágio do pipeline de mineração de texto que converte dados de texto bruto em um formato estruturado para processamento por máquina. Essencialmente, ele remove afixos das palavras, deixando apenas a forma base.5 Isso equivale a remover caracteres do final dos tokens de palavras. No entanto, além dessa semelhança básica, os algoritmos de stemming variam muito.
Para explorar as diferenças entre as operações dos algoritmos de stemming, podemos processar esta fala de Sonho de uma Noite de Verão de Shakespeare: “Love looks not with the eyes but with the mind, and therefore is winged Cupid painted blind.” Antes do stemming, os usuários devem tokenizar os dados de texto bruto. O tokenizador integrado do toolkit de linguagem natural Python (NLTK) produz o texto citado como:
Tokenizado: ['Love', 'looks', 'not', 'with', 'the', 'eyes', 'but', 'with', 'the', 'mind', ',', 'and', 'therefore', 'is', 'winged', 'Cupid', 'painted', 'blind', '.']
Ao executar a saída tokenizada por meio de vários stemmers, podemos observar como os algoritmos de stemming diferem.
O stemmer de Lovins é o primeiro algoritmo de stemming publicado. Essencialmente, atua como uma função de localização e substituição altamente parametrizada. Ele compara cada token de input com uma lista de sufixos comuns, com cada sufixo condicionado por uma das 29 regras. Se um dos sufixos da lista for encontrado em um token e a remoção do sufixo não violar nenhuma das condições do sufixo associado, o algoritmo remove esse sufixo do token. Então, o token com stemming é executado por meio de outro conjunto de regras, corrigindo malformações comuns em raízes com stemming, como letras duplas (por exemplo, hopping torna-se hopp e depois hop).6
Esse código usa a biblioteca de stemming do Python7 para aplicar stemming à citação de Shakespeare tokenizada:
from stemming.lovins import stem from nltk.tokenize import word_tokenize text = "Love looks not with the eyes but with the mind, and therefore is winged Cupid painted blind." words = word_tokenize(text) stemmed_words = [stem(word) for word in words]
O código produz:
Stemmed: ['Lov', 'look', 'not', 'with', 'th', 'ey', 'but', 'with', 'th', 'mind', ',', 'and', 'therefor', 'is', 'wing', 'Cupid', 'paint', 'blind', '.']
A produção mostra como o stemmer de Lovins transforma corretamente as conjugações e tempos em formas básicas (por exemplo, painted se torna paint), ao mesmo tempo que elimina a pluralização (por exemplo, eyes se torna eye). Contudo, o algoritmo de stemming de Lovins também retorna várias raízes malformadas, como lov, th e ey. Essas palavras-raiz malformadas resultam da remoção de muitos caracteres. Como costuma acontecer no aprendizado de máquina, esses erros ajudam a revelar processos subjacentes.
Quando comparado com a lista de sufixos do stemmer de Lovins, o sufixo mais longo que se encaixa tanto em love quanto em the é o caractere único -e. A única condição associada a esse sufixo é “sem restrições no radical”, o que significa que o stemmer pode remover o -e independentemente do comprimento do radical restante. Infelizmente, nenhuma das raízes love ou th contém as características que o algoritmo de Lovins utiliza para identificar palavras malformadas, como letras duplas ou plurais irregulares.8
Quando tais radicais malformados escapam do algoritmo, o stemmer de Lovins pode reduzir palavras semanticamente não relacionadas ao mesmo radical (por exemplo, the, these e this todos se reduzem a th. Claro, essas três palavras são todas demonstrativos e, portanto, compartilham uma função gramatical. Mas outros demonstrativos, como that e those, não se reduzem a th. Isso significa que os radicais gerados por Lovins não representam grupos de palavras da maneira adequada.
Comparado ao stemmer de Lovins, o algoritmo de stemming de Porter é mais matemático. Essencialmente, esse stemmer classifica cada caractere em um determinado token como consoante (c) ou vogal (v), agrupando consoantes subsequentes como C e vogais subsequentes como V. O stemmer, portanto, representa cada token de palavra como uma combinação de grupos de consoantes e vogais. Uma vez enumerado dessa forma, o stemmer executa cada token de palavra por meio de uma lista de regras que especificam os caracteres finais a serem removidos de acordo com o número de grupos de vogais e consoantes em um token.9 Como o próprio inglês segue regras léxicas gerais, mas não absolutas, o critério sistemático do algoritmo de stemming de Porter para determinar a remoção de sufixos pode retornar erros.
O Python NLTK contém uma função de stemming de Porter integrada. Este código implementa o algoritmo de stemming de Porter na citação de Shakespeare tokenizada:
from nltk.stem import PorterStemmer from nltk.tokenize import word_tokenize porter_stemmer = PorterStemmer() text = "Love looks not with the eyes but with the mind, and therefore is winged Cupid painted blind." words = word_tokenize(text) stemmed_words = [porter_stemmer.stem(word) for word in words]
Esse código retorna:
Stemmed: ['love', 'look', 'not', 'with', 'the', 'eye', 'but', 'with', 'the', 'mind', ',', 'and', 'therefor', 'is', 'wing', 'cupid', 'paint', 'blind', '.']
Assim como Lovins, Porter altera corretamente as conjugações de verbos e pluralizações de substantivos. Embora não tenha outros radicais malformados de Lovins (por exemplo, love para lov), o algoritmo de stemming de Porter remove erroneamente -e do final de therefore.
De acordo com o método de agrupamento de consoantes e vogais do stemmer de Porter, therefore, é representado como CVCVCVCV, ou C(VC)3V, com o expoente significando repetições de grupos de consoantes e vogais.
Uma das etapas finais do algoritmo afirma que, se uma palavra não passou por nenhum stemming e tem um valor de expoente maior que 1, -e é removido do final da palavra (se estiver presente). O valor do expoente de é igual a 3 e não contém nenhum dos sufixos listados nas outras condições do algoritmo.10 Assim, therefore se torna therefor
.É certo que este é o único erro do stemmer de Porter, talvez atestando por que ele é o algoritmo de stemming mais adotado. De fato, o stemmer de Porter serviu como base para algoritmos de stemming subsequentes.
O stemmer Snowball é uma versão atualizada do stemmer de Porter. Embora vise aplicar um conjunto mais robusto de regras para determinar a remoção de sufixos, ele ainda permanece propenso a muitos dos mesmos erros. Assim como o stemmer de Porter, o Python NLTK contém uma função de stemmer Snowball integrada:
from nltk.stem.snowball import SnowballStemmer from nltk.tokenize import word_tokenize stemmer = SnowballStemmer("english", True) text = "There is nothing either good or bad but thinking makes it so." words = word_tokenize(text) stemmed_words = [stemmer.stem(word) for word in words]
Ele produz a mesma saída do texto de Shakespeare que o stemmer de Porter, reduzindo incorretamente therefore para therefor:
Stemmed: ['love', 'look', 'not', 'with', 'the', 'eye', 'but', 'with', 'the', 'mind', ',', 'and', 'therefor', 'is', 'wing', 'cupid', 'paint', 'blind', '.']
O stemmer de Snowball difere do de Porter em dois aspectos principais. Primeiro, enquanto os stemmers de Lovins e Porter apenas aplicam o stemming a palavras em inglês, o stemmer de Snowball pode aplicar o stemming a textos em vários outros idiomas com alfabeto latino, como holandês, alemão, francês e, até, russo. Segundo, o stemmer de Snowball, quando implementado por meio da biblioteca Python NLTK, pode ignorar stopwords. Stopwords são uma coleção não universal de palavras que são removidas de um conjunto de dados durante o pré-processamento. A lista de stopwords predefinida do stemmer de Snowball contém palavras sem uma definição conceitual direta e que servem mais a uma função gramatical do que semântica. As palavras irrelevantes incluídas na lista de palavras irrelevantes em inglês do stemmer de Snowball incluem the, a, being e similares.11
Muitas fontes descrevem o stemmer de Lancaster (também conhecido como stemmer de Paice) como o mais agressivo dos stemmers da língua inglesa. O stemmer de Lancaster contém uma lista de mais de 100 regras que ditam quais cadeias de caracteres finais, se presentes, devem ser substituídas por outras cadeias, se houver. O stemmer itera por cada token de palavra, verificando-o em relação a todas as regras. Se a cadeia final do token corresponder à de uma regra, o algoritmo executa a operação descrita pela regra e, em seguida, executa a nova palavra transformada por todas as regras novamente. O stemmer itera por todas as regras até que um determinado token passe todas elas sem ser transformado.12
Embora não esteja disponível no Python NLTK, o stemmer de Lancaster está disponível na biblioteca de stemmings:13
from stemming.paicehusk import stem from nltk.tokenize import word_tokenize text = "Love looks not with the eyes but with the mind, and therefore is winged Cupid painted blind." words = word_tokenize(text) stemmed_words = [stem(word) for word in words]
O código aplica o stemming à passagem de Shakespeare tokenizada como:
Stemmed: ['Lov', 'look', 'not', 'with', 'the', 'ey', 'but', 'with', 'the', 'mind', ',', 'and', 'theref', '', 'wing', 'Cupid', 'paint', 'blind', '.']
Claramente, a abordagem iterativa do stemmer de Lancaster é a mais agressiva dos stemmers, como mostrado com theref. Primeiro, o stemmer de Lancaster tem a regra “e1>”. Essa regra remove o caractere único -e sem substituição. Depois que o algoritmo remove -e de therefore, ele executa o novo therefor em cada regra. A palavra recém-transformada se encaixa na regra “ro2>”. Essa regra remove o sufixo de dois caracteres -or sem substituição. O radical resultante theref não se encaixa em nenhuma das outras regras do algoritmo e, portanto, é retornado como a base do stemming. Ao contrário de Lovins, o algoritmo de Lancaster não tem meios de lidar com palavras malformadas.
Existem muitos stemmers para o inglês, assim como para outros idiomas com alfabeto latino. Mais recentemente, a pesquisa tem se voltado para o desenvolvimento e avaliação de algoritmos de stemming para idiomas com alfabeto não latino. O árabe, em particular, pode apresentar dificuldades devido à sua morfologia complexa e variações ortográficas. Alguns estudos comparam a eficácia de diferentes stemmers árabes em relação a tarefas como a classificação.14 Além disso, os pesquisadores investigam a precisão do stemming para melhorar as tarefas de recuperação de informações em tâmil15 e sânscrito.16
Embora pesquisas evidenciem o papel do stemming na melhoria da precisão de tarefas do PLN, o stemming apresenta dois problemas principais que os usuários precisam observar. Overstemming ocorre quando duas palavras semanticamente distintas são reduzidas à mesma raiz, sendo, assim, confundidas. Understemming ocorre quando duas palavras semanticamente relacionadas não são reduzidas à mesma raiz.17 Um exemplo de overstemming é a redução da palavra wander para wand pelo stemming de Lancaster, dois termos semanticamente distintos em inglês. Tanto o stemming de Porter quanto o de Lovins não alteram wander. Um exemplo de understemming é a não redução de knavish para knavish e knave para knave pelo stemming de Porter, que compartilham a mesma raiz semântica. Em comparação, o stemming de Lovins reduz ambas as palavras para knav.
Embora tenham usos e objetivos semelhantes, o stemming e a lematização diferem em aspectos pequenos, porém importantes. A literatura costuma descrever o stemming como mais heurístico, essencialmente removendo sufixos comuns das palavras para produzir uma raiz. A lematização, por outro lado, realiza uma análise morfológica mais detalhada de diferentes palavras para determinar uma forma base de dicionário, removendo não apenas sufixos, mas também prefixos. Embora o stemming seja implementado de forma mais rápida e fácil, muitos desenvolvedores de ferramentas de deep learning preferem a lematização devido ao seu processo de remoção mais sutil.
Projete assistentes e agentes de IA escaláveis com facilidade, automatize tarefas repetitivas e simplifique processos complexos com o IBM® watsonx Orchestrate.
Acelere o valor comercial da inteligência artificial com um portfólio poderoso e flexível de bibliotecas, serviços e aplicativos.
Reinvente os fluxos de trabalho e operações críticos adicionando IA para maximizar experiências, tomadas de decisão em tempo real e valor de negócios.
O IBM Granite é nossa família de modelos de IA abertos, de alto desempenho e confiáveis, personalizados para a empresa e otimizados para escalar suas aplicações de IA. Explore as opções de linguagens, código, séries temporais e proteções.
Descubra como o processamento de linguagem natural pode ajudar você a conversar de forma mais natural com computadores.
Entrevistamos duas mil organizações a respeito de suas iniciativas de IA para descobrir o que está funcionando, o que não está e como se preparar.
Explore o site do desenvolvedor da IBM para acessar blogs, artigos, boletins informativos e saber mais sobre a IA incorporável da IBM.
Aprenda conceitos fundamentais e desenvolva suas habilidades com laboratórios práticos, cursos, projetos guiados, avaliações e muito mais.
1 Ruslan Mitkov, Oxford Handbook of Computational Linguistics, 2nd edition, Oxford University Press, 2014.
2 Emily Bender e Alexander Koller, “Climbing towards NLU: On Meaning, Form, and Understanding in the Age of Data”, Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics, 2020 , pp. 5185-5198 , https://aclanthology.org/2020.acl-main.463
3 Steven Bird, Ewan Klein, and Edward Loper, Natural Language Processing with Python, O’Reilley, 2009.
4 Gary Miner, Dursun Delen, John Elder, Andrew Fast, Thomas Hill, and Robert A. Nisbet, Practical Text Mining and Statistical Analysis for Non-Structured Text Data Applications, Academic Press, 2012.
5 Christopher Manning and Hinrich Schütze, Foundations of Statistical Natural Language Processing, MIT Press, 1999.
6 Julie Beth Lovins, “Development of a stemming algorithm”, Mechanical Translation and Computational Linguistics, Vol. 11, Nos. 1 e 2, 1968, pp. 22-31, https://aclanthology.org/www.mt-archive.info/MT-1968-Lovins.pdf
7, 13 https://pypi.org/project/stemming/1.0
8 Julie Beth Lovins, “Development of a stemming algorithm”, Mechanical Translation and Computational Linguistics, Vol. 11, Nos. 1 e 2, 1968, pp. 22-31, https://aclanthology.org/www.mt-archive.info/MT-1968-Lovins.pdf
9 Martin Porter, “An algorithm for suffix stripping”, Program: electronic library and information systems, Vol. 14, No. 3, 1980, pp. 130-137, https://www.emerald.com/insight/content/doi/10.1108/eb046814/full/html
10 Martin Porter, “An algorithm for suffix stripping”, Program: electronic library and information systems, Vol. 14, No. 3, 1980, pp. 130-137, https://www.emerald.com/insight/content/doi/10.1108/eb046814/full/html
11 Martin Porter, “Snowball: A language for stemming algorithms”, 2001, https://snowballstem.org/texts/introduction.html
12 Chris Paice, “Another stemmer”, ACM SIGIR Forum, Vol. 24, No. 3, 1990, pp. 56-61, https://dl.acm.org/doi/10.1145/101306.101310
14 Y. A. Alhaj, J. Xiang, D. Zhao, M. A. A. Al-Qaness, M. Abd Elaziz e A. Dahou, “A Study of the Effects of Stemming Strategies on Arabic Document Classification”, IEEE Access, Vol. 7, pp. 32664-32671, https://ieeexplore.ieee.org/document/8664087. Janneke van der Zwaan, Maksim Abdul Latif, Dafne van Kuppevelt, Melle Lyklema, Christian Lange, “Are you sure your tool does what it is supposed to do? Validating Arabic root extraction”, Digital Scholarship in the Humanities, Vol. 36, 2021, pp. 137-150, https://academic.oup.com/dsh/article/36/Supplement_1/i137/5545478
15 Ratnavel Rajalakshmi, Srivarshan Selvaraj, Faerie Mattins, Pavitra Vasudevan, Anand Kumar, “HOTTEST: Hate and Offensive content identification in Tamil using Transformers and Enhanced Stemming”, Computer Speech & Language, Vol. 78, 2023, https://www.sciencedirect.com/science/article/abs/pii/S0885230822000870?via%3Dihub
16 Siba Sankar Sahu and Sukomal Pal, “Building a text retrieval system for the Sanskrit language: Exploring indexing, stemming, and searching issues”, Computer Speech & Language, Vol. 81, 2023, https://www.sciencedirect.com/science/article/abs/pii/S0885230823000372?via%3Dihub
17 Chris Paice, “Stemming”, Encyclopedia of Database Systems, Springer, 2020.