Spaces:
Sleeping
Sleeping
| import os | |
| import torch | |
| import pandas as pd | |
| from datasets import Dataset | |
| from transformers import ( | |
| AutoTokenizer, | |
| AutoModelForSequenceClassification, | |
| TrainingArguments, | |
| Trainer, | |
| DataCollatorWithPadding | |
| ) | |
| # 1. Configuration | |
| # Pour le Français, on utilise un modèle multilingue (XLM-RoBERTa) ou dédié (CamemBERT) | |
| MODEL_NAME = "xlm-roberta-base" | |
| OUTPUT_DIR = "./results" | |
| SAVE_DIR = "./fakenews_model_fr" | |
| def train(): | |
| # 2. Chargement des données (Exemple avec un CSV fictif) | |
| # Assurez-vous d'avoir un CSV avec au moins 'text' et 'label' (0=Real, 1=Fake) | |
| if not os.path.exists("data.csv"): | |
| print("Erreur: data.csv non trouvé. Création d'un exemple factice...") | |
| data = { | |
| "text": [ | |
| "Le président a inauguré une nouvelle école ce matin à Paris.", | |
| "Des extraterrestres ont envahi la tour Eiffel hier soir !" | |
| ], | |
| "label": [0, 1] | |
| } | |
| pd.DataFrame(data).to_csv("data.csv", index=False) | |
| df = pd.read_csv("data.csv") | |
| # Nettoyage des données : Supprimer les NaNs et s'assurer que 'text' est de type string | |
| df = df.dropna(subset=['text', 'label']) | |
| df['text'] = df['text'].astype(str) | |
| df = df[df['text'].str.len() > 10] | |
| # OPTIMISATION HACKATHON 🚀 : Échantillon aléatoire pour aller plus vite | |
| MAX_SAMPLES = 2000 | |
| if len(df) > MAX_SAMPLES: | |
| print(f"Extraction d'un échantillon aléatoire de {MAX_SAMPLES} sur {len(df)} lignes...") | |
| df = df.sample(MAX_SAMPLES, random_state=42).reset_index(drop=True) | |
| dataset = Dataset.from_pandas(df.reset_index(drop=True)) | |
| # 3. Tokenization | |
| tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) | |
| def preprocess_function(examples): | |
| return tokenizer(examples["text"], truncation=True, padding=True) | |
| tokenized_dataset = dataset.map(preprocess_function, batched=True) | |
| # 4. Chargement du modèle | |
| model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2) | |
| # 5. Arguments d'entraînement | |
| training_args = TrainingArguments( | |
| output_dir=OUTPUT_DIR, | |
| learning_rate=2e-5, | |
| per_device_train_batch_size=8, # Réduit pour économiser la RAM | |
| num_train_epochs=1, # 1 seule passe pour le hackathon | |
| weight_decay=0.01, | |
| save_strategy="epoch", | |
| ) | |
| # 6. Trainer | |
| trainer = Trainer( | |
| model=model, | |
| args=training_args, | |
| train_dataset=tokenized_dataset, | |
| tokenizer=tokenizer, | |
| data_collator=DataCollatorWithPadding(tokenizer=tokenizer), | |
| ) | |
| # 7. Lancement de l'entraînement | |
| print("Début de l'entraînement...") | |
| trainer.train() | |
| # 8. Sauvegarde | |
| model.save_pretrained(SAVE_DIR) | |
| tokenizer.save_pretrained(SAVE_DIR) | |
| print(f"Modèle sauvegardé dans {SAVE_DIR}") | |
| if __name__ == "__main__": | |
| train() | |