Naive Bayes AntiSpam
Creare un Filtro Anti-Spam con il Metodo Naive Bayes
Creare un Filtro Anti-Spam con il Metodo Naive Bayes
Il metodo Naive Bayes è uno degli algoritmi più utilizzati per classificare i dati, in particolare per il rilevamento dello spam.
Questo metodo si basa sul *Teorema di Bayes* e assume che le caratteristiche del testo siano indipendenti tra loro, il che lo rende semplice ed efficace.
In questo articolo, ti mostrerò come costruire un filtro anti-spam utilizzando Python e il metodo Naive Bayes.
Cos'è un Filtro Anti-Spam
Un filtro anti-spam è un sistema che analizza i messaggi di posta elettronica e li classifica come:
- Spam (messaggi indesiderati o potenzialmente pericolosi).
- Ham (messaggi legittimi).
Il filtro utilizza un modello addestrato su un dataset contenente email etichettate come spam o ham.
Dataset
Per addestrare il filtro, utilizzeremo un dataset di email etichettate. Un esempio comune è l'[SMS Spam Collection dataset](https://www.kaggle.com/uciml/sms-spam-collection-dataset).Scarica il dataset e assicurati che abbia due colonne:
- label: indica se l'email è "spam" o "ham".
- text: il contenuto del messaggio.
Passaggi per Creare il Filtro
Importare le Librerie
Prima di tutto, installa le librerie necessarie:
pip install pandas scikit-learn
Ora importa le librerie nel tuo script:
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report
Caricare e Analizzare il Dataset
Carica il dataset in un DataFrame e analizza i dati.
# Caricare il dataset
dataset = pd.read_csv("spam.csv", encoding="latin-1")
# Rinominare le colonne per semplicità
dataset = dataset.rename(columns={"v1": "label", "v2": "text"})
# Tenere solo le colonne rilevanti
dataset = dataset[["label", "text"]]
# Mostra alcune righe del dataset
print(dataset.head())
# Convertire le etichette in valori numerici
dataset["label"] = dataset["label"].map({"ham": 0, "spam": 1})
Preparare i Dati
Dividiamo il dataset in dati di addestramento e di test.
# Dividere il dataset in caratteristiche (X) e target (y)
X = dataset["text"]
y = dataset["label"]
# Convertire il testo in una rappresentazione numerica
vectorizer = CountVectorizer()
X_vectorized = vectorizer.fit_transform(X)
# Dividere i dati in training e test set
X_train, X_test, y_train, y_test = train_test_split(X_vectorized, y, test_size=0.2, random_state=42)
Addestrare il Modello
Addestriamo un modello Naive Bayes con i dati di addestramento.
# Inizializzare e addestrare il modello
model = MultinomialNB()
model.fit(X_train, y_train)
# Valutare il modello sui dati di test
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
Testare il Filtro
Puoi ora utilizzare il modello per classificare nuovi messaggi.
# Messaggi di esempio da classificare
new_emails = [
"Congratulations! You've won a $1,000 Walmart gift card. Go to http://spam.com to claim now.",
"Hey, are we still meeting for lunch today?",
]
# Trasformare i nuovi messaggi utilizzando il vettorizzatore addestrato
new_features = vectorizer.transform(new_emails)
# Predire se i messaggi sono spam o ham
predictions = model.predict(new_features)
# Mostrare i risultati
for email, label in zip(new_emails, predictions):
print(f"Messaggio: {email}")
print(f"Classificazione: {'Spam' if label == 1 else 'Ham'}\n")
Miglioramenti
Puoi migliorare il filtro anti-spam in diversi modi:
1. Dataset più ampio: Usa un dataset più rappresentativo del tuo traffico email reale.
2. Pre-elaborazione del testo: Rimuovi stopword, caratteri speciali e normalizza il testo (es. lowercase).
3. **Valutazione avanzata: Utilizza metriche come precisione e richiamo per ottimizzare il modello.
Automazione
Puoi integrare il filtro con la tua casella di posta utilizzando protocolli come IMAP o API per leggere e classificare le email in tempo reale. Consulta [questo articolo](#) per un esempio su come farlo.