My IBM Accedi Iscriviti

Cos'è lo stemming?

29 novembre 2023

Autori

Jacob Murel Ph.D.

Senior Technical Content Creator

Eda Kavlakoglu

Program Manager

Lo stemming è una delle numerose tecniche di normalizzazione del testo che converte i dati di testo non elaborati in un formato leggibile per le attività di elaborazione del linguaggio naturale.

Lo stemming è una tecnica di pre-elaborazione del testo nell'elaborazione del linguaggio naturale (NLP). In particolare, è il processo di riduzione della forma inflessa di una parola a un cosiddetto "tema", o forma radice, che spesso corrisponde al "lemma", come viene chiamato in linguistica1. È uno dei due metodi principali, l'altro è la lemmatizzazione, che riduce le varianti inflessive all'interno di un set di dati di testo a un lessema morfologico. In questo modo, lo stemming mira a migliorare l'elaborazione del testo nei sistemi di machine learning e di recupero delle informazioni.

Perché utilizzare lo stemming?

Le macchine, dalle funzioni di ricerca e individuazione ai modelli di deep learning, elaborano il linguaggio in gran parte in base alla forma, e molti ricercatori sostengono che i computer non sono in grado di comprendere il significato del linguaggio2. Anche se alcuni discutono quest'ultimo punto, è comunque vero che i modelli di machine learning devono essere addestrati a riconoscere parole diverse come varianti morfologiche di una parola di base. Ad esempio, nei motori di ricerca o nei cataloghi delle biblioteche, gli utenti possono inviare una query con una parola (ad esempio, investire), ma aspettarsi risultati che utilizzino qualsiasi forma inflessa della parola (ad esempio, investo, investimento, investimenti, ecc.). Riducendo le forme di parole derivate a una parola tema, lo stemming aiuta i sistemi di reperimento delle informazioni a equiparare le parole morfologicamente correlate3.

Per molte attività di text mining, tra cui la classificazione del testo, il clustering, l'indicizzazione e altro ancora, lo stemming aiuta a migliorare la precisione riducendo la dimensionalità degli algoritmi di machine learning e raggruppando le parole in base al concetto. La riduzione della dimensionalità degli algoritmi può migliorare l'accuratezza e la precisione dei modelli statistici NLP, come i modelli di argomento e di inserimento di parole4. Lo stemming migliora quindi l'accuratezza di vari compiti NLP, come l'analisi del sentimento e il tagging delle parti del discorso. In questo modo, lo stemming serve come passo importante nello sviluppo di modelli linguistici di grandi dimensioni.

Design 3D di palline che rotolano su una pista

Le ultime notizie e insight sull'AI 


Scopri notizie e insight selezionati da esperti in materia di AI, cloud e molto altro nella newsletter settimanale Think. 

Come funziona lo stemming

Lo stemming è una fase della pipeline di text mining che converte i dati di testo grezzi in un formato strutturato per l'elaborazione automatica. Lo stemming essenzialmente elimina gli affissi dalle parole, lasciando solo la forma di base5. Ciò equivale a rimuovere i caratteri dalla fine dei token delle parole. Al di là di questa somiglianza di base, tuttavia, gli algoritmi di stemming variano molto.

Mixture of Experts | Podcast

Decoding AI: Weekly News Roundup

Unisciti al nostro gruppo di livello mondiale di ingegneri, ricercatori, leader di prodotto e molti altri mentre si fanno strada nell'enorme quantità di informazioni sull'AI per darti le ultime notizie e gli ultimi insight sull'argomento.

Tipi di algoritmi di stemming

Per esplorare le differenze tra le operazioni degli algoritmi di stemming, possiamo elaborare questa frase tratta da Sogno di una notte di mezza estate di Shakespeare: "Love looks not with the eyes but with the mind, and therefore is winged Cupid painted blind". Prima dello stemming, gli utenti dovevano tokenizzare i dati di testo non elaborati. Il tokenizer integrato del Natural Language Toolkit (NLTK) di Python restituisce il testo citato come:

Tokenized: ['Love', 'looks', 'not', 'with', 'the', 'eyes', 'but', 'with', 'the', 'mind', ',', 'and', 'therefore', 'is', 'winged', 'Cupid', 'painted', 'blind', '.']

