ngày 27-09-2024
def is_spam(email):spam_keywords = ["giảm giá", "trúng thưởng", "click ngay"]#Nếu email có các từ spam thì trả về True -> email là spamif any(keyword in email.lower() for keyword in spam_keywords):return True#Nếu email có số lượng dấu ! nhiều hơn 3 thì trả về True -> email là spamif email.count("!") > 3:return Truereturn False
data = pd.read_csv('email.csv') # Giả sử dữ liệu email đã gán nhãn được lưu trong file email.csvX = data['email_content'] # Nội dung emaily = data['label'] # Nhãn (spam/không spam)
# gán giá trị cho random_state để có kết quả giống nhau giữa những lần chạyX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# stop_words='english' để sử dụng các hư từ của tiếng Anhtfidf_vectorizer = TfidfVectorizer(stop_words='english')X_train_tfidf = tfidf_vectorizer.fit_transform(X_train)X_test_tfidf = tfidf_vectorizer.transform(X_test)
lr_model = LogisticRegression(random_state=42)lr_model.fit(X_train_tfidf, y_train)
from sklearn.metrics import classification_reportdef evaluate_model(model, X_test, y_test):y_pred = model.predict(X_test)print(classification_report(y_test, y_pred))accuracy = accuracy_score(y_test, y_pred)return accuracylr_accuracy = evaluate_model(lr_model, X_test_tfidf, y_test)print("Logistic Regression Accuracy:", lr_accuracy)
def predict_email(email_content, model, vectorizer):email_tfidf = vectorizer.transform([email_content])prediction = model.predict(email_tfidf)return "Spam" if prediction[0] == 1 else "Not Spam"
import numpy as npimport pandas as pdfrom sklearn.model_selection import train_test_splitfrom tensorflow.keras.preprocessing.text import Tokenizerfrom tensorflow.keras.preprocessing.sequence import pad_sequencesfrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Embedding, LSTM, Dense, Dropoutfrom tensorflow.keras.callbacks import EarlyStopping# Bước 1: Đọc dữ liệudata = pd.read_csv('spam_data.csv') # Giả sử dữ liệu được lưu trong file CSVX = data['email_content'] # Nội dung emaily = data['label'] # Nhãn (spam/không spam)# Bước 2: Chia dữ liệuX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# Bước 3: Tiền xử lý dữ liệu văn bảntokenizer = Tokenizer(num_words=10000) # Số lượng từ tối đa trong từ điểntokenizer.fit_on_texts(X_train)# Token hóa và padding nội dung emailX_train_pad = pad_sequences(tokenizer.texts_to_sequences(X_train), maxlen=200)X_test_pad = pad_sequences(tokenizer.texts_to_sequences(X_test), maxlen=200)# Bước 4: Xây dựng mô hình Deep Learningmodel = Sequential([Embedding(max_words, 100, input_length=max_len),LSTM(128, return_sequences=True),LSTM(64),Dense(64, activation='relu'),Dropout(0.5),Dense(1, activation='sigmoid')])model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])# Bước 5: Huấn luyện mô hìnhhistory = model.fit(X_train_pad, y_train,epochs=10,batch_size=32,validation_split=0.1)# Bước 6: Đánh giá mô hìnhloss, accuracy = model.evaluate(X_test_pad, y_test)print(f"Test Accuracy: {accuracy:.4f}")# Bước 7: Dự đoán email mớidef predict_email(email_content):# Tiền xử lý email mớiemail_pad = pad_sequences(tokenizer.texts_to_sequences([email_content]), maxlen=max_len)# Dự đoánprediction = model.predict(email_pad)return "Spam" if prediction[0][0] > 0.5 else "Not Spam"