File size: 7,452 Bytes
f9903ea
9739fd6
 
 
f9903ea
7c483c8
c70917b
9739fd6
 
f9903ea
7c483c8
 
 
 
 
48034cd
7c483c8
 
 
 
 
 
 
 
 
 
48034cd
 
7c483c8
48034cd
 
7d63c56
7c483c8
 
7d63c56
 
f9903ea
7c483c8
bfc5779
 
7c483c8
 
48034cd
 
 
 
 
 
 
 
 
 
 
7c483c8
 
345319f
7c483c8
345319f
7c483c8
 
 
 
 
 
 
 
 
345319f
f9903ea
7c483c8
7d63c56
 
 
 
 
7c483c8
7d63c56
bfc5779
7c483c8
 
 
 
 
 
 
345319f
bfc5779
48034cd
6f7d2fb
 
48034cd
6f7d2fb
48034cd
 
 
 
6f7d2fb
 
 
48034cd
6f7d2fb
48034cd
6f7d2fb
48034cd
 
6f7d2fb
 
48034cd
6f7d2fb
 
48034cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6f7d2fb
 
 
 
48034cd
bfc5779
 
345319f
bfc5779
6f7d2fb
48034cd
b4fad3e
bfc5779
345319f
bfc5779
345319f
48034cd
bfc5779
 
345319f
bfc5779
345319f
48034cd
bfc5779
 
48034cd
 
 
 
 
 
 
 
 
 
 
7d63c56
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import streamlit as st
from transformers import pipeline, AutoModelForSequenceClassification, AutoTokenizer
import torch
import numpy as np

def analyze_email(email_body):
    spam_pipeline = pipeline("text-classification", model="cybersectony/phishing-email-detection-distilbert_v2.4.1")
    sentiment_model = AutoModelForSequenceClassification.from_pretrained("ISOM5240GP4/email_sentiment", num_labels=2)
    tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")

    spam_result = spam_pipeline(email_body)
    spam_label = spam_result[0]["label"]
    spam_confidence = spam_result[0]["score"]

    if spam_label == "LABEL_1":
        return "spam", f"This is a spam email (Confidence: {spam_confidence:.2f}). No follow-up needed."
    else:
        inputs = tokenizer(email_body, padding=True, truncation=True, return_tensors='pt')
        outputs = sentiment_model(**inputs)
        predictions = torch.nn.functional.softmax(outputs.logits, dim=-1)
        predictions = predictions.cpu().detach().numpy()
        sentiment_index = np.argmax(predictions)
        sentiment_confidence = predictions[0][sentiment_index]
        sentiment = "Positive" if sentiment_index == 1 else "Negative"

        if sentiment == "Positive":
            return "positive", (f"This email is not spam (Confidence: {spam_confidence:.2f}).\n"
                                f"Sentiment: {sentiment} (Confidence: {sentiment_confidence:.2f}). No follow-up needed.")
        else:
            return "negative", (f"This email is not spam (Confidence: {spam_confidence:.2f}).\n"
                                f"Sentiment: {sentiment} (Confidence: {sentiment_confidence:.2f}).\n"
                                "**Need to Follow-Up**: This email is not spam and has negative sentiment.")

