Spaces:
Sleeping
Sleeping
File size: 4,050 Bytes
bb13413 e4e6c95 bb13413 48ddb46 a80aa17 bb13413 583f54d e4e6c95 48ddb46 42d605f 48ddb46 583f54d e4e6c95 583f54d 48ddb46 583f54d e4e6c95 583f54d e4e6c95 583f54d e4e6c95 583f54d e4e6c95 48ddb46 e4e6c95 48ddb46 583f54d 48ddb46 e4e6c95 531657a e4e6c95 48ddb46 583f54d 531657a 48ddb46 e4e6c95 531657a 48ddb46 531657a 48ddb46 42d605f 48ddb46 42d605f 583f54d bb13413 583f54d 48ddb46 bb13413 | 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 | 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() |