EliteBot
Ce bot a pour objectif d'extraire les données présentes (pour les individus seulement) de la base de données des Elites suisses et de les mettre sur Wikipast.
Résumé des fonctionnalités
EliteBot va venir récupérer l'ensemble des Elites suisses disponibles sur le site des élites suisses [1]. Le robot va ensuite récupérer les informations liées aux données biographiques, à la formation et au parcours professionnel de l'élite. Ces fonctions sont développées dans le module de scraping. Pour chacune de ces élites, les données brutes sont traitées et mises en forme au format Wikipast dans le module Formatage. Enfin, un dernier module permet d'identifier les pages à créer sur Wikipast (élites encore non renseignées) et les informations à rajouter dans les élites déjà existantes.
Description technique
Scraping
Le module de scraping permet de répondre à deux besoins : récupérer la liste des élites suisses disponibles sur le site et récupérer les données liées à la biographie, la formation et le parcours professionnel de l'élite. Nous utilisons le module BeautifulSoup4 pour scrapper le code HTML.
Liste des élites suisses
La liste des élites suisses est contenue dans tous les tables contenues dans la table dont l'id est 'contleft' et dont les couleurs sont #D6E1EC ou #94D2E1. Nous récupérons ensuite le texte contenu dans le texte des balises 'a' correspondant au nom et prénom ainsi que l'ID qui est le nombre renseigné dans l'hyperlien de la balise. Nous ajoutons enfin ces informations à un tableau dont la clé est l'ID et la valeur est un tableau de la forme [Nom, Prénom].
Données d'une élite
Pour récupérer les données des élites, nous nous intéressons aux tables contenues dans la tableau dont l'id est 'contleft'. Nous distinguons enfin les tables dont nous souhaitons retirer les informations par leur attribut de classe. Nous récupérons, si existants, les données biographiques, la formation et le parcours professionnel. Les données respectives sont stockées dans un dictionnaire nommé infos avec la clé correspondante à la catégorie.
Le nom des catégories et des caractéristiques sont décrites dans keyword.py et sont identifiées à l'avance.
Données biographiques
Ce tableau se présente sous la forme de plusieurs lignes dont le premier élément est la caractéristique et le second la valeur de cette caractéristique. Nous allons conserver ces informations sous la forme d'un dictionnaire dont la clé est la caractéristique. Ce dictionnaire est ensuite conservé dans infos[biography].
Nous réalisons cependant une exception pour la date. En effet, le résultat initial donne par exemple pour Raphaël Abbet [2] :
{ 'Nom :': 'Abbet', 'Prénom :': 'Raphaël', 'Sexe :': 'H', 'Nationalité :': 'Suisse', 'Dates :': 'Naissance: 01/10/1940 Décès: 27.02.2018' }
En effet, l'attribut 'Dates' à des valeurs qui sont une concaténation de plusieurs attributs de dates avec leur valeur respective. Un traitement permet donc d'attribuer les dates de Naissance et de Décès comme des attributs du dictionnaire contenu dans infos[biography].
{ 'Nom :': 'Abbet', 'Prénom :': 'Raphaël', 'Sexe :': 'H', 'Nationalité :': 'Suisse', 'Naissance:': '01/10/1940', 'Décès:': '27.02.2018' }
Formation et parcours professionnel
Ces informations sont présentées sous forme de table. Dans le cas de la formation, il n'existe qu'une table. Dans le cas du parcours professionnel il peut exister plusieurs tables (avec des en-têtes différentes). Dans tous les cas, nous utilisons une fonction nommé tab_to_dic qui va, pour chaque ligne d'un tableau, ajouter un élément à un tableau de résultat. Ce dernier est un dictionnaire qui a pour clé les caractéristiques. La fonction permet également de désambiguer des header qui portent le même nom mais qui n'ont pas la même signification en fonction des catégories de sous-tableaux.
Ces tableaux sont conservés dans infos[formation] ou infos[fonc].
ID
L'ID de l'élite renseigné sur le site des élites suisses est également conservé eadns infos[ID].
Formatage
Les données sont scrappées puis passées à un classe appelée PastaMaker qui se charge de les mettre au format Wikipast. Les données passées sont sous forme de dictionnaire. La clé de ce dictionnaire correspond au type de valeur correspondante, ce qui permet de formater les données selon la catégorie à laquelle elle appartient. Il y a 3 catégories qui sont formatées.
La première est la biographie, où est récupéré le nom et prénom de l'individu. Si la date de naissance et/ou la date de décès sont données, alors les évènements correspondants sont aussi générées. La biographie doit impérativement être donnée sans quoi le formatage ne sera pas correcte.
La deuxième est la formation. Un évènement "Diplôme" est créé avec les informations présents, c'est-à-dire le nom de l'école, le titre obtenu et la spécialisation. Si il n'y pas de date pour la formation, l'évènement n'est pas créé.
La troisième est la fonction. Nous n'avons pas réussi à trouver d'évènement correspondant et ainsi l'évènement comprend principalement le titre de la fonction. Il n'y a pas de format rigoureux pour les fonctions, rendant la tache compliquée et certaines informations ne peuvent pas être utilisées car il y a trop de contenus différents possibles(lieu ou institutions ou même juste des lettres). Ici aussi, si il n'y pas de date pour la fonction, l'évènement n'est pas créé.
A travers toutes ces catégories plusieurs fonctions sont utilisés qui lisent et transforment par exemple les dates ou qui mettent la sources et les hypermots correctement.
Mise sur Wikipast
Une fois les données formattées au format wikipast, le nom de l'élite et son unique id sont mis ensemble afin de créer le titre de la page résultante. Le QueryManager s'occupe de décider s'il faut (ou non) ajouter une nouvelle page pour une élite ou modifier une page existante.
Voici la description technique de la fonction principale du QueryManager s'occupant de décider les actions à prendre en fonctions de l'input reçu du formatter et les données présentes sur wikipast:
- si la page correspondant au titre créé n'existe pas, le QueryManager crée simplement une nouvelle page et y écrit les données passées par le formatter
- si la page correspondant au titre existe déjà, le QueryManager tente de décider s'il s'agit d'une page créée par EliteBot ou par un humain. Dans le premier cas, le QueryManager edite la page existante et y ajoute les lignes du formatter manquantes. Dans le dernier cas, le QueryManager compare les lignes une par une et ajoute toute ligne non présente.
Lorsque l'id de l'élite est utilisé dans le nom de la page, le QueryManager s'occupe également de rendre le nom de page plus joli (en enlevant l'id) lorsque l'on est sur la page en utilisant la syntaxe.
[[<nom de page> | <alias du nom de page>]]
Analyse des résultat
Exemple d'un résultat
Nous allons suivre la page de Regina Elisabeth Aebi-Müller et son parcours à travers EliteBot [3]
Voici la page telle qu'elle est sur elite suisse:
Et voici le resultat donné par le scrapping:
{'ID': 84684, 'Données biographiques': {'Nom :': 'Aebi-Müller', 'Prénom :': 'Regina Elisabeth ', 'Sexe :': 'F', 'Nationalité :': 'suisse', 'Naissance:': '1971'}, 'Formation': [{'année': '2000', 'titre': 'Doctorat', 'catégorie': 'droit', 'lieu': 'UniBe', 'pays': 'Suisse'}], 'Fonctions et mandats': [{'durée': '2005- (2020)', 'université': 'UniLu (faculté de droit)', 'fonction': 'professeur ordinaire'}, {'durée': '(2010)', 'université': 'UniLu (Rechtswissenschaftliche Fakultät)', 'fonction': 'doyen'}, {'durée': '(2015)- ≥ 2020', 'université': 'Fonds national suisse de la recherche scientifique (conseil national de la recherche )', 'fonction': 'Membre', 'discipline': 'division 4', '': '1'}] }
Une fois formatée, ceci donne (où source correspond au lien [4]):
* [[1971]] / -. [[Naissance]] de [[Regina Elisabeth Aebi-Müller (84684)]] [source] * [[2000]] / [[Suisse]]. [[Diplôme]]: [[Regina Elisabeth Aebi-Müller (84684)]] diplomée de [[UniBe]] : Doctorat en droit [source] * [[2005]] / -. [[Regina Elisabeth Aebi-Müller (84684)]] est professeur ordinaire à [[UniLu]] (faculté de droit) [source] * [[2010]] / -. [[Regina Elisabeth Aebi-Müller (84684)]] est doyen à [[UniLu]] (Rechtswissenschaftliche Fakultät) [source] * [[2015]] / -. [[Regina Elisabeth Aebi-Müller (84684)]] est Membre à [[Fonds national suisse de la recherche scientifique]] (conseil national de la recherche ) [source]
Finalement, voici la requête créée par le QueryManager:
{ 'action': 'edit', 'title': 'Regina Elisabeth Aebi-Müller (84684)', 'token': 'HIDDEN', 'format': 'json', 'text': ' * [[1971]] / -. [[Naissance]] de [[Regina Elisabeth Aebi-Müller (84684) | Regina Elisabeth Aebi-Müller]] [source] * [[2000]] / [[Suisse]]. [[Diplôme]]: [[Regina Elisabeth Aebi-Müller (84684) | Regina Elisabeth Aebi-Müller]] diplomée de [[UniBe]] : Doctorat en droit [source] * [[2005]] / -. [[Regina Elisabeth Aebi-Müller (84684) | Regina Elisabeth Aebi-Müller]] est professeur ordinaire à [[UniLu]] (faculté de droit) [source] * [[2010]] / -. [[Regina Elisabeth Aebi-Müller (84684) | Regina Elisabeth Aebi-Müller]] est doyen à [[UniLu]] (Rechtswissenschaftliche Fakultät) [source] * [[2015]] / -. [[Regina Elisabeth Aebi-Müller (84684) | Regina Elisabeth Aebi-Müller]] est Membre à [[Fonds national suisse de la recherche scientifique]] (conseil national de la recherche ) [source] ', 'bot': 'true' }
La page peut ensuite être vue par n'importe quel utilisateur wikipast: Regina Elisabeth Aebi-Müller.
Performance du scraping
L'algorithme de scraping va venir récupérer les données HTML de chaque page et ensuite les traiter. Après quelques essais, nous émettons une hypothèse sur le fonctionnement du site. Chaque page d'élite n'est pas conservée et une requête SQL permet d'afficher la page pour chaque requête utilisateur. Ainsi, l'affichage de la page prends quelques secondes. De plus, il ne semble pas que ces requêtes puissent se réaliser de manière parallèle. On est donc dans une queue de requête, et nous sommes donc dépendant de la vitesse de réponse de la base de donnée et de la création de la page.
Le temps de téléchargement de la page est conséquent devant le temps d'exécution du reste du script. Nous avons chronométré la performance de vitesse sur l'ensemble des élites dont le nom commence par B.
Le temps moyen de téléchargement d'une page est de 3,32 secondes. Nous pouvons donc évaluer le temps de téléchargement et de scrap total pour l'ensemble du jeu de donnée à 36 heures.
Exemples de pages créées par EliteBot
- La page de Regina Elisabeth Aebi-Müller a été créée entièrement par EliteBot. Un autre exemple de ce même type de page est celle de Charles Cailler.
- La page de Hugo Allemann a été créée par un humain et améliorée par EliteBot.
Analyse des performances sur l'ensemble du jeu de données
Nous remplirons cette partie après l'exécutions du bot.
Améliorations possible
- Sur certaines pages se trouve une partie militaire qui parles des mandats et succès des militaires et/ou une partie généalogie qui montre la famille de l'individus. Ces deux parties ne sont pas utilisées.
- Le formatage n'utilise pas certaines informations de catégories diverses, mais peut-être des analyses plus poussées pourraient en faire usage.
Code
Le code est entièrement disponible sur GitHub [5]