Eseguendo l'output tokenizzato attraverso più stemmer, possiamo osservare le differenze tra gli algoritmi di stemming.

Stemmer di Lovins

Lo stemmer di Lovins è il primo algoritmo di stemming pubblicato. Essenzialmente, funziona come una funzione di ricerca e sostituzione fortemente parametrizzata. Confronta ogni input token contro un elenco di suffissi comuni, con ogni suffisso condizionato da una delle 29 regole. Se uno dei suffissi dell'elenco viene trovato in un token, e la rimozione del suffisso non viola nessuna delle condizioni del suffisso associato, l'algoritmo rimuove quel suffisso dal token. Il token stemmatizzato viene quindi sottoposto a un'altra serie di regole, che correggono le malformazioni comuni nelle radici stemmatizzate, come le lettere doppie (ad esempio, hopping diventa hopp che diventa hop)6.

 Questo codice utilizza la libreria di stemming Python7, per creare lo stemming della citazione di Shakespeare tokenizzata:

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]

L'output del codice è il seguente:

Stemmed: ['Lov', 'look', 'not', 'with', 'th', 'ey', 'but', 'with', 'th', 'mind', ',', 'and', 'therefor', 'is', 'wing', 'Cupid', 'paint', 'blind', '.']

L'output mostra come lo stemmer di Lovins trasforma correttamente le coniugazioni e i tempi in forme di base (ad esempio, painted diventa paint) eliminando la pluralizzazione (ad esempio, eyes diventa eye). Ma l'algoritmo di stemming di Lovins restituisce anche una serie di temi mal formati, come lov, th e ey. Queste parole radice malformate derivano dalla rimozione di troppi caratteri. Come spesso accade nell'apprendimento automatico, tali errori aiutano a rivelare i processi sottostanti.

Se confrontato con l'elenco di suffissi dello stemmer Lovins, il suffisso più lungo che si adatta sia a love che a the è il singolo carattere -e. L'unica condizione legata a questo suffisso è "Nessuna restrizione sul tema", il che significa che lo stemmer può rimuovere -e indipendentemente dalla lunghezza del tema rimanente. Sfortunatamente, nessuno dei suffissi lov o th contiene alcuna delle caratteristiche che l'algoritmo di Lovins utilizza per identificare le parole malformate, come le lettere doppie o i plurali irregolari8.

Quando tali temi malformati sfuggono all'algoritmo, lo stemmer di Lovins può ridurre parole semanticamente non correlate allo stesso tema, ad esempio, the, these, e this si riducono a th. Naturalmente, queste tre parole sono tutte dimostrative, e quindi condividono una funzione grammaticale. Tuttavia, altri dimostrativi, come that e those, non si riducono a th. Ciò significa che le radici generate da Lovins non rappresentano correttamente i gruppi di parole.

Stemmer di Porter

Rispetto allo stemmer di Lovins, l'algoritmo di stemming di Porter utilizza un algoritmo di stemming più matematico. Essenzialmente, questo stemmer classifica ogni carattere in un determinato token come consonante (c) o vocale (v), raggruppando le consonanti successive come C e le vocali successive come V. Lo stemmer rappresenta quindi ogni token di parola come una combinazione di gruppi di consonanti e vocali. Una volta enumerato in questo modo, lo stemmer esegue ogni token di parola attraverso un elenco di regole che specificano i caratteri finali da rimuovere in base al numero di gruppi di vocali-consonanti in un token9. Poiché l'inglese stesso segue regole lessicali generali ma non assolute, il criterio sistematico dell'algoritmo di stemming di Porter per determinare la rimozione dei suffissi può restituire errori.

Python NLTK contiene una funzione stemmer Porter integrata. Questo codice utilizza l'algoritmo di derivazione di Porter sulla frase tokenizzata di Shakespeare:

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]

Questo codice restituisce:

Stemmed: ['love', 'look', 'not', 'with', 'the', 'eye', 'but', 'with', 'the', 'mind', ',', 'and', 'therefor', 'is', 'wing', 'cupid', 'paint', 'blind', '.']

Come nel caso di Lovins, Porter modifica correttamente le coniugazioni dei verbi e le pluralizzazioni dei sostantivi. Anche se non ci sono temi erronei come in Lovins (ad esempio, da love a lov), l'algoritmo di stemming di Porter rimuove tuttavia erroneamente -e dalla fine di therefore.

