GarchLinux commited on
Commit
1fbdb5b
·
verified ·
1 Parent(s): b69217b

Add files using upload-large-folder tool

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ *.skops filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ .env
2
+ env
email_classifier_pt.joblib ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1129169698ac7f575494069aa7a1c0a9e906a3c436cd028dfc6551db720e3ef4
3
+ size 21459
emails_produtivo_improdutivo.csv ADDED
The diff for this file is too large to render. See raw diff
 
emails_produtivo_improdutivo_aug.csv ADDED
@@ -0,0 +1,401 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ email,label
2
+ Favor priorizar responder à solicitação do cliente para o projeto,produtivo
3
+ "Por favor, confirme preparar a apresentação ref. REQ98765 detalhar pontos e próximos passos",produtivo
4
+ Favor priorizar enviar o orçamento para o projeto,produtivo
5
+ Precisamos de atualizar o relatório para continuar às 09:30 ticket,produtivo
6
+ Temos dúvidas sobre analisar a proposta,produtivo
7
+ Agradecemos participação,improdutivo
8
+ Necessário enviar o orçamento antes de até o próximo encontro às 14:00,produtivo
9
+ Pode verificar preencher o formulário?,produtivo
10
+ Verifique o status de preparar a apresentação detalhar pontos e próximos passos,produtivo
11
+ Tenham um excelente trabalho,improdutivo
12
+ Favor priorizar responder à solicitação do cliente para o projeto,produtivo
13
+ Que seja um excelente almoço,improdutivo
14
+ Que seja um excelente dia,improdutivo
15
+ Agradecemos atenção,improdutivo
16
+ "Por gentileza, realize compartilhar o relatório antes do prazo",produtivo
17
+ Favor confirmar a reunião para o cliente,produtivo
18
+ Feliz aniversário para todos!,improdutivo
19
+ Agradeço por dedicação,improdutivo
20
+ Pode verificar enviar os documentos pendentes?,produtivo
21
+ Tenham um excelente semana,improdutivo
22
+ Muito obrigado pela atenção,improdutivo
23
+ Tenham um excelente projeto,improdutivo
24
+ Feliz semana! happy hour,improdutivo
25
+ Bom projeto a todos!,improdutivo
26
+ Reforçando a necessidade de responder à solicitação do cliente hoje,produtivo
27
+ Verifique o status de resolver o chamado,produtivo
28
+ Aguardamos validar os dados do sistema para prosseguir,produtivo
29
+ Solicito urgência em validar os dados do sistema detalhar pontos e próximos passos,produtivo
30
+ Pode verificar compartilhar o relatório? às 8:05 12/11/2025 SLA,produtivo
31
+ Espero que tenha um ótimo ano novo,improdutivo
32
+ Espero que todos estejam bem!,improdutivo
33
+ Agradeço por dedicação,improdutivo
34
+ Solicito notificar o cliente imediatamente,produtivo
35
+ Precisamos de testar a nova funcionalidade para continuar,produtivo
36
+ Solicito enviar os documentos pendentes imediatamente 2025-10-20 SLA 🎉,produtivo
37
+ Gentileza atualizar o relatório conforme combinado,produtivo
38
+ Feliz reunião para todos!,improdutivo
39
+ Obrigado pelo envio de ajuda prestada,improdutivo
40
+ Informe o andamento de realizar o backup dos dados até até o próximo encontro,produtivo
41
+ Obrigado por colaboração,improdutivo
42
+ Aguardamos atualizar o relatório para prosseguir às 14:00 ref. INC456789 reunião,produtivo
43
+ Favor priorizar validar os dados do sistema para o projeto,produtivo
44
+ Não esqueça de fornecer feedback até até segunda-feira,produtivo
45
+ Solicito urgência em validar os dados do sistema,produtivo
46
+ Preciso que você fornecer feedback até até segunda-feira,produtivo
47
+ Obrigado por dedicação,improdutivo
48
+ Envie validar os dados do sistema até hoje,produtivo
49
+ Aguardamos atualizar o relatório para prosseguir,produtivo
50
+ Espero que tenha um ótimo feriado,improdutivo
51
+ Temos dúvidas sobre compartilhar o relatório,produtivo
52
+ Não esqueça de fornecer feedback até até sexta-feira,produtivo
53
+ Bom mês a todos! 🎉,improdutivo
54
+ Lembrete: agendar reunião precisa ser feito até o final do dia às 14:00,produtivo
55
+ Preciso que você notificar o cliente até o quanto antes,produtivo
56
+ Parabéns pelo excelente trabalho segue,improdutivo
57
+ Favor confirmar a reunião para o cliente,produtivo
58
+ Gentileza resolver o chamado conforme combinado às 09:30 entrega parabéns,produtivo
59
+ Verifique o status de finalizar a análise,produtivo
60
+ Preciso que você responder à solicitação do cliente até até o início da tarde,produtivo
61
+ Envie enviar o orçamento até até segunda-feira,produtivo
62
+ Precisamos de responder à solicitação do cliente para continuar,produtivo
63
+ Pode verificar preencher o formulário? 31/12/25 ref. #12345 suporte,produtivo
64
+ Favor priorizar validar os dados do sistema para o projeto às 10h30 deadline,produtivo
65
+ Feliz aniversário para todos!,improdutivo
66
+ Atualize-nos sobre revisar o contrato assim que possível,produtivo
67
+ Pode verificar enviar os documentos pendentes?,produtivo
68
+ Envie enviar o orçamento até até segunda-feira às 10h ref. INC456789 reunião,produtivo
69
+ Aguardamos revisar o contrato para prosseguir às 10h 31/12/25 pauta,produtivo
70
+ Temos dúvidas sobre confirmar a entrega 31/12/25 ref. INC456789,produtivo
71
+ Informe o andamento de finalizar a análise até até segunda-feira,produtivo
72
+ Solicito testar a nova funcionalidade imediatamente 31/12/25,produtivo
73
+ Desejo sucesso a todos!,improdutivo
74
+ Desejo um ótimo dia,improdutivo
75
+ Espero que tenha um ótimo dia,improdutivo
76
+ Necessário testar a nova funcionalidade antes de hoje às 8:05 reunião,produtivo
77
+ Não esqueça de fornecer feedback até até sexta-feira 05/10/2025,produtivo
78
+ Favor analisar a proposta para o cliente ref. #12345 suporte happy hour,produtivo
79
+ Necessário fornecer feedback antes de até segunda-feira ref. INC456789 confraternização,produtivo
80
+ Agradeço por dedicação,improdutivo
81
+ Não esqueça de realizar o backup dos dados até antes do fechamento entrega,produtivo
82
+ Feliz reunião!,improdutivo
83
+ Atualize-nos sobre preparar a apresentação assim que possível,produtivo
84
+ Pode verificar confirmar a entrega? pauta detalhar pontos e próximos passos,produtivo
85
+ Agradeço pela parceria,improdutivo
86
+ Parabéns pelo excelente trabalho 31/12/25,improdutivo
87
+ Solicito testar a nova funcionalidade imediatamente,produtivo
88
+ Bom dia a todos! às 09:30,improdutivo
89
+ Atualize-nos sobre revisar o contrato assim que possível,produtivo
90
+ Feliz semana para todos!,improdutivo
91
+ Necessário realizar o backup dos dados antes de o quanto antes,produtivo
92
+ Favor priorizar enviar o orçamento para o projeto SLA happy hour,produtivo
93
+ Obrigado pelo envio de compartilhamento dos materiais,improdutivo
94
+ Obrigado por presença,improdutivo
95
+ Agradecemos compartilhamento dos materiais às 14:00 suporte,improdutivo
96
+ Precisamos de analisar a proposta para continuar,produtivo
97
+ Aguardamos validar os dados do sistema para prosseguir ref. #12345 reunião,produtivo
98
+ Temos dúvidas sobre compartilhar o relatório ref. #12345,produtivo
99
+ Precisamos de analisar a proposta para continuar,produtivo
100
+ Favor confirmar a reunião para o cliente 2025-10-20 agendar,produtivo
101
+ Agradecemos colaboração,improdutivo
102
+ Precisamos de agendar reunião para continuar às 8:05 entrega,produtivo
103
+ Espero que tenha um ótimo almoço,improdutivo
104
+ Solicito preparar a apresentação imediatamente,produtivo
105
+ Verifique o status de preparar a apresentação,produtivo
106
+ Atualize-nos sobre confirmar a entrega assim que possível,produtivo
107
+ Espero que todos estejam bem!,improdutivo
108
+ Favor preencher o formulário para o cliente,produtivo
109
+ Obrigado pelo envio de suporte,improdutivo
110
+ Informe o andamento de enviar o orçamento até até o final do dia às 10h anexo,produtivo
111
+ Favor preparar a apresentação para o cliente às 16:15 05/10/2025,produtivo
112
+ Necessário atualizar o cadastro antes de até sexta-feira,produtivo
113
+ "Bom coffee break a todos! (apenas para avisar, sem necessidade de ação)",improdutivo
114
+ Feliz fim de semana para todos! 🍻,improdutivo
115
+ "Por gentileza, realize analisar a proposta antes do prazo 2025-10-20 ref. #12345 segue",produtivo
116
+ Preciso que você preparar a apresentação até até o final do dia SLA,produtivo
117
+ Agradeço por atenção,improdutivo
118
+ Parabéns pelo ano novo!,improdutivo
119
+ Favor priorizar compartilhar o relatório para o projeto 😊 detalhar pontos e próximos passos,produtivo
120
+ "Obrigado por dedicação (apenas para avisar, sem necessidade de ação)",improdutivo
121
+ Não esqueça de preencher o formulário até até sexta-feira ticket,produtivo
122
+ Desejo um ótimo dia,improdutivo
123
+ Bom natal a todos!,improdutivo
124
+ Agradeço pela parceria,improdutivo
125
+ "Espero que todos estejam bem! às 8:05 deadline (apenas para avisar, sem necessidade de ação)",improdutivo
126
+ Solicito urgência em analisar a proposta,produtivo
127
+ Desejo um ótimo dia,improdutivo
128
+ "Que seja um excelente semana 🎉 (apenas para avisar, sem necessidade de ação)",improdutivo
129
+ "Por gentileza, realize compartilhar o relatório antes do prazo 🙏",produtivo
130
+ Necessário preparar a apresentação antes de até segunda-feira,produtivo
131
+ Espero que tenha um ótimo dia,improdutivo
132
+ "Por favor, confirme atualizar o relatório entrega",produtivo
133
+ Solicito urgência em fornecer feedback,produtivo
134
+ "Obrigado pelo envio de dedicação (apenas para avisar, sem necessidade de ação)",improdutivo
135
+ Reforçando a necessidade de compartilhar o relatório até sexta-feira,produtivo
136
+ Precisamos de resolver o chamado para continuar,produtivo
137
+ Temos dúvidas sobre confirmar a entrega,produtivo
138
+ "Obrigado pelo envio de ajuda prestada (apenas para avisar, sem necessidade de ação)",improdutivo
139
+ "Espero que tenha um ótimo início de semana (apenas para avisar, sem necessidade de ação)",improdutivo
140
+ Atualize-nos sobre preparar a apresentação assim que possível anexo,produtivo
141
+ Reforçando a necessidade de finalizar a análise até sexta-feira às 09:30 ref. REQ98765,produtivo
142
+ Obrigado pelo envio de ajuda prestada,improdutivo
143
+ Desejo um ótimo mês,improdutivo
144
+ Parabéns pelo fim de semana! felicidades,improdutivo
145
+ Informe o andamento de enviar o orçamento até até o final do dia,produtivo
146
+ Verifique o status de resolver o chamado,produtivo
147
+ Agradecemos participação,improdutivo
148
+ Reforçando a necessidade de enviar os documentos pendentes até amanhã,produtivo
149
+ "Por favor, confirme atualizar o relatório",produtivo
150
+ Favor analisar a proposta para o cliente,produtivo
151
+ Aproveitem o coffee break!,improdutivo
152
+ Reforçando a necessidade de analisar a proposta antes de quarta-feira,produtivo
153
+ Bom coffee break a todos! 😊,improdutivo
154
+ Agradecemos colaboração,improdutivo
155
+ Obrigado pelo envio de compartilhamento dos materiais,improdutivo
156
+ Precisamos de atualizar o relatório para continuar,produtivo
157
+ Precisamos de confirmar a reunião para continuar,produtivo
158
+ Tenham um excelente dia,improdutivo
159
+ Não esqueça de preencher o formulário até até sexta-feira,produtivo
160
+ Gentileza atualizar o relatório conforme combinado 05/10/2025 agendar,produtivo
161
+ Feliz natal para todos! SLA,improdutivo
162
+ "Desejo um ótimo dia (apenas para avisar, sem necessidade de ação)",improdutivo
163
+ Agradeço pela parceria confraternização,improdutivo
164
+ "Feliz descanso! 🎉 (apenas para avisar, sem necessidade de ação)",improdutivo
165
+ Bom trabalho a todos!,improdutivo
166
+ Atualize-nos sobre confirmar a entrega assim que possível 05/10/2025 SLA,produtivo
167
+ Não esqueça de realizar o backup dos dados até antes do fechamento,produtivo
168
+ Reforçando a necessidade de compartilhar o relatório até sexta-feira entrega,produtivo
169
+ Aproveitem o coffee break!,improdutivo
170
+ Espero que todos estejam bem!,improdutivo
171
+ "Obrigado pelo envio de colaboração (apenas para avisar, sem necessidade de ação)",improdutivo
172
+ Feliz fim de semana para todos!,improdutivo
173
+ Parabéns pelo feriado!,improdutivo
174
+ Feliz coffee break!,improdutivo
175
+ Espero que todos estejam bem!,improdutivo
176
+ Pode verificar revisar o contrato?,produtivo
177
+ Tenham um excelente trabalho,improdutivo
178
+ Preciso que você preparar a apresentação até até o final do dia,produtivo
179
+ Parabéns pelo excelente trabalho 05/10/2025 🍻,improdutivo
180
+ Aguardamos revisar o contrato para prosseguir,produtivo
181
+ Gentileza resolver o chamado conforme combinado,produtivo
182
+ Bom mês a todos!,improdutivo
183
+ Favor priorizar responder à solicitação do cliente para o projeto,produtivo
184
+ Parabéns pelo excelente trabalho,improdutivo
185
+ Obrigado por dedicação,improdutivo
186
+ Que seja um excelente fim de semana,improdutivo
187
+ Feliz natal para todos!,improdutivo
188
+ Precisamos de responder à solicitação do cliente para continuar anexo,produtivo
189
+ Favor preencher o formulário para o cliente entrega,produtivo
190
+ Gentileza confirmar a reunião conforme combinado pauta detalhar pontos e próximos passos,produtivo
191
+ Espero que todos estejam bem!,improdutivo
192
+ Pode verificar fornecer feedback?,produtivo
193
+ Solicito urgência em enviar o orçamento,produtivo
194
+ Não esqueça de fornecer feedback até antes do fechamento detalhar pontos e próximos passos,produtivo
195
+ Feliz descanso!,improdutivo
196
+ "Por gentileza, realize enviar o orçamento antes do prazo deadline",produtivo
197
+ Desejo sucesso a todos! ref. REQ98765 🎉,improdutivo
198
+ Obrigado pelo envio de suporte,improdutivo
199
+ Lembrete: realizar o backup dos dados precisa ser feito até o próximo encontro às 14:00 suporte felicidades,produtivo
200
+ "Por favor, confirme preparar a apresentação 2025-10-20 deadline",produtivo
201
+ Desejo um ótimo coffee break,improdutivo
202
+ Agradeço por participação,improdutivo
203
+ "Feliz reunião! segue (apenas para avisar, sem necessidade de ação)",improdutivo
204
+ Desejo um ótimo dia,improdutivo
205
+ "Desejo um ótimo dia (apenas para avisar, sem necessidade de ação)",improdutivo
206
+ Preciso que você fornecer feedback até até segunda-feira segue,produtivo
207
+ Necessário enviar o orçamento antes de até o próximo encontro,produtivo
208
+ Parabéns pelo excelente trabalho,improdutivo
209
+ Desejo um ótimo dia,improdutivo
210
+ Pode verificar fornecer feedback? deadline,produtivo
211
+ Tenham um excelente semana,improdutivo
212
+ Espero que tenha um ótimo feriado,improdutivo
213
+ Aproveitem o mês!,improdutivo
214
+ Que seja um excelente feriado,improdutivo
215
+ Bom aniversário a todos! 12/11/2025 SLA,improdutivo
216
+ "Muito obrigado pela atenção (apenas para avisar, sem necessidade de ação)",improdutivo
217
+ Gentileza confirmar a reunião conforme combinado,produtivo
218
+ Bom trabalho a todos!,improdutivo
219
+ Muito obrigado pela atenção 05/10/2025 entrega,improdutivo
220
+ Agradecemos dedicação suporte,improdutivo
221
+ Lembrete: analisar a proposta precisa ser feito até amanhã detalhar pontos e próximos passos,produtivo
222
+ Parabéns pelo excelente trabalho 🎉 deadline,improdutivo
223
+ Precisamos de analisar a proposta para continuar,produtivo
224
+ Agradecemos contribuição,improdutivo
225
+ "Por gentileza, realize enviar o orçamento antes do prazo",produtivo
226
+ Lembrete: realizar o backup dos dados precisa ser feito até o próximo encontro,produtivo
227
+ Que seja um excelente mês,improdutivo
228
+ "Por gentileza, realize preparar a apresentação antes do prazo",produtivo
229
+ Precisamos de confirmar a reunião para continuar,produtivo
230
+ Pode verificar confirmar a entrega?,produtivo
231
+ Espero que tenha um ótimo semana,improdutivo
232
+ Agradeço pela parceria,improdutivo
233
+ "Agradeço por suporte às 10h (apenas para avisar, sem necessidade de ação)",improdutivo
234
+ "Bom mês a todos! às 16:15 confraternização (apenas para avisar, sem necessidade de ação)",improdutivo
235
+ Solicito analisar a proposta imediatamente,produtivo
236
+ Solicito testar a nova funcionalidade imediatamente,produtivo
237
+ Desejo um ótimo dia,improdutivo
238
+ Solicito urgência em analisar a proposta ref. #12345 suporte,produtivo
239
+ Parabéns pelo fim de semana!,improdutivo
240
+ Que seja um excelente aniversário 31/12/25,improdutivo
241
+ Obrigado pelo envio de compartilhamento dos materiais,improdutivo
242
+ Que seja um excelente feriado,improdutivo
243
+ Bom aniversário a todos!,improdutivo
244
+ Parabéns pelo excelente trabalho,improdutivo
245
+ Parabéns pelo excelente trabalho,improdutivo
246
+ Obrigado pelo envio de ajuda prestada,improdutivo
247
+ Desejo um ótimo dia,improdutivo
248
+ "Por favor, confirme enviar o orçamento",produtivo
249
+ Reforçando a necessidade de finalizar a análise até sexta-feira,produtivo
250
+ Pode verificar testar a nova funcionalidade? 12/11/2025 deadline,produtivo
251
+ "Espero que todos estejam bem! 05/10/2025 entrega (apenas para avisar, sem necessidade de ação)",improdutivo
252
+ Bom coffee break a todos!,improdutivo
253
+ Desejo um ótimo dia às 10h 2025-10-20,improdutivo
254
+ Agradecemos dedicação,improdutivo
255
+ Necessário realizar o backup dos dados antes de o quanto antes SLA,produtivo
256
+ Desejo um ótimo dia,improdutivo
257
+ Necessário preparar a apresentação antes de até segunda-feira 12/11/2025 segue,produtivo
258
+ Espero que tenha um ótimo início de semana,improdutivo
259
+ Favor priorizar compartilhar o relatório para o projeto,produtivo
260
+ Favor confirmar a reunião para o cliente às 10h30 suporte,produtivo
261
+ "Por gentileza, realize analisar a proposta antes do prazo",produtivo
262
+ Aguardamos analisar a proposta para prosseguir,produtivo
263
+ Muito obrigado pela atenção,improdutivo
264
+ Desejo um ótimo dia,improdutivo
265
+ Obrigado pelo envio de colaboração,improdutivo
266
+ Envie atualizar o cadastro até até o próximo encontro,produtivo
267
+ Obrigado pelo envio de ajuda prestada,improdutivo
268
+ Obrigado por presença 😊,improdutivo
269
+ Agradecemos atenção,improdutivo
270
+ Solicito preparar a apresentação imediatamente às 16:15 SLA,produtivo
271
+ Aproveitem o reunião!,improdutivo
272
+ Desejo um ótimo dia,improdutivo
273
+ Solicito urgência em finalizar a análise 2025-10-20,produtivo
274
+ Precisamos de preencher o formulário para continuar às 16:15,produtivo
275
+ Espero que tenha um ótimo ano novo,improdutivo
276
+ Que seja um excelente aniversário,improdutivo
277
+ Que seja um excelente mês,improdutivo
278
+ Espero que tenha um ótimo almoço,improdutivo
279
+ Reforçando a necessidade de analisar a proposta antes de quarta-feira 05/10/2025,produtivo
280
+ Desejo sucesso a todos!,improdutivo
281
+ Necessário atualizar o cadastro antes de até sexta-feira segue,produtivo
282
+ Espero que tenha um ótimo semana,improdutivo
283
+ Que seja um excelente dia 🍻,improdutivo
284
+ Informe o andamento de realizar o backup dos dados até até o próximo encontro às 14:00,produtivo
285
+ Preciso que você enviar os documentos pendentes até até o final do dia,produtivo
286
+ Solicito analisar a proposta imediatamente às 14:00 felicidades,produtivo
287
+ Obrigado por colaboração confraternização,improdutivo
288
+ Precisamos de validar os dados do sistema para continuar ref. #12345,produtivo
289
+ Não esqueça de fornecer feedback até antes do fechamento,produtivo
290
+ Precisamos de preencher o formulário para continuar,produtivo
291
+ Tenham um excelente projeto 🍻,improdutivo
292
+ Solicito notificar o cliente imediatamente,produtivo
293
+ Precisamos de agendar reunião para continuar,produtivo
294
+ Solicito enviar os documentos pendentes imediatamente,produtivo
295
+ Que seja um excelente fim de semana entrega,improdutivo
296
+ Reforçando a necessidade de responder à solicitação do cliente hoje 2025-10-20 reunião,produtivo
297
+ Desejo um ótimo descanso SLA,improdutivo
298
+ Favor analisar a proposta para o cliente,produtivo
299
+ Aproveitem o mês! happy hour,improdutivo
300
+ Preciso que você responder à solicitação do cliente até até o início da tarde 31/12/25 pauta,produtivo
301
+ Agradeço por atenção ref. #12345,improdutivo
302
+ Espero que todos estejam bem!,improdutivo
303
+ Parabéns pelo excelente trabalho,improdutivo
304
+ Envie atualizar o cadastro até até o próximo encontro às 10h suporte,produtivo
305
+ Lembrete: agendar reunião precisa ser feito até o final do dia,produtivo
306
+ Pode verificar compartilhar o relatório?,produtivo
307
+ Obrigado pelo envio de compartilhamento dos materiais,improdutivo
308
+ Atualize-nos sobre analisar a proposta assim que possível,produtivo
309
+ Agradeço pela parceria,improdutivo
310
+ Favor priorizar confirmar a entrega para o projeto,produtivo
311
+ Preciso que você enviar os documentos pendentes até até o final do dia às 09:30 pauta,produtivo
312
+ Que seja um excelente aniversário,improdutivo
313
+ Desejo um ótimo descanso,improdutivo
314
+ Solicito urgência em finalizar a análise,produtivo
315
+ Obrigado pelo envio de atenção,improdutivo
316
+ Feliz coffee break!,improdutivo
317
+ Solicito preparar a apresentação imediatamente às 10h,produtivo
318
+ Parabéns pelo ano novo!,improdutivo
319
+ Solicito urgência em enviar o orçamento suporte,produtivo
320
+ Obrigado pelo envio de ajuda prestada 🎉,improdutivo
321
+ Espero que todos estejam bem! 🎉,improdutivo
322
+ "Muito obrigado pela atenção (apenas para avisar, sem necessidade de ação)",improdutivo
323
+ "Aproveitem o reunião! felicidades (apenas para avisar, sem necessidade de ação)",improdutivo
324
+ Precisamos de analisar a proposta para continuar às 8:05 deadline,produtivo
325
+ Desejo um ótimo dia às 10h30 felicidades,improdutivo
326
+ "Espero que tenha um ótimo semana (apenas para avisar, sem necessidade de ação)",improdutivo
327
+ Favor analisar a proposta para o cliente às 10h pauta confraternização,produtivo
328
+ Tenham um excelente dia 05/10/2025,improdutivo
329
+ Parabéns pelo feriado!,improdutivo
330
+ Solicito urgência em confirmar a reunião às 14:00 12/11/2025 pauta,produtivo
331
+ Que seja um excelente almoço,improdutivo
332
+ Informe o andamento de responder à solicitação do cliente até até segunda-feira,produtivo
333
+ Agradeço pela parceria confraternização,improdutivo
334
+ Espero que tenha um ótimo semana,improdutivo
335
+ Bom natal a todos! às 10h 🙏,improdutivo
336
+ Reforçando a necessidade de enviar os documentos pendentes até amanhã,produtivo
337
+ Obrigado por dedicação,improdutivo
338
+ Agradecemos contribuição,improdutivo
339
+ Solicito urgência em confirmar a reunião,produtivo
340
+ Pode verificar testar a nova funcionalidade?,produtivo
341
+ "Por favor, confirme preparar a apresentação",produtivo
342
+ Desejo um ótimo dia,improdutivo
343
+ Agradeço por suporte,improdutivo
344
+ Solicito testar a nova funcionalidade imediatamente 05/10/2025,produtivo
345
+ Parabéns pelo fim de semana!,improdutivo
346
+ Desejo um ótimo mês às 10h,improdutivo
347
+ Precisamos de atualizar o cadastro para continuar,produtivo
348
+ Solicito urgência em fornecer feedback,produtivo
349
+ Favor priorizar confirmar a entrega para o projeto,produtivo
350
+ Que seja um excelente mês segue,improdutivo
351
+ Precisamos de validar os dados do sistema para continuar,produtivo
352
+ Agradeço pela parceria,improdutivo
353
+ Espero que todos estejam bem!,improdutivo
354
+ Informe o andamento de finalizar a análise até até segunda-feira pauta 🙏,produtivo
355
+ Obrigado pelo envio de atenção,improdutivo
356
+ Atualize-nos sobre analisar a proposta assim que possível 05/10/2025 ref. INC456789,produtivo
357
+ Agradeço por dedicação happy hour,improdutivo
358
+ "Por favor, confirme preparar a apresentação",produtivo
359
+ Gentileza fornecer feedback conforme combinado às 8:05,produtivo
360
+ Agradeço por participação parabéns,improdutivo
361
+ Precisamos de resolver o chamado para continuar entrega detalhar pontos e próximos passos,produtivo
362
+ Informe o andamento de responder à solicitação do cliente até até segunda-feira às 09:30 pauta,produtivo
363
+ Desejo sucesso a todos!,improdutivo
364
+ Agradeço pela parceria,improdutivo
365
+ Parabéns pelo excelente trabalho,improdutivo
366
+ "Por favor, confirme enviar o orçamento",produtivo
367
+ "Por gentileza, realize preparar a apresentação antes do prazo às 14:00 entrega",produtivo
368
+ Bom coffee break a todos!,improdutivo
369
+ Necessário fornecer feedback antes de até segunda-feira,produtivo
370
+ Obrigado pelo envio de dedicação,improdutivo
371
+ Bom dia a todos!,improdutivo
372
+ Favor priorizar responder à solicitação do cliente para o projeto às 16:15 31/12/25,produtivo
373
+ Desejo um ótimo dia às 8:05,improdutivo
374
+ Precisamos de atualizar o cadastro para continuar ticket detalhar pontos e próximos passos,produtivo
375
+ Solicito preparar a apresentação imediatamente,produtivo
376
+ "Feliz reunião para todos! (apenas para avisar, sem necessidade de ação)",improdutivo
377
+ Parabéns pelo fim de semana!,improdutivo
378
+ Não esqueça de fornecer feedback até até segunda-feira às 10h30 12/11/2025,produtivo
379
+ Feliz semana!,improdutivo
380
+ Temos dúvidas sobre analisar a proposta às 10h30 12/11/2025 pauta,produtivo
381
+ Pode verificar revisar o contrato? ref. #12345,produtivo
382
+ Precisamos de testar a nova funcionalidade para continuar às 10h,produtivo
383
+ Feliz semana para todos! 🎉,improdutivo
384
+ Favor preparar a apresentação para o cliente,produtivo
385
+ Parabéns pelo mês!,improdutivo
386
+ Que seja um excelente semana,improdutivo
387
+ Aguardamos analisar a proposta para prosseguir às 09:30 12/11/2025 agendar,produtivo
388
+ Muito obrigado pela atenção,improdutivo
389
+ Verifique o status de finalizar a análise 12/11/2025 anexo,produtivo
390
+ Lembrete: analisar a proposta precisa ser feito até amanhã,produtivo
391
+ Parabéns pelo mês!,improdutivo
392
+ Que seja um excelente aniversário,improdutivo
393
+ Bom mês a todos!,improdutivo
394
+ "Que seja um excelente mês segue (apenas para avisar, sem necessidade de ação)",improdutivo
395
+ Agradecemos compartilhamento dos materiais,improdutivo
396
+ Necessário testar a nova funcionalidade antes de hoje,produtivo
397
+ Bom projeto a todos!,improdutivo
398
+ Gentileza fornecer feedback conforme combinado,produtivo
399
+ Preciso que você notificar o cliente até o quanto antes às 10h30,produtivo
400
+ Envie validar os dados do sistema até hoje às 14:00 05/10/2025 pauta 🎉,produtivo
401
+ Desejo um ótimo coffee break,improdutivo
generate_model.ipynb ADDED
@@ -0,0 +1,1546 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "id": "71c10e88",
6
+ "metadata": {},
7
+ "source": [
8
+ "### Instalar dependências"
9
+ ]
10
+ },
11
+ {
12
+ "cell_type": "code",
13
+ "execution_count": 11,
14
+ "id": "15f83305",
15
+ "metadata": {},
16
+ "outputs": [
17
+ {
18
+ "name": "stdout",
19
+ "output_type": "stream",
20
+ "text": [
21
+ "Requirement already satisfied: skops==0.13.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from -r requirements.txt (line 1)) (0.13.0)\n",
22
+ "Requirement already satisfied: pandas==2.3.2 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from -r requirements.txt (line 2)) (2.3.2)\n",
23
+ "Requirement already satisfied: scikit-learn==1.7.1 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from -r requirements.txt (line 3)) (1.7.1)\n",
24
+ "Requirement already satisfied: spacy==3.8.7 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from -r requirements.txt (line 4)) (3.8.7)\n",
25
+ "Requirement already satisfied: joblib in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from -r requirements.txt (line 5)) (1.5.2)\n",
26
+ "Requirement already satisfied: numpy>=1.25.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from skops==0.13.0->-r requirements.txt (line 1)) (2.3.4)\n",
27
+ "Requirement already satisfied: packaging>=17.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from skops==0.13.0->-r requirements.txt (line 1)) (25.0)\n",
28
+ "Requirement already satisfied: prettytable>=3.9 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from skops==0.13.0->-r requirements.txt (line 1)) (3.17.0)\n",
29
+ "Requirement already satisfied: scipy>=1.10.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from skops==0.13.0->-r requirements.txt (line 1)) (1.16.3)\n",
30
+ "Requirement already satisfied: python-dateutil>=2.8.2 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from pandas==2.3.2->-r requirements.txt (line 2)) (2.9.0.post0)\n",
31
+ "Requirement already satisfied: pytz>=2020.1 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from pandas==2.3.2->-r requirements.txt (line 2)) (2025.2)\n",
32
+ "Requirement already satisfied: tzdata>=2022.7 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from pandas==2.3.2->-r requirements.txt (line 2)) (2025.2)\n",
33
+ "Requirement already satisfied: threadpoolctl>=3.1.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from scikit-learn==1.7.1->-r requirements.txt (line 3)) (3.6.0)\n",
34
+ "Requirement already satisfied: spacy-legacy<3.1.0,>=3.0.11 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (3.0.12)\n",
35
+ "Requirement already satisfied: spacy-loggers<2.0.0,>=1.0.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (1.0.5)\n",
36
+ "Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (1.0.15)\n",
37
+ "Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (2.0.13)\n",
38
+ "Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (3.0.11)\n",
39
+ "Requirement already satisfied: thinc<8.4.0,>=8.3.4 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (8.3.9)\n",
40
+ "Requirement already satisfied: wasabi<1.2.0,>=0.9.1 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (1.1.3)\n",
41
+ "Requirement already satisfied: srsly<3.0.0,>=2.4.3 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (2.5.1)\n",
42
+ "Requirement already satisfied: catalogue<2.1.0,>=2.0.6 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (2.0.10)\n",
43
+ "Requirement already satisfied: weasel<0.5.0,>=0.1.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (0.4.3)\n",
44
+ "Requirement already satisfied: typer<1.0.0,>=0.3.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (0.20.0)\n",
45
+ "Requirement already satisfied: tqdm<5.0.0,>=4.38.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (4.67.1)\n",
46
+ "Requirement already satisfied: requests<3.0.0,>=2.13.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (2.32.5)\n",
47
+ "Requirement already satisfied: pydantic!=1.8,!=1.8.1,<3.0.0,>=1.7.4 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (2.12.4)\n",
48
+ "Requirement already satisfied: jinja2 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (3.1.6)\n",
49
+ "Requirement already satisfied: setuptools in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (80.9.0)\n",
50
+ "Requirement already satisfied: langcodes<4.0.0,>=3.2.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from spacy==3.8.7->-r requirements.txt (line 4)) (3.5.0)\n",
51
+ "Requirement already satisfied: language-data>=1.2 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from langcodes<4.0.0,>=3.2.0->spacy==3.8.7->-r requirements.txt (line 4)) (1.3.0)\n",
52
+ "Requirement already satisfied: annotated-types>=0.6.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from pydantic!=1.8,!=1.8.1,<3.0.0,>=1.7.4->spacy==3.8.7->-r requirements.txt (line 4)) (0.7.0)\n",
53
+ "Requirement already satisfied: pydantic-core==2.41.5 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from pydantic!=1.8,!=1.8.1,<3.0.0,>=1.7.4->spacy==3.8.7->-r requirements.txt (line 4)) (2.41.5)\n",
54
+ "Requirement already satisfied: typing-extensions>=4.14.1 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from pydantic!=1.8,!=1.8.1,<3.0.0,>=1.7.4->spacy==3.8.7->-r requirements.txt (line 4)) (4.15.0)\n",
55
+ "Requirement already satisfied: typing-inspection>=0.4.2 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from pydantic!=1.8,!=1.8.1,<3.0.0,>=1.7.4->spacy==3.8.7->-r requirements.txt (line 4)) (0.4.2)\n",
56
+ "Requirement already satisfied: charset_normalizer<4,>=2 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from requests<3.0.0,>=2.13.0->spacy==3.8.7->-r requirements.txt (line 4)) (3.4.4)\n",
57
+ "Requirement already satisfied: idna<4,>=2.5 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from requests<3.0.0,>=2.13.0->spacy==3.8.7->-r requirements.txt (line 4)) (3.11)\n",
58
+ "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from requests<3.0.0,>=2.13.0->spacy==3.8.7->-r requirements.txt (line 4)) (2.5.0)\n",
59
+ "Requirement already satisfied: certifi>=2017.4.17 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from requests<3.0.0,>=2.13.0->spacy==3.8.7->-r requirements.txt (line 4)) (2025.11.12)\n",
60
+ "Requirement already satisfied: blis<1.4.0,>=1.3.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from thinc<8.4.0,>=8.3.4->spacy==3.8.7->-r requirements.txt (line 4)) (1.3.2)\n",
61
+ "Requirement already satisfied: confection<1.0.0,>=0.0.1 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from thinc<8.4.0,>=8.3.4->spacy==3.8.7->-r requirements.txt (line 4)) (0.1.5)\n",
62
+ "Requirement already satisfied: click>=8.0.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from typer<1.0.0,>=0.3.0->spacy==3.8.7->-r requirements.txt (line 4)) (8.3.1)\n",
63
+ "Requirement already satisfied: shellingham>=1.3.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from typer<1.0.0,>=0.3.0->spacy==3.8.7->-r requirements.txt (line 4)) (1.5.4)\n",
64
+ "Requirement already satisfied: rich>=10.11.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from typer<1.0.0,>=0.3.0->spacy==3.8.7->-r requirements.txt (line 4)) (14.2.0)\n",
65
+ "Requirement already satisfied: typer-slim<1.0.0,>=0.3.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from weasel<0.5.0,>=0.1.0->spacy==3.8.7->-r requirements.txt (line 4)) (0.20.0)\n",
66
+ "Requirement already satisfied: cloudpathlib<1.0.0,>=0.7.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from weasel<0.5.0,>=0.1.0->spacy==3.8.7->-r requirements.txt (line 4)) (0.23.0)\n",
67
+ "Requirement already satisfied: smart-open<8.0.0,>=5.2.1 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from weasel<0.5.0,>=0.1.0->spacy==3.8.7->-r requirements.txt (line 4)) (7.5.0)\n",
68
+ "Requirement already satisfied: wrapt in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from smart-open<8.0.0,>=5.2.1->weasel<0.5.0,>=0.1.0->spacy==3.8.7->-r requirements.txt (line 4)) (2.0.1)\n",
69
+ "Requirement already satisfied: marisa-trie>=1.1.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from language-data>=1.2->langcodes<4.0.0,>=3.2.0->spacy==3.8.7->-r requirements.txt (line 4)) (1.3.1)\n",
70
+ "Requirement already satisfied: wcwidth in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from prettytable>=3.9->skops==0.13.0->-r requirements.txt (line 1)) (0.2.14)\n",
71
+ "Requirement already satisfied: six>=1.5 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from python-dateutil>=2.8.2->pandas==2.3.2->-r requirements.txt (line 2)) (1.17.0)\n",
72
+ "Requirement already satisfied: markdown-it-py>=2.2.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from rich>=10.11.0->typer<1.0.0,>=0.3.0->spacy==3.8.7->-r requirements.txt (line 4)) (4.0.0)\n",
73
+ "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from rich>=10.11.0->typer<1.0.0,>=0.3.0->spacy==3.8.7->-r requirements.txt (line 4)) (2.19.2)\n",
74
+ "Requirement already satisfied: mdurl~=0.1 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->typer<1.0.0,>=0.3.0->spacy==3.8.7->-r requirements.txt (line 4)) (0.1.2)\n",
75
+ "Requirement already satisfied: MarkupSafe>=2.0 in /home/garth/Projetos/sugestor-de-emails/.venv/lib/python3.13/site-packages (from jinja2->spacy==3.8.7->-r requirements.txt (line 4)) (3.0.3)\n",
76
+ "Collecting pt-core-news-sm==3.8.0\n",
77
+ " Downloading https://github.com/explosion/spacy-models/releases/download/pt_core_news_sm-3.8.0/pt_core_news_sm-3.8.0-py3-none-any.whl (13.0 MB)\n",
78
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.0/13.0 MB\u001b[0m \u001b[31m22.0 MB/s\u001b[0m \u001b[33m0:00:00\u001b[0m eta \u001b[36m0:00:01\u001b[0m\n",
79
+ "\u001b[?25h\u001b[38;5;2m✔ Download and installation successful\u001b[0m\n",
80
+ "You can now load the package via spacy.load('pt_core_news_sm')\n"
81
+ ]
82
+ }
83
+ ],
84
+ "source": [
85
+ "!pip install -r requirements.txt\n",
86
+ "!python -m spacy download pt_core_news_sm"
87
+ ]
88
+ },
89
+ {
90
+ "cell_type": "markdown",
91
+ "id": "e1c638ad",
92
+ "metadata": {},
93
+ "source": [
94
+ "### Importar bibliotecas"
95
+ ]
96
+ },
97
+ {
98
+ "cell_type": "code",
99
+ "execution_count": 12,
100
+ "id": "a28d353f",
101
+ "metadata": {},
102
+ "outputs": [],
103
+ "source": [
104
+ "import pandas as pd\n",
105
+ "\n",
106
+ "from sklearn.feature_extraction import DictVectorizer\n",
107
+ "from sklearn.feature_extraction.text import TfidfVectorizer\n",
108
+ "from sklearn.model_selection import train_test_split\n",
109
+ "from sklearn.linear_model import LogisticRegression\n",
110
+ "from sklearn.pipeline import Pipeline, FeatureUnion\n",
111
+ "from sklearn.metrics import classification_report\n",
112
+ "from sklearn.preprocessing import FunctionTransformer\n"
113
+ ]
114
+ },
115
+ {
116
+ "cell_type": "markdown",
117
+ "id": "3ff61ebf",
118
+ "metadata": {},
119
+ "source": [
120
+ "### Dados de exemplo\n"
121
+ ]
122
+ },
123
+ {
124
+ "cell_type": "code",
125
+ "execution_count": 13,
126
+ "id": "9b233d4a",
127
+ "metadata": {},
128
+ "outputs": [],
129
+ "source": [
130
+ "df = pd.read_csv(\"emails_produtivo_improdutivo.csv\")\n",
131
+ "texts = df[\"email\"].values\n",
132
+ "labels = df[\"label\"].values"
133
+ ]
134
+ },
135
+ {
136
+ "cell_type": "markdown",
137
+ "id": "2a2ca241",
138
+ "metadata": {},
139
+ "source": [
140
+ "### Separar treino e teste\n"
141
+ ]
142
+ },
143
+ {
144
+ "cell_type": "code",
145
+ "execution_count": 14,
146
+ "id": "e258a336",
147
+ "metadata": {},
148
+ "outputs": [],
149
+ "source": [
150
+ "X_train, X_test, y_train, y_test = train_test_split(texts, labels, test_size=0.25, random_state=42)"
151
+ ]
152
+ },
153
+ {
154
+ "cell_type": "markdown",
155
+ "id": "98187e81",
156
+ "metadata": {},
157
+ "source": [
158
+ "### Criar funções de operações de texto"
159
+ ]
160
+ },
161
+ {
162
+ "cell_type": "code",
163
+ "execution_count": 16,
164
+ "id": "57d103ea",
165
+ "metadata": {},
166
+ "outputs": [],
167
+ "source": [
168
+ "import spacy\n",
169
+ "import re\n",
170
+ "\n",
171
+ "language_model = \"pt_core_news_sm\"\n",
172
+ "nlp = spacy.load(language_model)\n",
173
+ "\n",
174
+ "def lemmatize_text(text: str) -> str:\n",
175
+ " \"\"\"Lematiza e remove stopwords/pontuações de um texto.\"\"\"\n",
176
+ " doc = nlp(text.lower())\n",
177
+ " return \" \".join([\n",
178
+ " token.lemma_ for token in doc\n",
179
+ " if not token.is_punct and not token.is_space and token.text not in nlp.Defaults.stop_words\n",
180
+ " ])\n",
181
+ "\n",
182
+ "def extrair_flags( texts: list[str]):\n",
183
+ " # X é uma lista/array de textos\n",
184
+ " out = []\n",
185
+ " for txt in texts:\n",
186
+ " t = txt.lower()\n",
187
+ " flags = {\n",
188
+ " \"has_time\": int(bool(re.search(r\"\\b\\d{1,2}:\\d{2}\\b\", t))),\n",
189
+ " \"has_date\": int(bool(re.search(r\"\\b\\d{1,2}/\\d{1,2}/\\d{2,4}\\b\", t))),\n",
190
+ " \"has_ticket\": int(bool(re.search(r\"(inc|req|chamado|#\\d{4,})\", t))),\n",
191
+ " \"len_lt_60\": int(len(t) < 60),\n",
192
+ " \"has_action_word\": int(bool(re.search(r\"\\b(pauta|entrega|deadline|anexo|segu[e|ir]|agendar|reuni[aã]o|suporte|sla)\\b\", t))),\n",
193
+ " \"has_social_word\": int(bool(re.search(r\"\\b(parab[eé]ns|felicidades|obrigad[oa]!*$|confraterniza|happy hour|churrasco)\\b\", t)))\n",
194
+ " }\n",
195
+ " out.append(flags)\n",
196
+ " return out"
197
+ ]
198
+ },
199
+ {
200
+ "cell_type": "markdown",
201
+ "id": "ac17b9fd",
202
+ "metadata": {},
203
+ "source": [
204
+ "### Criar pipeline TF-IDF + Classificador \n"
205
+ ]
206
+ },
207
+ {
208
+ "cell_type": "code",
209
+ "execution_count": 17,
210
+ "id": "851cd1c0",
211
+ "metadata": {},
212
+ "outputs": [],
213
+ "source": [
214
+ "\n",
215
+ "\n",
216
+ "\n",
217
+ "vectorizer = TfidfVectorizer(\n",
218
+ " preprocessor=lemmatize_text,\n",
219
+ " lowercase=False,\n",
220
+ " ngram_range=(1, 2),\n",
221
+ " min_df=3,\n",
222
+ " max_df=0.95,\n",
223
+ " sublinear_tf=True,\n",
224
+ " norm='l2'\n",
225
+ ")\n",
226
+ "\n",
227
+ "features = FeatureUnion([\n",
228
+ " (\"tfidf\", vectorizer),\n",
229
+ " (\"flags\", Pipeline([\n",
230
+ " (\"fx\", FunctionTransformer(extrair_flags, validate=False)),\n",
231
+ " (\"dv\", DictVectorizer(sparse=True))\n",
232
+ " ]))\n",
233
+ "])\n",
234
+ "\n",
235
+ "pipeline = Pipeline([\n",
236
+ " (\"feats\", features),\n",
237
+ " (\"clf\", LogisticRegression(class_weight='balanced', max_iter=2000))\n",
238
+ "])"
239
+ ]
240
+ },
241
+ {
242
+ "cell_type": "markdown",
243
+ "id": "b6eb8af1",
244
+ "metadata": {},
245
+ "source": [
246
+ "### Treinar modelo\n"
247
+ ]
248
+ },
249
+ {
250
+ "cell_type": "code",
251
+ "execution_count": 18,
252
+ "id": "7782ae07",
253
+ "metadata": {},
254
+ "outputs": [
255
+ {
256
+ "data": {
257
+ "text/html": [
258
+ "<style>#sk-container-id-2 {\n",
259
+ " /* Definition of color scheme common for light and dark mode */\n",
260
+ " --sklearn-color-text: #000;\n",
261
+ " --sklearn-color-text-muted: #666;\n",
262
+ " --sklearn-color-line: gray;\n",
263
+ " /* Definition of color scheme for unfitted estimators */\n",
264
+ " --sklearn-color-unfitted-level-0: #fff5e6;\n",
265
+ " --sklearn-color-unfitted-level-1: #f6e4d2;\n",
266
+ " --sklearn-color-unfitted-level-2: #ffe0b3;\n",
267
+ " --sklearn-color-unfitted-level-3: chocolate;\n",
268
+ " /* Definition of color scheme for fitted estimators */\n",
269
+ " --sklearn-color-fitted-level-0: #f0f8ff;\n",
270
+ " --sklearn-color-fitted-level-1: #d4ebff;\n",
271
+ " --sklearn-color-fitted-level-2: #b3dbfd;\n",
272
+ " --sklearn-color-fitted-level-3: cornflowerblue;\n",
273
+ "\n",
274
+ " /* Specific color for light theme */\n",
275
+ " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
276
+ " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
277
+ " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
278
+ " --sklearn-color-icon: #696969;\n",
279
+ "\n",
280
+ " @media (prefers-color-scheme: dark) {\n",
281
+ " /* Redefinition of color scheme for dark theme */\n",
282
+ " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
283
+ " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
284
+ " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
285
+ " --sklearn-color-icon: #878787;\n",
286
+ " }\n",
287
+ "}\n",
288
+ "\n",
289
+ "#sk-container-id-2 {\n",
290
+ " color: var(--sklearn-color-text);\n",
291
+ "}\n",
292
+ "\n",
293
+ "#sk-container-id-2 pre {\n",
294
+ " padding: 0;\n",
295
+ "}\n",
296
+ "\n",
297
+ "#sk-container-id-2 input.sk-hidden--visually {\n",
298
+ " border: 0;\n",
299
+ " clip: rect(1px 1px 1px 1px);\n",
300
+ " clip: rect(1px, 1px, 1px, 1px);\n",
301
+ " height: 1px;\n",
302
+ " margin: -1px;\n",
303
+ " overflow: hidden;\n",
304
+ " padding: 0;\n",
305
+ " position: absolute;\n",
306
+ " width: 1px;\n",
307
+ "}\n",
308
+ "\n",
309
+ "#sk-container-id-2 div.sk-dashed-wrapped {\n",
310
+ " border: 1px dashed var(--sklearn-color-line);\n",
311
+ " margin: 0 0.4em 0.5em 0.4em;\n",
312
+ " box-sizing: border-box;\n",
313
+ " padding-bottom: 0.4em;\n",
314
+ " background-color: var(--sklearn-color-background);\n",
315
+ "}\n",
316
+ "\n",
317
+ "#sk-container-id-2 div.sk-container {\n",
318
+ " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
319
+ " but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
320
+ " so we also need the `!important` here to be able to override the\n",
321
+ " default hidden behavior on the sphinx rendered scikit-learn.org.\n",
322
+ " See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
323
+ " display: inline-block !important;\n",
324
+ " position: relative;\n",
325
+ "}\n",
326
+ "\n",
327
+ "#sk-container-id-2 div.sk-text-repr-fallback {\n",
328
+ " display: none;\n",
329
+ "}\n",
330
+ "\n",
331
+ "div.sk-parallel-item,\n",
332
+ "div.sk-serial,\n",
333
+ "div.sk-item {\n",
334
+ " /* draw centered vertical line to link estimators */\n",
335
+ " background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
336
+ " background-size: 2px 100%;\n",
337
+ " background-repeat: no-repeat;\n",
338
+ " background-position: center center;\n",
339
+ "}\n",
340
+ "\n",
341
+ "/* Parallel-specific style estimator block */\n",
342
+ "\n",
343
+ "#sk-container-id-2 div.sk-parallel-item::after {\n",
344
+ " content: \"\";\n",
345
+ " width: 100%;\n",
346
+ " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
347
+ " flex-grow: 1;\n",
348
+ "}\n",
349
+ "\n",
350
+ "#sk-container-id-2 div.sk-parallel {\n",
351
+ " display: flex;\n",
352
+ " align-items: stretch;\n",
353
+ " justify-content: center;\n",
354
+ " background-color: var(--sklearn-color-background);\n",
355
+ " position: relative;\n",
356
+ "}\n",
357
+ "\n",
358
+ "#sk-container-id-2 div.sk-parallel-item {\n",
359
+ " display: flex;\n",
360
+ " flex-direction: column;\n",
361
+ "}\n",
362
+ "\n",
363
+ "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
364
+ " align-self: flex-end;\n",
365
+ " width: 50%;\n",
366
+ "}\n",
367
+ "\n",
368
+ "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
369
+ " align-self: flex-start;\n",
370
+ " width: 50%;\n",
371
+ "}\n",
372
+ "\n",
373
+ "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
374
+ " width: 0;\n",
375
+ "}\n",
376
+ "\n",
377
+ "/* Serial-specific style estimator block */\n",
378
+ "\n",
379
+ "#sk-container-id-2 div.sk-serial {\n",
380
+ " display: flex;\n",
381
+ " flex-direction: column;\n",
382
+ " align-items: center;\n",
383
+ " background-color: var(--sklearn-color-background);\n",
384
+ " padding-right: 1em;\n",
385
+ " padding-left: 1em;\n",
386
+ "}\n",
387
+ "\n",
388
+ "\n",
389
+ "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
390
+ "clickable and can be expanded/collapsed.\n",
391
+ "- Pipeline and ColumnTransformer use this feature and define the default style\n",
392
+ "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
393
+ "*/\n",
394
+ "\n",
395
+ "/* Pipeline and ColumnTransformer style (default) */\n",
396
+ "\n",
397
+ "#sk-container-id-2 div.sk-toggleable {\n",
398
+ " /* Default theme specific background. It is overwritten whether we have a\n",
399
+ " specific estimator or a Pipeline/ColumnTransformer */\n",
400
+ " background-color: var(--sklearn-color-background);\n",
401
+ "}\n",
402
+ "\n",
403
+ "/* Toggleable label */\n",
404
+ "#sk-container-id-2 label.sk-toggleable__label {\n",
405
+ " cursor: pointer;\n",
406
+ " display: flex;\n",
407
+ " width: 100%;\n",
408
+ " margin-bottom: 0;\n",
409
+ " padding: 0.5em;\n",
410
+ " box-sizing: border-box;\n",
411
+ " text-align: center;\n",
412
+ " align-items: start;\n",
413
+ " justify-content: space-between;\n",
414
+ " gap: 0.5em;\n",
415
+ "}\n",
416
+ "\n",
417
+ "#sk-container-id-2 label.sk-toggleable__label .caption {\n",
418
+ " font-size: 0.6rem;\n",
419
+ " font-weight: lighter;\n",
420
+ " color: var(--sklearn-color-text-muted);\n",
421
+ "}\n",
422
+ "\n",
423
+ "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
424
+ " /* Arrow on the left of the label */\n",
425
+ " content: \"▸\";\n",
426
+ " float: left;\n",
427
+ " margin-right: 0.25em;\n",
428
+ " color: var(--sklearn-color-icon);\n",
429
+ "}\n",
430
+ "\n",
431
+ "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
432
+ " color: var(--sklearn-color-text);\n",
433
+ "}\n",
434
+ "\n",
435
+ "/* Toggleable content - dropdown */\n",
436
+ "\n",
437
+ "#sk-container-id-2 div.sk-toggleable__content {\n",
438
+ " display: none;\n",
439
+ " text-align: left;\n",
440
+ " /* unfitted */\n",
441
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
442
+ "}\n",
443
+ "\n",
444
+ "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
445
+ " /* fitted */\n",
446
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
447
+ "}\n",
448
+ "\n",
449
+ "#sk-container-id-2 div.sk-toggleable__content pre {\n",
450
+ " margin: 0.2em;\n",
451
+ " border-radius: 0.25em;\n",
452
+ " color: var(--sklearn-color-text);\n",
453
+ " /* unfitted */\n",
454
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
455
+ "}\n",
456
+ "\n",
457
+ "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
458
+ " /* unfitted */\n",
459
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
460
+ "}\n",
461
+ "\n",
462
+ "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
463
+ " /* Expand drop-down */\n",
464
+ " display: block;\n",
465
+ " width: 100%;\n",
466
+ " overflow: visible;\n",
467
+ "}\n",
468
+ "\n",
469
+ "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
470
+ " content: \"▾\";\n",
471
+ "}\n",
472
+ "\n",
473
+ "/* Pipeline/ColumnTransformer-specific style */\n",
474
+ "\n",
475
+ "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
476
+ " color: var(--sklearn-color-text);\n",
477
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
478
+ "}\n",
479
+ "\n",
480
+ "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
481
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
482
+ "}\n",
483
+ "\n",
484
+ "/* Estimator-specific style */\n",
485
+ "\n",
486
+ "/* Colorize estimator box */\n",
487
+ "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
488
+ " /* unfitted */\n",
489
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
490
+ "}\n",
491
+ "\n",
492
+ "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
493
+ " /* fitted */\n",
494
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
495
+ "}\n",
496
+ "\n",
497
+ "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
498
+ "#sk-container-id-2 div.sk-label label {\n",
499
+ " /* The background is the default theme color */\n",
500
+ " color: var(--sklearn-color-text-on-default-background);\n",
501
+ "}\n",
502
+ "\n",
503
+ "/* On hover, darken the color of the background */\n",
504
+ "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
505
+ " color: var(--sklearn-color-text);\n",
506
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
507
+ "}\n",
508
+ "\n",
509
+ "/* Label box, darken color on hover, fitted */\n",
510
+ "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
511
+ " color: var(--sklearn-color-text);\n",
512
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
513
+ "}\n",
514
+ "\n",
515
+ "/* Estimator label */\n",
516
+ "\n",
517
+ "#sk-container-id-2 div.sk-label label {\n",
518
+ " font-family: monospace;\n",
519
+ " font-weight: bold;\n",
520
+ " display: inline-block;\n",
521
+ " line-height: 1.2em;\n",
522
+ "}\n",
523
+ "\n",
524
+ "#sk-container-id-2 div.sk-label-container {\n",
525
+ " text-align: center;\n",
526
+ "}\n",
527
+ "\n",
528
+ "/* Estimator-specific */\n",
529
+ "#sk-container-id-2 div.sk-estimator {\n",
530
+ " font-family: monospace;\n",
531
+ " border: 1px dotted var(--sklearn-color-border-box);\n",
532
+ " border-radius: 0.25em;\n",
533
+ " box-sizing: border-box;\n",
534
+ " margin-bottom: 0.5em;\n",
535
+ " /* unfitted */\n",
536
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
537
+ "}\n",
538
+ "\n",
539
+ "#sk-container-id-2 div.sk-estimator.fitted {\n",
540
+ " /* fitted */\n",
541
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
542
+ "}\n",
543
+ "\n",
544
+ "/* on hover */\n",
545
+ "#sk-container-id-2 div.sk-estimator:hover {\n",
546
+ " /* unfitted */\n",
547
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
548
+ "}\n",
549
+ "\n",
550
+ "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
551
+ " /* fitted */\n",
552
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
553
+ "}\n",
554
+ "\n",
555
+ "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
556
+ "\n",
557
+ "/* Common style for \"i\" and \"?\" */\n",
558
+ "\n",
559
+ ".sk-estimator-doc-link,\n",
560
+ "a:link.sk-estimator-doc-link,\n",
561
+ "a:visited.sk-estimator-doc-link {\n",
562
+ " float: right;\n",
563
+ " font-size: smaller;\n",
564
+ " line-height: 1em;\n",
565
+ " font-family: monospace;\n",
566
+ " background-color: var(--sklearn-color-background);\n",
567
+ " border-radius: 1em;\n",
568
+ " height: 1em;\n",
569
+ " width: 1em;\n",
570
+ " text-decoration: none !important;\n",
571
+ " margin-left: 0.5em;\n",
572
+ " text-align: center;\n",
573
+ " /* unfitted */\n",
574
+ " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
575
+ " color: var(--sklearn-color-unfitted-level-1);\n",
576
+ "}\n",
577
+ "\n",
578
+ ".sk-estimator-doc-link.fitted,\n",
579
+ "a:link.sk-estimator-doc-link.fitted,\n",
580
+ "a:visited.sk-estimator-doc-link.fitted {\n",
581
+ " /* fitted */\n",
582
+ " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
583
+ " color: var(--sklearn-color-fitted-level-1);\n",
584
+ "}\n",
585
+ "\n",
586
+ "/* On hover */\n",
587
+ "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
588
+ ".sk-estimator-doc-link:hover,\n",
589
+ "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
590
+ ".sk-estimator-doc-link:hover {\n",
591
+ " /* unfitted */\n",
592
+ " background-color: var(--sklearn-color-unfitted-level-3);\n",
593
+ " color: var(--sklearn-color-background);\n",
594
+ " text-decoration: none;\n",
595
+ "}\n",
596
+ "\n",
597
+ "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
598
+ ".sk-estimator-doc-link.fitted:hover,\n",
599
+ "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
600
+ ".sk-estimator-doc-link.fitted:hover {\n",
601
+ " /* fitted */\n",
602
+ " background-color: var(--sklearn-color-fitted-level-3);\n",
603
+ " color: var(--sklearn-color-background);\n",
604
+ " text-decoration: none;\n",
605
+ "}\n",
606
+ "\n",
607
+ "/* Span, style for the box shown on hovering the info icon */\n",
608
+ ".sk-estimator-doc-link span {\n",
609
+ " display: none;\n",
610
+ " z-index: 9999;\n",
611
+ " position: relative;\n",
612
+ " font-weight: normal;\n",
613
+ " right: .2ex;\n",
614
+ " padding: .5ex;\n",
615
+ " margin: .5ex;\n",
616
+ " width: min-content;\n",
617
+ " min-width: 20ex;\n",
618
+ " max-width: 50ex;\n",
619
+ " color: var(--sklearn-color-text);\n",
620
+ " box-shadow: 2pt 2pt 4pt #999;\n",
621
+ " /* unfitted */\n",
622
+ " background: var(--sklearn-color-unfitted-level-0);\n",
623
+ " border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
624
+ "}\n",
625
+ "\n",
626
+ ".sk-estimator-doc-link.fitted span {\n",
627
+ " /* fitted */\n",
628
+ " background: var(--sklearn-color-fitted-level-0);\n",
629
+ " border: var(--sklearn-color-fitted-level-3);\n",
630
+ "}\n",
631
+ "\n",
632
+ ".sk-estimator-doc-link:hover span {\n",
633
+ " display: block;\n",
634
+ "}\n",
635
+ "\n",
636
+ "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
637
+ "\n",
638
+ "#sk-container-id-2 a.estimator_doc_link {\n",
639
+ " float: right;\n",
640
+ " font-size: 1rem;\n",
641
+ " line-height: 1em;\n",
642
+ " font-family: monospace;\n",
643
+ " background-color: var(--sklearn-color-background);\n",
644
+ " border-radius: 1rem;\n",
645
+ " height: 1rem;\n",
646
+ " width: 1rem;\n",
647
+ " text-decoration: none;\n",
648
+ " /* unfitted */\n",
649
+ " color: var(--sklearn-color-unfitted-level-1);\n",
650
+ " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
651
+ "}\n",
652
+ "\n",
653
+ "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
654
+ " /* fitted */\n",
655
+ " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
656
+ " color: var(--sklearn-color-fitted-level-1);\n",
657
+ "}\n",
658
+ "\n",
659
+ "/* On hover */\n",
660
+ "#sk-container-id-2 a.estimator_doc_link:hover {\n",
661
+ " /* unfitted */\n",
662
+ " background-color: var(--sklearn-color-unfitted-level-3);\n",
663
+ " color: var(--sklearn-color-background);\n",
664
+ " text-decoration: none;\n",
665
+ "}\n",
666
+ "\n",
667
+ "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
668
+ " /* fitted */\n",
669
+ " background-color: var(--sklearn-color-fitted-level-3);\n",
670
+ "}\n",
671
+ "\n",
672
+ ".estimator-table summary {\n",
673
+ " padding: .5rem;\n",
674
+ " font-family: monospace;\n",
675
+ " cursor: pointer;\n",
676
+ "}\n",
677
+ "\n",
678
+ ".estimator-table details[open] {\n",
679
+ " padding-left: 0.1rem;\n",
680
+ " padding-right: 0.1rem;\n",
681
+ " padding-bottom: 0.3rem;\n",
682
+ "}\n",
683
+ "\n",
684
+ ".estimator-table .parameters-table {\n",
685
+ " margin-left: auto !important;\n",
686
+ " margin-right: auto !important;\n",
687
+ "}\n",
688
+ "\n",
689
+ ".estimator-table .parameters-table tr:nth-child(odd) {\n",
690
+ " background-color: #fff;\n",
691
+ "}\n",
692
+ "\n",
693
+ ".estimator-table .parameters-table tr:nth-child(even) {\n",
694
+ " background-color: #f6f6f6;\n",
695
+ "}\n",
696
+ "\n",
697
+ ".estimator-table .parameters-table tr:hover {\n",
698
+ " background-color: #e0e0e0;\n",
699
+ "}\n",
700
+ "\n",
701
+ ".estimator-table table td {\n",
702
+ " border: 1px solid rgba(106, 105, 104, 0.232);\n",
703
+ "}\n",
704
+ "\n",
705
+ ".user-set td {\n",
706
+ " color:rgb(255, 94, 0);\n",
707
+ " text-align: left;\n",
708
+ "}\n",
709
+ "\n",
710
+ ".user-set td.value pre {\n",
711
+ " color:rgb(255, 94, 0) !important;\n",
712
+ " background-color: transparent !important;\n",
713
+ "}\n",
714
+ "\n",
715
+ ".default td {\n",
716
+ " color: black;\n",
717
+ " text-align: left;\n",
718
+ "}\n",
719
+ "\n",
720
+ ".user-set td i,\n",
721
+ ".default td i {\n",
722
+ " color: black;\n",
723
+ "}\n",
724
+ "\n",
725
+ ".copy-paste-icon {\n",
726
+ " background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNy4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjUgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTIwOCAwTDMzMi4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw2Ny45IDY3LjljOSA5IDE0LjEgMjEuMiAxNC4xIDMzLjlMNDQ4IDMzNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjg4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4ek00OCAxMjhsODAgMCAwIDY0LTY0IDAgMCAyNTYgMTkyIDAgMC0zMiA2NCAwIDAgNDhjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDE3NmMwLTI2LjUgMjEuNS00OCA0OC00OHoiLz48L3N2Zz4=);\n",
727
+ " background-repeat: no-repeat;\n",
728
+ " background-size: 14px 14px;\n",
729
+ " background-position: 0;\n",
730
+ " display: inline-block;\n",
731
+ " width: 14px;\n",
732
+ " height: 14px;\n",
733
+ " cursor: pointer;\n",
734
+ "}\n",
735
+ "</style><body><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>Pipeline(steps=[(&#x27;feats&#x27;,\n",
736
+ " FeatureUnion(transformer_list=[(&#x27;tfidf&#x27;,\n",
737
+ " TfidfVectorizer(lowercase=False,\n",
738
+ " max_df=0.95,\n",
739
+ " min_df=3,\n",
740
+ " ngram_range=(1,\n",
741
+ " 2),\n",
742
+ " preprocessor=&lt;function lemmatize_text at 0x7f3ae7c1a7a0&gt;,\n",
743
+ " sublinear_tf=True)),\n",
744
+ " (&#x27;flags&#x27;,\n",
745
+ " Pipeline(steps=[(&#x27;fx&#x27;,\n",
746
+ " FunctionTransformer(func=&lt;function extrair_flags at 0x7f3ae7b923e0&gt;)),\n",
747
+ " (&#x27;dv&#x27;,\n",
748
+ " DictVectorizer())]))])),\n",
749
+ " (&#x27;clf&#x27;,\n",
750
+ " LogisticRegression(class_weight=&#x27;balanced&#x27;, max_iter=2000))])</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-7\" type=\"checkbox\" ><label for=\"sk-estimator-id-7\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>Pipeline</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.7/modules/generated/sklearn.pipeline.Pipeline.html\">?<span>Documentation for Pipeline</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"\">\n",
751
+ " <div class=\"estimator-table\">\n",
752
+ " <details>\n",
753
+ " <summary>Parameters</summary>\n",
754
+ " <table class=\"parameters-table\">\n",
755
+ " <tbody>\n",
756
+ " \n",
757
+ " <tr class=\"user-set\">\n",
758
+ " <td><i class=\"copy-paste-icon\"\n",
759
+ " onclick=\"copyToClipboard('steps',\n",
760
+ " this.parentElement.nextElementSibling)\"\n",
761
+ " ></i></td>\n",
762
+ " <td class=\"param\">steps&nbsp;</td>\n",
763
+ " <td class=\"value\">[(&#x27;feats&#x27;, ...), (&#x27;clf&#x27;, ...)]</td>\n",
764
+ " </tr>\n",
765
+ " \n",
766
+ "\n",
767
+ " <tr class=\"default\">\n",
768
+ " <td><i class=\"copy-paste-icon\"\n",
769
+ " onclick=\"copyToClipboard('transform_input',\n",
770
+ " this.parentElement.nextElementSibling)\"\n",
771
+ " ></i></td>\n",
772
+ " <td class=\"param\">transform_input&nbsp;</td>\n",
773
+ " <td class=\"value\">None</td>\n",
774
+ " </tr>\n",
775
+ " \n",
776
+ "\n",
777
+ " <tr class=\"default\">\n",
778
+ " <td><i class=\"copy-paste-icon\"\n",
779
+ " onclick=\"copyToClipboard('memory',\n",
780
+ " this.parentElement.nextElementSibling)\"\n",
781
+ " ></i></td>\n",
782
+ " <td class=\"param\">memory&nbsp;</td>\n",
783
+ " <td class=\"value\">None</td>\n",
784
+ " </tr>\n",
785
+ " \n",
786
+ "\n",
787
+ " <tr class=\"default\">\n",
788
+ " <td><i class=\"copy-paste-icon\"\n",
789
+ " onclick=\"copyToClipboard('verbose',\n",
790
+ " this.parentElement.nextElementSibling)\"\n",
791
+ " ></i></td>\n",
792
+ " <td class=\"param\">verbose&nbsp;</td>\n",
793
+ " <td class=\"value\">False</td>\n",
794
+ " </tr>\n",
795
+ " \n",
796
+ " </tbody>\n",
797
+ " </table>\n",
798
+ " </details>\n",
799
+ " </div>\n",
800
+ " </div></div></div><div class=\"sk-serial\"><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-8\" type=\"checkbox\" ><label for=\"sk-estimator-id-8\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>feats: FeatureUnion</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.7/modules/generated/sklearn.pipeline.FeatureUnion.html\">?<span>Documentation for feats: FeatureUnion</span></a></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"feats__\">\n",
801
+ " <div class=\"estimator-table\">\n",
802
+ " <details>\n",
803
+ " <summary>Parameters</summary>\n",
804
+ " <table class=\"parameters-table\">\n",
805
+ " <tbody>\n",
806
+ " \n",
807
+ " <tr class=\"user-set\">\n",
808
+ " <td><i class=\"copy-paste-icon\"\n",
809
+ " onclick=\"copyToClipboard('transformer_list',\n",
810
+ " this.parentElement.nextElementSibling)\"\n",
811
+ " ></i></td>\n",
812
+ " <td class=\"param\">transformer_list&nbsp;</td>\n",
813
+ " <td class=\"value\">[(&#x27;tfidf&#x27;, ...), (&#x27;flags&#x27;, ...)]</td>\n",
814
+ " </tr>\n",
815
+ " \n",
816
+ "\n",
817
+ " <tr class=\"default\">\n",
818
+ " <td><i class=\"copy-paste-icon\"\n",
819
+ " onclick=\"copyToClipboard('n_jobs',\n",
820
+ " this.parentElement.nextElementSibling)\"\n",
821
+ " ></i></td>\n",
822
+ " <td class=\"param\">n_jobs&nbsp;</td>\n",
823
+ " <td class=\"value\">None</td>\n",
824
+ " </tr>\n",
825
+ " \n",
826
+ "\n",
827
+ " <tr class=\"default\">\n",
828
+ " <td><i class=\"copy-paste-icon\"\n",
829
+ " onclick=\"copyToClipboard('transformer_weights',\n",
830
+ " this.parentElement.nextElementSibling)\"\n",
831
+ " ></i></td>\n",
832
+ " <td class=\"param\">transformer_weights&nbsp;</td>\n",
833
+ " <td class=\"value\">None</td>\n",
834
+ " </tr>\n",
835
+ " \n",
836
+ "\n",
837
+ " <tr class=\"default\">\n",
838
+ " <td><i class=\"copy-paste-icon\"\n",
839
+ " onclick=\"copyToClipboard('verbose',\n",
840
+ " this.parentElement.nextElementSibling)\"\n",
841
+ " ></i></td>\n",
842
+ " <td class=\"param\">verbose&nbsp;</td>\n",
843
+ " <td class=\"value\">False</td>\n",
844
+ " </tr>\n",
845
+ " \n",
846
+ "\n",
847
+ " <tr class=\"default\">\n",
848
+ " <td><i class=\"copy-paste-icon\"\n",
849
+ " onclick=\"copyToClipboard('verbose_feature_names_out',\n",
850
+ " this.parentElement.nextElementSibling)\"\n",
851
+ " ></i></td>\n",
852
+ " <td class=\"param\">verbose_feature_names_out&nbsp;</td>\n",
853
+ " <td class=\"value\">True</td>\n",
854
+ " </tr>\n",
855
+ " \n",
856
+ " </tbody>\n",
857
+ " </table>\n",
858
+ " </details>\n",
859
+ " </div>\n",
860
+ " </div></div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><label>tfidf</label></div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-9\" type=\"checkbox\" ><label for=\"sk-estimator-id-9\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>TfidfVectorizer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.7/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html\">?<span>Documentation for TfidfVectorizer</span></a></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"feats__tfidf__\">\n",
861
+ " <div class=\"estimator-table\">\n",
862
+ " <details>\n",
863
+ " <summary>Parameters</summary>\n",
864
+ " <table class=\"parameters-table\">\n",
865
+ " <tbody>\n",
866
+ " \n",
867
+ " <tr class=\"default\">\n",
868
+ " <td><i class=\"copy-paste-icon\"\n",
869
+ " onclick=\"copyToClipboard('input',\n",
870
+ " this.parentElement.nextElementSibling)\"\n",
871
+ " ></i></td>\n",
872
+ " <td class=\"param\">input&nbsp;</td>\n",
873
+ " <td class=\"value\">&#x27;content&#x27;</td>\n",
874
+ " </tr>\n",
875
+ " \n",
876
+ "\n",
877
+ " <tr class=\"default\">\n",
878
+ " <td><i class=\"copy-paste-icon\"\n",
879
+ " onclick=\"copyToClipboard('encoding',\n",
880
+ " this.parentElement.nextElementSibling)\"\n",
881
+ " ></i></td>\n",
882
+ " <td class=\"param\">encoding&nbsp;</td>\n",
883
+ " <td class=\"value\">&#x27;utf-8&#x27;</td>\n",
884
+ " </tr>\n",
885
+ " \n",
886
+ "\n",
887
+ " <tr class=\"default\">\n",
888
+ " <td><i class=\"copy-paste-icon\"\n",
889
+ " onclick=\"copyToClipboard('decode_error',\n",
890
+ " this.parentElement.nextElementSibling)\"\n",
891
+ " ></i></td>\n",
892
+ " <td class=\"param\">decode_error&nbsp;</td>\n",
893
+ " <td class=\"value\">&#x27;strict&#x27;</td>\n",
894
+ " </tr>\n",
895
+ " \n",
896
+ "\n",
897
+ " <tr class=\"default\">\n",
898
+ " <td><i class=\"copy-paste-icon\"\n",
899
+ " onclick=\"copyToClipboard('strip_accents',\n",
900
+ " this.parentElement.nextElementSibling)\"\n",
901
+ " ></i></td>\n",
902
+ " <td class=\"param\">strip_accents&nbsp;</td>\n",
903
+ " <td class=\"value\">None</td>\n",
904
+ " </tr>\n",
905
+ " \n",
906
+ "\n",
907
+ " <tr class=\"user-set\">\n",
908
+ " <td><i class=\"copy-paste-icon\"\n",
909
+ " onclick=\"copyToClipboard('lowercase',\n",
910
+ " this.parentElement.nextElementSibling)\"\n",
911
+ " ></i></td>\n",
912
+ " <td class=\"param\">lowercase&nbsp;</td>\n",
913
+ " <td class=\"value\">False</td>\n",
914
+ " </tr>\n",
915
+ " \n",
916
+ "\n",
917
+ " <tr class=\"user-set\">\n",
918
+ " <td><i class=\"copy-paste-icon\"\n",
919
+ " onclick=\"copyToClipboard('preprocessor',\n",
920
+ " this.parentElement.nextElementSibling)\"\n",
921
+ " ></i></td>\n",
922
+ " <td class=\"param\">preprocessor&nbsp;</td>\n",
923
+ " <td class=\"value\">&lt;function lem...x7f3ae7c1a7a0&gt;</td>\n",
924
+ " </tr>\n",
925
+ " \n",
926
+ "\n",
927
+ " <tr class=\"default\">\n",
928
+ " <td><i class=\"copy-paste-icon\"\n",
929
+ " onclick=\"copyToClipboard('tokenizer',\n",
930
+ " this.parentElement.nextElementSibling)\"\n",
931
+ " ></i></td>\n",
932
+ " <td class=\"param\">tokenizer&nbsp;</td>\n",
933
+ " <td class=\"value\">None</td>\n",
934
+ " </tr>\n",
935
+ " \n",
936
+ "\n",
937
+ " <tr class=\"default\">\n",
938
+ " <td><i class=\"copy-paste-icon\"\n",
939
+ " onclick=\"copyToClipboard('analyzer',\n",
940
+ " this.parentElement.nextElementSibling)\"\n",
941
+ " ></i></td>\n",
942
+ " <td class=\"param\">analyzer&nbsp;</td>\n",
943
+ " <td class=\"value\">&#x27;word&#x27;</td>\n",
944
+ " </tr>\n",
945
+ " \n",
946
+ "\n",
947
+ " <tr class=\"default\">\n",
948
+ " <td><i class=\"copy-paste-icon\"\n",
949
+ " onclick=\"copyToClipboard('stop_words',\n",
950
+ " this.parentElement.nextElementSibling)\"\n",
951
+ " ></i></td>\n",
952
+ " <td class=\"param\">stop_words&nbsp;</td>\n",
953
+ " <td class=\"value\">None</td>\n",
954
+ " </tr>\n",
955
+ " \n",
956
+ "\n",
957
+ " <tr class=\"default\">\n",
958
+ " <td><i class=\"copy-paste-icon\"\n",
959
+ " onclick=\"copyToClipboard('token_pattern',\n",
960
+ " this.parentElement.nextElementSibling)\"\n",
961
+ " ></i></td>\n",
962
+ " <td class=\"param\">token_pattern&nbsp;</td>\n",
963
+ " <td class=\"value\">&#x27;(?u)\\\\b\\\\w\\\\w+\\\\b&#x27;</td>\n",
964
+ " </tr>\n",
965
+ " \n",
966
+ "\n",
967
+ " <tr class=\"user-set\">\n",
968
+ " <td><i class=\"copy-paste-icon\"\n",
969
+ " onclick=\"copyToClipboard('ngram_range',\n",
970
+ " this.parentElement.nextElementSibling)\"\n",
971
+ " ></i></td>\n",
972
+ " <td class=\"param\">ngram_range&nbsp;</td>\n",
973
+ " <td class=\"value\">(1, ...)</td>\n",
974
+ " </tr>\n",
975
+ " \n",
976
+ "\n",
977
+ " <tr class=\"user-set\">\n",
978
+ " <td><i class=\"copy-paste-icon\"\n",
979
+ " onclick=\"copyToClipboard('max_df',\n",
980
+ " this.parentElement.nextElementSibling)\"\n",
981
+ " ></i></td>\n",
982
+ " <td class=\"param\">max_df&nbsp;</td>\n",
983
+ " <td class=\"value\">0.95</td>\n",
984
+ " </tr>\n",
985
+ " \n",
986
+ "\n",
987
+ " <tr class=\"user-set\">\n",
988
+ " <td><i class=\"copy-paste-icon\"\n",
989
+ " onclick=\"copyToClipboard('min_df',\n",
990
+ " this.parentElement.nextElementSibling)\"\n",
991
+ " ></i></td>\n",
992
+ " <td class=\"param\">min_df&nbsp;</td>\n",
993
+ " <td class=\"value\">3</td>\n",
994
+ " </tr>\n",
995
+ " \n",
996
+ "\n",
997
+ " <tr class=\"default\">\n",
998
+ " <td><i class=\"copy-paste-icon\"\n",
999
+ " onclick=\"copyToClipboard('max_features',\n",
1000
+ " this.parentElement.nextElementSibling)\"\n",
1001
+ " ></i></td>\n",
1002
+ " <td class=\"param\">max_features&nbsp;</td>\n",
1003
+ " <td class=\"value\">None</td>\n",
1004
+ " </tr>\n",
1005
+ " \n",
1006
+ "\n",
1007
+ " <tr class=\"default\">\n",
1008
+ " <td><i class=\"copy-paste-icon\"\n",
1009
+ " onclick=\"copyToClipboard('vocabulary',\n",
1010
+ " this.parentElement.nextElementSibling)\"\n",
1011
+ " ></i></td>\n",
1012
+ " <td class=\"param\">vocabulary&nbsp;</td>\n",
1013
+ " <td class=\"value\">None</td>\n",
1014
+ " </tr>\n",
1015
+ " \n",
1016
+ "\n",
1017
+ " <tr class=\"default\">\n",
1018
+ " <td><i class=\"copy-paste-icon\"\n",
1019
+ " onclick=\"copyToClipboard('binary',\n",
1020
+ " this.parentElement.nextElementSibling)\"\n",
1021
+ " ></i></td>\n",
1022
+ " <td class=\"param\">binary&nbsp;</td>\n",
1023
+ " <td class=\"value\">False</td>\n",
1024
+ " </tr>\n",
1025
+ " \n",
1026
+ "\n",
1027
+ " <tr class=\"default\">\n",
1028
+ " <td><i class=\"copy-paste-icon\"\n",
1029
+ " onclick=\"copyToClipboard('dtype',\n",
1030
+ " this.parentElement.nextElementSibling)\"\n",
1031
+ " ></i></td>\n",
1032
+ " <td class=\"param\">dtype&nbsp;</td>\n",
1033
+ " <td class=\"value\">&lt;class &#x27;numpy.float64&#x27;&gt;</td>\n",
1034
+ " </tr>\n",
1035
+ " \n",
1036
+ "\n",
1037
+ " <tr class=\"default\">\n",
1038
+ " <td><i class=\"copy-paste-icon\"\n",
1039
+ " onclick=\"copyToClipboard('norm',\n",
1040
+ " this.parentElement.nextElementSibling)\"\n",
1041
+ " ></i></td>\n",
1042
+ " <td class=\"param\">norm&nbsp;</td>\n",
1043
+ " <td class=\"value\">&#x27;l2&#x27;</td>\n",
1044
+ " </tr>\n",
1045
+ " \n",
1046
+ "\n",
1047
+ " <tr class=\"default\">\n",
1048
+ " <td><i class=\"copy-paste-icon\"\n",
1049
+ " onclick=\"copyToClipboard('use_idf',\n",
1050
+ " this.parentElement.nextElementSibling)\"\n",
1051
+ " ></i></td>\n",
1052
+ " <td class=\"param\">use_idf&nbsp;</td>\n",
1053
+ " <td class=\"value\">True</td>\n",
1054
+ " </tr>\n",
1055
+ " \n",
1056
+ "\n",
1057
+ " <tr class=\"default\">\n",
1058
+ " <td><i class=\"copy-paste-icon\"\n",
1059
+ " onclick=\"copyToClipboard('smooth_idf',\n",
1060
+ " this.parentElement.nextElementSibling)\"\n",
1061
+ " ></i></td>\n",
1062
+ " <td class=\"param\">smooth_idf&nbsp;</td>\n",
1063
+ " <td class=\"value\">True</td>\n",
1064
+ " </tr>\n",
1065
+ " \n",
1066
+ "\n",
1067
+ " <tr class=\"user-set\">\n",
1068
+ " <td><i class=\"copy-paste-icon\"\n",
1069
+ " onclick=\"copyToClipboard('sublinear_tf',\n",
1070
+ " this.parentElement.nextElementSibling)\"\n",
1071
+ " ></i></td>\n",
1072
+ " <td class=\"param\">sublinear_tf&nbsp;</td>\n",
1073
+ " <td class=\"value\">True</td>\n",
1074
+ " </tr>\n",
1075
+ " \n",
1076
+ " </tbody>\n",
1077
+ " </table>\n",
1078
+ " </details>\n",
1079
+ " </div>\n",
1080
+ " </div></div></div></div></div></div><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><label>flags</label></div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-10\" type=\"checkbox\" ><label for=\"sk-estimator-id-10\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>extrair_flags</div><div class=\"caption\">FunctionTransformer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.7/modules/generated/sklearn.preprocessing.FunctionTransformer.html\">?<span>Documentation for FunctionTransformer</span></a></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"feats__flags__fx__\">\n",
1081
+ " <div class=\"estimator-table\">\n",
1082
+ " <details>\n",
1083
+ " <summary>Parameters</summary>\n",
1084
+ " <table class=\"parameters-table\">\n",
1085
+ " <tbody>\n",
1086
+ " \n",
1087
+ " <tr class=\"user-set\">\n",
1088
+ " <td><i class=\"copy-paste-icon\"\n",
1089
+ " onclick=\"copyToClipboard('func',\n",
1090
+ " this.parentElement.nextElementSibling)\"\n",
1091
+ " ></i></td>\n",
1092
+ " <td class=\"param\">func&nbsp;</td>\n",
1093
+ " <td class=\"value\">&lt;function ext...x7f3ae7b923e0&gt;</td>\n",
1094
+ " </tr>\n",
1095
+ " \n",
1096
+ "\n",
1097
+ " <tr class=\"default\">\n",
1098
+ " <td><i class=\"copy-paste-icon\"\n",
1099
+ " onclick=\"copyToClipboard('inverse_func',\n",
1100
+ " this.parentElement.nextElementSibling)\"\n",
1101
+ " ></i></td>\n",
1102
+ " <td class=\"param\">inverse_func&nbsp;</td>\n",
1103
+ " <td class=\"value\">None</td>\n",
1104
+ " </tr>\n",
1105
+ " \n",
1106
+ "\n",
1107
+ " <tr class=\"default\">\n",
1108
+ " <td><i class=\"copy-paste-icon\"\n",
1109
+ " onclick=\"copyToClipboard('validate',\n",
1110
+ " this.parentElement.nextElementSibling)\"\n",
1111
+ " ></i></td>\n",
1112
+ " <td class=\"param\">validate&nbsp;</td>\n",
1113
+ " <td class=\"value\">False</td>\n",
1114
+ " </tr>\n",
1115
+ " \n",
1116
+ "\n",
1117
+ " <tr class=\"default\">\n",
1118
+ " <td><i class=\"copy-paste-icon\"\n",
1119
+ " onclick=\"copyToClipboard('accept_sparse',\n",
1120
+ " this.parentElement.nextElementSibling)\"\n",
1121
+ " ></i></td>\n",
1122
+ " <td class=\"param\">accept_sparse&nbsp;</td>\n",
1123
+ " <td class=\"value\">False</td>\n",
1124
+ " </tr>\n",
1125
+ " \n",
1126
+ "\n",
1127
+ " <tr class=\"default\">\n",
1128
+ " <td><i class=\"copy-paste-icon\"\n",
1129
+ " onclick=\"copyToClipboard('check_inverse',\n",
1130
+ " this.parentElement.nextElementSibling)\"\n",
1131
+ " ></i></td>\n",
1132
+ " <td class=\"param\">check_inverse&nbsp;</td>\n",
1133
+ " <td class=\"value\">True</td>\n",
1134
+ " </tr>\n",
1135
+ " \n",
1136
+ "\n",
1137
+ " <tr class=\"default\">\n",
1138
+ " <td><i class=\"copy-paste-icon\"\n",
1139
+ " onclick=\"copyToClipboard('feature_names_out',\n",
1140
+ " this.parentElement.nextElementSibling)\"\n",
1141
+ " ></i></td>\n",
1142
+ " <td class=\"param\">feature_names_out&nbsp;</td>\n",
1143
+ " <td class=\"value\">None</td>\n",
1144
+ " </tr>\n",
1145
+ " \n",
1146
+ "\n",
1147
+ " <tr class=\"default\">\n",
1148
+ " <td><i class=\"copy-paste-icon\"\n",
1149
+ " onclick=\"copyToClipboard('kw_args',\n",
1150
+ " this.parentElement.nextElementSibling)\"\n",
1151
+ " ></i></td>\n",
1152
+ " <td class=\"param\">kw_args&nbsp;</td>\n",
1153
+ " <td class=\"value\">None</td>\n",
1154
+ " </tr>\n",
1155
+ " \n",
1156
+ "\n",
1157
+ " <tr class=\"default\">\n",
1158
+ " <td><i class=\"copy-paste-icon\"\n",
1159
+ " onclick=\"copyToClipboard('inv_kw_args',\n",
1160
+ " this.parentElement.nextElementSibling)\"\n",
1161
+ " ></i></td>\n",
1162
+ " <td class=\"param\">inv_kw_args&nbsp;</td>\n",
1163
+ " <td class=\"value\">None</td>\n",
1164
+ " </tr>\n",
1165
+ " \n",
1166
+ " </tbody>\n",
1167
+ " </table>\n",
1168
+ " </details>\n",
1169
+ " </div>\n",
1170
+ " </div></div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-11\" type=\"checkbox\" ><label for=\"sk-estimator-id-11\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>DictVectorizer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.7/modules/generated/sklearn.feature_extraction.DictVectorizer.html\">?<span>Documentation for DictVectorizer</span></a></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"feats__flags__dv__\">\n",
1171
+ " <div class=\"estimator-table\">\n",
1172
+ " <details>\n",
1173
+ " <summary>Parameters</summary>\n",
1174
+ " <table class=\"parameters-table\">\n",
1175
+ " <tbody>\n",
1176
+ " \n",
1177
+ " <tr class=\"default\">\n",
1178
+ " <td><i class=\"copy-paste-icon\"\n",
1179
+ " onclick=\"copyToClipboard('dtype',\n",
1180
+ " this.parentElement.nextElementSibling)\"\n",
1181
+ " ></i></td>\n",
1182
+ " <td class=\"param\">dtype&nbsp;</td>\n",
1183
+ " <td class=\"value\">&lt;class &#x27;numpy.float64&#x27;&gt;</td>\n",
1184
+ " </tr>\n",
1185
+ " \n",
1186
+ "\n",
1187
+ " <tr class=\"default\">\n",
1188
+ " <td><i class=\"copy-paste-icon\"\n",
1189
+ " onclick=\"copyToClipboard('separator',\n",
1190
+ " this.parentElement.nextElementSibling)\"\n",
1191
+ " ></i></td>\n",
1192
+ " <td class=\"param\">separator&nbsp;</td>\n",
1193
+ " <td class=\"value\">&#x27;=&#x27;</td>\n",
1194
+ " </tr>\n",
1195
+ " \n",
1196
+ "\n",
1197
+ " <tr class=\"default\">\n",
1198
+ " <td><i class=\"copy-paste-icon\"\n",
1199
+ " onclick=\"copyToClipboard('sparse',\n",
1200
+ " this.parentElement.nextElementSibling)\"\n",
1201
+ " ></i></td>\n",
1202
+ " <td class=\"param\">sparse&nbsp;</td>\n",
1203
+ " <td class=\"value\">True</td>\n",
1204
+ " </tr>\n",
1205
+ " \n",
1206
+ "\n",
1207
+ " <tr class=\"default\">\n",
1208
+ " <td><i class=\"copy-paste-icon\"\n",
1209
+ " onclick=\"copyToClipboard('sort',\n",
1210
+ " this.parentElement.nextElementSibling)\"\n",
1211
+ " ></i></td>\n",
1212
+ " <td class=\"param\">sort&nbsp;</td>\n",
1213
+ " <td class=\"value\">True</td>\n",
1214
+ " </tr>\n",
1215
+ " \n",
1216
+ " </tbody>\n",
1217
+ " </table>\n",
1218
+ " </details>\n",
1219
+ " </div>\n",
1220
+ " </div></div></div></div></div></div></div></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-12\" type=\"checkbox\" ><label for=\"sk-estimator-id-12\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>LogisticRegression</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.7/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"clf__\">\n",
1221
+ " <div class=\"estimator-table\">\n",
1222
+ " <details>\n",
1223
+ " <summary>Parameters</summary>\n",
1224
+ " <table class=\"parameters-table\">\n",
1225
+ " <tbody>\n",
1226
+ " \n",
1227
+ " <tr class=\"default\">\n",
1228
+ " <td><i class=\"copy-paste-icon\"\n",
1229
+ " onclick=\"copyToClipboard('penalty',\n",
1230
+ " this.parentElement.nextElementSibling)\"\n",
1231
+ " ></i></td>\n",
1232
+ " <td class=\"param\">penalty&nbsp;</td>\n",
1233
+ " <td class=\"value\">&#x27;l2&#x27;</td>\n",
1234
+ " </tr>\n",
1235
+ " \n",
1236
+ "\n",
1237
+ " <tr class=\"default\">\n",
1238
+ " <td><i class=\"copy-paste-icon\"\n",
1239
+ " onclick=\"copyToClipboard('dual',\n",
1240
+ " this.parentElement.nextElementSibling)\"\n",
1241
+ " ></i></td>\n",
1242
+ " <td class=\"param\">dual&nbsp;</td>\n",
1243
+ " <td class=\"value\">False</td>\n",
1244
+ " </tr>\n",
1245
+ " \n",
1246
+ "\n",
1247
+ " <tr class=\"default\">\n",
1248
+ " <td><i class=\"copy-paste-icon\"\n",
1249
+ " onclick=\"copyToClipboard('tol',\n",
1250
+ " this.parentElement.nextElementSibling)\"\n",
1251
+ " ></i></td>\n",
1252
+ " <td class=\"param\">tol&nbsp;</td>\n",
1253
+ " <td class=\"value\">0.0001</td>\n",
1254
+ " </tr>\n",
1255
+ " \n",
1256
+ "\n",
1257
+ " <tr class=\"default\">\n",
1258
+ " <td><i class=\"copy-paste-icon\"\n",
1259
+ " onclick=\"copyToClipboard('C',\n",
1260
+ " this.parentElement.nextElementSibling)\"\n",
1261
+ " ></i></td>\n",
1262
+ " <td class=\"param\">C&nbsp;</td>\n",
1263
+ " <td class=\"value\">1.0</td>\n",
1264
+ " </tr>\n",
1265
+ " \n",
1266
+ "\n",
1267
+ " <tr class=\"default\">\n",
1268
+ " <td><i class=\"copy-paste-icon\"\n",
1269
+ " onclick=\"copyToClipboard('fit_intercept',\n",
1270
+ " this.parentElement.nextElementSibling)\"\n",
1271
+ " ></i></td>\n",
1272
+ " <td class=\"param\">fit_intercept&nbsp;</td>\n",
1273
+ " <td class=\"value\">True</td>\n",
1274
+ " </tr>\n",
1275
+ " \n",
1276
+ "\n",
1277
+ " <tr class=\"default\">\n",
1278
+ " <td><i class=\"copy-paste-icon\"\n",
1279
+ " onclick=\"copyToClipboard('intercept_scaling',\n",
1280
+ " this.parentElement.nextElementSibling)\"\n",
1281
+ " ></i></td>\n",
1282
+ " <td class=\"param\">intercept_scaling&nbsp;</td>\n",
1283
+ " <td class=\"value\">1</td>\n",
1284
+ " </tr>\n",
1285
+ " \n",
1286
+ "\n",
1287
+ " <tr class=\"user-set\">\n",
1288
+ " <td><i class=\"copy-paste-icon\"\n",
1289
+ " onclick=\"copyToClipboard('class_weight',\n",
1290
+ " this.parentElement.nextElementSibling)\"\n",
1291
+ " ></i></td>\n",
1292
+ " <td class=\"param\">class_weight&nbsp;</td>\n",
1293
+ " <td class=\"value\">&#x27;balanced&#x27;</td>\n",
1294
+ " </tr>\n",
1295
+ " \n",
1296
+ "\n",
1297
+ " <tr class=\"default\">\n",
1298
+ " <td><i class=\"copy-paste-icon\"\n",
1299
+ " onclick=\"copyToClipboard('random_state',\n",
1300
+ " this.parentElement.nextElementSibling)\"\n",
1301
+ " ></i></td>\n",
1302
+ " <td class=\"param\">random_state&nbsp;</td>\n",
1303
+ " <td class=\"value\">None</td>\n",
1304
+ " </tr>\n",
1305
+ " \n",
1306
+ "\n",
1307
+ " <tr class=\"default\">\n",
1308
+ " <td><i class=\"copy-paste-icon\"\n",
1309
+ " onclick=\"copyToClipboard('solver',\n",
1310
+ " this.parentElement.nextElementSibling)\"\n",
1311
+ " ></i></td>\n",
1312
+ " <td class=\"param\">solver&nbsp;</td>\n",
1313
+ " <td class=\"value\">&#x27;lbfgs&#x27;</td>\n",
1314
+ " </tr>\n",
1315
+ " \n",
1316
+ "\n",
1317
+ " <tr class=\"user-set\">\n",
1318
+ " <td><i class=\"copy-paste-icon\"\n",
1319
+ " onclick=\"copyToClipboard('max_iter',\n",
1320
+ " this.parentElement.nextElementSibling)\"\n",
1321
+ " ></i></td>\n",
1322
+ " <td class=\"param\">max_iter&nbsp;</td>\n",
1323
+ " <td class=\"value\">2000</td>\n",
1324
+ " </tr>\n",
1325
+ " \n",
1326
+ "\n",
1327
+ " <tr class=\"default\">\n",
1328
+ " <td><i class=\"copy-paste-icon\"\n",
1329
+ " onclick=\"copyToClipboard('multi_class',\n",
1330
+ " this.parentElement.nextElementSibling)\"\n",
1331
+ " ></i></td>\n",
1332
+ " <td class=\"param\">multi_class&nbsp;</td>\n",
1333
+ " <td class=\"value\">&#x27;deprecated&#x27;</td>\n",
1334
+ " </tr>\n",
1335
+ " \n",
1336
+ "\n",
1337
+ " <tr class=\"default\">\n",
1338
+ " <td><i class=\"copy-paste-icon\"\n",
1339
+ " onclick=\"copyToClipboard('verbose',\n",
1340
+ " this.parentElement.nextElementSibling)\"\n",
1341
+ " ></i></td>\n",
1342
+ " <td class=\"param\">verbose&nbsp;</td>\n",
1343
+ " <td class=\"value\">0</td>\n",
1344
+ " </tr>\n",
1345
+ " \n",
1346
+ "\n",
1347
+ " <tr class=\"default\">\n",
1348
+ " <td><i class=\"copy-paste-icon\"\n",
1349
+ " onclick=\"copyToClipboard('warm_start',\n",
1350
+ " this.parentElement.nextElementSibling)\"\n",
1351
+ " ></i></td>\n",
1352
+ " <td class=\"param\">warm_start&nbsp;</td>\n",
1353
+ " <td class=\"value\">False</td>\n",
1354
+ " </tr>\n",
1355
+ " \n",
1356
+ "\n",
1357
+ " <tr class=\"default\">\n",
1358
+ " <td><i class=\"copy-paste-icon\"\n",
1359
+ " onclick=\"copyToClipboard('n_jobs',\n",
1360
+ " this.parentElement.nextElementSibling)\"\n",
1361
+ " ></i></td>\n",
1362
+ " <td class=\"param\">n_jobs&nbsp;</td>\n",
1363
+ " <td class=\"value\">None</td>\n",
1364
+ " </tr>\n",
1365
+ " \n",
1366
+ "\n",
1367
+ " <tr class=\"default\">\n",
1368
+ " <td><i class=\"copy-paste-icon\"\n",
1369
+ " onclick=\"copyToClipboard('l1_ratio',\n",
1370
+ " this.parentElement.nextElementSibling)\"\n",
1371
+ " ></i></td>\n",
1372
+ " <td class=\"param\">l1_ratio&nbsp;</td>\n",
1373
+ " <td class=\"value\">None</td>\n",
1374
+ " </tr>\n",
1375
+ " \n",
1376
+ " </tbody>\n",
1377
+ " </table>\n",
1378
+ " </details>\n",
1379
+ " </div>\n",
1380
+ " </div></div></div></div></div></div></div><script>function copyToClipboard(text, element) {\n",
1381
+ " // Get the parameter prefix from the closest toggleable content\n",
1382
+ " const toggleableContent = element.closest('.sk-toggleable__content');\n",
1383
+ " const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
1384
+ " const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text;\n",
1385
+ "\n",
1386
+ " const originalStyle = element.style;\n",
1387
+ " const computedStyle = window.getComputedStyle(element);\n",
1388
+ " const originalWidth = computedStyle.width;\n",
1389
+ " const originalHTML = element.innerHTML.replace('Copied!', '');\n",
1390
+ "\n",
1391
+ " navigator.clipboard.writeText(fullParamName)\n",
1392
+ " .then(() => {\n",
1393
+ " element.style.width = originalWidth;\n",
1394
+ " element.style.color = 'green';\n",
1395
+ " element.innerHTML = \"Copied!\";\n",
1396
+ "\n",
1397
+ " setTimeout(() => {\n",
1398
+ " element.innerHTML = originalHTML;\n",
1399
+ " element.style = originalStyle;\n",
1400
+ " }, 2000);\n",
1401
+ " })\n",
1402
+ " .catch(err => {\n",
1403
+ " console.error('Failed to copy:', err);\n",
1404
+ " element.style.color = 'red';\n",
1405
+ " element.innerHTML = \"Failed!\";\n",
1406
+ " setTimeout(() => {\n",
1407
+ " element.innerHTML = originalHTML;\n",
1408
+ " element.style = originalStyle;\n",
1409
+ " }, 2000);\n",
1410
+ " });\n",
1411
+ " return false;\n",
1412
+ "}\n",
1413
+ "\n",
1414
+ "document.querySelectorAll('.fa-regular.fa-copy').forEach(function(element) {\n",
1415
+ " const toggleableContent = element.closest('.sk-toggleable__content');\n",
1416
+ " const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
1417
+ " const paramName = element.parentElement.nextElementSibling.textContent.trim();\n",
1418
+ " const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName;\n",
1419
+ "\n",
1420
+ " element.setAttribute('title', fullParamName);\n",
1421
+ "});\n",
1422
+ "</script></body>"
1423
+ ],
1424
+ "text/plain": [
1425
+ "Pipeline(steps=[('feats',\n",
1426
+ " FeatureUnion(transformer_list=[('tfidf',\n",
1427
+ " TfidfVectorizer(lowercase=False,\n",
1428
+ " max_df=0.95,\n",
1429
+ " min_df=3,\n",
1430
+ " ngram_range=(1,\n",
1431
+ " 2),\n",
1432
+ " preprocessor=<function lemmatize_text at 0x7f3ae7c1a7a0>,\n",
1433
+ " sublinear_tf=True)),\n",
1434
+ " ('flags',\n",
1435
+ " Pipeline(steps=[('fx',\n",
1436
+ " FunctionTransformer(func=<function extrair_flags at 0x7f3ae7b923e0>)),\n",
1437
+ " ('dv',\n",
1438
+ " DictVectorizer())]))])),\n",
1439
+ " ('clf',\n",
1440
+ " LogisticRegression(class_weight='balanced', max_iter=2000))])"
1441
+ ]
1442
+ },
1443
+ "execution_count": 18,
1444
+ "metadata": {},
1445
+ "output_type": "execute_result"
1446
+ }
1447
+ ],
1448
+ "source": [
1449
+ "pipeline.fit(X_train, y_train)"
1450
+ ]
1451
+ },
1452
+ {
1453
+ "cell_type": "markdown",
1454
+ "id": "944db9d1",
1455
+ "metadata": {},
1456
+ "source": [
1457
+ "### Avaliar modelo\n"
1458
+ ]
1459
+ },
1460
+ {
1461
+ "cell_type": "code",
1462
+ "execution_count": 19,
1463
+ "id": "20cb21eb",
1464
+ "metadata": {},
1465
+ "outputs": [
1466
+ {
1467
+ "name": "stdout",
1468
+ "output_type": "stream",
1469
+ "text": [
1470
+ " precision recall f1-score support\n",
1471
+ "\n",
1472
+ " improdutivo 0.99 1.00 1.00 259\n",
1473
+ " produtivo 1.00 0.99 1.00 241\n",
1474
+ "\n",
1475
+ " accuracy 1.00 500\n",
1476
+ " macro avg 1.00 1.00 1.00 500\n",
1477
+ "weighted avg 1.00 1.00 1.00 500\n",
1478
+ "\n"
1479
+ ]
1480
+ }
1481
+ ],
1482
+ "source": [
1483
+ "y_pred = pipeline.predict(X_test)\n",
1484
+ "print(classification_report(y_test, y_pred))"
1485
+ ]
1486
+ },
1487
+ {
1488
+ "cell_type": "markdown",
1489
+ "id": "0855a435",
1490
+ "metadata": {},
1491
+ "source": [
1492
+ "### Salvar modelo para formato `.skops`"
1493
+ ]
1494
+ },
1495
+ {
1496
+ "cell_type": "code",
1497
+ "execution_count": null,
1498
+ "id": "97bbc77b",
1499
+ "metadata": {},
1500
+ "outputs": [
1501
+ {
1502
+ "name": "stdout",
1503
+ "output_type": "stream",
1504
+ "text": [
1505
+ "Modelo salvo em 'email_classifier_pt.skops' ás 2025-11-16T16:56:16\n"
1506
+ ]
1507
+ }
1508
+ ],
1509
+ "source": [
1510
+ "from datetime import datetime, timezone\n",
1511
+ "\n",
1512
+ "# data e hora ISO 8601 em UTC (com 'Z')\n",
1513
+ "agora_utc_iso = datetime.now(timezone.utc).strftime(\"%Y-%m-%dT%H:%M:%S\")\n",
1514
+ "\n",
1515
+ "\n",
1516
+ "import joblib\n",
1517
+ "\n",
1518
+ "joblib.dump(pipeline, \"email_classifier_pt.joblib\")\n",
1519
+ "\n",
1520
+ "\n",
1521
+ "print(\"Modelo salvo em 'email_classifier_pt.skops' ás \" + agora_utc_iso)"
1522
+ ]
1523
+ }
1524
+ ],
1525
+ "metadata": {
1526
+ "kernelspec": {
1527
+ "display_name": ".venv",
1528
+ "language": "python",
1529
+ "name": "python3"
1530
+ },
1531
+ "language_info": {
1532
+ "codemirror_mode": {
1533
+ "name": "ipython",
1534
+ "version": 3
1535
+ },
1536
+ "file_extension": ".py",
1537
+ "mimetype": "text/x-python",
1538
+ "name": "python",
1539
+ "nbconvert_exporter": "python",
1540
+ "pygments_lexer": "ipython3",
1541
+ "version": "3.13.7"
1542
+ }
1543
+ },
1544
+ "nbformat": 4,
1545
+ "nbformat_minor": 5
1546
+ }
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ skops == 0.13.0
2
+ pandas == 2.3.2
3
+ scikit-learn == 1.7.1
4
+ spacy == 3.8.7
5
+ joblib == 1.5.2