« GallicaSPARQLBot » : différence entre les versions

De Wikipast
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 1 : Ligne 1 :
Le GallicaSPARQLBot est un bot python complétant ou générant automatiquement des pages Wikipast à partir des données de la Bibliothèque nationale de France (BnF).
== Résumé des fonctionnalités ==


Le code pour le bot est disponible sur [https://github.com/robinmamie/GallicaSPARQLBot| ce repo GitHub]. Pour exécuter le bot, il suffit de lancer le fichier python execute_bot.py en passant le mot de passe du GallicaSPARQLBot en argument.
Le GallicaSPARQLBot est un bot python complétant ou générant automatiquement des pages Wikipast à partir de [https://data.bnf.fr/ la base de données de la Bibliothèque nationale de France (BnF)].


Dans un premier temps, le bot cherche, à travers des requêtes SPARQL, l'intégralité des auteurs appartenant à la base de données de la BnF.
== Description technique ==


A partir de la liste d'auteur sont récupérés les fichiers json de chaque auteur. Ils contiennent les informations suivantes:
=== Formattage des données ===
* La date/le lieu de Naissance de l'auteur,
* La date/le lieu de Mort de l'auteur,
* Une liste des œuvres principales de l'auteur,
* Une image de profil de l'auteur (si elle existe).


A partir de la liste des œuvres principales de chaque auteur sont récupérés les fichiers json de chaque auteur. Ils contiennent les informations suivantes:
Dans un premier temps, le bot cherche, à travers une requête SPARQL, l'intégralité des auteurs appartenant à la base de données de la BnF.
* La date de création de l’œuvre,
* Le type de l’œuvre (Art Graphique, Livre, ...),
* L'Auteur de l’œuvre,
* Une illustration de l’œuvre (si elle existe).


A partir de ces fichiers, le bot crée la page Wikipast liée à chaque auteur en y ajoutant un lien vers l'image de profil (si elle existe dans la BnF), leurs dates de naissance et de mort ainsi que ses œuvres principales (uniquement celles contenant une date); une page Wikipast est créée pour chacune de ces œuvres avec une illustration (si elle existe dans la BnF). Ces ajouts sont chacun accompagnés de liens renvoyant vers le site de la BnF et sont normalisés de la façon suivante:
Ensuite, les données suivantes sont récupérées pour chaque auteur :


Pour la date de naissance : <pre> 1840.11.14 / Paris 9e. Naissance de Claude Monet. </pre>
* La date et le lieu de naissance de l'auteur
* La date et le lieu de mort de l'auteur
* La liste des œuvres principales (selon la BnF) de l'auteur
* Une image de profil de l'auteur (si elle existe)


Pour la date de décès : <pre> 1926.12.06 / Giverny. Décès de Claude Monet. </pre>
Enfin, les données suivantes sont récupérées pour chaque œuvre principale de l'auteur en question:


Pour une œuvre : <pre> 1879. Création par Claude Monet de Camille sur son lit de mort (Monet). </pre>
* La date de création de l’œuvre
* Le type de l’œuvre (Art Graphique, Livre, ...)
* Une illustration de l’œuvre (si elle existe)


[http://wikipast.epfl.ch/wikipast/index.php/Andr%C3%A9_del_Sarto_(Musset) Exemple d'œuvre complète]
A partir de ces données, le bot crée la page Wikipast liée à chaque auteur en y ajoutant un lien vers l'image de profil (si elle existe dans la BnF), leurs dates de naissance et de mort ainsi que ses œuvres principales (uniquement celles contenant une date). De manière analogue, une page Wikipast est créée pour chacune de ces œuvres avec une illustration (si elle existe dans la BnF). Ces ajouts sont chacun accompagnés de liens renvoyant vers le site de la BnF et sont normalisés de la façon suivante:


[http://wikipast.epfl.ch/wikipast/index.php/Sym%C3%A9on_le_Nouveau_Th%C3%A9ologien Exemple d'auteur ayant des dates compliqués à gérer]
Pour la date de naissance, dépendamment de la mention du lieu:
 
<pre>
[[DATE]] / [[LIEU]]. [[Naissance]] de [[AUTEUR]]. [PAGE BNF DE L'AUTEUR]
</pre>
<pre>
[[DATE]]. [[Naissance]] de [[AUTEUR]]. [PAGE BNF DE L'AUTEUR]
</pre>
 
Pour la date de décès, dépendamment de la mention du lieu :
 
<pre>
[[DATE]] / [[LIEU]]. [[Décès]] de [[AUTEUR]]. [PAGE BNF DE L'AUTEUR]
</pre>
<pre>
[[DATE]]. [[Décès]] de [[AUTEUR]]. [PAGE BNF DE L'AUTEUR]
</pre>
 
Pour une œuvre, dépendamment de la mention de sont type  :
 
<pre>
[[DATE]]. [[Création]] par [[AUTEUR]] de [[ŒUVRE]] ([[TYPE]]). [PAGE BNF DE L'ŒUVRE]
</pre>
<pre>
[[DATE]]. [[Création]] par [[AUTEUR]] de [[ŒUVRE]]. [PAGE BNF DE L'ŒUVRE]
</pre>
 
=== Gestion des pages ===
 
Chacune des pages explorées par le bot est agrémentée de son type Wikidata et de son identifiant BnF (BnF id). Cela veut dire que si aucune ligne de contenu n'existe dans la base de donnée (naissance, décès ou création), alors la page est tout de même créée avec ces informations. La mention du type Wikidata permet aux autres bots de retrouver très facilement sur Wikipast tous les êtres humains (portant l'identification Q5) et toutes les œuvres (Q387234) grâce à une simple recherche. Cette fonction est par exemple utilisée par le [[Wikidataficator]].
 
La gestion des homonymes utilise la politique du « premier arrivé, premier servi ». En effet, si le bot veut insérer un auteur et que son nom n'existe pas encore sur Wikipast, alors une page est créée normalement. A contrario, s'il existe déjà une page avec le nom de l'auteur, alors une page est créée mais son titre sera composé du nom de l'auteur suivi d'un identifiant unique (UUID) (exemple: [[Johann Strauss (3bd88e1)]], père de [[Johann Strauss]]).
   
   
Afin d'éviter des collisions entre le nom de plusieurs œuvres ainsi qu'entre le nom d'une œuvre et celui d'un auteur, il a donc été choisi de nommer les œuvres de la façon suivante : Nom de l’œuvre + Nom de l'auteur (Exemple Claude Monet de Camille sur son lit de mort (Monet) ).
Afin d'éviter des collisions entre le nom de plusieurs œuvres ainsi qu'entre le nom d'une œuvre et celui d'un auteur, il a donc été choisi de nommer les œuvres de la façon suivante : ''Nom de l’œuvre (nom de l'auteur)'' (exemple [[L'Ours dans un bateau (fable V) (Gravelot)]] ).
 
 
== Discussion des performances ==
 
=== Quantité produite ===
 
Le bot a créé environ 500'000 pages d'auteurs ainsi que 15'000 pages d'œuvres en un peu moins de 4 jours, ce qui est un laps de temps très raisonnable. La plupart des auteurs listés dans la base de données de la BnF n'ont malheureusement pas d'autre information que leur nom, donc une grande partie des pages créées est vide, mais exploitable grâce au tag wikidata et à l'identifiant BnF.
 
=== Difficultés rencontrées ===
 
Puisque le nombre de requêtes par seconde était très élevé (il y avait jusqu'à 200 fils d'exécutions en parallèle, mais en moyenne une trentaine), il pouvait arriver que des requêtes http n'arrivent pas à bon port. Cela crée donc des éléments manquants dans le résultat final. Seuls 1'500 liens sur le million traité n'ont pas été exécutés, et ont été relancés manuellement après la fin de l'exécution initiale. Finalement, aucun échec n'est à déplorer suite à cette intervention.
 
Le cas des auteurs existant déjà n'a été géré que suite à l'exécution initiale, afin d'éviter la création inutile de pages en cas de relancement (pour cause d'erreur, etc.)
 
Certaines œuvres présentaient un titre si long qu'il cassait la limite de caractères pour un titre de page sur Wikipast (256 bytes). Ce problème a été résolu après que quelques cas se soient présentés.
 
L'ordre des évènements était également non trivial à gérer. Un simple algorithme de tri sur les évènements ne suffit pas pour [[Cicéron|les dates négatives]] et [[Syméon le Nouveau Théologien|changeant d'ordre de magnitude]]. Le bot en prend également compte.
 
 
== Planification du bot ==
 
Le bot est censé n'être exécuté qu'une seule fois. Tout changement de la base de donnée de la BnF devrait être géré par l'intermédiaire d'un autre bot, car la politique du [[GallicaSPARQLBot]] est de ne jamais écraser ou modifier une page déjà existante.
 
 
 
== Exemple de résultat ==
 
=== Auteur ===


La Gestion des homonymes utilise la politique du premier arrivé, premier servi. Si nous voulons insérer un auteur et que son nom n'existe pas encore sur Wikipast, alors une page est créée normalement, au contraire, si il existe déjà une page avec le nom de l'auteur alors une page est créée mais son titre sera composé du nom de l'auteur suivi identifiant utilisateur de la Bnf (uid) entre parenthèse (Exemple : .......).
''Tiré de :'' [[Sénèque]]


Chacune des pages explorées par le bot sont agrémentées d'un identifiant BnF (BnF id) et de leur type Wikidata.
Wikidata: ([https://www.wikidata.org/wiki/Q5 Q5])


BnF ID: [http://data.bnf.fr/ark:/12148/cb11887555p 11887555p]


*[[-4]] / [[Cordoue]]. [[Naissance]] de [[Sénèque]]. [http://data.bnf.fr/ark:/12148/cb11887555p]


== Performances ==
*[[41]]. [[Création]] par [[Sénèque]] de [[De la colère (Sénèque)|De la colère]] ([[Philosophie]]). [https://data.bnf.fr/fr/12191412/seneque_de_la_colere/]


Le bot permet de créer en moyenne 1000 pages d'auteurs (sans compter les pages d'œuvres) en environ 7 minutes. Ceci fait fait que l'import total (environ 500'000 auteurs) ne devrait pas prendre plus de 2.5 jours. Cette vitesse a été atteinte en parallélisant le programme, permettant une diminution très importante du temps total.
*[[54]]. [[Création]] par [[Sénèque]] de [[Apocoloquintose du divin Claude (Sénèque)|Apocoloquintose du divin Claude]] ([[Littératures]]). [https://data.bnf.fr/fr/12365542/seneque_apocoloquintose_du_divin_claude/]


Suite à la création de 7000 auteurs (ainsi que de nombreuses œuvres), les estimations pratiques se rangent plutôt dans les 7 jours.
*[[54]]. [[Création]] par [[Sénèque]] de [[De la constance du sage (Sénèque)|De la constance du sage]] ([[Littératures]]). [https://data.bnf.fr/fr/12227052/seneque_de_la_constance_du_sage/]


*[[61]]. [[Création]] par [[Sénèque]] de [[De la vie heureuse (Sénèque)|De la vie heureuse]] ([[Philosophie]]). [https://data.bnf.fr/fr/12191402/seneque_de_la_vie_heureuse/]


== Exemple d'utilisation ==
*[[62]]. [[Création]] par [[Sénèque]] de [[Questions naturelles (Sénèque)|Questions naturelles]] ([[Philosophie]]). [https://data.bnf.fr/fr/12479394/seneque_questions_naturelles/]


*[[63]]. [[Création]] par [[Sénèque]] de [[De la providence (Sénèque)|De la providence]] ([[Philosophie]]). [https://data.bnf.fr/fr/12227053/seneque_de_la_providence/]


*[[65]] / [[Rome]]. [[Décès]] de [[Sénèque]]. [http://data.bnf.fr/ark:/12148/cb11887555p]


Pour un auteur:


=== Œuvre  ===


''Tiré de :'' [[Histoire de la peinture en Italie (Stendhal)]]


[[Fichier:Page Audran.png]]
Wikidata: ([https://www.wikidata.org/wiki/Q386724 Q386724])


BnF ID: [https://data.bnf.fr/fr/14415306/stendhal_histoire_de_la_peinture_en_italie/ 14415306q]


[https://gallica.bnf.fr/ark:/12148/bpt6k6215656z https://gallica.bnf.fr/ark:/12148/bpt6k6215656z.thumbnail.jpg]


Pour une œuvre:
*[[1817]]. [[Création]] par [[Stendhal]] de [[Histoire de la peinture en Italie (Stendhal)|Histoire de la peinture en Italie]] ([[Peinture]]). [https://data.bnf.fr/fr/14415306/stendhal_histoire_de_la_peinture_en_italie/]




== Code ==


[[Fichier:Oeuvre Audran.png]]
Le code source du bot est disponible sur [https://github.com/robinmamie/GallicaSPARQLBot| GitHub].

Version du 18 mai 2019 à 16:52

Résumé des fonctionnalités

Le GallicaSPARQLBot est un bot python complétant ou générant automatiquement des pages Wikipast à partir de la base de données de la Bibliothèque nationale de France (BnF).

Description technique

Formattage des données

Dans un premier temps, le bot cherche, à travers une requête SPARQL, l'intégralité des auteurs appartenant à la base de données de la BnF.

Ensuite, les données suivantes sont récupérées pour chaque auteur :

  • La date et le lieu de naissance de l'auteur
  • La date et le lieu de mort de l'auteur
  • La liste des œuvres principales (selon la BnF) de l'auteur
  • Une image de profil de l'auteur (si elle existe)

Enfin, les données suivantes sont récupérées pour chaque œuvre principale de l'auteur en question:

  • La date de création de l’œuvre
  • Le type de l’œuvre (Art Graphique, Livre, ...)
  • Une illustration de l’œuvre (si elle existe)

A partir de ces données, le bot crée la page Wikipast liée à chaque auteur en y ajoutant un lien vers l'image de profil (si elle existe dans la BnF), leurs dates de naissance et de mort ainsi que ses œuvres principales (uniquement celles contenant une date). De manière analogue, une page Wikipast est créée pour chacune de ces œuvres avec une illustration (si elle existe dans la BnF). Ces ajouts sont chacun accompagnés de liens renvoyant vers le site de la BnF et sont normalisés de la façon suivante:

Pour la date de naissance, dépendamment de la mention du lieu:

[[DATE]] / [[LIEU]]. [[Naissance]] de [[AUTEUR]]. [PAGE BNF DE L'AUTEUR]
[[DATE]]. [[Naissance]] de [[AUTEUR]]. [PAGE BNF DE L'AUTEUR]

Pour la date de décès, dépendamment de la mention du lieu :

[[DATE]] / [[LIEU]]. [[Décès]] de [[AUTEUR]]. [PAGE BNF DE L'AUTEUR]
[[DATE]]. [[Décès]] de [[AUTEUR]]. [PAGE BNF DE L'AUTEUR]

Pour une œuvre, dépendamment de la mention de sont type  :

[[DATE]]. [[Création]] par [[AUTEUR]] de [[ŒUVRE]] ([[TYPE]]). [PAGE BNF DE L'ŒUVRE]
[[DATE]]. [[Création]] par [[AUTEUR]] de [[ŒUVRE]]. [PAGE BNF DE L'ŒUVRE]

Gestion des pages

Chacune des pages explorées par le bot est agrémentée de son type Wikidata et de son identifiant BnF (BnF id). Cela veut dire que si aucune ligne de contenu n'existe dans la base de donnée (naissance, décès ou création), alors la page est tout de même créée avec ces informations. La mention du type Wikidata permet aux autres bots de retrouver très facilement sur Wikipast tous les êtres humains (portant l'identification Q5) et toutes les œuvres (Q387234) grâce à une simple recherche. Cette fonction est par exemple utilisée par le Wikidataficator.

La gestion des homonymes utilise la politique du « premier arrivé, premier servi ». En effet, si le bot veut insérer un auteur et que son nom n'existe pas encore sur Wikipast, alors une page est créée normalement. A contrario, s'il existe déjà une page avec le nom de l'auteur, alors une page est créée mais son titre sera composé du nom de l'auteur suivi d'un identifiant unique (UUID) (exemple: Johann Strauss (3bd88e1), père de Johann Strauss).

Afin d'éviter des collisions entre le nom de plusieurs œuvres ainsi qu'entre le nom d'une œuvre et celui d'un auteur, il a donc été choisi de nommer les œuvres de la façon suivante : Nom de l’œuvre (nom de l'auteur) (exemple : L'Ours dans un bateau (fable V) (Gravelot) ).


Discussion des performances

Quantité produite

Le bot a créé environ 500'000 pages d'auteurs ainsi que 15'000 pages d'œuvres en un peu moins de 4 jours, ce qui est un laps de temps très raisonnable. La plupart des auteurs listés dans la base de données de la BnF n'ont malheureusement pas d'autre information que leur nom, donc une grande partie des pages créées est vide, mais exploitable grâce au tag wikidata et à l'identifiant BnF.

Difficultés rencontrées

Puisque le nombre de requêtes par seconde était très élevé (il y avait jusqu'à 200 fils d'exécutions en parallèle, mais en moyenne une trentaine), il pouvait arriver que des requêtes http n'arrivent pas à bon port. Cela crée donc des éléments manquants dans le résultat final. Seuls 1'500 liens sur le million traité n'ont pas été exécutés, et ont été relancés manuellement après la fin de l'exécution initiale. Finalement, aucun échec n'est à déplorer suite à cette intervention.

Le cas des auteurs existant déjà n'a été géré que suite à l'exécution initiale, afin d'éviter la création inutile de pages en cas de relancement (pour cause d'erreur, etc.)

Certaines œuvres présentaient un titre si long qu'il cassait la limite de caractères pour un titre de page sur Wikipast (256 bytes). Ce problème a été résolu après que quelques cas se soient présentés.

L'ordre des évènements était également non trivial à gérer. Un simple algorithme de tri sur les évènements ne suffit pas pour les dates négatives et changeant d'ordre de magnitude. Le bot en prend également compte.


Planification du bot

Le bot est censé n'être exécuté qu'une seule fois. Tout changement de la base de donnée de la BnF devrait être géré par l'intermédiaire d'un autre bot, car la politique du GallicaSPARQLBot est de ne jamais écraser ou modifier une page déjà existante.


Exemple de résultat

Auteur

Tiré de : Sénèque

Wikidata: (Q5)

BnF ID: 11887555p


Œuvre

Tiré de : Histoire de la peinture en Italie (Stendhal)

Wikidata: (Q386724)

BnF ID: 14415306q

bpt6k6215656z.thumbnail.jpg


Code

Le code source du bot est disponible sur GitHub.