Spaces:
Build error
Build error
| # app.py | |
| import streamlit as st | |
| import requests | |
| import json | |
| from transformers import pipeline | |
| from questions import questions | |
| st.title("Classificação de Comentários do CEU") | |
| st.write("Este aplicativo baixa respostas da API, classifica os comentários e exibe os resultados.") | |
| def get_questions_map(questions_list): | |
| return {str(q["id"]): q["question"] for q in questions_list} | |
| def load_classifier(): | |
| classifier = pipeline( | |
| task="zero-shot-classification", | |
| model="joeddav/xlm-roberta-large-xnli" # Modelo multilíngue | |
| ) | |
| return classifier | |
| def fetch_data(api_url): | |
| response = requests.get(api_url) | |
| if response.status_code == 200: | |
| return response.json() | |
| else: | |
| st.error(f"Erro ao acessar a API: {response.status_code}") | |
| return None | |
| def process_data(data, questions_map, classifier, candidate_labels): | |
| associacoes = [] | |
| classified_comments = [] | |
| for registro in data: | |
| token = registro.get("student_info", {}).get("token", "Sem Token") | |
| answers = registro.get("answers", {}) | |
| comments = registro.get("comments", {}) | |
| for pergunta_id_str, resposta in answers.items(): | |
| pergunta_texto = questions_map.get(pergunta_id_str, f"Pergunta {pergunta_id_str}") | |
| comentario = comments.get(pergunta_id_str, "Sem comentário") | |
| associacoes.append({ | |
| "token": token, | |
| "perguntaId": pergunta_id_str, | |
| "perguntaTexto": pergunta_texto, | |
| "resposta": resposta, | |
| "comentario": comentario | |
| }) | |
| # Classificação do comentário, se existir | |
| if comentario and comentario.strip(): | |
| text_for_model = f"Pergunta: {pergunta_texto}. Comentário: {comentario}" | |
| classification_result = classifier( | |
| text_for_model, | |
| candidate_labels, | |
| multi_label=False | |
| ) | |
| best_label = classification_result["labels"][0] | |
| best_score = classification_result["scores"][0] | |
| classified_comments.append({ | |
| "token": token, | |
| "perguntaId": pergunta_id_str, | |
| "perguntaTexto": pergunta_texto, | |
| "resposta": resposta, | |
| "comentario": comentario, | |
| "classificacao": best_label, | |
| "confiança": round(best_score, 4) | |
| }) | |
| return associacoes, classified_comments | |
| def main(): | |
| api_url = st.text_input("URL da API", "https://proced.datasavvy.com.br/api/responses") | |
| if st.button("Processar Dados"): | |
| data = fetch_data(api_url) | |
| if data: | |
| with st.spinner("Carregando modelo de classificação..."): | |
| classifier = load_classifier() | |
| questions_map = get_questions_map(questions) | |
| candidate_labels = [ | |
| "sugestões de melhoria", | |
| "elogios", | |
| "reclamações", | |
| "solicitações de serviços ou infraestrutura" | |
| ] | |
| with st.spinner("Processando e classificando comentários..."): | |
| associacoes, classified_comments = process_data(data, questions_map, classifier, candidate_labels) | |
| st.success("Processamento concluído!") | |
| st.header("Associações de Perguntas, Respostas e Comentários") | |
| st.dataframe(associacoes) | |
| st.header("Comentários Classificados") | |
| st.dataframe(classified_comments) | |
| # Opção para baixar os resultados | |
| st.subheader("Baixar Resultados") | |
| associacoes_json = json.dumps(associacoes, indent=4, ensure_ascii=False) | |
| classified_comments_json = json.dumps(classified_comments, indent=4, ensure_ascii=False) | |
| st.download_button( | |
| label="Baixar Associações (JSON)", | |
| data=associacoes_json, | |
| file_name="associacoes.json", | |
| mime="application/json" | |
| ) | |
| st.download_button( | |
| label="Baixar Classificações (JSON)", | |
| data=classified_comments_json, | |
| file_name="classified_comments.json", | |
| mime="application/json" | |
| ) | |
| if __name__ == "__main__": | |
| main() | |