Secondo il metodo di raggruppamento consonante-vocale di Porter, therefore è rappresentato come CVCVCVCV, o C(VC)3V, con l'esponente che indica le ripetizioni dei gruppi consonante-vocale.

Uno dei passaggi finali dell'algoritmo prevede che, se una parola non è stata sottoposta ad alcuno stemming e ha un valore di esponente maggiore di 1, -e viene rimossa dalla desinenza della parola (se presente). Il valore di esponente di therefore è uguale a 3 e non contiene nessuno dei suffissi elencati nelle altre condizioni dell'algoritmo10. Di conseguenza, therefore diventa therefor.

Certo, questo è l'unico errore dello stemmer di Porter, forse a testimonianza del fatto che è l'algoritmo di stemming più adottato. In effetti, lo stemmer di Porter è servito da base per i successivi algoritmi di stemming.

Stemmer Snowball

Lo stemmer Snowball è una versione aggiornata dello stemmer Porter. Sebbene abbia l'obiettivo di applicare una serie di regole più robuste per determinare la rimozione dei suffissi, rimane comunque incline a molti degli stessi errori. Come lo stemmer Porter, Python NLTK contiene una funzione di stemmer Snowball integrata:

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]

Produce lo stesso output del testo shakespeariano dello stemmer di Porter, riducendo erroneamente therefore a therefor:

Stemmed: ['love', 'look', 'not', 'with', 'the', 'eye', 'but', 'with', 'the', 'mind', ',', 'and', 'therefor', 'is', 'wing', 'cupid', 'paint', 'blind', '.']

Lo stemmer Snowball differisce da quello di Porter principalmente per due motivi. Innanzitutto, mentre gli stemmer di Lovins e Porter si applicano solo a parole inglesi, lo stemmer Snowball si può applicare a testi altre lingue dell'alfabeto latino, come olandese, tedesco, francese e persino al russo. In secondo luogo, lo stemmer Snowball, se implementato tramite la libreria Python NLTK, può ignorare le stop word. Le stop word sono una raccolta non universale di parole che vengono rimosse da un set di dati durante la pre-elaborazione. La lista di stop word predefinita dello stemmer Snowball contiene parole senza una definizione concettuale diretta e che svolgono una funzione più grammaticale che semantica. Le parole ripetute incluse nella lista di stop word inglesi dello stemmer Snowball includono the, a, being e simili11.

Stemmer di Lancaster

Molte fonti descrivono lo stemmer di Lancaster, noto anche come lo stemmer di Paice, come il più aggressivo degli stemmer della lingua inglese. Lo stemmer di Lancaster contiene un elenco di oltre 100 regole che determinano quali stringhe di caratteri finali, se presenti, debbano essere sostituite con altre, se presenti. Lo stemmer esamina ogni token di parola, verificandolo rispetto a tutte le regole. Se la stringa finale del token corrisponde a quella di una regola, l'algoritmo esegue l'operazione descritta della regola e quindi esegue nuovamente la nuova parola trasformata in tutte le regole. Lo stemmer scorre tutte le regole fino a quando un determinato token le supera tutte senza essere trasformato12.

Sebbene non disponibile in Python NLTK, lo stemmer Lancaster è disponibile nella libreria di stemming13:

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]

Il codice riproduce la frase di Shakespeare tokenizzata come:

Stemmed: ['Lov', 'look', 'not', 'with', 'the', 'ey', 'but', 'with', 'the', 'mind', ',', 'and', 'theref', '', 'wing', 'Cupid', 'paint', 'blind', '.']

Chiaramente, l'approccio iterativo dello stemmer di Lancaster è il più aggressivo degli stemmer, come dimostrato da theref. Innanzitutto, lo stemmer di Lancaster ha la regola "e1>". Questa regola rimuove il carattere singolo ­-e senza sostituirlo. Dopo che l'algoritmo rimuove -e da therefore, esegue il nuovo therefor in ogni regola. La parola appena trasformata corrisponde alla regola "ro2>". Questa regola rimuove il suffisso di due caratteri -or senza sostituirlo. Il tema risultante theref non corrisponde a nessuna delle altre regole degli algoritmi e quindi viene restituito come base derivata. A differenza di Lovins, l'algoritmo di Lancaster non ha mezzi per tenere conto delle parole malformate.

