classificad / app.py
Pauloeocadia's picture
Update app.py
36bbeb4 verified
raw
history blame
9.24 kB
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)