File size: 4,293 Bytes
0406bd2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
"""
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)