Spaces:
Sleeping
Sleeping
| 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() |