Vai al contenuto principale

Stemming e Lemmatizzazione in Python

Questo tutorial affronta stemming e lemmatizzazione da un punto di vista pratico usando il pacchetto Python Natural Language ToolKit (NLTK).
Aggiornato 29 set 2026  · 12 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

L’inglese moderno è considerato una lingua debolmente flessa. Ciò significa che esistono molte parole in inglese derivate da un’altra parola; ad esempio, la parola flessa “normality” deriva da “norm”, che è la forma base. Tutte le lingue flesse sono composte da parole con forme radicali comuni, ma il grado di flessione varia in base alla lingua.  

Quando lavori con il testo, a volte è necessario applicare tecniche di normalizzazione per riportare le parole dalla loro forma derivata alla forma radicale. Questo aiuta a ridurre la casualità e ad avvicinare le parole nel corpus a uno standard predefinito, migliorando l’efficienza dell’elaborazione perché il computer ha a che fare con meno caratteristiche. 

Due delle tecniche di normalizzazione del testo più popolari nel Natural Language Processing (NLP) sono lo stemming e la lemmatizzazione. 

Queste tecniche sono state studiate per anni dai ricercatori; chi lavora in NLP in genere le usa per preparare parole, testi e documenti a una fase di elaborazione successiva in diversi compiti. 

Questo tutorial tratterà stemming e lemmatizzazione da un punto di vista pratico utilizzando il pacchetto Python Natural Language ToolKit (NLTK).

Dai un’occhiata a questo workbook DataLab per una panoramica di tutto il codice in questo tutorial. Per modificare ed eseguire il codice, crea una copia del workbook per eseguirlo e modificarlo.

Che cos’è lo Stemming?

Lo stemming è una tecnica usata per ridurre una parola flessa al suo “stem” (radice). Ad esempio, le parole “programming”, “programmer” e “programs” possono tutte essere ridotte alla radice comune “program”. In altre parole, “program” può essere usato come sinonimo delle tre forme flesse precedenti. 

Eseguire questa tecnica di elaborazione del testo è spesso utile per gestire la sparsità e/o standardizzare il vocabolario. Non solo aiuta a ridurre la ridondanza, dato che la radice e le parole flesse hanno per lo più lo stesso significato, ma consente anche ai modelli NLP di apprendere collegamenti tra parole flesse e la loro radice, aiutando il modello a comprenderne l’uso in contesti simili. 

Gli algoritmi di stemming funzionano prendendo un elenco di prefissi e suffissi frequenti presenti nelle parole flesse e tagliando la fine o l’inizio della parola. Questo può occasionalmente produrre radici che non sono parole reali — una limitazione che vedremo più avanti.

Vantaggi dello stemming

  • Migliori prestazioni del modello: Lo stemming riduce il numero di parole uniche che un algoritmo deve elaborare, il che può migliorarne le prestazioni. Inoltre, può farlo funzionare più velocemente e in modo più efficiente.
  • Raggruppare parole simili: Parole con significato simile possono essere raggruppate, anche se hanno forme diverse. Questo può essere utile in compiti come la classificazione dei documenti, dove è importante identificare argomenti o temi chiave all’interno di un testo. 
  • Più facile da analizzare e capire: Poiché lo stemming in genere riduce la dimensione del vocabolario, è molto più semplice analizzare, confrontare e comprendere i testi. Questo è utile in compiti come l’analisi del sentiment, dove l’obiettivo è determinare il sentimento di un documento. 

Svantaggi dello stemming

  • Overstemming / falsi positivi: Accade quando un algoritmo di stemming riduce parole flesse diverse alla stessa radice anche se non sono correlate; ad esempio, l’algoritmo Porter Stemmer riduce "universal", "university" e "universe" alla stessa radice. Sebbene siano etimologicamente correlate, nel linguaggio moderno hanno significati in domini molto diversi. Trattarle come sinonimi ridurrà la pertinenza nei risultati di ricerca. 
  • Understemming / falsi negativi: Accade quando un algoritmo di stemming riduce parole flesse a radici differenti, anche se dovrebbero essere la stessa. Ad esempio, l’algoritmo Porter Stemmer non riduce le parole “alumnus”, “alumnae” e “alumni” alla stessa radice, sebbene dovrebbero essere trattate come sinonimi. 
  • Problematiche linguistiche: Man mano che morfologia, ortografia e codifica dei caratteri della lingua target si fanno più complesse, progettare stemmer diventa più difficile; ad esempio, uno stemmer per l’italiano è più complicato di uno per l’inglese perché ci sono molte più flessioni verbali. Uno stemmer per il russo è ancora più complesso per via delle maggiori declinazioni dei nomi.

