Scrap_Wiki / app.py
Eric2mangel's picture
Update app.py
a80aa17 verified
Raw
History Blame Contribute Delete
4.05 kB
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()