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()