Che cos’è la Lemmatizzazione?

La lemmatizzazione è un’altra tecnica usata per ridurre parole flesse alla loro forma base. Descrive il processo algoritmico di identificazione del “lemma” (forma da dizionario) di una parola flessa in base al suo significato previsto. 

A differenza dello stemming, la lemmatizzazione si basa sull’individuazione accurata della parte del discorso e del significato di una parola in base al contesto. Ciò significa che prende in considerazione la posizione della parola flessa nella frase, nonché il contesto più ampio che circonda quella frase, come le frasi vicine o persino l’intero documento.

La lemmatizzazione di solito si riferisce a fare le cose correttamente usando un vocabolario e l’analisi morfologica delle parole, in genere mirando a rimuovere solo le desinenze flessive e a restituire la forma base o da dizionario di una parola, nota come lemma

Standford NLP Group, Standford NLP Group

In altre parole, lemmatizzare un documento significa fare le cose per bene, poiché implica l’uso di un vocabolario e l’analisi morfologica delle parole per rimuovere solo le desinenze flessive e restituire la forma base o da dizionario di una parola, nota come “lemma”. Ad esempio, puoi aspettarti che un algoritmo di lemmatizzazione mappi “runs”, “running” e “ran” al lemma “run”.  

Vantaggi della lemmatizzazione

  • Accuratezza: La lemmatizzazione non si limita a troncare le parole come accade con gli algoritmi di stemming. L’analisi delle parole viene condotta in base alla parte del discorso per tenere conto del contesto nella produzione dei lemmi. Inoltre, la lemmatizzazione produce sempre parole presenti nel dizionario.

Svantaggi della lemmatizzazione 

  • Dispendiosa in tempo: Rispetto allo stemming, la lemmatizzazione è un processo lento e che richiede tempo. Questo perché comporta l’analisi morfologica e la derivazione del significato delle parole da un dizionario. 

Inizia a imparare Python gratis

Introduzione alla Data Science in Python

BasicSkill Level
4 ore
504.2K learners
Impara ad analizzare e visualizzare efficacemente i tuoi dati con Python e scopri la Data Science. Non serve saper programmare.
See DetailsRight Arrow
Start Course

Esempi di Stemming e Lemmatizzazione in Python con NLTK

Ora hai una panoramica di stemming e lemmatizzazione. In questa sezione, passiamo alla pratica e mostriamo esempi di entrambe le tecniche usando Python e una libreria chiamata NLTK. 

Il pacchetto NLTK per Python

Natural Language Tool Kit (NLTK) è una libreria Python usata per costruire programmi in grado di elaborare il linguaggio naturale. La libreria può eseguire diverse operazioni come tokenizzazione, stemming, classificazione, parsing, tagging, ragionamento semantico, analisi del sentiment e altro.

L’ultima versione è NLTK 3.9.x e richiede Python 3.10 o superiore (fino a 3.14), ma non devi preoccupartene perché è preinstallata nel workbook DataLab — ti basta importare nltk e sei a posto.

Esempio di stemming in Python

Uno degli algoritmi di stemming più popolari è il “Porter stemmer”. Il Porter stemmer fu proposto per la prima volta da Martin Porter in un articolo del 1980 intitolato "An algorithm for suffix stripping". Il paper è diventato uno degli algoritmi più comuni per lo stemming in inglese.

Vediamo come funziona:

import nltk
from nltk.stem import PorterStemmer
nltk.download("punkt_tab")  # Use punkt_tab in NLTK 3.9+; punkt is deprecated
​
# 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

"""

Questo è un esempio piuttosto semplice; ci aspettavamo questi risultati dal nostro Porter stemmer come menzionato nella sezione “Stemming” sopra. 

Proviamo un esempio più insidioso:

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
"""

Qui puoi vedere che alcune parole in output non fanno parte del dizionario inglese (ad esempio “becaus”, “peopl” e “programm.”). Un’altra cosa da notare è che il contesto non viene preso in considerazione. Per esempio, “programmers” è un sostantivo plurale ma è stato ridotto a “program”, che può essere un sostantivo o un verbo — in altre parole, le radici risultano ambigue. 

