import joblib import gradio as gr import re model = joblib.load("./phishing_model.pkl") vectorizer = joblib.load("./phishing_tfidf_vectorizer.pkl") def text_clean(text): if not isinstance(text, str): return "" text = text.lower() text = re.sub(r"<.*?>", " ", text) text = re.sub(r"https?://\S+|www\.\S+", " url ", text) text = re.sub(r"\b\d{7,}\b", " ", text) text = re.sub(r"[^a-z0-9@.$%\-\s]", " ", text) text = re.sub(r"\s+", " ", text).strip() return text def predict(email): cleaned = text_clean(email) vector = vectorizer.transform([cleaned]) prediction = model.predict(vector)[0] probabilities = model.predict_proba(vector)[0] label = "Phishing" if prediction == 1 else "Legitimate" return ( label, f"{probabilities[prediction] * 100:.2f}%", { "Legitimate": float(probabilities[0]), "Phishing": float(probabilities[1]), }, ) examples = { "Legitimate - Meeting": """Hi Aditya, Can we meet tomorrow at 3 PM to discuss the internship project? Thanks, Rahul""", "Legitimate - GitHub": """GitHub Your pull request has been successfully merged into the main branch. View changes: https://github.com/example/repo""", "Phishing - Bank": """support@secure-bank-login.xyz secure-bank-login.xyz Dear Customer, Your account has been temporarily suspended. Click below immediately to verify your identity. https://secure-bank-login.xyz/login""", "Phishing - PayPal": """service@paypal-security.xyz paypal-security.xyz We've detected unusual activity on your PayPal account. Verify your account within 24 hours or it will be permanently limited. https://paypal-security.xyz""" } def load_example(choice): return examples[choice] with gr.Blocks(title="Email Phishing Detector") as demo: gr.Markdown( """ # Email Phishing Detector Detect whether an email is **Legitimate** or **Phishing** using a Multinomial Naive Bayes model trained on TF-IDF features. """ ) with gr.Row(): with gr.Column(scale=3): email_input = gr.Textbox( label="Email Content", lines=18, placeholder="Paste the complete email here..." ) predict_btn = gr.Button("Predict", variant="primary") with gr.Column(scale=2): prediction = gr.Textbox(label="Prediction") confidence = gr.Textbox(label="Confidence") probabilities = gr.Label(label="Class Probabilities") gr.Markdown("### Try an Example") example_dropdown = gr.Dropdown( choices=list(examples.keys()), value=list(examples.keys())[0], label="Example Emails" ) example_dropdown.change( load_example, inputs=example_dropdown, outputs=email_input ) predict_btn.click( predict, inputs=email_input, outputs=[ prediction, confidence, probabilities ] ) demo.launch()