FastText: il cacciavite del NLP

Nato nei laboratori di Facebook AI Research, FastText è stato concepito con l’obiettivo di rendere l’elaborazione del linguaggio naturale veloce, accessibile e potente anche in un contesto di produzione. Non si tratta di una tecnologia sperimentale: è stato progettato per essere usato subito, senza dover configurare un’infrastruttura da film di fantascienza.
Per gli sviluppatori che lavorano su chatbot, classificatori di intenti o sistemi NER leggermente più complessi, FastText è spesso la risposta più sensata. Non è glamour, ma è efficace: riesce a gestire testi brevi, vocaboli limitati e può essere addestrato in pochi minuti su una CPU. Questo lo rende una risorsa preziosa quando il tempo è più importante della pura sofisticazione.
Cos'è davvero FastText FastText è una libreria open source per la rappresentazione distribuita delle parole e per la classificazione del testo. Sotto il cofano utilizza modelli come skipgram e CBOW, evoluzioni dirette di Word2Vec, ma porta un’innovazione decisiva: rappresenta le parole come somma di n‑grammi di caratteri.
Questa scelta architetturale consente al modello di capire che “gatto” non è solo una parola intera, ma è composta da frammenti come “gat”, “att”, “tto” e così via. Di conseguenza, quando durante l’inferenza il modello incontra una parola mai vista – un refuso, un nome proprio nuovo o un neologismo – non collassa, ma costruisce un embedding basandosi sui pezzi conosciuti.
Il risultato è una forma di intelligenza pratica: non perfetta, ma estremamente furba e robusta. Questo approccio rende FastText particolarmente adatto a scenari dove la copertura del vocabolario è limitata o dove gli errori di battitura sono frequenti.
Skipgram e CBOW: la scelta strategica
FastText supporta due modalità principali di training non supervisionato: skipgram e CBOW. Lo skipgram predice il contesto dato un target, mentre il CBOW fa l’inverso, predicendo il target a partire dal contesto.
In pratica, lo skipgram tende a funzionare meglio su parole rare, perché impara a riconoscere contesti anche quando il termine appare poco spesso. Il CBOW, invece, è più veloce e richiede meno risorse, risultando ideale per corpora più grandi o per scenari dove la velocità è una priorità.
La decisione su quale modello adottare non è mai “universale”. Dipende dal use case specifico: se il tuo corpus è piccolo o medio e desideri embeddings robusti, lo skipgram è quasi sempre la scelta migliore. Se, al contrario, il tempo di addestramento e la memoria sono limitati, il CBOW può rappresentare un compromesso accettabile.
La magia degli n‑grammi di caratteri
Questa è la vera arma di FastText. Quando abiliti parametri come minn, maxn e bucket, chiedi al modello di includere sotto‑componenti dei termini, ossia i n‑grammi di caratteri.
L’effetto è duplice: il modello diventa più grande e più complesso, ma allo stesso tempo guadagna in generalizzazione e nella capacità di gestire parole out‑of‑vocabulary (OOV). Disattivare questi parametri riduce le dimensioni e velocizza l’inferenza, ma si perde in robustezza.
Se stai costruendo un classificatore di intenti in un dominio chiuso, con frasi brevi e un vocabolario controllato, puoi permetterti di disabilitare gli n‑grammi e ottenere un modello ultra compatto. Al contrario, se il tuo contesto è rumoroso, con errori di battitura, neologismi o nomi propri imprevedibili, mantenere gli n‑grammi è fondamentale per evitare di vedere il modello “crollare”.
Può fare entrambi? Sì, ed è qui che diventa interessante Molti si chiedono se FastText sia solo un generatore di embeddings o un classificatore di testo. La risposta è: è entrambi, e le due funzionalità non si escludono a vicenda.
La modalità non supervisionata (skipgram o CBOW) produce un modello di embeddings che apprende la struttura del linguaggio da un corpus grezzo, senza necessità di etichette. La modalità supervisionata (train_supervised) genera un classificatore, richiedendo esempi etichettati, ma interna al modello costruisce comunque una rappresentazione vettoriale delle parole.
Anche quando addestri un classificatore, FastText apprende degli embeddings ottimizzati per il tuo task specifico. Questi possono essere estratti, esportati e riutilizzati in altri contesti, fornendo un vantaggio notevole: un unico modello che serve sia per classificare intenti sia per calcolare similarità semantica nel dominio di interesse.
FastText come generatore di embeddings
Prima di entrare nel dettaglio operativo, è utile evidenziare perché FastText è una scelta eccellente per generare embeddings: è leggero, rapido da addestrare, gestisce parole OOV grazie agli n‑grammi e si integra facilmente con altre librerie di machine learning.
Installazione e setup
Per sistemi macOS con Homebrew:
Oppure, se desideri il massimo controllo, puoi compilare da sorgente:
Addestramento non supervisionato Il punto di partenza è un corpus di testo grezzo. Non serve alcuna etichetta, basta un file con una riga per documento. L’esempio seguente mostra come addestrare un modello skipgram con parametri tipici:
Recuperare gli embeddings Una volta addestrato, è possibile estrarre i vettori di parole, parole OOV e frasi intere:
get_word_vector restituisce il vettore di una singola parola, includendo il contributo degli n‑grammi, mentre get_sentence_vector calcola la media normalizzata dei vettori delle parole della frase, offrendo una rappresentazione semplice ma efficace per frasi brevi.
FastText come classificatore di testo
Passare dalla generazione di embeddings alla classificazione è altrettanto fluido. FastText utilizza un formato di testo leggibile, dove ogni riga è composta dal prefisso __label__ seguito dall’etichetta e dal testo.
Il formato dei dati
Regole pratiche di preprocessing:
- Converti tutto in minuscolo.
- Separa la punteggiatura con spazi.
- Mantieni i caratteri accentati italiani.
Preprocessing consigliato
Addestramento del classificatore
FastText contro i Transformer
Se hai bisogno di comprensione semantica profonda, disambiguazione complessa o reasoning multilivello, i modelli tipo BERT, RoBERTa o GPT sono più adatti. Tuttavia, questi modelli portano con sé costi elevati: dimensioni enormi, latenza più alta, maggiore consumo di memoria e complessità di deployment.
FastText, al contrario, è minimalista: occupa pochi megabyte, gira su CPU senza problemi e si addestra in tempi ridicoli rispetto ai transformer. La scelta non dovrebbe basarsi sulla moda, ma sui requisiti reali del progetto: per intenti brevi e sistemi NLU leggeri, FastText è più che sufficiente, mentre per analisi semantiche fine‑grained su documenti lunghi potrebbe risultare limitato.
Quantizzazione e modelli ultraleggeri
Un altro aspetto spesso sottovalutato è la quantizzazione. FastText permette di ridurre drasticamente le dimensioni del modello mantenendo una buona precisione:
In un caso reale, un classificatore con 20 intenti passa da 50‑100 MB a 2‑5 MB, con una perdita di accuracy inferiore all’1‑2 %. Questa compressione è particolarmente utile per deployment su dispositivi embedded, container con limiti di memoria o funzioni serverless dove ogni megabyte conta.
Un esempio completo end‑to‑end
Per chi desidera un flusso operativo completo, ecco un esempio che copre tutti i passaggi: preprocessing, addestramento, valutazione, predizione e estrazione degli embeddings.
Questo script mostra come passare dal preprocessing alla valutazione, includendo la quantizzazione finale per ridurre le dimensioni del modello.
Quando usarlo davvero
FastText è ideale quando:
- Hai bisogno di embeddings statici veloci.
- Devi classificare testi brevi o intenti.
- Lavori con dataset medi o piccoli.
- Non disponi di GPU.
- Cerchi una soluzione stabile e a bassa latenza in produzione.
- Vuoi un unico modello che fornisca sia classificazione sia embeddings per il tuo dominio.
Non è consigliato quando:
- È necessaria una comprensione contestuale dinamica.
- Devi modellare frasi complesse con dipendenze lunghe.
- Hai bisogno di fine‑tuning semantico avanzato.
- Il tuo caso d’uso richiede reasoning multilivello o generazione di testo.
In sintesi, la decisione non è una questione di moda, ma di architettura del sistema e dei requisiti di progetto.
Opinione personale, senza filtri
Nel mondo reale, dove le scadenze sono strette e i server devono restare operativi, FastText è uno strumento spesso sottovalutato. Non fa scena nei meetup, non genera paper da conferenza, ma funziona in produzione con costi contenuti e latenza ridotta.
Spesso scegliamo strumenti troppo complessi per problemi semplici, finendo per incorrere in rallentamenti e costi inutili. FastText costringe a ragionare in modo pulito: dataset ben fatti, preprocessing serio e obiettivi chiari. Non c’è spazio per nascondersi dietro 400 milioni di parametri.
Questa “sviluppo pratico” lo rende elegante: è il cacciavite nel cassetto che apri quando sai di averne bisogno, senza cercare l’ultimo gadget tecnologico.
Conclusione
FastText non è il futuro scintillante del NLP, ma è il cacciavite che ti permette di costruire sistemi leggeri, veloci e affidabili. Se stai creando un NLU per intenti brevi, un classificatore di chatbot o vuoi embeddings robusti senza impazzire con GPU e costi elevati, è la scelta giusta.
Puoi addestrare un unico modello che funzioni sia come classificatore sia come generatore di embeddings, risparmiando tempo e risorse. Non è la soluzione universale, ma nel contesto adeguato è la scelta più intelligente.
In un ecosistema dove l’over‑engineering è la norma, l’intelligenza pratica di FastText vale più dell’hype. È uno strumento solido, pronto all’uso, che ti permette di focalizzarti sul problema di business anziché sulla complessità della tecnologia.