Esempio di lemmatizzazione in Python

La motivazione alla base dei lemmatizzatori sensibili al contesto è stata migliorare le prestazioni su parole sconosciute e ambigue. Nel nostro esempio di lemmatizzazione useremo un lemmatizzatore molto diffuso chiamato WordNet lemmatizer. 

WordNet è un ampio database lessicale libero e pubblico per la lingua inglese che mira a stabilire relazioni semantiche strutturate tra le parole.

Vediamolo in azione:

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:
   # pos="v" tells the lemmatizer to treat words as verbs
   # Other options: "n" (noun), "a" (adjective), "r" (adverb)
   print("{0:20}{1:20}".format(word, wnl.lemmatize(word, pos="v")))

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

Le parole fornite in input al nostro lemmatizzatore rimarranno invariate se non possono essere trovate in WordNet. Questo significa che va fornito il contesto, cosa che si fa passando il valore del parametro part-of-speech, pos, a wordnet_lemmatizer.lemmatize.

Nota che “programmer” non è stato ridotto a “program” dal nostro lemmatizzatore: questo perché gli abbiamo detto di trattare solo i verbi. 

Passiamo ora qualcosa di più complicato al nostro lemmatizzatore per vedere come se la cava…

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 
"""

Tutte le parole restituite dall’algoritmo di lemmatizzazione sono presenti nel dizionario inglese — a parte “pythonistas”, che è un termine informale usato per riferirsi ai programmatori Python. 

Stemming vs. Lemmatizzazione

Hai visto come implementare entrambe le tecniche, ma come si confrontano? 

Stemming e lemmatizzazione sono entrambe tecniche di elaborazione del testo che puntano a ridurre parole flesse a una radice comune. Nonostante l’allineamento nell’obiettivo generale, le due tecniche non sono uguali. 

Le principali differenze tra stemming e lemmatizzazione risiedono nel modo in cui ciascuna tecnica raggiunge l’obiettivo di ridurre parole flesse a una radice comune. 

Gli algoritmi di stemming cercano di trovare le radici comuni di varie flessioni tagliando le estremità o gli inizi della parola. Il taglio si basa su un elenco di prefissi e suffissi comuni che si trovano tipicamente nelle parole flesse. Questo taglio non discriminante può a volte portare a radici significative, ma altre volte no. 

Gli algoritmi di lemmatizzazione, invece, cercano di trovare radici comuni dalle parole flesse conducendo un’analisi morfologica. Per ridurre accuratamente le flessioni, è necessario mantenere un dizionario dettagliato che l’algoritmo possa consultare per ricondurre una parola flessa al suo lemma.

Le due tecniche possono anche differire nel fatto che lo stemming più comunemente raggruppa parole correlate derivazionalmente, mentre la lemmatizzazione in genere raggruppa solo le diverse forme flessive di un lemma.

Stanford NLP, IR Book

L’approccio euristico e grossolano adottato dagli algoritmi di stemming implica in genere che siano veloci ed efficienti ma non sempre accurati. Al contrario, gli algoritmi di lemmatizzazione sacrificano velocità ed efficienza per l’accuratezza, producendo così radici significative. 

Ad esempio, un algoritmo di stemming potrebbe ridurre “saw” a “s.” Un algoritmo di lemmatizzazione considererà se “saw” è un sostantivo (l’attrezzo per tagliare) o un verbo (passato di “see”) in base al contesto in cui è usato, prima di decidere quale lemma restituire — se è un sostantivo restituirà “saw”, se è un verbo restituirà “see”.

Questi punti ormai ti saranno abbastanza chiari, quindi ecco la domanda da un milione di dollari — “dovrei usare lo stemming o la lemmatizzazione per il preprocessing del testo?” 

Come per molte cose nel software: dipende. 

Tieni alla velocità e all’efficienza? Se sì, scegli lo stemming. 

Il contesto è importante per la tua applicazione? Se hai risposto “sì”, allora usa la lemmatizzazione. 

La tecnica da usare dipende completamente dall’applicazione su cui stai lavorando e dagli obiettivi del progetto. Potresti voler eseguire esperimenti con entrambe le tecniche e confrontare i risultati per vedere quale approccio produce gli esiti più in linea con i tuoi obiettivi. 

Qualcosa che non abbiamo approfondito in questo tutorial è come vengono creati gli algoritmi di lemmatizzazione; questo perché esistono diverse librerie (come SpaCy, NLTK, ecc.) compatibili con lingue differenti. Tuttavia, se dovessi creare il tuo lemmatizzatore per una lingua non supportata (ad esempio, Akan), ti servirebbero una buona conoscenza e comprensione della lingua target per costruirlo. Gli algoritmi di stemming sono molto più facili da costruire in tali scenari.

  Stemming Lemmatizzazione
Velocità Veloce Lenta
Accuratezza Inferiore Superiore
Output Potrebbe non essere una parola reale Sempre una parola reale
Usa il contesto? No Sì
Ideale per Motori di ricerca, filtri antispam Chatbot, analisi del sentiment, QA

Conclusione

In sintesi, stemming e lemmatizzazione sono tecniche usate per l’elaborazione del testo in NLP. Entrambe puntano a ridurre le flessioni a radici comuni, ma ciascuna adotta un approccio diverso per farlo. 

La lemmatizzazione è molto più accurata dello stemming. Restituisce sempre parole presenti nel dizionario e tiene conto del contesto. Per la maggior parte delle pipeline NLP moderne, la lemmatizzazione è preferita quando l’accuratezza conta. Tuttavia, se lavori su larga scala o stai costruendo un prototipo rapido, lo stemming può essere sufficiente ed è considerevolmente più veloce.


Kurtis Pykes 's photo
Author
Kurtis Pykes
LinkedIn

FAQs

Devo scaricare qualcosa in più per usare lo stemmer e il lemmatizzatore di NLTK?

Per il Porter Stemmer, non sono necessari download extra oltre all’installazione di NLTK. Per il WordNet Lemmatizer, dovrai eseguire nltk.download("wordnet") e nltk.download("omw-1.4") una volta prima di usarlo. Per la tokenizzazione, in NLTK 3.9+ ti servirà anche nltk.download("punkt_tab").

Perché il mio lemmatizzatore restituisce la stessa parola che ho inserito senza cambiarla?

Di solito significa due cose: o la parola non è stata trovata nel dizionario di WordNet, oppure non hai specificato il parametro pos (part-of-speech) corretto. Ad esempio, wnl.lemmatize("running") restituisce "running" per impostazione predefinita perché assume un sostantivo. Passa pos="v" per trattarlo come verbo e ottenere invece "run".

È meglio lo stemming o la lemmatizzazione per i motori di ricerca?

In genere si preferisce lo stemming per i motori di ricerca perché a quella scala la velocità conta più dell’accuratezza perfetta. Quando un utente cerca "running shoes", vuoi che i risultati per "run", "runner" e "runs" arrivino rapidamente. L’occasionale radice non presente nel dizionario non influisce molto sull’esperienza. La lemmatizzazione è eccessiva per la maggior parte dei casi d’uso nella ricerca.

Posso usare queste tecniche con lingue diverse dall’inglese?

Sì, ma con difficoltà variabile. NLTK ha un supporto limitato per altre lingue out-of-the-box. Per un supporto multilingue più ampio, librerie come spaCy o Stanza sono opzioni migliori — in particolare spaCy ha un ottimo supporto di lemmatizzazione per lingue come tedesco, francese, spagnolo, portoghese e altre. Costruire il tuo stemmer o lemmatizzatore per una lingua a basse risorse (come l’Akan) richiede una profonda conoscenza della morfologia di quella lingua.

La lemmatizzazione produce sempre risultati migliori dello stemming nei modelli NLP?

Non necessariamente. Dipende dal tuo task e dal dataset. Per compiti in cui il significato esatto delle parole è importante — come question answering, analisi del sentiment o chatbot — la lemmatizzazione in genere funziona meglio. Per compiti più semplici come classificazione dei documenti o estrazione di keyword, lo stemming spesso produce risultati altrettanto validi, con una frazione del costo computazionale. L’approccio più sicuro è testare entrambi e confrontare i risultati sui tuoi dati specifici.

Argomenti
Intelligenza artificiale
Python
Machine Learning

Approfondisci Python e il Natural Language Processing

Corso

Introduzione al Deep Learning in Python

4 ore
264.8K
Impara le basi delle reti neurali e come creare modelli di deep learning usando Keras 2.0 in Python.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

Mostra AltroMostra Altro