""" Construction du DataFrame final pour le projet Charge les données Amazon, nettoie, analyse sentiment, génère réponses """ import pandas as pd from datasets import load_dataset from data_processing import clean_text, label_to_sentiment, make_fake_email from generate_response import generer_reponse def build_dataframe(n_samples: int = 1000, n_negative_responses: int = 100) -> pd.DataFrame: """ Construit le DataFrame final avec sentiment et réponses Args: n_samples (int): Nombre d'avis à charger du dataset n_negative_responses (int): Nombre d'avis négatifs pour lesquels générer une réponse Returns: pd.DataFrame: DataFrame avec colonnes texte_clean, sentiment, response, email_client """ print(f"📊 Construction du DataFrame avec {n_samples} avis...") # 1. Chargement du dataset print("1️⃣ Chargement du dataset Amazon Reviews...") dataset = load_dataset("SetFit/amazon_reviews_multi_fr", split=f"train[:{n_samples}]") df = pd.DataFrame(dataset)[["text", "label"]].copy() df = df.rename(columns={"text": "texte_original"}) print(f" ✅ {len(df)} avis chargés") # 2. Nettoyage des textes print("2️⃣ Nettoyage des textes...") df["texte_clean"] = df["texte_original"].apply(clean_text) print(" ✅ Textes nettoyés") # 3. Analyse de sentiment print("3️⃣ Analyse de sentiment...") df["sentiment"] = df["label"].apply(label_to_sentiment) n_positif = (df["sentiment"] == "positif").sum() n_negatif = (df["sentiment"] == "negatif").sum() print(f" ✅ Sentiments : {n_positif} positifs, {n_negatif} négatifs") # 4. Génération de réponses pour avis négatifs print(f"4️⃣ Génération de réponses pour {n_negative_responses} avis négatifs...") df["response"] = "" neg_df = df[df["sentiment"] == "negatif"].head(n_negative_responses) for idx, row in neg_df.iterrows(): try: review_text = row["texte_original"] response = generer_reponse(review_text, max_tokens=80, temperature=0.7) df.at[idx, "response"] = response if (idx + 1) % 10 == 0: print(f" ... {idx + 1}/{len(neg_df)} réponses générées") except Exception as e: print(f" ⚠️ Erreur pour l'avis {idx}: {e}") df.at[idx, "response"] = "[Erreur de génération]" print(" ✅ Réponses générées") # 5. Ajout des emails factices print("5️⃣ Ajout des emails clients...") df["email_client"] = [make_fake_email(i) for i in range(1, len(df) + 1)] print(" ✅ Emails ajoutés") # 6. DataFrame final df_final = df[["texte_clean", "sentiment", "response", "email_client"]].copy() print(f"\n✅ DataFrame final construit : {len(df_final)} lignes") print(f" - Colonnes : {list(df_final.columns)}") print(f" - Réponses générées : {(df_final['response'] != '').sum()}") return df_final def save_dataframe(df: pd.DataFrame, output_path: str = "dataframe_final.csv"): """ Sauvegarde le DataFrame en CSV Args: df (pd.DataFrame): DataFrame à sauvegarder output_path (str): Chemin du fichier de sortie """ df.to_csv(output_path, index=False) print(f"💾 DataFrame sauvegardé : {output_path}") if __name__ == "__main__": print("=" * 80) print("🚀 CONSTRUCTION DU DATAFRAME AMAZON SENTIMENT ANALYSIS") print("=" * 80) # Construction avec paramètres réduits pour test rapide df = build_dataframe(n_samples=100, n_negative_responses=10) # Affichage d'exemples print("\n📋 Exemples d'avis négatifs avec réponses :") print("-" * 80) neg_with_response = df[(df["sentiment"] == "negatif") & (df["response"] != "")] for i, row in neg_with_response.head(3).iterrows(): print(f"\nAvis {i+1}:") print(f"Texte nettoyé : {row['texte_clean'][:100]}...") print(f"Réponse : {row['response'][:150]}...") print(f"Email : {row['email_client']}") # Sauvegarde save_dataframe(df, "dataframe_amazon_test.csv") print("\n" + "=" * 80) print("✅ TERMINÉ !") print("=" * 80)