import gradio as gr import wikipedia from transformers import pipeline import pandas as pd import folium from collections import Counter import re # Initialisation du modèle summarizer = pipeline("summarization", model="facebook/bart-large-cnn") def wiki_person_dashboard(personne): try: wikipedia.set_lang("fr") page = wikipedia.page(personne) contenu = page.content[:1000] # Réduit à 1000 caractères pour éviter surcharge # Résumé principal prompt = f"Résume les informations clés sur {personne} : date de naissance, date de décès (si applicable), conjointes, enfants." try: resume = summarizer(contenu, max_length=150, min_length=50, do_sample=False)[0]["summary_text"] except Exception as e: resume = f"Erreur de résumé : {str(e)}" # Extraction structurée avec sécurités naissance = "Non trouvé" deces = "Encore en vie" conjointes = "Non trouvé" enfants = "Non trouvé" if "né" in resume.lower() and len(resume.split("né")) > 1: naissance = resume.split("né")[1].split(".")[0].strip() if "mort" in resume.lower() and len(resume.split("mort")) > 1: deces = resume.split("mort")[1].split(".")[0].strip() if ("marié" in resume.lower() or "épousa" in resume.lower()) and len(resume.split("marié" if "marié" in resume.lower() else "épousa")) > 1: conjointes = resume.split("marié" if "marié" in resume.lower() else "épousa")[1].split(".")[0].strip() if "enfant" in resume.lower() and len(resume.split("enfant")) > 1: enfants = resume.split("enfant")[1].split(".")[0].strip() # Tableau data = { "Date de naissance": [naissance], "Date de décès": [deces], "Conjointes": [conjointes], "Enfants": [enfants] } df = pd.DataFrame(data) # Extraction des lieux lieux_prompt = f"Liste les lieux mentionnés dans la vie de {personne} avec une estimation des dates." try: lieux_resume = summarizer(contenu, max_length=100, min_length=30, do_sample=False)[0]["summary_text"] except Exception as e: lieux_resume = f"Erreur lieux : {str(e)}" lieux = [] for line in lieux_resume.split("."): if " à " in line: lieu = line.split(" à ")[-1].strip() date_match = re.search(r"\d{4}", line) date_estimee = int(date_match.group(0)) if date_match else 1900 lieux.append((lieu, date_estimee)) # Compter les fréquences lieux_freq = Counter([l[0] for l in lieux]) lieux_data = [(lieu, freq, min([d for l, d in lieux if l == lieu])) for lieu, freq in lieux_freq.items()] # Carte carte = folium.Map(location=[48.8566, 2.3522], zoom_start=2) for lieu, freq, date in lieux_data: lat, lon = 48.8566, 2.3522 # Placeholder if "paris" in lieu.lower(): lat, lon = 48.8566, 2.3522 elif "londres" in lieu.lower(): lat, lon = 51.5074, -0.1278 couleur = f"hsl({int((date - 1800) / 2)}, 100%, 50%)" folium.CircleMarker( location=[lat, lon], radius=freq * 10, popup=f"{lieu} ({date})", color=couleur, fill=True, fill_color=couleur ).add_to(carte) carte.save("map.html") with open("map.html", "r") as f: map_html = f.read() return df, map_html except Exception as e: return pd.DataFrame({"Erreur": [str(e)]}), f"Erreur générale : {str(e)}" # Interface interface = gr.Interface( fn=wiki_person_dashboard, inputs=gr.Textbox(label="Nom de la personne"), outputs=[gr.Dataframe(label="Informations"), gr.HTML(label="Carte des lieux")], title="Dashboard Biographique" ) interface.launch()