# 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()