File size: 3,269 Bytes
39acd70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import pandas as pd
import sys
import re
import difflib
from pprint import pprint

# Chemin vers le fichier parquet
parquet_file = "data/lighteval_results/details/Qwen/Qwen2.5-72B-Instruct/2025-04-01T13-30-41.628107/details_custom|yourbench|0_2025-04-01T13-30-41.628107.parquet"

# Fonction pour nettoyer les réponses (enlever balises XML, espaces, etc.)
def clean_response(response):
    # Enlever les balises XML
    response = re.sub(r'<answer>(.*?)</answer>', r'\1', response, flags=re.DOTALL)
    # Normaliser les espaces
    response = ' '.join(response.split())
    return response.lower().strip()

# Charger le fichier parquet
df = pd.read_parquet(parquet_file)

# Afficher des informations de base
print(f"Nombre total d'exemples: {len(df)}")
print(f"Tous les scores: {[metric.get('accuracy', 'N/A') for metric in df['metrics']]}")
print("\n" + "="*80 + "\n")

# Analyser la similarité entre les réponses du modèle et les réponses de référence
print("ANALYSE DE SIMILARITÉ ENTRE RÉPONSES MODÈLE ET RÉPONSES DE RÉFÉRENCE\n")

total_correct_content = 0

for i in range(len(df)):
    # Extraire les réponses
    model_answer = df.iloc[i].predictions[0] if len(df.iloc[i].predictions) > 0 else "N/A"
    reference_answer = df.iloc[i].choices[0] if len(df.iloc[i].choices) > 0 else "N/A"
    question = df.iloc[i].specifics.get('question', 'N/A')
    
    # Nettoyer les réponses pour comparaison
    clean_model = clean_response(model_answer)
    clean_reference = clean_response(reference_answer)
    
    # Calculer la similarité
    similarity = difflib.SequenceMatcher(None, clean_model, clean_reference).ratio()
    
    # Vérifier si les éléments clés de la réponse de référence sont dans la réponse du modèle
    key_terms = clean_reference.split()
    important_terms = [term for term in key_terms if len(term) > 4]  # Mots de plus de 4 lettres
    
    terms_found = sum(1 for term in important_terms if term in clean_model)
    term_coverage = terms_found / len(important_terms) if important_terms else 0
    
    # Définir si le contenu de la réponse est correct (utiliser un seuil)
    is_content_correct = term_coverage > 0.5 or similarity > 0.4
    if is_content_correct:
        total_correct_content += 1
    
    # Afficher les résultats
    print(f"EXEMPLE {i+1}:")
    print(f"Question: {question}")
    print(f"Réponse du modèle (nettoyée): {clean_model[:150]}..." if len(clean_model) > 150 else f"Réponse du modèle (nettoyée): {clean_model}")
    print(f"Réponse de référence (nettoyée): {clean_reference}")
    print(f"Ratio de similarité: {similarity:.2f}")
    print(f"Couverture des termes importants: {term_coverage:.2f} ({terms_found}/{len(important_terms)})")
    print(f"Contenu de la réponse jugé correct? {'OUI' if is_content_correct else 'NON'}")
    
    # Quelques informations supplémentaires
    print(f"Métrique LightEval: {df.iloc[i].metrics.get('accuracy', 'N/A')}")
    print("-"*80 + "\n")

print(f"RÉSUMÉ: {total_correct_content}/{len(df)} réponses ({total_correct_content/len(df)*100:.1f}%) ont un contenu jugé correct selon notre analyse simple.")
print(f"Comparé à LightEval: {sum(metric.get('accuracy', 0) for metric in df['metrics'])}/{len(df)} réponses correctes.")