anonymous12321 commited on
Commit
cc2e80a
·
verified ·
1 Parent(s): da3ff36

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +122 -36
app.py CHANGED
@@ -1,5 +1,5 @@
1
  """
2
- 🪶 Council Matters Classifier – PT
3
  """
4
 
5
  import gradio as gr
@@ -9,7 +9,6 @@ import re
9
  from pathlib import Path
10
  from scipy.sparse import hstack, csr_matrix
11
 
12
-
13
  try:
14
  import torch
15
  from transformers import AutoTokenizer, AutoModel
@@ -124,38 +123,35 @@ class PortugueseClassifier:
124
  predicted_labels.sort(key=lambda x: x["probability"], reverse=True)
125
  return predicted_labels
126
 
 
127
  # ---------------- Load Classifier ----------------
128
  classifier = PortugueseClassifier()
129
 
130
  # ---------------- Suggestions ----------------
131
  suggestions = [
132
- "Pelo Senhor Presidente foi presente a esta reunião a informação n.º º ****** da Secção de Urbanismo e Fiscalização -- Serviço de Obras Particulares. \nPonderado e analisado o assunto o Executivo Municipal deliberou por unanimidade aprovar o projeto de arquitetura relativo ao Processo de obras n.º ***** -- EDIFIC.",
133
- "Pelo Senhor Presidente foram presentes a esta reunião os documentos relativos à assunção de compromissos plurianuais relativos à Loja do Cidadão, em Alandroal que se anexam à presente ata. \nPonderado e analisado o assunto o Executivo Municipal deliberou por maioria, com os votos a favor dos eleitos pelo PS e a abstenção da eleita pelo Nós, Cidadãos, aprovar a assunção de compromissos plurianuais. \nReferiu o Sr. Presidente que o FAM enviou então o parecer necessário para aprovação destes dois pontos e que refere que \"atendendo ao exposto propõe que a Direção Executiva do FAM emita parecer prévio positivo à proposta de modificação ao orçamento municipal de 2024 apresentado pela Câmara Municipal\". ",
134
- "-BALANCETE:\n-Operações orçamentas respeitante ao dia vinte e seis de março do corrente ano, é de um milhão oitocentos e onze mil quinhentos e quinze euros e noventa cêntimos.",
135
- "-APOIO SOLICITADO CEAN-CENTRO EDUCATIVO ALICE NABEIRO-VIAGEM DE FINALISTAS-ANO 2024:\n-Apreciação da informação (registo 5911) dos serviços financeiros, referente ao assunto em epígrafe, que a seguir se transcreve:-“ Na sequência da documentação apresentada pelo CEAN – Centro Educativo Alice Nabeiro no âmbito da realização de uma Viagem de Finalistas a Paris, e após análise dos referidos documentos da mencionada entidade e visto a atividade preponderante ser de índole educativo e social, o valor que sugiro quantifica-se em 500,00 (quinhentos euros) o qual considero razoável para o tipo de atividade referida. O valor sugerido tem cobertura orçamental através da Grande Opção do Plano, 2 232 2011/5044 – Transferências Correntes para Instituições Culturais, cuja dotação global prevista nos Documentos Previsionais para o Exercício 2023 é de 150.000,00 €. Pelo exposto e para efeitos de apreciação por parte de V. Exas., é tudo o que me cabe informar, acerca do assunto mencionado em epígrafe”.\n-A CÂMARA DELIBEROU, POR UNANIMIDADE, ATRIBUIR UM APOIO NO VALOR DE 500,00€ (QUINHENTOS EUROS) AO CEAN-CENTRO EDUCATIVO ALICE NABEIRO, TENDO EM VISTA AJUDAR A CUSTEAR A VIAGEM DE FINALISTA 2024."
136
- "-APOIO SOLICITADO PELA ASSOCIAÇÃO CULTURAL AXPRESS-ARTE - FESTIVAL INTERNACIONAL DE DANÇA:\n-Apreciação da informação (registo 5835) dos serviços financeiros, referente ao assunto em epígrafe, que a seguir se transcreve:-“ Na sequência da documentação apresentada pela Axpress-Arte – Associação Cultural para o exercício 2024, e em face da documentação apresentada pela referida instituição no âmbito da candidatura referida em epigrafe, e após análise dos referidos documentos da mencionada entidade e visto a atividade preponderante ser de índole cultural, o valor que sugiro quantifica-se em 3.000,00 (três mil euros) anuais o qual considero razoável para este tipo de atividade. O valor sugerido tem cobertura orçamental através da Grande Opção do Plano, 2 251 2011/5075 – Transferências Correntes para Instituições Culturais, cuja dotação global prevista nos Documentos Previsionais para o Exercício 2024 é de 90.000,00 €. Sendo o Histórico dos últimos anos de atribuição de apoios para a referida instituição o seguinte:\n\n————————————Quadro de Apoios 2019 – 2023————————————\nAno,Valor em Euros\n2019,0,00\n2020,0,00\n2021,0,00\n2022,3.000,00\n2023,3.000,00\n————————————————————————————————————————————————————— \n-Pelo exposto e para efeitos de apreciação por parte de V. Exas., é tudo o que me cabe informar, acerca do assunto mencionado em epígrafe”.\n-A CÂMARA DELIBEROU, POR UNANIMIDADE, ATRIBUIR UM APOIO NO VALOR DE 3.000,00€ (TRÊS MIL EUROS) À ASSOCIAÇÃO CULTURAL AXPRESS-ARTE, TENDO EM VISTA A REALIZAÇÃO DO FESTIVAL INTERNACIONAL DE DANÇA.",
137
- "Presente declaração, emitida pelo Senhor Presidente da Câmara em 07.junho.2024, para ratificação, constante da plataforma de gestão documental SigmaDoc Web/NIPG: 19890/24_Pendente: 100707.\n\nDocumentos que se dão como inteiramente reproduzidos na presente ata e ficam, para todos os efeitos legais, arquivados em pasta própria existente para o efeito.\n\nA Câmara deliberou, ao abrigo da n.º 3, do artigo 35.º do RJAL, aprovado pela Lei n.º 75/2013, de 12 de setembro, na sua redação atual, ratificar a Declaração emitida pelo Senhor Presidente da Camara em 07.junho.2024, em que o Município da Covilhã pretende ceder apoio logístico, institucional e/ou monetário para o evento \"18.ª Santa Bebiana\", atividade esta levada a cabo pela Casa do Povo do Paul, no âmbito da candidatura ao “Cultura ao Centro 2024, da CCDRC”.",
138
- "3.2. – ICOVI, Infraestruturas e Concessões da Covilhã, EM\n\nFoi presente à Câmara informação constante da plataforma de gestão documental SigmaDoc Web/NIPG: 15508/24_Pendente: 101576, relativa ao ofício da ICOVI – Infraestruturas e Concessões da Covilhã, EM, com a referência 11/23, datado de 02.abril.2024, no qual informa o Resultado Antes de Impostos de 2023 negativo no valor de - 176.266,35€ (cento e setenta e seis mil, duzentos e sessenta e seis euros e trinta e cinco cêntimos) e solicita a cobertura desse resultado.\n\nDocumento que se dá como inteiramente reproduzido na presente ata e fica, para todos os efeitos legais, arquivado em pasta própria existente para o efeito.\n\nO Senhor Vereador Ricardo Miguel Correia Leitão Ferreira da Silva criticou o facto de a empresa somente enviar à Câmara um pedido do valor sem pelo menos enviar o relatório e contas.\n\nNão participou na discussão e votação do presente assunto o Senhor Vereador José Miguel Ribeiro Oliveira, nos termos previstos no n.º 6 do artigo 55.º do Anexo I da Lei nº. 75/2013, de 12 de setembro que aprova o RJAL, conjugado com o artigo 69.º do CPA – Código do Procedimento Administrativo, aprovado pelo Decreto-lei n.º 4/2015, de 7 de janeiro, na nova redação, por exercer as funções de Presidente do Conselho da Administração.\n\nA Câmara deliberou, com o voto contra dos Senhores Vereadores Ricardo Miguel Correia Leitão Ferreira da Silva e Jorge Humberto Martins Simões, tendo em conta que a Empresa Municipal ICOVI – Infraestruturas e Concessões da Covilhã, EM, apresenta um Resultado Antes de Impostos de 2023 negativo no valor de - 176.266,35€ (cento e setenta e seis mil, duzentos e sessenta e seis euros e trinta e cinco cêntimos), nos termos da legislação aplicável, aprovar e efetuar uma transferência financeira no valor de 176.266,35€ (cento e setenta e seis mil, duzentos e sessenta e seis euros e trinta e cinco cêntimos)",
139
- "Presente à Câmara informação, constante da distribuição no sistema informático de gestão documental com a referência EDOC/2022/27808, propondo a ratificação do Aditamento ao Contrato de Comparticipação entre o Instituto da Habitação e da Reabilitação Urbana, I.P. e o Município da Covilhã, destinado à Construção de edifício multifamiliar para 12 Alojamentos de Emergência (BNAUT).\n\nDocumentos que se dão como inteiramente reproduzidos na presente ata e ficam, para todos os efeitos legais, arquivados em pasta própria existente para o efeito.\n\nA Câmara deliberou ratificar o Aditamento ao Contrato de Comparticipação entre o Instituto da Habitação e da Reabilitação Urbana, I.P. e o Município da Covilhã – BNAUT, em que as Partes acordam em proceder à alteração do n.º 1 da Cláusula Terceira, do n.º 1 da Cláusula Quarta e da alínea a) do nº 1 da Cláusula Sexta do Contrato, e que tem por objeto a concessão de um apoio financeiro não reembolsável destinado a financiar a realização do projeto designado por “Construção de edifício multifamiliar para alojamento de emergência na Rua Comendador Gomes Correia n.º 39 a 65”, enquadrado no Aviso n.º 02/CO2-i02/2021, em que a Entidade Beneficiária é a Beneficiária Final, entidade globalmente responsável pela execução do Projeto de investimento ora contratualizado.",
140
- "O Presidente da Câmara apresentou declaração de inexistência de conflitos de interesse relativamente aos procedimentos da ordem do dia da presente reunião, constantes dos pontos 1 a 7 e 9 a 18, que se dá aqui por reproduzida e fica arquivada em pasta anexa ao livro de atas.",
141
- "7. TRÂNSITO – FREGUESIA DE PRAZINS SANTO TIRSO E CORVITE – ALTERAÇÃO DE TRÂNSITO NA TRAVESSA DO CAMPO NOVO - Presente a seguinte proposta: “Por forma a incrementar as condições de segurança e acessibilidade local dos moradores, a Junta de Freguesia submeteu proposta de alteração de trânsito na Travessa do Campo Novo, Freguesia de Prazins Santo Tirso e Corvite, no tramo compreendido entre a Travessa Nova do Campo Novo e a Rua 24 de Junho, aprovada pela Assembleia de Freguesia. Considerando os constrangimentos associados ao reduzido perfil transversal da Travessa do Campo Novo, a alteração potenciará o incremento da segurança rodoviária local, bem como a mitigação da prática de estacionamento em contravenção, submete-se à apreciação Camarária conforme postura anexa.” A postura e as atas dos órgãos executivo e deliberativo da Freguesia dão-se aqui por reproduzidos e ficam arquivados em pasta anexa ao livro de atas. DELIBERADO, POR UNANIMIDADE, SUBMETER À APROVAÇÃO DA ASSEMBLEIA MUNICIPAL.",
142
- "1. Ata da reunião pública do Executivo Municipal de 11 de novembro de 2024.\nAprovada, por unanimidade, pelos presentes na reunião pública do Executivo Municipal de 11 de novembro de 2024.",
143
  ]
