Pre-elaborazione
Migliorare le prestazioni del filtro anti-spam. Pre-elaborare il testo prima di addestrare il modello.
Pre-elaborare il testo prima di addestrare il modello
Per migliorare le prestazioni del filtro anti-spam, è essenziale pre-elaborare il testo prima di addestrare il modello.
La pre-elaborazione può includere:
1. Rimozione di stopword: Parole comuni come "il", "e", "di", che non aggiungono significato significativo al modello.
2. Rimozione di caratteri speciali e punteggiatura.
3. Conversione del testo in lowercase: Per rendere il modello insensibile al maiuscolo/minuscolo.
Ecco il codice aggiornato con la pre-elaborazione del testo: ### **Codice Python con Pre-elaborazione del Testo** #### Importare e configurare le librerie necessarie Assicurati di avere le librerie aggiornate e installate:
pip install pandas scikit-learn nltk
Script completo
import pandas as pd
import re
from nltk.corpus import stopwords
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
# Scaricare stopwords di NLTK
import nltk
nltk.download('stopwords')
# Pre-elaborazione del testo
def preprocess_text(text):
# Converti in lowercase
text = text.lower()
# Rimuovi caratteri speciali e numeri
text = re.sub(r'[^a-z\s]', '', text)
# Tokenizza e rimuovi stopword
stop_words = set(stopwords.words("english"))
text = " ".join(word for word in text.split() if word not in stop_words)
return text
# 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"]]
# Convertire le etichette in valori numerici
dataset["label"] = dataset["label"].map({"ham": 0, "spam": 1})
# Applicare la pre-elaborazione del testo
dataset["text"] = dataset["text"].apply(preprocess_text)
# 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)
# 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))
print("Report di classificazione:\n", classification_report(y_test, y_pred))
# Testare nuovi messaggi
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?",
]
# Pre-elaborare i nuovi messaggi
new_emails_processed = [preprocess_text(email) for email in new_emails]
# Trasformare i nuovi messaggi utilizzando il vettorizzatore addestrato
new_features = vectorizer.transform(new_emails_processed)
# 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")