classificad / app.py
Pauloeocadia's picture
Update app.py
1d36c93 verified
# 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.")
@st.cache(allow_output_mutation=True)
def get_questions_map(questions_list):
return {str(q["id"]): q["question"] for q in questions_list}
@st.cache(allow_output_mutation=True)
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()