Spaces:
Sleeping
Sleeping
import requests | |
import json | |
from transformers import pipeline | |
# 1) Lista completa das perguntas | |
questions = [ | |
{ | |
"id": 1, | |
"question": "1.1 - Unidade do CEU:", | |
"type": "radio", | |
"options": [ | |
"CEU itapoã", | |
"CEU Recanto", | |
"CEU QNR 02", | |
"CEU QMN 28", | |
"CEU QNN 13", | |
"Outro" | |
], | |
"otherOption": True, | |
"section": "1. Informações Gerais", | |
"allowComment": False | |
}, | |
{ | |
"id": 2, | |
"question": "1.2 - Categoria de Participante:", | |
"type": "radio", | |
"options": [ | |
"Aluno(a)", | |
"Pai/Mãe/Responsável", | |
"Professor(a)", | |
"Gestor(a)", | |
"Monitor(a)", | |
"Outro" | |
], | |
"otherOption": True, | |
"section": "1. Informações Gerais", | |
"allowComment": False, | |
"interpretation": "A pergunta identifica qual o tipo de envolvimento do participante com o CEU..." | |
}, | |
{ | |
"id": 3, | |
"question": "2.1 - Como você avalia a infraestrutura da unidade do CEU que frequenta?", | |
"type": "radio", | |
"options": ["Excelente", "Boa", "Regular", "Ruim", "Muito Ruim"], | |
"section": "2. Avaliação Geral", | |
"allowComment": True, | |
"interpretation": "A maioria dos alunos avalia a infraestrutura como boa ou excelente..." | |
}, | |
{ | |
"id": 4, | |
"question": "2.3 - Como você avalia os programas e atividades oferecidos?", | |
"type": "radio", | |
"options": ["Excelente", "Boa", "Regular", "Ruim", "Muito Ruim"], | |
"section": "2. Avaliação Geral", | |
"allowComment": True, | |
"interpretation": "Os programas e atividades oferecidos são amplamente bem avaliados..." | |
}, | |
{ | |
"id": 5, | |
"question": "2.4 - Os horários das atividades atendem às suas necessidades?", | |
"type": "radio", | |
"options": ["Sim", "Parcialmente", "Não"], | |
"section": "2. Avaliação Geral", | |
"allowComment": True, | |
"interpretation": "Horários adequados facilitam a participação..." | |
}, | |
{ | |
"id": 6, | |
"question": "2.5 - Você sente que sua participação nas atividades contribui para seu desenvolvimento pessoal/profissional?", | |
"type": "radio", | |
"options": ["Sim", "Parcialmente", "Não"], | |
"section": "2. Avaliação Geral", | |
"allowComment": True, | |
"interpretation": "A percepção de ganho pessoal/profissional é um indicador..." | |
}, | |
{ | |
"id": 7, | |
"question": "3.1 - Como você avalia o atendimento da equipe do CEU (monitores, professores, gestores)?", | |
"type": "radio", | |
"options": ["Excelente", "Boa", "Regular", "Ruim", "Muito Ruim"], | |
"section": "3. Atendimento e Qualidade do Serviço", | |
"allowComment": True, | |
"interpretation": "O atendimento da equipe é crucial para a satisfação..." | |
}, | |
{ | |
"id": 8, | |
"question": "3.2 - Você sente que a equipe do CEU está disponível e pronta para ajudar quando necessário?", | |
"type": "radio", | |
"options": ["Sempre", "Na maioria das vezes", "Às vezes", "Raramente", "Nunca"], | |
"section": "3. Atendimento e Qualidade do Serviço", | |
"allowComment": True, | |
"interpretation": "Disponibilidade e prontidão da equipe refletem diretamente no bem-estar..." | |
}, | |
{ | |
"id": 9, | |
"question": "3.3 - Como você avalia a comunicação da unidade (informação sobre eventos, mudanças, etc.)?", | |
"type": "radio", | |
"options": ["Excelente", "Boa", "Regular", "Ruim", "Muito Ruim"], | |
"section": "3. Atendimento e Qualidade do Serviço", | |
"allowComment": True, | |
"interpretation": "Uma boa comunicação é essencial para engajamento..." | |
}, | |
{ | |
"id": 10, | |
"question": "4.1 - As atividades do CEU têm impacto positivo na sua vida ou na de seus filhos?", | |
"type": "radio", | |
"options": ["Sim", "Parcialmente", "Não"], | |
"section": "4. Impacto e Satisfação Pessoal", | |
"allowComment": True, | |
"interpretation": "Medir o impacto positivo demonstra o valor social do CEU..." | |
}, | |
{ | |
"id": 11, | |
"question": "4.2 - Você indicaria o CEU para amigos ou familiares?", | |
"type": "radio", | |
"options": ["Sim", "Talvez", "Não"], | |
"section": "4. Impacto e Satisfação Pessoal", | |
"allowComment": True, | |
"interpretation": "O indicador de recomendação sugere grau de satisfação..." | |
}, | |
{ | |
"id": 12, | |
"question": "5.1 - Há algo que você gostaria de ver melhorado no CEU?", | |
"type": "radio", | |
"options": ["Sim", "Não"], | |
"section": "5. Sugestões e Melhorias", | |
"allowComment": True, | |
"interpretation": "Esta pergunta abre espaço para melhorias pontuais e específicas..." | |
}, | |
{ | |
"id": 13, | |
"question": "5.2 - Que tipo de novas atividades ou programas você gostaria de ver no CEU?", | |
"type": "radio", | |
"options": ["Sim", "Não"], | |
"section": "5. Sugestões e Melhorias", | |
"allowComment": True, | |
"interpretation": "Novas atividades ou programas expandem a atratividade do CEU..." | |
}, | |
{ | |
"id": 14, | |
"question": "5.3 - Há algum outro comentário ou sugestão que gostaria de compartilhar?", | |
"type": "radio", | |
"options": ["Sim", "Não"], | |
"section": "5. Sugestões e Melhorias", | |
"allowComment": True, | |
"interpretation": "Um espaço aberto para o participante expressar livremente..." | |
} | |
] | |
# Mapeia id da pergunta => texto | |
questions_map = {q["id"]: q["question"] for q in questions} | |
# URL da API | |
url = "https://proced.datasavvy.com.br/api/responses" | |
# Consome a API | |
response = requests.get(url) | |
if response.status_code == 200: | |
data = response.json() | |
else: | |
print("Erro ao acessar a API:", response.status_code) | |
exit() | |
# Montar lista de associações | |
associacoes = [] | |
for registro in data: | |
if "answers" in registro and "comments" in registro: | |
for pergunta_id_str, resposta in registro["answers"].items(): | |
try: | |
pergunta_id = int(pergunta_id_str) | |
except ValueError: | |
pergunta_id = None | |
comentario = registro["comments"].get(pergunta_id_str, None) | |
# Aqui, ao invés de "studentId": registro["studentId"] | |
# Usamos o token que está em registro["student_info"]["token"] | |
associacoes.append({ | |
"studentId": registro["student_info"]["token"], # <== Mudança aqui | |
"perguntaId": pergunta_id_str, | |
"perguntaTexto": questions_map.get(pergunta_id, f"Pergunta {pergunta_id_str}"), | |
"resposta": resposta, | |
"comentario": comentario | |
}) | |
# Inicializar o pipeline de Zero-Shot Classification | |
classifier = pipeline( | |
task="zero-shot-classification", | |
model="joeddav/xlm-roberta-large-xnli" # modelo multilíngue PT | |
) | |
candidate_labels = [ | |
"sugestões de melhoria", | |
"elogios", | |
"reclamações", | |
"solicitações de serviços ou infraestrutura" | |
] | |
classified_comments = [] | |
for registro in data: | |
if "comments" not in registro or "answers" not in registro: | |
continue | |
for question_id_str, comment in registro["comments"].items(): | |
if not comment or not comment.strip(): | |
continue | |
answer = registro["answers"].get(question_id_str, "Sem resposta") | |
try: | |
q_id = int(question_id_str) | |
except ValueError: | |
q_id = None | |
question_text = questions_map.get(q_id, f"Pergunta {question_id_str}") | |
text_for_model = f"Pergunta: {question_text}. Comentário: {comment}" | |
classification_result = classifier( | |
text_for_model, | |
candidate_labels, | |
multi_label=False | |
) | |
best_label = classification_result["labels"][0] | |
best_score = classification_result["scores"][0] | |
# Aqui também | |
classified_comments.append({ | |
"studentId": registro["student_info"]["token"], # <== Mudança aqui | |
"questionId": question_id_str, | |
"questionText": question_text, | |
"answer": answer, | |
"comment": comment, | |
"classification": best_label, | |
"confidence": best_score | |
}) | |
# Salvar resultados em JSON | |
with open("associacoes.json", "w", encoding="utf-8") as assoc_file: | |
json.dump(associacoes, assoc_file, indent=4, ensure_ascii=False) | |
print("Arquivo 'associacoes.json' criado com sucesso!") | |
with open("classified_comments.json", "w", encoding="utf-8") as classified_file: | |
json.dump(classified_comments, classified_file, indent=4, ensure_ascii=False) | |
print("Arquivo 'classified_comments.json' criado com sucesso!") | |
# Mostra uma amostra | |
print("\n--- Associações (amostra) ---") | |
for assoc in associacoes[:5]: | |
print(assoc) | |
print("\n--- Classificações (amostra) ---") | |
for classified in classified_comments[:5]: | |
print(classified) | |