« GallicaSPARQLBot » : différence entre les versions

De Wikipast
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
 
(12 versions intermédiaires par 5 utilisateurs non affichées)
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).
{| class="wikitable"
|Langue
|'''Français'''
|[[(en)_GallicaSPARQLBot|English]]
|}
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)].


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.
== Description technique ==


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.
=== Formattage des données ===


Le fichier json de l'auteur est récupéré. Il contient 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.
* Sa date/son lieu de Naissance,
* Sa date/son lieu de Mort,
* Ses œuvres principales.


A partir de ces informations, le bot crée ou modifie la page Wikipast liée à chaque auteur en y ajoutant leurs dates de naissance et de mort et ajoute de la même façon les œuvres principales de l'auteur et leurs pages associées (leurs informations sont elles aussi récupérées à travers les json des œuvres). 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:


Les pages Wikipast de chacune des œuvres de l'auteur sont aussi créées.
<pre>
[[DATE]] / [[LIEU]]. [[Naissance]] de [[AUTEUR]]. [PAGE BNF DE L'AUTEUR]
</pre>
<pre>
[[DATE]]. [[Naissance]] de [[AUTEUR]]. [PAGE BNF DE L'AUTEUR]
</pre>


Afin d'éviter des collisions entre le nom de plusieures œuvres ainsi qu'entre le nom d'une œuvre et celui d'un auteur, il a été choisi de nommer ces pages avec le nom de l’œuvre suivi du nom de l'auteur (par exemple: .......... ).
Pour la date de décès, dépendamment de la mention du lieu :


Chacune des pages explorées par le bot seront agrémentées d'un identifiant BnF (Bnf id) et de leur type wikidata.
<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>


== Performances ==
Pour une œuvre, dépendamment de la mention de son type  :


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.
<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>


Suite à la création de 7000 auteurs (ainsi que de nombreuses œuvres), les estimations pratiques se rangent plutôt dans les 7 jours.
=== 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 [https://www.wikidata.org/wiki/Q5 Q5]) et toutes les œuvres ([https://www.wikidata.org/wiki/Q386724 Q386724]) grâce à une simple recherche. Cette fonction est par exemple utilisée par le [[Wikidataficator]].


== Exemple d'utilisation ==
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 sa page est créée normalement. A contrario, s'il existe déjà une page avec le nom de l'auteur, alors sa 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 é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 ==


Pour un auteur:
=== 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 ===


[[Fichier:Page Audran.png]]
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.


Pour une œuvre:
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 ==


[[Fichier:Oeuvre Audran.png]]
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: ([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]
 
*[[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/]
 
*[[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/]
 
*[[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/]
 
*[[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]
 
 
=== Œuvre  ===
 
''Tiré de :'' [[Histoire de la peinture en Italie (Stendhal)]]
 
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]
 
*[[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 ==
 
Le code source du bot est disponible sur [https://github.com/robinmamie/GallicaSPARQLBot GitHub].
 
Le Gallica SPARQL bot est composé des fichiers suivants:
 
* execute_bot.py: à exécuter en utilisant python execute_bot.py pour créer la page de tous les auteurs présents sur Gallica. Mentionner le mot de passe du GallicaSPARQLBot en argument.
* parse_failed.py: à exécuter pour gérer les cas où les liens n'ont pas pu être sauvegardés (à placer dans le dossier log/Fail)
* parse_existed.py: à exécuter pour gérer les cas où les auteurs existent déjà sur Wikipast (à placer dans le dossier log/Exists)
* bot_parsing.py: parse les données présentes sur Gallica pour les présenter de façon standard sur WikiPast
* web_tools.py: contient les outils nécessaires pour récupérer et éditer diverses pages en ligne (wikipast, JSON, ...)
* list_authors.py: récupère le résultat de la commande SPARQL sauvegardée dans data/authors_link.txt afin de lister tous les auteurs dans le fichier data/authors.txt
* data/authors_link.txt: requête SPARQL de Gallica retournant un fichier JSON.
* data/authors.txt: éventuellement, liste de lien vers tous les auteurs listés sur Gallica

Dernière version du 21 mai 2019 à 09:02

Langue Français English

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 son 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 (Q386724) 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 sa page est créée normalement. A contrario, s'il existe déjà une page avec le nom de l'auteur, alors sa 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 é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.

Le Gallica SPARQL bot est composé des fichiers suivants:

  • execute_bot.py: à exécuter en utilisant python execute_bot.py pour créer la page de tous les auteurs présents sur Gallica. Mentionner le mot de passe du GallicaSPARQLBot en argument.
  • parse_failed.py: à exécuter pour gérer les cas où les liens n'ont pas pu être sauvegardés (à placer dans le dossier log/Fail)
  • parse_existed.py: à exécuter pour gérer les cas où les auteurs existent déjà sur Wikipast (à placer dans le dossier log/Exists)
  • bot_parsing.py: parse les données présentes sur Gallica pour les présenter de façon standard sur WikiPast
  • web_tools.py: contient les outils nécessaires pour récupérer et éditer diverses pages en ligne (wikipast, JSON, ...)
  • list_authors.py: récupère le résultat de la commande SPARQL sauvegardée dans data/authors_link.txt afin de lister tous les auteurs dans le fichier data/authors.txt
  • data/authors_link.txt: requête SPARQL de Gallica retournant un fichier JSON.
  • data/authors.txt: éventuellement, liste de lien vers tous les auteurs listés sur Gallica