Spaces:
Sleeping
Sleeping
Commit
·
1291f7a
1
Parent(s):
d87e64b
Deploy Email Classifier API
Browse files- Dockerfile +30 -0
- Synthetic_Email_Dataset.csv +401 -0
- app.py +339 -0
- deploy.py +310 -0
- requirements.txt +8 -0
- train_model.py +186 -0
Dockerfile
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
FROM python:3.9-slim
|
2 |
+
|
3 |
+
WORKDIR /app
|
4 |
+
|
5 |
+
# Install system dependencies
|
6 |
+
RUN apt-get update && apt-get install -y \
|
7 |
+
build-essential \
|
8 |
+
&& rm -rf /var/lib/apt/lists/*
|
9 |
+
|
10 |
+
# Copy requirements first to leverage Docker cache
|
11 |
+
COPY requirements.txt .
|
12 |
+
|
13 |
+
# Install Python dependencies
|
14 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
15 |
+
|
16 |
+
# Copy application code
|
17 |
+
COPY . .
|
18 |
+
|
19 |
+
# Create directory for model files
|
20 |
+
RUN mkdir -p /app/models
|
21 |
+
|
22 |
+
# Expose port
|
23 |
+
EXPOSE 7860
|
24 |
+
|
25 |
+
# Health check
|
26 |
+
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
|
27 |
+
CMD curl -f http://localhost:7860/health || exit 1
|
28 |
+
|
29 |
+
# Run the application
|
30 |
+
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
|
Synthetic_Email_Dataset.csv
ADDED
@@ -0,0 +1,401 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
label,message,topic,intent,tone
|
2 |
+
0,"Hello, You asked for it, so here is the notes. Warm wishes, David",notes,request,formal
|
3 |
+
1,"Good morning, Just sharing the meeting agenda as requested. Cheers, Anna",document,send attachment,informal
|
4 |
+
1,"Good morning, You asked for it, so here is the resume. Regards, Emily",resume,send attachment,formal
|
5 |
+
0,"Dear team, As discussed, I'm sending the manual. Regards, Emily",manual,inform,informal
|
6 |
+
1,"Hi all,Here are the meeting agenda, as promised. Warm wishes, David",meeting agenda,send attachment,informal
|
7 |
+
1,"Dear team, You asked for it, so here is the technical log. Sincerely, Michael",technical log,send attachment,informal
|
8 |
+
0,"Dear team, Attached is the error log you requested. Warm wishes, David",error log,inform,informal
|
9 |
+
1,"Hi all, Kindly review the attached photos. Thanks, Sarah",photos,send attachment,informal
|
10 |
+
0,"Dear team, Attached is the contract you requested. Cheers, Anna",contract,request,informal
|
11 |
+
0,"Good afternoon, Please find attached the invoice. Sincerely, Michael",personal,request,informal
|
12 |
+
1,"Dear team, Please find attached the report. Thanks, Sarah",report,send attachment,formal
|
13 |
+
1,"Dear Paul, As discussed, I'm sending the presentation slides. Regards, Emily",presentation slides,send attachment,informal
|
14 |
+
1,"Dear Hanna, You asked for it, so here is the itinerary. Regards, Emily",itinerary,send attachment,formal
|
15 |
+
1,"Good morning, Just sharing the data analysis as requested. Best regards, John",data analysis,send attachment,informal
|
16 |
+
0,"Hi, As discussed, I'm sending the presentation slides. Cheers, Anna",presentation slides,request,formal
|
17 |
+
0,"Hi, Just sharing the error log as requested. Sincerely, Michael",error log,request,informal
|
18 |
+
1,"Hi all, Kindly review the attached presentation slides. Regards, Emily",presentation slides,send attachment,informal
|
19 |
+
0,"Good morning, As discussed, I'm sending the manual. Cheers, Anna",manual,request,formal
|
20 |
+
0,"Hi, I've attached the notes for your review. Best regards, John",notes,request,formal
|
21 |
+
1,"Good morning, Please find attached the technical log. Cheers, Anna",technical log,send attachment,informal
|
22 |
+
0,"Hi all, Please find attached the presentation slides. Sincerely, Michael",presentation slides,inform,formal
|
23 |
+
0,"Good afternoon,Here are the photos, as promised. Regards, Emily",photos,request,formal
|
24 |
+
1,"Hi, As discussed, I'm sending the proposal. Warm wishes, David",proposal,send attachment,informal
|
25 |
+
1,"Dear team, I've attached the project plan for your review. Best regards, John",project plan,send attachment,informal
|
26 |
+
1,"Hello,Here are the data analysis, as promised. Warm wishes, David",data analysis,send attachment,informal
|
27 |
+
1,"Hi, I've attached the notes for your review. Warm wishes, David",notes,send attachment,informal
|
28 |
+
1,"Hello,Here are the presentation slides, as promised. Sincerely, Michael",presentation slides,send attachment,informal
|
29 |
+
1,"Hi all, I've attached the brochure for your review. Regards, Emily",brochure,send attachment,informal
|
30 |
+
1,"Hi all, Kindly review the attached photos. Best regards, John",photos,send attachment,formal
|
31 |
+
1,"Good afternoon, Please find attached the itinerary. Thanks, Sarah",itinerary,send attachment,informal
|
32 |
+
1,"Dear team,Here are the presentation slides, as promised. Thanks, Sarah",presentation slides,send attachment,informal
|
33 |
+
0,"Dear Alexa, You asked for it, so here is the invoice. Best regards, John",invoice,request,formal
|
34 |
+
1,"Hello, Just sharing the invoice as requested. Sincerely, Michael",invoice,send attachment,informal
|
35 |
+
0,"Good afternoon, Attached is the meeting agenda you requested. Regards, Emily",meeting agenda,inform,formal
|
36 |
+
1,"Hello,Here are the notes, as promised. Warm wishes, David",itinerary,send attachment,informal
|
37 |
+
0,"Good morning, Just sharing the report as requested. Best regards, John",report,request,informal
|
38 |
+
0,"Dear Haley, As discussed, I'm sending the assignment. Thanks, Sarah",assignment,request,informal
|
39 |
+
1,"Hello, I've attached the notes for your review. Best regards, John",notes,send attachment,informal
|
40 |
+
0,"Good afternoon, Please find attached the resume. Cheers, Anna",resume,request,formal
|
41 |
+
1,"Good afternoon, Just sharing the error log as requested. Sincerely, Michael",project plan,send attachment,informal
|
42 |
+
1,"Hi, Please find attached the manual. Warm wishes, David",manual,send attachment,formal
|
43 |
+
1,"Hello, Kindly review the attached invoice. Cheers, Anna",invoice,send attachment,informal
|
44 |
+
1,"Good morning, As discussed, I'm sending the invoice. Sincerely, Michael",invoice,send attachment,formal
|
45 |
+
1,"Good morning, You asked for it, so here is the technical log. Sincerely, Michael",technical log,send attachment,formal
|
46 |
+
1,"Good morning, I've attached the manual for your review. Warm wishes, David",manual,send attachment,formal
|
47 |
+
0,"Dear Jessica, Attached is the resume you requested. Regards, Emily",resume,request,informal
|
48 |
+
1,"Good morning, Just sharing the invoice as requested. Regards, Emily",invoice,send attachment,informal
|
49 |
+
0,"Hi,Here are the invoice, as promised. Cheers, Anna",invoice,request,informal
|
50 |
+
1,"Good morning, Kindly review the attached error log. Best regards, John",error log,send attachment,informal
|
51 |
+
1,"Hi, Please find attached the meeting agenda. Regards, Emily",spreadsheet,send attachment,informal
|
52 |
+
1,"Dear team, I've attached the error log for your review. Cheers, Anna",error log,send attachment,informal
|
53 |
+
0,"Hi all, I've attached the presentation slides for your review. Regards, Emily",presentation slides,inform,informal
|
54 |
+
1,"Good morning, You asked for it, so here is the report. Thanks, Sarah",report,send attachment,formal
|
55 |
+
1,"Dear team, Please find attached the error log. Warm wishes, David",error log,send attachment,formal
|
56 |
+
0,"Hi, Please find attached the invoice. Best regards, John",invoice,inform,informal
|
57 |
+
0,"Hello, As discussed, I'm sending the invoice. Warm wishes, David",invoice,request,informal
|
58 |
+
1,"Good afternoon, Kindly review the attached spreadsheet. Warm wishes, David",spreadsheet,send attachment,formal
|
59 |
+
1,"Hello, Kindly review the attached manual. Sincerely, Michael",manual,send attachment,formal
|
60 |
+
1,"Dear Mat, You asked for it, so here is the resume. Thanks, Sarah",resume,send attachment,informal
|
61 |
+
0,"Hello, I've attached the invoice for your review. Regards, Emily",invoice,request,formal
|
62 |
+
1,"Dear Anna, As discussed, I'm sending the data analysis. Regards, Emily",data analysis,send attachment,informal
|
63 |
+
1,"Good morning, As discussed, I'm sending the manual. Best regards, John",manual,send attachment,formal
|
64 |
+
0,"Hi, Please find attached the spreadsheet. Warm wishes, David",spreadsheet,inform,formal
|
65 |
+
1,"Hello, Just sharing the notes as requested. Regards, Emily",notes,send attachment,informal
|
66 |
+
1,"Hi all, Just sharing the meeting agenda as requested. Cheers, Anna",meeting agenda,send attachment,formal
|
67 |
+
1,"Good afternoon, Attached is the brochure you requested. Best regards, John",brochure,send attachment,informal
|
68 |
+
1,"Hi, You asked for it, so here is the data analysis. Thanks, Sarah",data analysis,send attachment,formal
|
69 |
+
1,"Dear Kai, Please find attached the technical log. Regards, Emily",technical log,send attachment,informal
|
70 |
+
1,"Hello, Kindly review the attached brochure. Best regards, John",brochure,send attachment,formal
|
71 |
+
1,"Hi, Attached is the manual you requested. Warm wishes, David",manual,send attachment,formal
|
72 |
+
1,"Hi all, Attached is the brochure you requested. Thanks, Sarah",brochure,send attachment,informal
|
73 |
+
0,"Good afternoon, Please find attached the manual. Cheers, Anna",project plan,inform,informal
|
74 |
+
1,"Hello, I've attached the technical log for your review. Warm wishes, David",technical log,send attachment,formal
|
75 |
+
1,"Dear team, Attached is the resume you requested. Cheers, Anna",resume,send attachment,informal
|
76 |
+
1,"Dear Chanyeol, Please find attached the technical log. Sincerely, Michael",update,send attachment,informal
|
77 |
+
1,"Hi all, As discussed, I'm sending the proposal. Regards, Emily",proposal,send attachment,informal
|
78 |
+
1,"Good morning, Kindly review the attached invoice. Sincerely, Michael",invoice,send attachment,formal
|
79 |
+
1,"Hi all, Kindly review the attached presentation slides. Warm wishes, David",presentation slides,send attachment,formal
|
80 |
+
1,"Hi, You asked for it, so here is the meeting agenda. Best regards, John",meeting agenda,send attachment,formal
|
81 |
+
0,"Dear Michale, Just sharing the brochure as requested. Warm wishes, David",brochure,request,formal
|
82 |
+
0,"Hello, As discussed, I'm sending the brochure. Sincerely, Michael",brochure,inform,formal
|
83 |
+
0,"Hi, Just sharing the manual as requested. Thanks, Sarah",manual,inform,formal
|
84 |
+
0,"Dear team,Here are the data analysis, as promised. Warm wishes, David",data analysis,request,formal
|
85 |
+
0,"Dear ,Here are the meeting agenda, as promised. Warm wishes, David",meeting agenda,inform,formal
|
86 |
+
1,"Good afternoon, Attached is the itinerary you requested. Regards, Emily",itinerary,send attachment,informal
|
87 |
+
1,"Dear team, You asked for it, so here is the manual. Regards, Emily",manual,send attachment,formal
|
88 |
+
1,"Hello, Attached is the resume you requested. Sincerely, Michael",resume,send attachment,informal
|
89 |
+
1,"Dear Cur, You asked for it, so here is the itinerary. Best regards, John",itinerary,send attachment,informal
|
90 |
+
1,"Hello, As discussed, I'm sending the technical log. Sincerely, Michael",technical log,send attachment,formal
|
91 |
+
0,"Good morning, You asked for it, so here is the meeting agenda. Best regards, John",meeting agenda,request,informal
|
92 |
+
0,"Good morning,Here are the data analysis, as promised. Best regards, John",brochure,inform,formal
|
93 |
+
1,"Dear , You asked for it, so here is the assignment. Regards, Emily",assignment,send attachment,informal
|
94 |
+
1,"Good afternoon, As discussed, I'm sending the invoice. Thanks, Sarah",contract,send attachment,informal
|
95 |
+
1,"Hi, I've attached the proposal for your review. Regards, Emily",proposal,send attachment,formal
|
96 |
+
0,"Good afternoon, Kindly review the attached assignment. Warm wishes, David",assignment,inform,formal
|
97 |
+
1,"Dear team, I've attached the project plan for your review. Regards, Emily",project plan,send attachment,informal
|
98 |
+
1,"Hi, You asked for it, so here is the spreadsheet. Best regards, John",spreadsheet,send attachment,formal
|
99 |
+
1,"Dear Jes, You asked for it, so here is the technical log. Regards, Emily",technical log,send attachment,informal
|
100 |
+
1,"Good morning, Attached is the photos you requested. Cheers, Anna",photos,send attachment,informal
|
101 |
+
1,"Hi all, Just sharing the report as requested. Best regards, John",personal,send attachment,informal
|
102 |
+
1,"Hi, You asked for it, so here is the proposal. Regards, Emily",manual,send attachment,formal
|
103 |
+
0,"Good afternoon, You asked for it, so here is the manual. Thanks, Sarah",manual,inform,informal
|
104 |
+
1,"Dear Josh, As discussed, I'm sending the invoice. Warm wishes, David",invoice,send attachment,formal
|
105 |
+
1,"Good morning, Kindly review the attached proposal. Sincerely, Michael",assignment,send attachment,formal
|
106 |
+
1,"Hello, Just sharing the brochure as requested. Regards, Emily",brochure,send attachment,formal
|
107 |
+
1,"Good morning, Kindly review the attached itinerary. Sincerely, Michael",itinerary,send attachment,formal
|
108 |
+
1,"Dear team, Kindly review the attached photos. Regards, Emily",photos,send attachment,formal
|
109 |
+
1,"Dear Berlin,Here are the itinerary, as promised. Warm wishes, David",itinerary,send attachment,formal
|
110 |
+
1,"Hi all, Kindly review the attached assignment. Warm wishes, David",assignment,send attachment,informal
|
111 |
+
1,"Hi all, Please find attached the spreadsheet. Thanks, Sarah",spreadsheet,send attachment,formal
|
112 |
+
0,"Good afternoon, As discussed, I'm sending the itinerary. Warm wishes, David",itinerary,request,formal
|
113 |
+
1,"Dear Alex, Attached is the invoice you requested. Thanks, Sarah",invoice,send attachment,formal
|
114 |
+
0,"Hello, You asked for it, so here is the presentation slides. Sincerely, Michael",presentation slides,inform,informal
|
115 |
+
1,"Hello,Here are the project plan, as promised. Best regards, John",update,send attachment,formal
|
116 |
+
1,"Dear Susan, Please find attached the notes. Sincerely, Michael",notes,send attachment,formal
|
117 |
+
1,"Dear , As discussed, I'm sending the photos. Sincerely, Michael",photos,send attachment,formal
|
118 |
+
1,"Hi,Here are the itinerary, as promised. Sincerely, Michael",itinerary,send attachment,formal
|
119 |
+
0,"Dear , Kindly review the attached spreadsheet. Thanks, Sarah",spreadsheet,request,informal
|
120 |
+
1,"Hello, I've attached the spreadsheet for your review. Sincerely, Michael",spreadsheet,send attachment,informal
|
121 |
+
1,"Dear , Attached is the report you requested. Cheers, Anna",report,send attachment,formal
|
122 |
+
1,"Hi, Attached is the brochure you requested. Sincerely, Michael",brochure,send attachment,formal
|
123 |
+
1,"Hello, You asked for it, so here is the presentation slides. Sincerely, Michael",presentation slides,send attachment,informal
|
124 |
+
1,"Good morning, Just sharing the brochure as requested. Best regards, John",brochure,send attachment,informal
|
125 |
+
1,"Hi, Kindly review the attached resume. Thanks, Sarah",resume,send attachment,informal
|
126 |
+
1,"Hi, Attached is the meeting agenda you requested. Warm wishes, David",meeting agenda,send attachment,formal
|
127 |
+
1,"Hello, As discussed, I'm sending the assignment. Sincerely, Michael",assignment,send attachment,informal
|
128 |
+
0,"Hi all, Please find attached the resume. Warm wishes, David",resume,request,formal
|
129 |
+
0,"Hello,Here are the technical log, as promised. Best regards, John",technical log,inform,formal
|
130 |
+
1,"Hi all, Just sharing the manual as requested. Thanks, Sarah",manual,send attachment,informal
|
131 |
+
0,"Good afternoon,Here are the technical log, as promised. Sincerely, Michael",technical log,request,formal
|
132 |
+
1,"Dear , Kindly review the attached contract. Warm wishes, David",contract,send attachment,informal
|
133 |
+
1,"Good afternoon, I've attached the brochure for your review. Regards, Emily",brochure,send attachment,formal
|
134 |
+
1,"Dear team, You asked for it, so here is the notes. Sincerely, Michael",notes,send attachment,formal
|
135 |
+
1,"Good afternoon, I've attached the technical log for your review. Thanks, Sarah",technical log,send attachment,informal
|
136 |
+
1,"Hi all, Kindly review the attached brochure. Best regards, John",brochure,send attachment,informal
|
137 |
+
0,"Hello, Attached is the notes you requested. Regards, Emily",notes,inform,formal
|
138 |
+
1,"Dear , Please find attached the notes. Best regards, John",notes,send attachment,formal
|
139 |
+
1,"Dear team,Here are the notes, as promised. Sincerely, Michael",notes,send attachment,formal
|
140 |
+
1,"Dear team, Just sharing the invoice as requested. Best regards, John",invoice,send attachment,formal
|
141 |
+
1,"Dear team, You asked for it, so here is the photos. Thanks, Sarah",photos,send attachment,informal
|
142 |
+
1,"Dear team, Kindly review the attached manual. Best regards, John",manual,send attachment,informal
|
143 |
+
0,"Hi, Please find attached the resume. Warm wishes, David",resume,request,informal
|
144 |
+
0,"Hello, Just sharing the project plan as requested. Cheers, Anna",project plan,request,formal
|
145 |
+
1,"Hi all, Just sharing the brochure as requested. Warm wishes, David",brochure,send attachment,formal
|
146 |
+
1,"Hello, I've attached the resume for your review. Thanks, Sarah",resume,send attachment,informal
|
147 |
+
1,"Dear , You asked for it, so here is the contract. Warm wishes, David",contract,send attachment,formal
|
148 |
+
1,"Hi all,Here are the meeting agenda, as promised. Warm wishes, David",meeting agenda,send attachment,formal
|
149 |
+
0,"Good morning,Here are the notes, as promised. Regards, Emily",notes,inform,formal
|
150 |
+
1,"Dear , I've attached the resume for your review. Best regards, John",resume,send attachment,informal
|
151 |
+
0,"Hello, Kindly review the attached report. Sincerely, Michael",report,request,informal
|
152 |
+
1,"Hi, I've attached the error log for your review. Cheers, Anna",error log,send attachment,informal
|
153 |
+
1,"Hi all, Attached is the data analysis you requested. Sincerely, Michael",data analysis,send attachment,informal
|
154 |
+
0,"Dear , As discussed, I'm sending the assignment. Warm wishes, David",assignment,inform,informal
|
155 |
+
0,"Good afternoon, Please find attached the meeting agenda. Thanks, Sarah",meeting agenda,inform,informal
|
156 |
+
1,"Good afternoon, You asked for it, so here is the assignment. Best regards, John",assignment,send attachment,informal
|
157 |
+
1,"Good morning, You asked for it, so here is the presentation slides. Sincerely, Michael",presentation slides,send attachment,formal
|
158 |
+
1,"Hi, You asked for it, so here is the meeting agenda. Cheers, Anna",meeting agenda,send attachment,informal
|
159 |
+
1,"Good afternoon, Attached is the contract you requested. Warm wishes, David",contract,send attachment,informal
|
160 |
+
1,"Dear , Attached is the spreadsheet you requested. Thanks, Sarah",spreadsheet,send attachment,formal
|
161 |
+
1,"Hi all, You asked for it, so here is the itinerary. Sincerely, Michael",itinerary,send attachment,formal
|
162 |
+
1,"Good afternoon, Please find attached the meeting agenda. Warm wishes, David",meeting agenda,send attachment,informal
|
163 |
+
1,"Hi all,Here are the data analysis, as promised. Best regards, John",data analysis,send attachment,formal
|
164 |
+
1,"Hello,Here are the technical log, as promised. Regards, Emily",technical log,send attachment,formal
|
165 |
+
0,"Hi all, I've attached the notes for your review. Warm wishes, David",assignment,inform,informal
|
166 |
+
1,"Good afternoon, As discussed, I'm sending the error log. Cheers, Anna",error log,send attachment,formal
|
167 |
+
1,"Good morning,Here are the photos, as promised. Regards, Emily",photos,send attachment,informal
|
168 |
+
1,"Dear team,Here are the spreadsheet, as promised. Best regards, John",spreadsheet,send attachment,informal
|
169 |
+
1,"Good morning, Kindly review the attached itinerary. Thanks, Sarah",itinerary,send attachment,informal
|
170 |
+
1,"Good afternoon, You asked for it, so here is the presentation slides. Thanks, Sarah",presentation slides,send attachment,formal
|
171 |
+
1,"Hi all, Attached is the meeting agenda you requested. Thanks, Sarah",spreadsheet,send attachment,informal
|
172 |
+
1,"Dear , You asked for it, so here is the proposal. Warm wishes, David",proposal,send attachment,informal
|
173 |
+
1,"Hi all, You asked for it, so here is the technical log. Regards, Emily",technical log,send attachment,informal
|
174 |
+
1,"Hello, I've attached the brochure for your review. Regards, Emily",brochure,send attachment,formal
|
175 |
+
1,"Hi all, Kindly review the attached resume. Regards, Emily",resume,send attachment,informal
|
176 |
+
1,"Dear , Just sharing the spreadsheet as requested. Regards, Emily",spreadsheet,send attachment,formal
|
177 |
+
1,"Hi all, You asked for it, so here is the report. Regards, Emily",report,send attachment,formal
|
178 |
+
1,"Dear , Attached is the photos you requested. Warm wishes, David",photos,send attachment,informal
|
179 |
+
0,"Dear team, I've attached the presentation slides for your review. Thanks, Sarah",presentation slides,inform,informal
|
180 |
+
1,"Dear , Just sharing the report as requested. Thanks, Sarah",report,send attachment,informal
|
181 |
+
1,"Good afternoon, Just sharing the proposal as requested. Best regards, John",proposal,send attachment,informal
|
182 |
+
1,"Hello, Please find attached the presentation slides. Thanks, Sarah",presentation slides,send attachment,informal
|
183 |
+
1,"Dear , I've attached the notes for your review. Cheers, Anna",technical log,send attachment,formal
|
184 |
+
1,"Good afternoon, Attached is the report you requested. Cheers, Anna",report,send attachment,informal
|
185 |
+
1,"Hi all, Kindly review the attached proposal. Warm wishes, David",proposal,send attachment,formal
|
186 |
+
1,"Hi all, Kindly review the attached contract. Warm wishes, David",project plan,send attachment,formal
|
187 |
+
1,"Dear team, As discussed, I'm sending the notes. Thanks, Sarah",notes,send attachment,formal
|
188 |
+
1,"Hello, I've attached the proposal for your review. Cheers, Anna",proposal,send attachment,formal
|
189 |
+
1,"Hello, Attached is the spreadsheet you requested. Best regards, John",spreadsheet,send attachment,formal
|
190 |
+
0,"Dear team, You asked for it, so here is the presentation slides. Cheers, Anna",presentation slides,request,formal
|
191 |
+
1,"Good afternoon, As discussed, I'm sending the data analysis. Thanks, Sarah",data analysis,send attachment,informal
|
192 |
+
1,"Dear team, Just sharing the manual as requested. Thanks, Sarah",manual,send attachment,informal
|
193 |
+
1,"Hi all, Please find attached the assignment. Cheers, Anna",assignment,send attachment,formal
|
194 |
+
1,"Hi, Please find attached the itinerary. Sincerely, Michael",itinerary,send attachment,informal
|
195 |
+
1,"Hi all, Attached is the technical log you requested. Sincerely, Michael",technical log,send attachment,formal
|
196 |
+
1,"Hello, You asked for it, so here is the report. Regards, Emily",report,send attachment,formal
|
197 |
+
0,"Dear team, Just sharing the resume as requested. Thanks, Sarah",resume,inform,formal
|
198 |
+
1,"Hi,Here are the manual, as promised. Cheers, Anna",manual,send attachment,formal
|
199 |
+
1,"Good afternoon, Please find attached the presentation slides. Regards, Emily",spreadsheet,send attachment,informal
|
200 |
+
0,"Good morning,Here are the assignment, as promised. Regards, Emily",assignment,request,informal
|
201 |
+
1,"Good afternoon, I've attached the presentation slides for your review. Cheers, Anna",presentation slides,send attachment,informal
|
202 |
+
0,"Hi all, Please find attached the technical log. Thanks, Sarah",technical log,request,formal
|
203 |
+
0,"Good afternoon, Kindly review the attached contract. Cheers, Anna",contract,inform,formal
|
204 |
+
1,"Dear , Just sharing the data analysis as requested. Warm wishes, David",data analysis,send attachment,formal
|
205 |
+
1,"Hi, You asked for it, so here is the contract. Warm wishes, David",contract,send attachment,informal
|
206 |
+
1,"Good afternoon, You asked for it, so here is the resume. Sincerely, Michael",resume,send attachment,formal
|
207 |
+
1,"Good afternoon, I've attached the report for your review. Thanks, Sarah",report,send attachment,formal
|
208 |
+
1,"Good morning, Please find attached the notes. Regards, Emily",notes,send attachment,formal
|
209 |
+
1,"Good morning, Just sharing the technical log as requested. Regards, Emily",brochure,send attachment,formal
|
210 |
+
0,"Hi, I've attached the technical log for your review. Warm wishes, David",technical log,request,informal
|
211 |
+
1,"Good morning, Kindly review the attached itinerary. Cheers, Anna",itinerary,send attachment,informal
|
212 |
+
1,"Dear , Attached is the resume you requested. Warm wishes, David",resume,send attachment,informal
|
213 |
+
1,"Hello,Here are the manual, as promised. Best regards, John",manual,send attachment,informal
|
214 |
+
0,"Dear team, Attached is the manual you requested. Sincerely, Michael",manual,request,informal
|
215 |
+
1,"Good morning, Kindly review the attached meeting agenda. Cheers, Anna",meeting agenda,send attachment,formal
|
216 |
+
0,"Dear team, Please find attached the report. Best regards, John",report,inform,informal
|
217 |
+
0,"Dear team, I've attached the itinerary for your review. Best regards, John",itinerary,inform,formal
|
218 |
+
0,"Hello, Attached is the contract you requested. Sincerely, Michael",contract,inform,formal
|
219 |
+
1,"Hi all,Here are the meeting agenda, as promised. Warm wishes, David",meeting agenda,send attachment,informal
|
220 |
+
1,"Dear , You asked for it, so here is the manual. Cheers, Anna",manual,send attachment,formal
|
221 |
+
0,"Dear , Please find attached the assignment. Best regards, John",brochure,request,formal
|
222 |
+
1,"Hi, Please find attached the manual. Warm wishes, David",manual,send attachment,informal
|
223 |
+
1,"Hello, As discussed, I'm sending the data analysis. Regards, Emily",data analysis,send attachment,formal
|
224 |
+
0,"Hi, As discussed, I'm sending the assignment. Thanks, Sarah",assignment,request,informal
|
225 |
+
0,"Hi all, Attached is the itinerary you requested. Sincerely, Michael",itinerary,inform,formal
|
226 |
+
1,"Good afternoon, Attached is the presentation slides you requested. Cheers, Anna",presentation slides,send attachment,formal
|
227 |
+
1,"Dear team, As discussed, I'm sending the invoice. Warm wishes, David",invoice,send attachment,informal
|
228 |
+
1,"Hi, Please find attached the itinerary. Cheers, Anna",itinerary,send attachment,formal
|
229 |
+
0,"Hello, Please find attached the notes. Thanks, Sarah",notes,inform,formal
|
230 |
+
1,"Hello, As discussed, I'm sending the photos. Warm wishes, David",photos,send attachment,informal
|
231 |
+
1,"Good morning, Attached is the error log you requested. Sincerely, Michael",error log,send attachment,formal
|
232 |
+
1,"Dear , Kindly review the attached manual. Warm wishes, David",manual,send attachment,formal
|
233 |
+
1,"Good morning, Attached is the photos you requested. Thanks, Sarah",photos,send attachment,formal
|
234 |
+
1,"Dear , Kindly review the attached error log. Thanks, Sarah",error log,send attachment,formal
|
235 |
+
1,"Dear team, Attached is the itinerary you requested. Thanks, Sarah",itinerary,send attachment,formal
|
236 |
+
0,"Hello, Attached is the technical log you requested. Cheers, Anna",technical log,inform,informal
|
237 |
+
1,"Hello,Here are the resume, as promised. Best regards, John",resume,send attachment,formal
|
238 |
+
1,"Good morning,Here are the spreadsheet, as promised. Thanks, Sarah",spreadsheet,send attachment,formal
|
239 |
+
0,"Hi, I've attached the technical log for your review. Thanks, Sarah",technical log,inform,formal
|
240 |
+
0,"Hi all, Kindly review the attached error log. Best regards, John",error log,request,formal
|
241 |
+
1,"Hello, Please find attached the resume. Cheers, Anna",resume,send attachment,formal
|
242 |
+
1,"Dear , Just sharing the assignment as requested. Cheers, Anna",assignment,send attachment,informal
|
243 |
+
0,"Dear , As discussed, I'm sending the resume. Best regards, John",resume,request,formal
|
244 |
+
0,"Dear team, I've attached the spreadsheet for your review. Best regards, John",spreadsheet,inform,informal
|
245 |
+
1,"Dear , As discussed, I'm sending the brochure. Regards, Emily",brochure,send attachment,formal
|
246 |
+
1,"Dear , Attached is the invoice you requested. Sincerely, Michael",invoice,send attachment,formal
|
247 |
+
1,"Good morning, Kindly review the attached itinerary. Cheers, Anna",itinerary,send attachment,formal
|
248 |
+
1,"Dear team, Please find attached the assignment. Sincerely, Michael",assignment,send attachment,informal
|
249 |
+
0,"Hello, I've attached the report for your review. Sincerely, Michael",report,request,informal
|
250 |
+
0,"Dear , Just sharing the assignment as requested. Best regards, John",assignment,request,informal
|
251 |
+
1,"Dear team, Please find attached the report. Thanks, Sarah",report,send attachment,formal
|
252 |
+
0,"Good morning,Here are the contract, as promised. Regards, Emily",contract,inform,informal
|
253 |
+
1,"Dear team, Please find attached the spreadsheet. Warm wishes, David",spreadsheet,send attachment,informal
|
254 |
+
1,"Hi all, As discussed, I'm sending the spreadsheet. Thanks, Sarah",spreadsheet,send attachment,informal
|
255 |
+
1,"Dear team,Here are the data analysis, as promised. Best regards, John",data analysis,send attachment,informal
|
256 |
+
1,"Good morning, Kindly review the attached photos. Sincerely, Michael",photos,send attachment,informal
|
257 |
+
1,"Good morning, I've attached the contract for your review. Thanks, Sarah",contract,send attachment,formal
|
258 |
+
1,"Hi, Just sharing the invoice as requested. Cheers, Anna",invoice,send attachment,informal
|
259 |
+
0,"Hello, Just sharing the proposal as requested. Cheers, Anna",proposal,request,informal
|
260 |
+
1,"Good afternoon,Here are the invoice, as promised. Best regards, John",invoice,send attachment,informal
|
261 |
+
0,"Dear , Just sharing the resume as requested. Cheers, Anna",resume,inform,formal
|
262 |
+
0,"Dear team, You asked for it, so here is the proposal. Cheers, Anna",proposal,request,informal
|
263 |
+
0,"Hello, Attached is the assignment you requested. Thanks, Sarah",assignment,inform,formal
|
264 |
+
0,"Hi all,Here are the invoice, as promised. Regards, Emily",invoice,request,formal
|
265 |
+
0,"Good morning, You asked for it, so here is the notes. Warm wishes, David",notes,request,formal
|
266 |
+
0,"Hi all, Please find attached the presentation slides. Warm wishes, David",presentation slides,request,informal
|
267 |
+
0,"Good morning, You asked for it, so here is the itinerary. Best regards, John",itinerary,request,informal
|
268 |
+
1,"Good afternoon, You asked for it, so here is the proposal. Sincerely, Michael",presentation slides,send attachment,informal
|
269 |
+
1,"Good afternoon, Kindly review the attached photos. Cheers, Anna",photos,send attachment,informal
|
270 |
+
0,"Dear team, Just sharing the meeting agenda as requested. Warm wishes, David",meeting agenda,inform,formal
|
271 |
+
0,"Hello, Please find attached the data analysis. Thanks, Sarah",data analysis,inform,formal
|
272 |
+
1,"Good morning, Please find attached the resume. Best regards, John",meeting agenda,send attachment,informal
|
273 |
+
0,"Good afternoon,Here are the technical log, as promised. Sincerely, Michael",technical log,request,informal
|
274 |
+
0,"Hello, You asked for it, so here is the meeting agenda. Sincerely, Michael",meeting agenda,request,formal
|
275 |
+
1,"Hi all, Attached is the project plan you requested. Warm wishes, David",project plan,send attachment,formal
|
276 |
+
1,"Hi all, Please find attached the resume. Warm wishes, David",resume,send attachment,formal
|
277 |
+
1,"Hi, Kindly review the attached photos. Sincerely, Michael",photos,send attachment,informal
|
278 |
+
1,"Good afternoon, Kindly review the attached presentation slides. Thanks, Sarah",presentation slides,send attachment,informal
|
279 |
+
1,"Hi all, As discussed, I'm sending the contract. Cheers, Anna",contract,send attachment,informal
|
280 |
+
0,"Good afternoon, Please find attached the technical log. Sincerely, Michael",technical log,request,formal
|
281 |
+
0,"Hi all, Please find attached the itinerary. Best regards, John",itinerary,request,informal
|
282 |
+
1,"Hello,Here are the report, as promised. Sincerely, Michael",report,send attachment,formal
|
283 |
+
1,"Hello, As discussed, I'm sending the assignment. Warm wishes, David",assignment,send attachment,informal
|
284 |
+
1,"Hi all, I've attached the technical log for your review. Regards, Emily",technical log,send attachment,formal
|
285 |
+
0,"Good afternoon, Attached is the notes you requested. Regards, Emily",notes,inform,informal
|
286 |
+
1,"Hello, You asked for it, so here is the invoice. Warm wishes, David",invoice,send attachment,formal
|
287 |
+
0,"Dear team,Here are the itinerary, as promised. Warm wishes, David",itinerary,inform,informal
|
288 |
+
1,"Hi all,Here are the brochure, as promised. Sincerely, Michael",brochure,send attachment,formal
|
289 |
+
1,"Dear team,Here are the invoice, as promised. Thanks, Sarah",invoice,send attachment,informal
|
290 |
+
1,"Hi, You asked for it, so here is the invoice. Thanks, Sarah",invoice,send attachment,informal
|
291 |
+
1,"Hello, As discussed, I'm sending the manual. Thanks, Sarah",manual,send attachment,formal
|
292 |
+
0,"Good afternoon,Here are the spreadsheet, as promised. Best regards, John",spreadsheet,inform,formal
|
293 |
+
0,"Dear Rio, You asked for it, so here is the contract. Best regards, John",contract,inform,formal
|
294 |
+
1,"Hi, Attached is the presentation slides you requested. Cheers, Anna",presentation slides,send attachment,informal
|
295 |
+
1,"Good morning, Kindly review the attached notes. Best regards, John",notes,send attachment,formal
|
296 |
+
1,"Dear team, You asked for it, so here is the notes. Cheers, Anna",proposal,send attachment,formal
|
297 |
+
1,"Good afternoon, As discussed, I'm sending the project plan. Best regards, John",project plan,send attachment,formal
|
298 |
+
0,"Good afternoon, You asked for it, so here is the resume. Best regards, John",resume,request,formal
|
299 |
+
1,"Good morning,Here are the itinerary, as promised. Regards, Emily",itinerary,send attachment,formal
|
300 |
+
1,"Dear Domic, Kindly review the attached notes. Regards, Emily",notes,send attachment,informal
|
301 |
+
1,"Hello, Attached is the error log you requested. Sincerely, Michael",error log,send attachment,formal
|
302 |
+
1,"Good afternoon, You asked for it, so here is the brochure. Sincerely, Michael",brochure,send attachment,informal
|
303 |
+
0,"Hi all, Just sharing the spreadsheet as requested. Sincerely, Michael",spreadsheet,inform,informal
|
304 |
+
0,"Good afternoon,Here are the proposal, as promised. Thanks, Sarah",proposal,inform,informal
|
305 |
+
0,"Good morning, I've attached the data analysis for your review. Cheers, Anna",data analysis,inform,formal
|
306 |
+
1,"Hi, Just sharing the presentation slides as requested. Sincerely, Michael",presentation slides,send attachment,formal
|
307 |
+
1,"Hi, I've attached the manual for your review. Sincerely, Michael",manual,send attachment,formal
|
308 |
+
0,"Hi, Just sharing the assignment as requested. Regards, Emily",assignment,inform,informal
|
309 |
+
1,"Hi, Just sharing the project plan as requested. Thanks, Sarah",project plan,send attachment,formal
|
310 |
+
1,"Hi, As discussed, I'm sending the proposal. Cheers, Anna",proposal,send attachment,informal
|
311 |
+
0,"Hi all, Attached is the notes you requested. Thanks, Sarah",notes,request,informal
|
312 |
+
0,"Dear ,Here are the invoice, as promised. Thanks, Sarah",invoice,inform,formal
|
313 |
+
1,"Good morning,Here are the invoice, as promised. Warm wishes, David",invoice,send attachment,formal
|
314 |
+
1,"Good afternoon, You asked for it, so here is the assignment. Warm wishes, David",itinerary,send attachment,formal
|
315 |
+
0,"Hi all, Attached is the notes you requested. Thanks, Sarah",notes,inform,formal
|
316 |
+
0,"Good morning, Kindly review the attached manual. Regards, Emily",manual,inform,formal
|
317 |
+
1,"Hello, Kindly review the attached contract. Warm wishes, David",contract,send attachment,informal
|
318 |
+
1,"Dear team, As discussed, I'm sending the contract. Cheers, Anna",contract,send attachment,formal
|
319 |
+
1,"Hi all, I've attached the meeting agenda for your review. Warm wishes, David",document,send attachment,formal
|
320 |
+
1,"Hi, Kindly review the attached photos. Best regards, John",photos,send attachment,formal
|
321 |
+
1,"Hi, As discussed, I'm sending the error log. Best regards, John",error log,send attachment,formal
|
322 |
+
0,"Dear team, I've attached the data analysis for your review. Best regards, John",data analysis,request,informal
|
323 |
+
0,"Dear team, Just sharing the data analysis as requested. Thanks, Sarah",data analysis,inform,formal
|
324 |
+
1,"Hi, Please find attached the report. Best regards, John",report,send attachment,informal
|
325 |
+
0,"Hi all, As discussed, I'm sending the spreadsheet. Cheers, Anna",spreadsheet,request,formal
|
326 |
+
0,"Dear , Please find attached the presentation slides. Cheers, Anna",presentation slides,request,informal
|
327 |
+
1,"Hello, You asked for it, so here is the itinerary. Best regards, John",itinerary,send attachment,informal
|
328 |
+
1,"Dear Mic, Just sharing the itinerary as requested. Thanks, Sarah",itinerary,send attachment,informal
|
329 |
+
1,"Good afternoon,Here are the assignment, as promised. Cheers, Anna",assignment,send attachment,informal
|
330 |
+
0,"Hello, Attached is the project plan you requested. Best regards, John",project plan,request,informal
|
331 |
+
1,"Dear Cheerish, I've attached the spreadsheet for your review. Sincerely, Michael",spreadsheet,send attachment,informal
|
332 |
+
0,"Dear Bill, As discussed, I'm sending the report. Regards, Emily",report,inform,informal
|
333 |
+
0,"Dear team, I've attached the contract for your review. Thanks, Sarah",contract,request,informal
|
334 |
+
1,"Hello, Just sharing the brochure as requested. Cheers, Anna",brochure,send attachment,informal
|
335 |
+
1,"Dear Lana, You asked for it, so here is the error log. Warm wishes, David",error log,send attachment,formal
|
336 |
+
0,"Hi all, Please find attached the manual. Best regards, John",manual,inform,informal
|
337 |
+
0,"Dear Taylor, Attached is the itinerary you requested. Thanks, Sarah",itinerary,request,informal
|
338 |
+
0,"Hello, Attached is the contract you requested. Best regards, John",contract,inform,informal
|
339 |
+
0,"Good morning, You asked for it, so here is the data analysis. Warm wishes, David",data analysis,inform,informal
|
340 |
+
1,"Dear team, Attached is the technical log you requested. Regards, Emily",manual,send attachment,informal
|
341 |
+
1,"Good morning, Kindly review the attached project plan. Regards, Emily",project plan,send attachment,formal
|
342 |
+
0,"Dear Justin, You asked for it, so here is the resume. Cheers, Anna",resume,inform,informal
|
343 |
+
1,"Good afternoon,Here are the assignment, as promised. Regards, Emily",assignment,send attachment,formal
|
344 |
+
1,"Hi, You asked for it, so here is the invoice. Best regards, John",invoice,send attachment,informal
|
345 |
+
1,"Good afternoon,Here are the photos, as promised. Sincerely, Michael",itinerary,send attachment,informal
|
346 |
+
0,"Hi, Just sharing the notes as requested. Warm wishes, David",notes,request,informal
|
347 |
+
0,"Dear Weekend, Kindly review the attached proposal. Thanks, Sarah",proposal,request,informal
|
348 |
+
0,"Good morning, You asked for it, so here is the assignment. Regards, Emily",assignment,inform,formal
|
349 |
+
1,"Hi all, Just sharing the resume as requested. Regards, Emily",resume,send attachment,formal
|
350 |
+
0,"Good morning, Kindly review the attached manual. Regards, Emily",manual,request,informal
|
351 |
+
0,"Hi all, Attached is the technical log you requested. Warm wishes, David",technical log,inform,formal
|
352 |
+
1,"Good morning, I've attached the spreadsheet for your review. Regards, Emily",spreadsheet,send attachment,formal
|
353 |
+
0,"Good afternoon, As discussed, I'm sending the proposal. Thanks, Sarah",proposal,inform,formal
|
354 |
+
1,"Dear Bernard, Kindly review the attached notes. Sincerely, Michael",notes,send attachment,informal
|
355 |
+
1,"Good morning, Kindly review the attached invoice. Regards, Emily",invoice,send attachment,informal
|
356 |
+
1,"Hi all, Kindly review the attached meeting agenda. Sincerely, Michael",meeting agenda,send attachment,informal
|
357 |
+
1,"Hi, Just sharing the contract as requested. Best regards, John",contract,send attachment,formal
|
358 |
+
0,"Hi all, As discussed, I'm sending the report. Warm wishes, David",report,inform,formal
|
359 |
+
0,"Good morning, You asked for it, so here is the project plan. Sincerely, Michael",project plan,inform,formal
|
360 |
+
0,"Dear team, Just sharing the assignment as requested. Thanks, Sarah",assignment,inform,informal
|
361 |
+
1,"Good afternoon, Kindly review the attached proposal. Warm wishes, David",proposal,send attachment,informal
|
362 |
+
0,"Dear Joe, Just sharing the manual as requested. Warm wishes, David",manual,request,informal
|
363 |
+
0,"Dear Josh, Kindly review the attached data analysis. Sincerely, Michael",data analysis,inform,informal
|
364 |
+
1,"Hi, I've attached the report for your review. Thanks, Sarah",report,send attachment,informal
|
365 |
+
1,"Hi, I've attached the project plan for your review. Best regards, John",project plan,send attachment,formal
|
366 |
+
0,"Hi, You asked for it, so here is the assignment. Cheers, Anna",assignment,inform,informal
|
367 |
+
1,"Good afternoon,Here are the contract, as promised. Best regards, John",contract,send attachment,informal
|
368 |
+
0,"Hi, Just sharing the notes as requested. Thanks, Sarah",notes,request,formal
|
369 |
+
1,"Hello, You asked for it, so here is the photos. Thanks, Sarah",spreadsheet,send attachment,formal
|
370 |
+
1,"Hi all, Kindly review the attached brochure. Thanks, Sarah",brochure,send attachment,formal
|
371 |
+
0,"Dear Jolie, I've attached the assignment for your review. Sincerely, Michael",project plan,inform,informal
|
372 |
+
1,"Dear William, Please find attached the data analysis. Thanks, Sarah",data analysis,send attachment,formal
|
373 |
+
0,"Good morning, You asked for it, so here is the meeting agenda. Regards, Emily",meeting agenda,inform,informal
|
374 |
+
1,"Hello, As discussed, I'm sending the invoice. Sincerely, Michael",invoice,send attachment,informal
|
375 |
+
1,"Dear Will,Here are the itinerary, as promised. Regards, Emily",itinerary,send attachment,formal
|
376 |
+
1,"Hello, As discussed, I'm sending the photos. Best regards, John",photos,send attachment,informal
|
377 |
+
1,"Hi, Just sharing the meeting agenda as requested. Best regards, John",meeting agenda,send attachment,formal
|
378 |
+
1,"Hi all,Here are the presentation slides, as promised. Regards, Emily",presentation slides,send attachment,informal
|
379 |
+
1,"Hi, You asked for it, so here is the spreadsheet. Thanks, Sarah",spreadsheet,send attachment,informal
|
380 |
+
1,"Hi all, Please find attached the resume. Sincerely, Michael",technical log,send attachment,formal
|
381 |
+
1,"Hi, Please find attached the itinerary. Cheers, Anna",itinerary,send attachment,formal
|
382 |
+
1,"Dear team,Here are the assignment, as promised. Best regards, John",assignment,send attachment,formal
|
383 |
+
0,"Hi all, You asked for it, so here is the meeting agenda. Regards, Emily",meeting agenda,inform,informal
|
384 |
+
1,"Dear team, Attached is the manual you requested. Sincerely, Michael",manual,send attachment,informal
|
385 |
+
1,"Good morning, Please find attached the resume. Regards, Emily",resume,send attachment,formal
|
386 |
+
1,"Good morning, You asked for it, so here is the notes. Warm wishes, David",notes,send attachment,informal
|
387 |
+
0,"Dear Jas, Please find attached the technical log. Sincerely, Michael",technical log,request,formal
|
388 |
+
0,"Dear team, You asked for it, so here is the report. Warm wishes, David",report,request,informal
|
389 |
+
1,"Dear Leo, As discussed, I'm sending the data analysis. Sincerely, Michael",data analysis,send attachment,informal
|
390 |
+
1,"Dear Lio, Attached is the spreadsheet you requested. Thanks, Sarah",spreadsheet,send attachment,formal
|
391 |
+
1,"Hi all, As discussed, I'm sending the presentation slides. Cheers, Anna",presentation slides,send attachment,informal
|
392 |
+
1,"Hi, Attached is the brochure you requested. Best regards, John",brochure,send attachment,informal
|
393 |
+
1,"Hello, As discussed, I'm sending the presentation slides. Regards, Emily",presentation slides,send attachment,informal
|
394 |
+
0,"Hi, Please find attached the project plan. Warm wishes, David",project plan,inform,formal
|
395 |
+
0,"Good afternoon,Here are the photos, as promised. Best regards, John",photos,inform,formal
|
396 |
+
1,"Good afternoon, As discussed, I'm sending the brochure. Regards, Emily",brochure,send attachment,formal
|
397 |
+
1,"Dear Nah, Please find attached the manual. Best regards, John",manual,send attachment,informal
|
398 |
+
0,"Hello, Kindly review the attached assignment. Thanks, Sarah",assignment,request,informal
|
399 |
+
1,"Hello, Please find attached the photos. Warm wishes, David",photos,send attachment,formal
|
400 |
+
1,"Dear Nick, Please find attached the project plan. Cheers, Anna",project plan,send attachment,formal
|
401 |
+
1,"Hi, Attached is the contract you requested. Best regards, John",contract,send attachment,formal
|
app.py
ADDED
@@ -0,0 +1,339 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from fastapi import FastAPI, HTTPException
|
2 |
+
from fastapi.middleware.cors import CORSMiddleware
|
3 |
+
from fastapi.responses import HTMLResponse
|
4 |
+
from pydantic import BaseModel
|
5 |
+
import joblib
|
6 |
+
import pandas as pd
|
7 |
+
import numpy as np
|
8 |
+
from sklearn.feature_extraction.text import TfidfVectorizer
|
9 |
+
from sklearn.naive_bayes import MultinomialNB
|
10 |
+
from sklearn.pipeline import Pipeline
|
11 |
+
from sklearn.model_selection import train_test_split
|
12 |
+
from sklearn.metrics import classification_report, accuracy_score
|
13 |
+
import re
|
14 |
+
import os
|
15 |
+
from typing import List, Dict, Any
|
16 |
+
import logging
|
17 |
+
|
18 |
+
# Configure logging
|
19 |
+
logging.basicConfig(level=logging.INFO)
|
20 |
+
logger = logging.getLogger(__name__)
|
21 |
+
|
22 |
+
# Initialize FastAPI app
|
23 |
+
app = FastAPI(
|
24 |
+
title="Email Attachment Classifier API",
|
25 |
+
description="API to classify whether an email has attachments or not using Naive Bayes",
|
26 |
+
version="1.0.0",
|
27 |
+
docs_url="/docs",
|
28 |
+
redoc_url="/redoc"
|
29 |
+
)
|
30 |
+
|
31 |
+
# Add CORS middleware
|
32 |
+
app.add_middleware(
|
33 |
+
CORSMiddleware,
|
34 |
+
allow_origins=["*"],
|
35 |
+
allow_credentials=True,
|
36 |
+
allow_methods=["*"],
|
37 |
+
allow_headers=["*"],
|
38 |
+
)
|
39 |
+
|
40 |
+
# Pydantic models
|
41 |
+
class EmailInput(BaseModel):
|
42 |
+
message: str
|
43 |
+
|
44 |
+
class EmailBatchInput(BaseModel):
|
45 |
+
messages: List[str]
|
46 |
+
|
47 |
+
class PredictionResponse(BaseModel):
|
48 |
+
message: str
|
49 |
+
prediction: int
|
50 |
+
prediction_label: str
|
51 |
+
confidence: float
|
52 |
+
probabilities: Dict[str, float]
|
53 |
+
|
54 |
+
class BatchPredictionResponse(BaseModel):
|
55 |
+
predictions: List[PredictionResponse]
|
56 |
+
|
57 |
+
class ModelInfo(BaseModel):
|
58 |
+
model_type: str
|
59 |
+
accuracy: float
|
60 |
+
feature_count: int
|
61 |
+
training_samples: int
|
62 |
+
|
63 |
+
# Global variables
|
64 |
+
model_pipeline = None
|
65 |
+
model_info = None
|
66 |
+
|
67 |
+
def preprocess_text(text: str) -> str:
|
68 |
+
"""Preprocess email text"""
|
69 |
+
# Convert to lowercase
|
70 |
+
text = text.lower()
|
71 |
+
# Remove extra whitespace
|
72 |
+
text = re.sub(r'\s+', ' ', text)
|
73 |
+
# Remove special characters but keep basic punctuation
|
74 |
+
text = re.sub(r'[^\w\s,.\-!?]', ' ', text)
|
75 |
+
return text.strip()
|
76 |
+
|
77 |
+
def load_and_train_model():
|
78 |
+
"""Load data and train the Naive Bayes model"""
|
79 |
+
global model_pipeline, model_info
|
80 |
+
|
81 |
+
try:
|
82 |
+
# Load the dataset (assuming it's in the same directory)
|
83 |
+
if os.path.exists('Synthetic_Email_Dataset.csv'):
|
84 |
+
df = pd.read_csv('Synthetic_Email_Dataset.csv')
|
85 |
+
else:
|
86 |
+
logger.warning("Dataset file not found, creating sample data")
|
87 |
+
# Create sample data for demonstration
|
88 |
+
sample_data = {
|
89 |
+
'label': [0, 1, 0, 1] * 100,
|
90 |
+
'message': [
|
91 |
+
"Hello, You asked for it, so here is the notes. Warm wishes, David",
|
92 |
+
"Good morning, Just sharing the meeting agenda as requested. Cheers, Anna",
|
93 |
+
"Dear team, As discussed, I'm sending the manual. Regards, Emily",
|
94 |
+
"Hi all, Please find attached the project plan. Thanks, Michael"
|
95 |
+
] * 100
|
96 |
+
}
|
97 |
+
df = pd.DataFrame(sample_data)
|
98 |
+
|
99 |
+
# Preprocess messages
|
100 |
+
df['processed_message'] = df['message'].apply(preprocess_text)
|
101 |
+
|
102 |
+
# Split data
|
103 |
+
X = df['processed_message']
|
104 |
+
y = df['label']
|
105 |
+
|
106 |
+
X_train, X_test, y_train, y_test = train_test_split(
|
107 |
+
X, y, test_size=0.2, random_state=42, stratify=y
|
108 |
+
)
|
109 |
+
|
110 |
+
# Create pipeline
|
111 |
+
model_pipeline = Pipeline([
|
112 |
+
('tfidf', TfidfVectorizer(
|
113 |
+
max_features=1000,
|
114 |
+
ngram_range=(1, 2),
|
115 |
+
stop_words='english',
|
116 |
+
lowercase=True,
|
117 |
+
min_df=1,
|
118 |
+
max_df=0.95
|
119 |
+
)),
|
120 |
+
('classifier', MultinomialNB(alpha=1.0))
|
121 |
+
])
|
122 |
+
|
123 |
+
# Train model
|
124 |
+
logger.info("Training Naive Bayes model...")
|
125 |
+
model_pipeline.fit(X_train, y_train)
|
126 |
+
|
127 |
+
# Evaluate model
|
128 |
+
y_pred = model_pipeline.predict(X_test)
|
129 |
+
accuracy = accuracy_score(y_test, y_pred)
|
130 |
+
|
131 |
+
# Store model info
|
132 |
+
model_info = ModelInfo(
|
133 |
+
model_type="Multinomial Naive Bayes",
|
134 |
+
accuracy=round(accuracy, 4),
|
135 |
+
feature_count=model_pipeline.named_steps['tfidf'].vocabulary_.__len__(),
|
136 |
+
training_samples=len(X_train)
|
137 |
+
)
|
138 |
+
|
139 |
+
logger.info(f"Model trained successfully with accuracy: {accuracy:.4f}")
|
140 |
+
logger.info(f"Feature count: {model_info.feature_count}")
|
141 |
+
|
142 |
+
# Save model
|
143 |
+
joblib.dump(model_pipeline, 'email_classifier_model.pkl')
|
144 |
+
logger.info("Model saved successfully")
|
145 |
+
|
146 |
+
return True
|
147 |
+
|
148 |
+
except Exception as e:
|
149 |
+
logger.error(f"Error in training model: {str(e)}")
|
150 |
+
return False
|
151 |
+
|
152 |
+
def load_pretrained_model():
|
153 |
+
"""Load pretrained model if available"""
|
154 |
+
global model_pipeline, model_info
|
155 |
+
|
156 |
+
try:
|
157 |
+
if os.path.exists('email_classifier_model.pkl'):
|
158 |
+
model_pipeline = joblib.load('email_classifier_model.pkl')
|
159 |
+
logger.info("Pretrained model loaded successfully")
|
160 |
+
|
161 |
+
# Set default model info if not available
|
162 |
+
if model_info is None:
|
163 |
+
model_info = ModelInfo(
|
164 |
+
model_type="Multinomial Naive Bayes",
|
165 |
+
accuracy=0.92, # Default value
|
166 |
+
feature_count=len(model_pipeline.named_steps['tfidf'].vocabulary_),
|
167 |
+
training_samples=320 # Default value
|
168 |
+
)
|
169 |
+
return True
|
170 |
+
except Exception as e:
|
171 |
+
logger.error(f"Error loading pretrained model: {str(e)}")
|
172 |
+
|
173 |
+
return False
|
174 |
+
|
175 |
+
@app.on_event("startup")
|
176 |
+
async def startup_event():
|
177 |
+
"""Initialize model on startup"""
|
178 |
+
logger.info("Starting Email Classifier API...")
|
179 |
+
|
180 |
+
# Try to load pretrained model first
|
181 |
+
if not load_pretrained_model():
|
182 |
+
# If no pretrained model, train new one
|
183 |
+
if not load_and_train_model():
|
184 |
+
logger.error("Failed to initialize model")
|
185 |
+
|
186 |
+
@app.get("/", response_class=HTMLResponse)
|
187 |
+
async def root():
|
188 |
+
"""Root endpoint with API documentation"""
|
189 |
+
html_content = """
|
190 |
+
<!DOCTYPE html>
|
191 |
+
<html>
|
192 |
+
<head>
|
193 |
+
<title>Email Attachment Classifier API</title>
|
194 |
+
<style>
|
195 |
+
body { font-family: Arial, sans-serif; margin: 40px; }
|
196 |
+
.header { color: #2c3e50; }
|
197 |
+
.endpoint { background-color: #f8f9fa; padding: 15px; margin: 10px 0; border-radius: 5px; }
|
198 |
+
.method { color: #27ae60; font-weight: bold; }
|
199 |
+
code { background-color: #e9ecef; padding: 2px 4px; border-radius: 3px; }
|
200 |
+
</style>
|
201 |
+
</head>
|
202 |
+
<body>
|
203 |
+
<h1 class="header">📧 Email Attachment Classifier API</h1>
|
204 |
+
<p>This API classifies whether an email message indicates an attachment or not using Naive Bayes classifier.</p>
|
205 |
+
|
206 |
+
<h2>Available Endpoints:</h2>
|
207 |
+
|
208 |
+
<div class="endpoint">
|
209 |
+
<h3><span class="method">GET</span> /info</h3>
|
210 |
+
<p>Get model information and statistics</p>
|
211 |
+
</div>
|
212 |
+
|
213 |
+
<div class="endpoint">
|
214 |
+
<h3><span class="method">POST</span> /predict</h3>
|
215 |
+
<p>Predict single email message</p>
|
216 |
+
<p><strong>Body:</strong> <code>{"message": "Your email content here"}</code></p>
|
217 |
+
</div>
|
218 |
+
|
219 |
+
<div class="endpoint">
|
220 |
+
<h3><span class="method">POST</span> /predict-batch</h3>
|
221 |
+
<p>Predict multiple email messages</p>
|
222 |
+
<p><strong>Body:</strong> <code>{"messages": ["Email 1", "Email 2", ...]}</code></p>
|
223 |
+
</div>
|
224 |
+
|
225 |
+
<div class="endpoint">
|
226 |
+
<h3><span class="method">GET</span> /health</h3>
|
227 |
+
<p>Check API health status</p>
|
228 |
+
</div>
|
229 |
+
|
230 |
+
<h2>Interactive Documentation:</h2>
|
231 |
+
<p>Visit <a href="/docs">/docs</a> for Swagger UI or <a href="/redoc">/redoc</a> for ReDoc</p>
|
232 |
+
|
233 |
+
<h2>Labels:</h2>
|
234 |
+
<ul>
|
235 |
+
<li><strong>0:</strong> No attachment mentioned</li>
|
236 |
+
<li><strong>1:</strong> Attachment mentioned</li>
|
237 |
+
</ul>
|
238 |
+
</body>
|
239 |
+
</html>
|
240 |
+
"""
|
241 |
+
return HTMLResponse(content=html_content, status_code=200)
|
242 |
+
|
243 |
+
@app.get("/health")
|
244 |
+
async def health_check():
|
245 |
+
"""Health check endpoint"""
|
246 |
+
if model_pipeline is None:
|
247 |
+
return {"status": "unhealthy", "message": "Model not loaded"}
|
248 |
+
return {"status": "healthy", "message": "API is running"}
|
249 |
+
|
250 |
+
@app.get("/info", response_model=ModelInfo)
|
251 |
+
async def get_model_info():
|
252 |
+
"""Get model information"""
|
253 |
+
if model_info is None:
|
254 |
+
raise HTTPException(status_code=503, detail="Model not initialized")
|
255 |
+
return model_info
|
256 |
+
|
257 |
+
@app.post("/predict", response_model=PredictionResponse)
|
258 |
+
async def predict_single(email: EmailInput):
|
259 |
+
"""Predict single email message"""
|
260 |
+
if model_pipeline is None:
|
261 |
+
raise HTTPException(status_code=503, detail="Model not loaded")
|
262 |
+
|
263 |
+
try:
|
264 |
+
# Preprocess input
|
265 |
+
processed_message = preprocess_text(email.message)
|
266 |
+
|
267 |
+
# Make prediction
|
268 |
+
prediction = model_pipeline.predict([processed_message])[0]
|
269 |
+
probabilities = model_pipeline.predict_proba([processed_message])[0]
|
270 |
+
|
271 |
+
# Prepare response
|
272 |
+
prediction_label = "Has attachment" if prediction == 1 else "No attachment"
|
273 |
+
confidence = float(max(probabilities))
|
274 |
+
|
275 |
+
prob_dict = {
|
276 |
+
"no_attachment": float(probabilities[0]),
|
277 |
+
"has_attachment": float(probabilities[1])
|
278 |
+
}
|
279 |
+
|
280 |
+
return PredictionResponse(
|
281 |
+
message=email.message,
|
282 |
+
prediction=int(prediction),
|
283 |
+
prediction_label=prediction_label,
|
284 |
+
confidence=confidence,
|
285 |
+
probabilities=prob_dict
|
286 |
+
)
|
287 |
+
|
288 |
+
except Exception as e:
|
289 |
+
logger.error(f"Prediction error: {str(e)}")
|
290 |
+
raise HTTPException(status_code=500, detail=f"Prediction failed: {str(e)}")
|
291 |
+
|
292 |
+
@app.post("/predict-batch", response_model=BatchPredictionResponse)
|
293 |
+
async def predict_batch(emails: EmailBatchInput):
|
294 |
+
"""Predict multiple email messages"""
|
295 |
+
if model_pipeline is None:
|
296 |
+
raise HTTPException(status_code=503, detail="Model not loaded")
|
297 |
+
|
298 |
+
if len(emails.messages) > 100:
|
299 |
+
raise HTTPException(status_code=400, detail="Maximum 100 messages per batch")
|
300 |
+
|
301 |
+
try:
|
302 |
+
predictions = []
|
303 |
+
|
304 |
+
# Preprocess all messages
|
305 |
+
processed_messages = [preprocess_text(msg) for msg in emails.messages]
|
306 |
+
|
307 |
+
# Make batch predictions
|
308 |
+
batch_predictions = model_pipeline.predict(processed_messages)
|
309 |
+
batch_probabilities = model_pipeline.predict_proba(processed_messages)
|
310 |
+
|
311 |
+
# Prepare responses
|
312 |
+
for i, (message, prediction, probabilities) in enumerate(
|
313 |
+
zip(emails.messages, batch_predictions, batch_probabilities)
|
314 |
+
):
|
315 |
+
prediction_label = "Has attachment" if prediction == 1 else "No attachment"
|
316 |
+
confidence = float(max(probabilities))
|
317 |
+
|
318 |
+
prob_dict = {
|
319 |
+
"no_attachment": float(probabilities[0]),
|
320 |
+
"has_attachment": float(probabilities[1])
|
321 |
+
}
|
322 |
+
|
323 |
+
predictions.append(PredictionResponse(
|
324 |
+
message=message,
|
325 |
+
prediction=int(prediction),
|
326 |
+
prediction_label=prediction_label,
|
327 |
+
confidence=confidence,
|
328 |
+
probabilities=prob_dict
|
329 |
+
))
|
330 |
+
|
331 |
+
return BatchPredictionResponse(predictions=predictions)
|
332 |
+
|
333 |
+
except Exception as e:
|
334 |
+
logger.error(f"Batch prediction error: {str(e)}")
|
335 |
+
raise HTTPException(status_code=500, detail=f"Batch prediction failed: {str(e)}")
|
336 |
+
|
337 |
+
if __name__ == "__main__":
|
338 |
+
import uvicorn
|
339 |
+
uvicorn.run(app, host="0.0.0.0", port=7860)
|
deploy.py
ADDED
@@ -0,0 +1,310 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python3
|
2 |
+
"""
|
3 |
+
Automated deployment script for Hugging Face Spaces
|
4 |
+
"""
|
5 |
+
|
6 |
+
import os
|
7 |
+
import subprocess
|
8 |
+
import sys
|
9 |
+
import shutil
|
10 |
+
from pathlib import Path
|
11 |
+
import json
|
12 |
+
import requests
|
13 |
+
from datetime import datetime
|
14 |
+
|
15 |
+
class HuggingFaceDeployer:
|
16 |
+
def __init__(self, username: str, space_name: str, token: str = None):
|
17 |
+
self.username = username
|
18 |
+
self.space_name = space_name
|
19 |
+
self.token = token
|
20 |
+
self.space_url = f"https://huggingface.co/spaces/{username}/{space_name}"
|
21 |
+
self.git_url = f"https://huggingface.co/spaces/{username}/{space_name}.git"
|
22 |
+
|
23 |
+
def check_requirements(self):
|
24 |
+
"""Check if all required files exist"""
|
25 |
+
required_files = [
|
26 |
+
'app.py',
|
27 |
+
'requirements.txt',
|
28 |
+
'Dockerfile',
|
29 |
+
'README.md',
|
30 |
+
'Synthetic_Email_Dataset.csv'
|
31 |
+
]
|
32 |
+
|
33 |
+
missing_files = []
|
34 |
+
for file in required_files:
|
35 |
+
if not os.path.exists(file):
|
36 |
+
missing_files.append(file)
|
37 |
+
|
38 |
+
if missing_files:
|
39 |
+
print(f"❌ Missing required files: {', '.join(missing_files)}")
|
40 |
+
return False
|
41 |
+
|
42 |
+
print("✅ All required files found")
|
43 |
+
return True
|
44 |
+
|
45 |
+
def setup_huggingface_space(self):
|
46 |
+
"""Create Hugging Face Space via API"""
|
47 |
+
if not self.token:
|
48 |
+
print("⚠️ No Hugging Face token provided. You'll need to create the space manually.")
|
49 |
+
print(f"Go to: https://huggingface.co/new-space")
|
50 |
+
input("Press Enter after creating the space...")
|
51 |
+
return True
|
52 |
+
|
53 |
+
headers = {"Authorization": f"Bearer {self.token}"}
|
54 |
+
data = {
|
55 |
+
"type": "space",
|
56 |
+
"name": self.space_name,
|
57 |
+
"sdk": "docker",
|
58 |
+
"private": False
|
59 |
+
}
|
60 |
+
|
61 |
+
response = requests.post(
|
62 |
+
f"https://huggingface.co/api/repos/create",
|
63 |
+
headers=headers,
|
64 |
+
json=data
|
65 |
+
)
|
66 |
+
|
67 |
+
if response.status_code == 201:
|
68 |
+
print(f"✅ Space created successfully: {self.space_url}")
|
69 |
+
return True
|
70 |
+
elif response.status_code == 409:
|
71 |
+
print(f"ℹ️ Space already exists: {self.space_url}")
|
72 |
+
return True
|
73 |
+
else:
|
74 |
+
print(f"❌ Failed to create space: {response.text}")
|
75 |
+
return False
|
76 |
+
|
77 |
+
def prepare_files(self):
|
78 |
+
"""Prepare files for deployment"""
|
79 |
+
print("📁 Preparing files...")
|
80 |
+
|
81 |
+
# Create README.md with proper header
|
82 |
+
readme_header = f'''---
|
83 |
+
title: {self.space_name.replace('-', ' ').title()}
|
84 |
+
emoji: 📧
|
85 |
+
colorFrom: blue
|
86 |
+
colorTo: green
|
87 |
+
sdk: docker
|
88 |
+
app_port: 7860
|
89 |
+
pinned: false
|
90 |
+
license: mit
|
91 |
+
tags:
|
92 |
+
- email-classification
|
93 |
+
- naive-bayes
|
94 |
+
- text-classification
|
95 |
+
- nlp
|
96 |
+
- fastapi
|
97 |
+
---
|
98 |
+
|
99 |
+
'''
|
100 |
+
|
101 |
+
# Read existing README and add header
|
102 |
+
if os.path.exists('README.md'):
|
103 |
+
with open('README.md', 'r', encoding='utf-8') as f:
|
104 |
+
existing_content = f.read()
|
105 |
+
|
106 |
+
# Remove existing header if present
|
107 |
+
if existing_content.startswith('---'):
|
108 |
+
parts = existing_content.split('---', 2)
|
109 |
+
if len(parts) > 2:
|
110 |
+
existing_content = parts[2].strip()
|
111 |
+
|
112 |
+
with open('README.md', 'w', encoding='utf-8') as f:
|
113 |
+
f.write(readme_header + existing_content)
|
114 |
+
|
115 |
+
print("✅ Files prepared")
|
116 |
+
return True
|
117 |
+
|
118 |
+
def clone_and_deploy(self):
|
119 |
+
"""Clone the space repository and deploy"""
|
120 |
+
print("🔄 Cloning repository...")
|
121 |
+
|
122 |
+
# Create temporary directory
|
123 |
+
temp_dir = f"temp_{self.space_name}"
|
124 |
+
if os.path.exists(temp_dir):
|
125 |
+
shutil.rmtree(temp_dir)
|
126 |
+
|
127 |
+
try:
|
128 |
+
# Clone the repository
|
129 |
+
result = subprocess.run([
|
130 |
+
'git', 'clone', self.git_url, temp_dir
|
131 |
+
], capture_output=True, text=True)
|
132 |
+
|
133 |
+
if result.returncode != 0:
|
134 |
+
print(f"❌ Failed to clone repository: {result.stderr}")
|
135 |
+
return False
|
136 |
+
|
137 |
+
# Copy files to the cloned repository
|
138 |
+
files_to_copy = [
|
139 |
+
'app.py',
|
140 |
+
'requirements.txt',
|
141 |
+
'Dockerfile',
|
142 |
+
'README.md',
|
143 |
+
'train_model.py',
|
144 |
+
'Synthetic_Email_Dataset.csv'
|
145 |
+
]
|
146 |
+
|
147 |
+
for file in files_to_copy:
|
148 |
+
if os.path.exists(file):
|
149 |
+
shutil.copy2(file, temp_dir)
|
150 |
+
print(f"📄 Copied {file}")
|
151 |
+
|
152 |
+
# Change to the repository directory
|
153 |
+
os.chdir(temp_dir)
|
154 |
+
|
155 |
+
# Configure git
|
156 |
+
subprocess.run(['git', 'config', 'user.email', '[email protected]'])
|
157 |
+
subprocess.run(['git', 'config', 'user.name', 'Auto Deployer'])
|
158 |
+
|
159 |
+
# Add all files
|
160 |
+
subprocess.run(['git', 'add', '.'])
|
161 |
+
|
162 |
+
# Commit changes
|
163 |
+
commit_message = f"Deploy Email Classifier API - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
|
164 |
+
result = subprocess.run(['git', 'commit', '-m', commit_message],
|
165 |
+
capture_output=True, text=True)
|
166 |
+
|
167 |
+
if result.returncode != 0:
|
168 |
+
print(f"ℹ️ Nothing to commit or commit failed: {result.stderr}")
|
169 |
+
|
170 |
+
# Push changes
|
171 |
+
if self.token:
|
172 |
+
# Use token for authentication
|
173 |
+
auth_url = self.git_url.replace('https://', f'https://oauth2:{self.token}@')
|
174 |
+
result = subprocess.run(['git', 'push', auth_url, 'main'],
|
175 |
+
capture_output=True, text=True)
|
176 |
+
else:
|
177 |
+
result = subprocess.run(['git', 'push', 'origin', 'main'],
|
178 |
+
capture_output=True, text=True)
|
179 |
+
|
180 |
+
if result.returncode == 0:
|
181 |
+
print("✅ Successfully pushed to Hugging Face!")
|
182 |
+
print(f"🚀 Your API will be available at: {self.space_url}")
|
183 |
+
return True
|
184 |
+
else:
|
185 |
+
print(f"❌ Failed to push: {result.stderr}")
|
186 |
+
return False
|
187 |
+
|
188 |
+
except Exception as e:
|
189 |
+
print(f"❌ Deployment failed: {str(e)}")
|
190 |
+
return False
|
191 |
+
finally:
|
192 |
+
# Clean up
|
193 |
+
os.chdir('..')
|
194 |
+
if os.path.exists(temp_dir):
|
195 |
+
shutil.rmtree(temp_dir)
|
196 |
+
|
197 |
+
def test_deployment(self):
|
198 |
+
"""Test the deployed API"""
|
199 |
+
print("🧪 Testing deployed API...")
|
200 |
+
|
201 |
+
api_url = f"{self.space_url.replace('/spaces/', '/spaces/')}"
|
202 |
+
|
203 |
+
# Wait a bit for deployment
|
204 |
+
import time
|
205 |
+
print("⏳ Waiting for deployment to complete...")
|
206 |
+
time.sleep(30)
|
207 |
+
|
208 |
+
try:
|
209 |
+
# Test health endpoint
|
210 |
+
response = requests.get(f"{api_url}/health", timeout=30)
|
211 |
+
if response.status_code == 200:
|
212 |
+
print("✅ Health check passed")
|
213 |
+
|
214 |
+
# Test prediction endpoint
|
215 |
+
test_response = requests.post(
|
216 |
+
f"{api_url}/predict",
|
217 |
+
json={"message": "Please find attached the document."},
|
218 |
+
timeout=30
|
219 |
+
)
|
220 |
+
|
221 |
+
if test_response.status_code == 200:
|
222 |
+
result = test_response.json()
|
223 |
+
print(f"✅ Prediction test passed: {result['prediction_label']}")
|
224 |
+
return True
|
225 |
+
else:
|
226 |
+
print(f"❌ Prediction test failed: {test_response.status_code}")
|
227 |
+
else:
|
228 |
+
print(f"❌ Health check failed: {response.status_code}")
|
229 |
+
|
230 |
+
except requests.exceptions.RequestException as e:
|
231 |
+
print(f"⚠️ API not yet accessible (this is normal for new deployments): {str(e)}")
|
232 |
+
print("🕐 The API may take a few minutes to become available")
|
233 |
+
|
234 |
+
return False
|
235 |
+
|
236 |
+
def deploy(self):
|
237 |
+
"""Full deployment process"""
|
238 |
+
print("🚀 Starting deployment to Hugging Face Spaces...")
|
239 |
+
print(f"📦 Space: {self.space_url}")
|
240 |
+
print("="*60)
|
241 |
+
|
242 |
+
# Check requirements
|
243 |
+
if not self.check_requirements():
|
244 |
+
return False
|
245 |
+
|
246 |
+
# Setup Hugging Face Space
|
247 |
+
if not self.setup_huggingface_space():
|
248 |
+
return False
|
249 |
+
|
250 |
+
# Prepare files
|
251 |
+
if not self.prepare_files():
|
252 |
+
return False
|
253 |
+
|
254 |
+
# Deploy
|
255 |
+
if not self.clone_and_deploy():
|
256 |
+
return False
|
257 |
+
|
258 |
+
print("\n" + "="*60)
|
259 |
+
print("🎉 DEPLOYMENT COMPLETED!")
|
260 |
+
print("="*60)
|
261 |
+
print(f"📧 API URL: {self.space_url}")
|
262 |
+
print(f"📚 Documentation: {self.space_url}/docs")
|
263 |
+
print(f"🔍 Interactive API: {self.space_url}/redoc")
|
264 |
+
print("\n⏳ Note: It may take a few minutes for the API to become fully available.")
|
265 |
+
|
266 |
+
# Test deployment
|
267 |
+
self.test_deployment()
|
268 |
+
|
269 |
+
return True
|
270 |
+
|
271 |
+
def main():
|
272 |
+
"""Main deployment function"""
|
273 |
+
print("🔧 Hugging Face Spaces Deployment Tool")
|
274 |
+
print("="*40)
|
275 |
+
|
276 |
+
# Get user input
|
277 |
+
username = input("Enter your Hugging Face username: ").strip()
|
278 |
+
if not username:
|
279 |
+
print("❌ Username is required")
|
280 |
+
sys.exit(1)
|
281 |
+
|
282 |
+
space_name = input("Enter space name (e.g., email-classifier-api): ").strip()
|
283 |
+
if not space_name:
|
284 |
+
print("❌ Space name is required")
|
285 |
+
sys.exit(1)
|
286 |
+
|
287 |
+
token = input("Enter your Hugging Face token (optional, press Enter to skip): ").strip()
|
288 |
+
if not token:
|
289 |
+
print("ℹ️ No token provided. You'll need to create the space manually.")
|
290 |
+
|
291 |
+
# Create deployer and deploy
|
292 |
+
deployer = HuggingFaceDeployer(username, space_name, token)
|
293 |
+
|
294 |
+
if deployer.deploy():
|
295 |
+
print("\n✅ Deployment successful!")
|
296 |
+
print("\n📋 Next steps:")
|
297 |
+
print("1. Wait 2-3 minutes for the build to complete")
|
298 |
+
print("2. Check the build logs in your Hugging Face Space")
|
299 |
+
print("3. Test your API endpoints")
|
300 |
+
print("4. Share your API with others!")
|
301 |
+
else:
|
302 |
+
print("\n❌ Deployment failed!")
|
303 |
+
print("\n🔧 Troubleshooting:")
|
304 |
+
print("1. Check that all required files are present")
|
305 |
+
print("2. Verify your Hugging Face credentials")
|
306 |
+
print("3. Ensure git is installed and configured")
|
307 |
+
print("4. Check the build logs in your Hugging Face Space")
|
308 |
+
|
309 |
+
if __name__ == "__main__":
|
310 |
+
main()
|
requirements.txt
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
fastapi==0.104.1
|
2 |
+
uvicorn[standard]==0.24.0
|
3 |
+
pandas==2.1.3
|
4 |
+
numpy==1.25.2
|
5 |
+
scikit-learn==1.3.2
|
6 |
+
joblib==1.3.2
|
7 |
+
pydantic==2.5.0
|
8 |
+
python-multipart==0.0.6
|
train_model.py
ADDED
@@ -0,0 +1,186 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python3
|
2 |
+
"""
|
3 |
+
Standalone script to train the email classifier model
|
4 |
+
"""
|
5 |
+
|
6 |
+
import pandas as pd
|
7 |
+
import numpy as np
|
8 |
+
from sklearn.feature_extraction.text import TfidfVectorizer
|
9 |
+
from sklearn.naive_bayes import MultinomialNB
|
10 |
+
from sklearn.pipeline import Pipeline
|
11 |
+
from sklearn.model_selection import train_test_split, cross_val_score
|
12 |
+
from sklearn.metrics import classification_report, accuracy_score, confusion_matrix
|
13 |
+
import joblib
|
14 |
+
import re
|
15 |
+
import os
|
16 |
+
from datetime import datetime
|
17 |
+
|
18 |
+
def preprocess_text(text: str) -> str:
|
19 |
+
"""Preprocess email text"""
|
20 |
+
text = text.lower()
|
21 |
+
text = re.sub(r'\s+', ' ', text)
|
22 |
+
text = re.sub(r'[^\w\s,.\-!?]', ' ', text)
|
23 |
+
return text.strip()
|
24 |
+
|
25 |
+
def load_data(file_path: str):
|
26 |
+
"""Load and preprocess the dataset"""
|
27 |
+
print(f"Loading dataset from {file_path}...")
|
28 |
+
|
29 |
+
if not os.path.exists(file_path):
|
30 |
+
print(f"Error: Dataset file {file_path} not found!")
|
31 |
+
return None, None
|
32 |
+
|
33 |
+
df = pd.read_csv(file_path)
|
34 |
+
print(f"Dataset loaded: {len(df)} samples")
|
35 |
+
print(f"Columns: {list(df.columns)}")
|
36 |
+
|
37 |
+
# Basic data info
|
38 |
+
print(f"\nLabel distribution:")
|
39 |
+
print(df['label'].value_counts())
|
40 |
+
|
41 |
+
# Preprocess messages
|
42 |
+
df['processed_message'] = df['message'].apply(preprocess_text)
|
43 |
+
|
44 |
+
return df['processed_message'], df['label']
|
45 |
+
|
46 |
+
def train_model(X, y):
|
47 |
+
"""Train the Naive Bayes model"""
|
48 |
+
print("\nSplitting data...")
|
49 |
+
X_train, X_test, y_train, y_test = train_test_split(
|
50 |
+
X, y, test_size=0.2, random_state=42, stratify=y
|
51 |
+
)
|
52 |
+
|
53 |
+
print(f"Training set: {len(X_train)} samples")
|
54 |
+
print(f"Test set: {len(X_test)} samples")
|
55 |
+
|
56 |
+
# Create pipeline
|
57 |
+
print("\nCreating model pipeline...")
|
58 |
+
pipeline = Pipeline([
|
59 |
+
('tfidf', TfidfVectorizer(
|
60 |
+
max_features=1000,
|
61 |
+
ngram_range=(1, 2),
|
62 |
+
stop_words='english',
|
63 |
+
lowercase=True,
|
64 |
+
min_df=1,
|
65 |
+
max_df=0.95
|
66 |
+
)),
|
67 |
+
('classifier', MultinomialNB(alpha=1.0))
|
68 |
+
])
|
69 |
+
|
70 |
+
# Train model
|
71 |
+
print("Training model...")
|
72 |
+
pipeline.fit(X_train, y_train)
|
73 |
+
|
74 |
+
# Cross-validation
|
75 |
+
print("Performing cross-validation...")
|
76 |
+
cv_scores = cross_val_score(pipeline, X_train, y_train, cv=5, scoring='accuracy')
|
77 |
+
print(f"Cross-validation scores: {cv_scores}")
|
78 |
+
print(f"Mean CV accuracy: {cv_scores.mean():.4f} (+/- {cv_scores.std() * 2:.4f})")
|
79 |
+
|
80 |
+
# Test set evaluation
|
81 |
+
print("\nEvaluating on test set...")
|
82 |
+
y_pred = pipeline.predict(X_test)
|
83 |
+
test_accuracy = accuracy_score(y_test, y_pred)
|
84 |
+
|
85 |
+
print(f"Test accuracy: {test_accuracy:.4f}")
|
86 |
+
print("\nClassification Report:")
|
87 |
+
print(classification_report(y_test, y_pred, target_names=['No Attachment', 'Has Attachment']))
|
88 |
+
|
89 |
+
print("\nConfusion Matrix:")
|
90 |
+
print(confusion_matrix(y_test, y_pred))
|
91 |
+
|
92 |
+
# Feature analysis
|
93 |
+
print("\nAnalyzing most important features...")
|
94 |
+
feature_names = pipeline.named_steps['tfidf'].get_feature_names_out()
|
95 |
+
feature_scores = pipeline.named_steps['classifier'].feature_log_prob_
|
96 |
+
|
97 |
+
# Top features for each class
|
98 |
+
for class_idx, class_name in enumerate(['No Attachment', 'Has Attachment']):
|
99 |
+
top_features_idx = np.argsort(feature_scores[class_idx])[-20:]
|
100 |
+
top_features = [feature_names[i] for i in top_features_idx]
|
101 |
+
print(f"\nTop 20 features for {class_name}:")
|
102 |
+
print(", ".join(reversed(top_features)))
|
103 |
+
|
104 |
+
return pipeline, test_accuracy
|
105 |
+
|
106 |
+
def save_model(pipeline, accuracy, output_path='email_classifier_model.pkl'):
|
107 |
+
"""Save the trained model"""
|
108 |
+
print(f"\nSaving model to {output_path}...")
|
109 |
+
|
110 |
+
# Add metadata
|
111 |
+
model_info = {
|
112 |
+
'pipeline': pipeline,
|
113 |
+
'accuracy': accuracy,
|
114 |
+
'feature_count': len(pipeline.named_steps['tfidf'].vocabulary_),
|
115 |
+
'training_date': datetime.now().isoformat(),
|
116 |
+
'model_type': 'Multinomial Naive Bayes',
|
117 |
+
'preprocessing': 'TF-IDF with 1-2 grams'
|
118 |
+
}
|
119 |
+
|
120 |
+
joblib.dump(model_info, output_path)
|
121 |
+
print(f"Model saved successfully!")
|
122 |
+
print(f"Model info:")
|
123 |
+
print(f" - Accuracy: {accuracy:.4f}")
|
124 |
+
print(f" - Features: {model_info['feature_count']}")
|
125 |
+
print(f" - Training date: {model_info['training_date']}")
|
126 |
+
|
127 |
+
def test_model_predictions(pipeline):
|
128 |
+
"""Test model with sample predictions"""
|
129 |
+
print("\n" + "="*50)
|
130 |
+
print("TESTING MODEL WITH SAMPLE PREDICTIONS")
|
131 |
+
print("="*50)
|
132 |
+
|
133 |
+
test_messages = [
|
134 |
+
"Hello, please find attached the document you requested.",
|
135 |
+
"Good morning, I'm sharing the report as discussed.",
|
136 |
+
"Hi team, attached is the presentation for tomorrow's meeting.",
|
137 |
+
"Dear all, kindly review the attached files.",
|
138 |
+
"Hello, how are you doing today?",
|
139 |
+
"I will send you the information later.",
|
140 |
+
"Please let me know if you need any clarification.",
|
141 |
+
"The meeting is scheduled for 3 PM tomorrow."
|
142 |
+
]
|
143 |
+
|
144 |
+
for msg in test_messages:
|
145 |
+
processed_msg = preprocess_text(msg)
|
146 |
+
prediction = pipeline.predict([processed_msg])[0]
|
147 |
+
probabilities = pipeline.predict_proba([processed_msg])[0]
|
148 |
+
confidence = max(probabilities)
|
149 |
+
|
150 |
+
label = "Has Attachment" if prediction == 1 else "No Attachment"
|
151 |
+
print(f"\nMessage: '{msg}'")
|
152 |
+
print(f"Prediction: {label} (confidence: {confidence:.3f})")
|
153 |
+
print(f"Probabilities: No={probabilities[0]:.3f}, Yes={probabilities[1]:.3f}")
|
154 |
+
|
155 |
+
def main():
|
156 |
+
"""Main training function"""
|
157 |
+
print("="*60)
|
158 |
+
print("EMAIL ATTACHMENT CLASSIFIER TRAINING")
|
159 |
+
print("="*60)
|
160 |
+
|
161 |
+
# Load data
|
162 |
+
dataset_path = 'Synthetic_Email_Dataset.csv'
|
163 |
+
X, y = load_data(dataset_path)
|
164 |
+
|
165 |
+
if X is None:
|
166 |
+
print("Failed to load dataset. Exiting...")
|
167 |
+
return
|
168 |
+
|
169 |
+
# Train model
|
170 |
+
pipeline, accuracy = train_model(X, y)
|
171 |
+
|
172 |
+
# Save model
|
173 |
+
save_model(pipeline, accuracy)
|
174 |
+
|
175 |
+
# Test predictions
|
176 |
+
test_model_predictions(pipeline)
|
177 |
+
|
178 |
+
print("\n" + "="*60)
|
179 |
+
print("TRAINING COMPLETED SUCCESSFULLY!")
|
180 |
+
print("="*60)
|
181 |
+
print(f"Final model accuracy: {accuracy:.4f}")
|
182 |
+
print("Model saved as 'email_classifier_model.pkl'")
|
183 |
+
print("You can now deploy the API using 'python app.py'")
|
184 |
+
|
185 |
+
if __name__ == "__main__":
|
186 |
+
main()
|