Limitazioni dello stemming

Supporto linguistico

Ci sono molti stemmer in inglese, così come altri stemmer per altre lingue con alfabeto latino. Più recentemente, la ricerca si è rivolta allo sviluppo e alla valutazione di algoritmi di stemming per lingue con alfabeto non latino. L'arabo, in particolare, può risultare difficile a causa della sua complessa morfologia e delle sue variazioni ortografiche. Alcuni studi confrontano l'efficacia di diversi termini arabi in relazione ad attività come la classificazione14. Inoltre, i ricercatori studiano l'accuratezza dello stemming nel migliorare le attività di recupero delle informazioni in tamil15 e in sanscrito16.

Overstemming e understemming

Sebbene la ricerca dimostri il ruolo dello stemming nel migliorare l'accuratezza dei compiti di NLP, lo stemming presenta due problemi principali a cui gli utenti devono prestare attenzione. L'over-stemming si verifica quando due parole semanticamente distinte vengono ridotte alla stessa radice e quindi confuse. L'under-stemming indica quando due parole semanticamente correlate non vengono ridotte alla stessa radice17. Un esempio di over-stemming è la riduzione da parte dello stemmer Lancaster di wander a wand, due termini semanticamente distinti in inglese. Tuttavia, sia lo stemmer di Porter che quello di Lovins non alterano affatto wander. Un esempio di under-stemming è la mancata riduzione di knavish a knavish e knave a knave, che condividono la stessa radice semantica. In confronto, lo stemmer di Lovins riduce entrambe le parole a knav.

Formazione di base

Pur avendo usi e obiettivi simili, lo stemming e la lemmatizzazione hanno alcune piccole ma sostanziali differenze. La letteratura spesso descrive lo stemming come più euristico, essenzialmente eliminando i suffissi comuni dalle parole per produrre una parola radice. La lemmatizzazione, invece, conduce un'analisi morfologica più dettagliata di parole diverse per determinare una forma base di dizionario, rimuovendo non solo i suffissi, ma anche i prefissi. Sebbene lo stemming sia più rapido e facilmente implementabile, molti sviluppatori di strumenti di deep learning potrebbero preferire la lemmatizzazione dato il suo processo di stripping più sfaccettato.

Soluzioni correlate

Soluzioni correlate

IBM watsonx Orchestrate

Progetta facilmente assistenti e agenti di AI scalabili, automatizza le attività ripetitive e semplifica i processi complessi con IBM watsonx Orchestrate.

Scopri watsonx Orchestrate
Strumenti di elaborazione del linguaggio naturale e API

Accelera il valore aziendale dell'intelligenza artificiale con un portfolio potente e flessibile di librerie, servizi e applicazioni.

Esplora le soluzioni NLP
Consulenza e servizi sull'AI

Reinventa i flussi di lavoro e le operazioni critiche aggiungendo l'AI per massimizzare le esperienze, il processo decisionale in tempo reale e il valore di business.

Esplora i servizi AI
Fai il passo successivo

Progetta facilmente assistenti e agenti di AI scalabili, automatizza le attività ripetitive e semplifica i processi complessi con IBM watsonx Orchestrate.

Scopri watsonx Orchestrate Esplora le soluzioni NLP
Note a piè di pagina

1 Ruslan Mitkov, Oxford Handbook of Computational Linguistics, 2a edizione, 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, pag. 5185-5198 , https://aclanthology.org/2020.acl-main.463

3 Steven Bird, Ewan Klein e Edward Loper, Natural Language Processing with Python, O'Reilley, 2009.

4 Gary Miner, Dursun Delen, John Elder, Andrew Fast, Thomas Hill e Robert A. Nisbet, Practical Text Mining and Statistical Analysis for Non-Structured Text Data Applications, Academic Press, 2012.

5 Christopher Manning e 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, N. 1 e 2, 1968, pag. 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, N. 1 e 2, 1968, pag. 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, N. 3, 1980, pag. 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, N. 3, 1980, pag. 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, N. 3, 1990, pag.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, pag. 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, pag.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, 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.