File size: 2,725 Bytes
e679b32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# 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()