Spaces:
Runtime error
Runtime error
| """ | |
| 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) | |