amazon-sentiment-analysis-shirin / build_dataframe.py
Oxyb50410's picture
Upload 8 files
0406bd2 verified
"""
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)