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'(.*?)', 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.")