Trong thời đại kỹ thuật số hiện nay, email là một trong những phương tiện truyền thông chính. Tuy nhiên, email spam đang trở thành vấn đề nghiêm trọng gây phiền toái và lãng phí thời gian. Việc xây dựng một hệ thống học máy để phân loại email spam không chỉ là một bài toán thực tế hấp dẫn, mà còn là một đồ án học máy cơ bản giúp sinh viên nắm rõ quy trình xử lý ngôn ngữ tự nhiên (NLP), tiền xử lý dữ liệu, và huấn luyện mô hình phân loại.
Bài viết này hướng dẫn bạn xây dựng hệ thống phân loại email spam hoàn chỉnh bằng Python. Nếu bạn đã đọc các bài trước như Tự động tạo mô hình học máy với AutoML, Nhận diện đối tượng bằng YOLOv8 hay Phân tích dữ liệu ngành học và điểm số, thì bài này sẽ giúp bạn rèn luyện khả năng lập trình và ứng dụng kiến thức đó trong xử lý văn bản.
Chuẩn bị dữ liệu và thư viện cần thiết
Để huấn luyện mô hình phát hiện email spam, ta cần một tập dữ liệu đã được gán nhãn gồm hai loại: spam và ham (không phải spam). Dataset rất phổ biến và dễ dùng là SMS Spam Collection – bao gồm hơn 5.000 tin nhắn văn bản được gán nhãn rõ ràng, lý tưởng cho bài toán phân loại.
Bạn có thể tải dataset tại đây:
👉 SMS Spam Collection Dataset on Kaggle
Sau khi tải, bạn cần cài đặt các thư viện xử lý văn bản và học máy:
pip install pandas scikit-learn nltk matplotlib seaborn
Tập dữ liệu có hai cột chính:
-
v1: Nhãn (spam hoặc ham) -
v2: Nội dung tin nhắn văn bản
Sau khi đổi tên lại cột, bạn sẽ tiến hành xử lý ngôn ngữ tự nhiên.
Tiền xử lý văn bản với NLP
Trước khi huấn luyện mô hình, cần làm sạch dữ liệu văn bản. Đây là bước cực kỳ quan trọng trong mọi bài toán NLP. Văn bản thô thường chứa ký tự đặc biệt, stopwords và các từ không mang ý nghĩa.
Các bước xử lý bao gồm:
-
Chuyển văn bản về chữ thường (lowercase)
-
Loại bỏ dấu câu, ký tự đặc biệt
-
Tách từ (tokenization)
-
Loại bỏ từ dừng (stopwords)
-
Lemmatization – đưa từ về gốc ngữ nghĩa
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report, confusion_matrix
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
import string
nltk.download('stopwords')
nltk.download('wordnet')
# Đọc dữ liệu và đổi tên cột
df = pd.read_csv("spam.csv", encoding='latin-1')[['v1', 'v2']]
df.columns = ['label', 'text']
# Làm sạch văn bản
stop_words = set(stopwords.words('english'))
lemmatizer = WordNetLemmatizer()
def clean_text(text):
text = text.lower()
text = ''.join([char for char in text if char not in string.punctuation])
tokens = text.split()
tokens = [lemmatizer.lemmatize(word) for word in tokens if word not in stop_words]
return ' '.join(tokens)
df['cleaned'] = df['text'].apply(clean_text)
Vector hóa dữ liệu và huấn luyện mô hình
Sau khi xử lý xong văn bản, bạn cần biến nó thành dạng vector số học. Đối với bài toán phân loại văn bản, TF-IDF Vectorizer là lựa chọn tốt vì nó đánh giá trọng số từ khóa dựa trên tần suất xuất hiện và tính hiếm.
Mô hình học máy được sử dụng ở đây là Naive Bayes Multinomial – đơn giản, nhanh và hiệu quả cao cho bài toán phân loại văn bản.
# Tách dữ liệu huấn luyện và kiểm tra X_train, X_test, y_train, y_test = train_test_split(df['cleaned'], df['label'], test_size=0.2, random_state=42) # Vector hóa văn bản vectorizer = TfidfVectorizer() X_train_vec = vectorizer.fit_transform(X_train) X_test_vec = vectorizer.transform(X_test) # Huấn luyện mô hình model = MultinomialNB() model.fit(X_train_vec, y_train) # Đánh giá hiệu quả y_pred = model.predict(X_test_vec) print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred))
Triển khai giao diện dòng lệnh đơn giản
Sau khi huấn luyện xong mô hình, bạn có thể viết một hàm đơn giản để phân loại email mới theo input người dùng. Đây là bước quan trọng nếu bạn muốn tích hợp mô hình vào ứng dụng thực tế.
def predict_spam(text):
cleaned = clean_text(text)
vector = vectorizer.transform([cleaned])
result = model.predict(vector)
return result[0]
print(predict_spam(\"Congratulations! You've won a free ticket to Bahamas!\"))
Kết luận
Qua bài viết này, bạn đã thực hiện trọn vẹn một đồ án học máy cơ bản nhưng thiết thực: phân loại email spam. Bạn đã biết cách xử lý văn bản, chuyển sang vector, áp dụng mô hình Naive Bayes và đánh giá kết quả. Đây là bước đệm tốt để bạn làm dashboard Streamlit, hoặc tích hợp hệ thống phát hiện spam vào app Flask.
Nếu muốn tiếp tục nâng cấp, bạn có thể:
-
Dùng mô hình mạnh hơn như SVM hoặc BERT
-
Triển khai bằng Streamlit (giao diện người dùng)
-
Chuyển sang phân loại email thật từ Gmail API