144
  example_idx = 0
145
 
 
146
  def next_example():
147
  global example_idx
148
  example_idx = (example_idx + 1) % len(suggestions)
149
  return suggestions[example_idx]
150
 
 
151
  def prev_example():
152
  global example_idx
153
  example_idx = (example_idx - 1 + len(suggestions)) % len(suggestions)
154
  return suggestions[example_idx]
155
 
 
156
  def use_suggestion(suggestion):
157
  return suggestion
158
 
 
159
  def classify_display(text):
160
  preds = classifier.predict(text)
161
  if not preds:
@@ -165,37 +161,127 @@ def classify_display(text):
165
  label = p["label"]
166
  prob = p["probability"]
167
  conf = p["confidence"]
168
- color = {"high": "#00ff88", "medium": "#ffd966", "low": "#ff6666"}[conf]
169
- chips += f"<span class='output-chip' style='border-color:{color}80;color:{color}'>{label} ({prob:.0%})</span>"
170
  return f"<div style='display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin-top:10px'>{chips}</div>"
171
 
172
- # ---------------- CSS atualizado ----------------
 
173
  custom_css = """
174
- body { background-color: #0c0c0c; color: #f1f1f1; font-family: 'Inter', sans-serif; }
175
- .gradio-container { background-color: #0c0c0c; color: #f1f1f1; }
176
- h2, h3 { text-align: center; color: #00b4ff; font-weight: 600; }
177
- textarea { background-color: #181818 !important; color: #fff !important; border-radius: 10px !important; border: 1px solid #333 !important; }
178
- button { background-color: #007aff !important; color: white !important; font-weight: 600 !important; border-radius: 8px !important; border: none !important; }
179
- button:hover { background-color: #00aaff !important; }
180
- .output-chip { background-color: #1a1a1a; padding: 5px 12px; border-radius: 8px; font-weight: 500; border: 1px solid #007aff33; }
181
- .suggestion-box { background-color: #112f50; border-radius: 10px; border: 1px solid #1f3c5a; padding: 10px; display: flex; align-items: center; justify-content: center; color: #eee; margin-top: 25px; position: relative; overflow: scroll; } .arrow-btn { width: 25px; height: 25px; font-size: 12px; padding: 0; background: none; border: none; color: #e0f0ff; cursor: pointer; font-weight: bold; }
182
-
183
- .arrow-btn:hover { color: #ffffff; transform: scale(1.3); }
184
- .use-btn { background-color:#66b3ff !important; color:#000 !important; font-weight:600 !important; border-radius:6px !important; padding:3px 8px !important; margin-left:5px;}
185
- .use-btn:hover { background-color:#99ccff !important; }
186
- .suggestion-box .prev-btn { position: absolute; top: 5px; left: 5px; }
187
- .suggestion-box .next-btn { position: absolute; top: 5px; right: 5px; }
188
- .suggestion-box .suggestion-text { width: 100%; text-align: center; border:none; background:none; color:#eee; font-weight:500; padding-top:8px; overflow-y: scroll;}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
189
  """