def main():
    st.title("EmailSentry")
    st.write("Aims to perform analysis on incoming emails and to determine whether there is urgency or higher priority for the company to follow-up.")

    # Initialize session state
    if "email_body" not in st.session_state:
        st.session_state.email_body = ""
    if "result" not in st.session_state:
        st.session_state.result = ""
    if "result_type" not in st.session_state:
        st.session_state.result_type = ""

    # Collapsible instructions
    with st.expander("How to Use", expanded=False):
        st.write("""
        - Type or paste an email into the text box.
        - Alternatively, click one of the sample buttons to load a predefined email.
        - Press 'Analyze Email' to check if it’s spam and analyze its sentiment.
        - Use 'Clear' to reset the input and result.
        """)

    # Text area for email input
    email_body = st.text_area("Email Body", value=st.session_state.email_body, height=200, key="email_input")

    # Sample emails (shortened snippets for button labels)
    sample_spam = """
Subject: Urgent: Verify Your Account Now!
Dear Customer,
We have detected unusual activity on your account. To prevent suspension, please verify your login details immediately by clicking the link below:
[Click Here to Verify](http://totally-legit-site.com/verify)
Failure to verify within 24 hours will result in your account being locked. This is for your security.
Best regards,
The Security Team
    """
    spam_snippet = "Subject: Urgent: Verify Your Account Now! Dear Customer, We have detected unusual activity..."

    sample_not_spam_positive = """
Subject: Great Experience with HKTV Mall!
Dear HKTV Mall Team,
I just received my order #HKTV-123456, and I’m really impressed with the fast delivery and quality of the products! Thanks for making my shopping experience so smooth. Keep up the great work!
Best regards,
Emily
    """
    positive_snippet = "Subject: Great Experience with HKTV Mall! Dear HKTV Mall Team, I just received my order..."

    sample_not_spam_negative = """
Subject: Issue with Recent Delivery
Dear Support,
I received my package today, but it was damaged, and two items were missing. This is really frustrating—please let me know how we can resolve this as soon as possible.
Thanks,
Sarah
    """
    negative_snippet = "Subject: Issue with Recent Delivery Dear Support, I received my package today, but..."

    # Custom CSS for buttons and result boxes
    st.markdown("""
        <style>
        /* Sample buttons (smaller text) */
        div.stButton > button[kind="secondary"] {
            font-size: 12px;
            padding: 5px 10px;
            background-color: #f0f0f0;
            color: #333333;
            border: 1px solid #cccccc;
            border-radius: 3px;
        }
        /* Analyze Email button (larger, orange) */
        div.stButton > button[kind="primary"] {
            background-color: #FF5733;
            color: white;
            font-size: 18px;
            padding: 12px 24px;
            border: none;
            border-radius: 5px;
            margin-right: 10px;
        }
        div.stButton > button[kind="primary"]:hover {
            background-color: #E74C3C;
        }
        /* Clear button (gray) */
        div.stButton > button[kind="secondary"][key="clear"] {
            background-color: #d3d3d3;
            color: #333333;
            font-size: 16px;
            padding: 10px 20px;
            border: none;
            border-radius: 5px;
        }
        div.stButton > button[kind="secondary"][key="clear"]:hover {
            background-color: #b0b0b0;
        }
        /* Result boxes */
        .spam-result {
            background-color: #ffcccc;
            padding: 10px;
            border-radius: 5px;
            border: 1px solid #ff9999;
        }
        .positive-result {
            background-color: #ccffcc;
            padding: 10px;
            border-radius: 5px;
            border: 1px solid #99cc99;
        }
        .negative-result {
            background-color: #fff3cc;
            padding: 10px;
            border-radius: 5px;
            border: 1px solid #ffcc66;
        }
        </style>
    """, unsafe_allow_html=True)

    # Sample buttons (in columns)
    col1, col2, col3 = st.columns(3)
    with col1:
        if st.button(spam_snippet, key="spam_sample"):
            st.session_state.email_body = sample_spam
            st.session_state.result = ""
            st.session_state.result_type = ""
            st.rerun()
    with col2:
        if st.button(positive_snippet, key="positive_sample"):
            st.session_state.email_body = sample_not_spam_positive
            st.session_state.result = ""
            st.session_state.result_type = ""
            st.rerun()
    with col3:
        if st.button(negative_snippet, key="negative_sample"):
            st.session_state.email_body = sample_not_spam_negative
            st.session_state.result = ""
            st.session_state.result_type = ""
            st.rerun()

    # Analyze and Clear buttons (in a row)
    col_analyze, col_clear = st.columns([1, 1])
    with col_analyze:
        if st.button("Analyze Email", key="analyze", type="primary"):
            if email_body:
                with st.spinner("Analyzing email..."):
                    result_type, result = analyze_email(email_body)
                    st.session_state.result = result
                    st.session_state.result_type = result_type
            else:
                st.session_state.result = "Please enter an email body or select a sample to analyze."
                st