Spaces:
Sleeping
Sleeping
| # controllers/metrics_controllers.py | |
| # Duarte Grilo - 2201320 - Projeto Informático | |
| import json | |
| import pandas as pd | |
| import matplotlib.pyplot as plt | |
| import time | |
| import sys | |
| import os | |
| # Garante que é possível importar a partir do diretório principal | |
| sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) | |
| # 🧠 Carrega os datasets necessários | |
| with open("data/respostas/respostas_tipo.json", encoding="utf-8") as f: | |
| respostas_tipo = json.load(f) # Respostas de referência (ouro) | |
| with open("data/respostas/velvet_respostas_metricas.json", encoding="utf-8") as f: | |
| respostas_velvet = json.load(f) # Respostas do modelo Velvet | |
| with open("data/respostas/chatgpt_respostas.json", encoding="utf-8") as f: | |
| respostas_chatgpt = json.load(f) # Respostas do ChatGPT | |
| # 🧠 Modelo de embeddings para medir similaridade semântica | |
| from sentence_transformers import SentenceTransformer, util | |
| modelo = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2") | |
| # 📊 Calcula as similaridades entre resposta_ouro e cada modelo | |
| resultados = [] | |
| for tipo, velvet, chatgpt in zip(respostas_tipo, respostas_velvet, respostas_chatgpt): | |
| pergunta = tipo["pergunta"] | |
| resposta_ouro = tipo["resposta"] | |
| resposta_velvet = velvet["resposta"] | |
| resposta_chatgpt = chatgpt["resposta"] | |
| # Calcula embeddings | |
| emb_ouro = modelo.encode(resposta_ouro, convert_to_tensor=True) | |
| emb_velvet = modelo.encode(resposta_velvet, convert_to_tensor=True) | |
| emb_chatgpt = modelo.encode(resposta_chatgpt, convert_to_tensor=True) | |
| # Similaridade coseno com a resposta de referência | |
| sim_velvet = float(util.cos_sim(emb_ouro, emb_velvet)) | |
| sim_chatgpt = float(util.cos_sim(emb_ouro, emb_chatgpt)) | |
| # Regista resultados em percentagem | |
| resultados.append({ | |
| "Pergunta": pergunta, | |
| "Velvet": sim_velvet * 100, | |
| "ChatGPT": sim_chatgpt * 100 | |
| }) | |
| # 📈 Cria um DataFrame com os resultados | |
| df = pd.DataFrame(resultados) | |
| # 🖼️ Gráfico de barras comparativo | |
| ax = df.plot( | |
| x="Pergunta", | |
| kind="bar", | |
| figsize=(12, 6), | |
| ylabel="Similaridade com Resposta de Ouro (%)", | |
| xlabel="Pergunta", | |
| title="Comparação de Qualidade das Respostas (ChatGPT vs Velvet)", | |
| rot=20 | |
| ) | |
| # 🧼 Ajustes visuais no gráfico | |
| plt.xticks(rotation=30, ha="right") | |
| plt.legend(title="Modelo") | |
| plt.tight_layout() | |
| plt.grid(axis="y") | |
| # 💾 Exporta resultados para CSV | |
| nome_ficheiro = f"data/relatorio_comparativo_{int(time.time())}.csv" | |
| df.to_csv(nome_ficheiro, index=False, encoding="utf-8-sig") | |
| print(f"✅ Relatório salvo em: {nome_ficheiro}") | |
| # 📊 Mostra o gráfico | |
| plt.show() | |