190
 
 
191
  # ---------------- Gradio UI ----------------
192
  with gr.Blocks(css=custom_css, theme="gradio/soft") as demo:
193
  gr.Markdown("## 🏛️ **Council Matters Classifier – PT**")
194
- gr.Markdown("### Insert your text (in portuguese):")
195
-
196
- input_text = gr.Textbox(label="", placeholder="Write your text (in portuguese)...", lines=6)
197
 
198
- classify_btn = gr.Button("Classify")
 
199
  output = gr.HTML()
200
  classify_btn.click(fn=classify_display, inputs=input_text, outputs=output)
201
 
@@ -203,7 +289,7 @@ with gr.Blocks(css=custom_css, theme="gradio/soft") as demo:
203
  prev_btn = gr.Button("⟨", elem_classes="prev-btn arrow-btn")
204
  suggestion_display = gr.Textbox(value=suggestions[0], interactive=False, elem_classes="suggestion-text")
205
  next_btn = gr.Button("⟩", elem_classes="next-btn arrow-btn")
206
- use_btn = gr.Button("Use", elem_classes="use-btn")
207
 
208
  prev_btn.click(fn=prev_example, outputs=suggestion_display)
209
  next_btn.click(fn=next_example, outputs=suggestion_display)
 
1
  """
2
+ 🪶 Council Matters Classifier – PT (Light Demo)
3
  """
