Classificatore email spam/phishing in italiano basato su Naive Bayes + TF-IDF, addestrato su dataset italiano + Enron (~33.000 email reali) con sistema di apprendimento continuo dal feedback dell'utente.
- 🇮🇹 Dataset italiano — 1.000 email in italiano (spam e ham) create appositamente per il contesto italiano (INPS, banche, operatori telefonici, truffe comuni)
- 🌍 Integrazione Enron — ~33.000 email reali scaricate automaticamente da HuggingFace (
SetFit/enron_spam) - 🤖 Apprendimento continuo — ogni email analizzata può essere confermata o corretta dall'utente; il modello si riaddestra automaticamente ogni 5 feedback
- 💾 Feedback persistente — i feedback vengono salvati in
user_feedback.jsone ricaricati ad ogni avvio - 📊 Statistiche in tempo reale — accuratezza, matrice di confusione, top parole spam
- 🔄 Riaddestramento automatico — il modello migliora ad ogni sessione
spamAI/
├── phishing.py # Script principale
├── emails_dataset.json # 1.000 email italiane etichettate (spam/ham)
├── user_feedback.json # Feedback utente accumulati (cresce nel tempo)
└── README.md
git clone https://github.com/massiprofessor/spamAI.git
cd spamAIpip install scikit-learn pandas datasets tqdmpython phishing.pyAl primo avvio scarica il dataset Enron da HuggingFace (~100 MB, poi in cache). Dalla seconda esecuzione parte istantaneamente.
All'avvio lo script mostra le statistiche del modello e poi entra in modalità interattiva:
📧 Oggetto: Hai vinto un iPhone! Ritira subito il premio
📝 Corpo (doppio INVIO per confermare):
Congratulazioni! Sei stato selezionato...
[INVIO]
[INVIO]
─────────────────────────────────────────────────────────────
SPAM / PHISHING — Rischio ALTO
Confidenza spam : 97.3%
Confidenza legittima: 2.7%
[██████████████████████████████]
La previsione è corretta?
[S] Sì, confermo [N] No, è legittima [I] Ignora
→ S
Confermato come spam. Feedback #1 salvato.
Ancora 4 feedback al prossimo riaddestramento.
| Comando | Descrizione |
|---|---|
esci |
Termina la sessione |
stats |
Mostra statistiche aggiornate del modello |
S / Y |
Conferma la previsione del modello |
N |
Correggi la previsione (insegna al modello) |
I |
Ignora — non salvare questo caso |
Email (oggetto + corpo)
│
▼
Pulizia testo
(rimozione header, URL→URL, email→EMAIL, numeri→NUM)
│
▼
TF-IDF Vectorizer
(60.000 feature, ngram 1-2, sublinear_tf)
│
▼
Naive Bayes (MultinomialNB, alpha=0.1)
│
▼
Probabilità spam/ham + barra visiva
| Sorgente | Lingua | Note | |
|---|---|---|---|
emails_dataset.json |
1.000 | 🇮🇹 Italiano | Creato appositamente per il contesto italiano |
SetFit/enron_spam |
~33.000 | 🇺🇸 Inglese | Email reali aziendali Enron |
user_feedback.json |
variabile | 🇮🇹 / 🌍 | Feedback utente — cresce ad ogni sessione |
Ogni feedback confermato o corretto dall'utente viene:
- Salvato in
user_feedback.jsoncon timestamp, predizione AI e etichetta corretta - Incluso nel dataset di training alla successiva sessione
- Usato per riaddestramento automatico ogni 5 nuovi feedback
{
"id": 42,
"timestamp": "2026-03-18T10:32:11",
"subject": "Urgente: verifica il tuo conto UniCredit",
"body": "Clicca qui per verificare...",
"label": "spam",
"ai_predicted": "spam",
"was_correct": true,
"conf_spam": 0.961,
"conf_ham": 0.039
}| Metrica | Valore |
|---|---|
| Accuratezza (test set) | 98%+ |
| Dataset training | ~23.000 email |
| Dataset test | ~10.000 email |
| Split | 70% train / 30% test (stratificato) |
| Feature TF-IDF | 60.000 |
All'inizio di phishing.py:
TRAIN_RATIO = 0.70 # percentuale dati di training
RANDOM_SEED = 42 # riproducibilità
MAX_ENRON_EMAILS = 33000 # max email Enron da caricare
TFIDF_MAX_FEAT = 60000 # feature TF-IDF
RETRAIN_EVERY = 5 # feedback prima del riaddestramento[
{
"id": 1,
"subject": "URGENTE: Il tuo conto è stato sospeso",
"body": "Gentile cliente, abbiamo rilevato attività sospetta...",
"label": "spam"
},
{
"id": 2,
"subject": "Riunione di team - giovedì ore 15",
"body": "Ciao a tutti, vi convoco per una riunione...",
"label": "ham"
}
]I valori validi per label sono "spam" e "ham".
- Python 3.8+
scikit-learnpandasdatasets(HuggingFace)tqdm
pip install scikit-learn pandas datasets tqdm- Studenti di cybersecurity — laboratorio pratico su ML applicato al rilevamento phishing
- Docenti — materiale didattico pronto all'uso con dataset in italiano
- Uso personale — analizza le email sospette copiando oggetto e corpo
Contributi benvenuti! In particolare:
- Nuove email italiane per
emails_dataset.json(spam o ham realistiche) - Miglioramenti all'algoritmo di classificazione
- Supporto per altri dataset pubblici
MIT License — libero utilizzo, anche per scopi didattici.
Realizzato con 🐍 Python · scikit-learn · HuggingFace Datasets