4
 
5
  import gradio as gr
 
9
  from pathlib import Path
10
  from scipy.sparse import hstack, csr_matrix
11
 
 
12
  try:
13
  import torch
14
  from transformers import AutoTokenizer, AutoModel
 
123
  predicted_labels.sort(key=lambda x: x["probability"], reverse=True)
124
  return predicted_labels
125
 
126
+
127
  # ---------------- Load Classifier ----------------
128
  classifier = PortugueseClassifier()
129
 
130
  # ---------------- Suggestions ----------------
131
  suggestions = [
132
+ "Pelo Senhor Presidente foi presente a esta reunião a informação n.º ...",
133
+ "Pelo Senhor Presidente foram presentes a esta reunião os documentos relativos à assunção de compromissos plurianuais...",
134
+ "-BALANCETE: Operações orçamentais respeitantes ao dia vinte e seis de março...",
 
 
 
 
 
 
 
 
135
  ]
136
  example_idx = 0
137
 
138
+
139
  def next_example():
140
  global example_idx
141
  example_idx = (example_idx + 1) % len(suggestions)
142
  return suggestions[example_idx]
143
 
144
+
145
  def prev_example():
146
  global example_idx
147
  example_idx = (example_idx - 1 + len(suggestions)) % len(suggestions)
148
  return suggestions[example_idx]
149
 
150
+
151
  def use_suggestion(suggestion):
152
  return suggestion
153
 
154
+
155
  def classify_display(text):
156
  preds = classifier.predict(text)
157
  if not preds:
 
161
  label = p["label"]
162
  prob = p["probability"]
163
  conf = p["confidence"]
164
+ color = {"high": "#28a745", "medium": "#f0ad4e", "low": "#d9534f"}[conf]
165
+ chips += f"<span class='output-chip' style='border-color:{color};color:{color}'>{label} ({prob:.0%})</span>"
166
  return f"<div style='display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin-top:10px'>{chips}</div>"
167
 
168
+
169
+ # ---------------- CSS Light ----------------
170
  custom_css = """
171
+ body, .gradio-container {
172
+ background-color: #ffffff;
173
+ color: #111;
174
+ font-family: 'Inter', sans-serif;
175
+ }
176
+
177
+ h2, h3 {
178
+ text-align: center;
179
+ color: #004aad;
180
+ font-weight: 600;
181
+ }
182
+
183
+ textarea {
184
+ background-color: #f8f9fa !important;
185
+ color: #111 !important;
186
+ border-radius: 10px !important;
187
+ border: 1px solid #ccc !important;
188
+ }
189
+
190
+ button {
191
+ background-color: #0069d9 !important;
192
+ color: white !important;
193
+ font-weight: 600 !important;
194
+ border-radius: 8px !important;
195
+ border: none !important;
196
+ }
197
+
198
+ button:hover {
199
+ background-color: #0056b3 !important;
200
+ }
201
+
202
+ .output-chip {
203
+ background-color: #f8f9fa;
204
+ padding: 5px 12px;
205
+ border-radius: 8px;
206
+ font-weight: 500;
207
+ border: 1px solid #ddd;
208
+ }
209
+
210
+ .suggestion-box {
211
+ background-color: #f1f5ff;
212
+ border-radius: 10px;
213
+ border: 1px solid #c8d6fa;
214
+ padding: 10px;
215
+ display: flex;
216
+ align-items: center;
217
+ justify-content: center;
218
+ color: #111;
219
+ margin-top: 25px;
220
+ position: relative;
221
+ }
222
+
223
+ .arrow-btn {
224
+ width: 25px;
225
+ height: 25px;
226
+ font-size: 12px;
227
+ padding: 0;
228
+ background: none;
229
+ border: none;
230
+ color: #004aad;
231
+ cursor: pointer;
232
+ font-weight: bold;
233
+ }
234
+
235
+ .arrow-btn:hover {
236
+ color: #002f6c;
237
+ transform: scale(1.2);
238
+ }
239
+
240
+ .use-btn {
241
+ background-color:#004aad !important;
242
+ color:#fff !important;
243
+ font-weight:600 !important;
244
+ border-radius:6px !important;
245
+ padding:3px 8px !important;
246
+ margin-left:5px;
247
+ }
248
+
249
+ .use-btn:hover {
250
+ background-color:#0069d9 !important;
251
+ }
252
+
253
+ .suggestion-box .prev-btn {
254
+ position: absolute;
255
+ top: 5px;
256
+ left: 5px;
257
+ }
258
+
259
+ .suggestion-box .next-btn {
260
+ position: absolute;
261
+ top: 5px;
262
+ right: 5px;
263
+ }
264
+
265
+ .suggestion-box .suggestion-text {
266
+ width: 100%;
267
+ text-align: center;
268
+ border:none;
269
+ background:none;
270
+ color:#111;
271
+ font-weight:500;
272
+ padding-top:8px;
273
+ overflow-y: scroll;
274
+ }
275
  """
276
 
277
+
278
  # ---------------- Gradio UI ----------------
279
  with gr.Blocks(css=custom_css, theme="gradio/soft") as demo:
280
  gr.Markdown("## 🏛️ **Council Matters Classifier – PT**")
281
+ gr.Markdown("### Insira o texto em português:")
 
 
282
 
283
+ input_text = gr.Textbox(label="", placeholder="Escreva o texto...", lines=6)
284
+ classify_btn = gr.Button("Classificar")
285
  output = gr.HTML()
286
  classify_btn.click(fn=classify_display, inputs=input_text, outputs=output)
287
 
 
289
  prev_btn = gr.Button("⟨", elem_classes="prev-btn arrow-btn")
290
  suggestion_display = gr.Textbox(value=suggestions[0], interactive=False, elem_classes="suggestion-text")
291
  next_btn = gr.Button("⟩", elem_classes="next-btn arrow-btn")
292
+ use_btn = gr.Button("Usar", elem_classes="use-btn")
293
 
294
  prev_btn.click(fn=prev_example, outputs=suggestion_display)
295
  next_btn.click(fn=next_example, outputs=suggestion_display)