SportBot
Le but du SportBot est d'apporter des informations sur les résultats obtenus par certains athlètes aux Jeux Olympiques d'hiver et d'été entre 1896 et 2014 à partir d'une dataset prise sur kaggle. Le SportBot extrait dans un premier temps les infos prises dans la base de données et créait en conséquence une page Wikipast de l'athlète avec les infos contenues dans la base de données. De plus, le bot ajoute le nombre de médailles obtenues durant au cours d'une certaine année sur la page du pays concerné.
Objectifs
- Création/modification de page pour chaque d'athlètes ayant obtenu une ou plusieurs médailles aux JOs.
- Ajout du lieu, de la date, du type de médaille obtenue par l'athlète.
- Ajout du nombre de médailles obtenue durant chaque JO sur la page du pays concerné.
Implémentation et fonctionnalités
Préprocessing du dataset
Afin de pouvoir lire et extraire les données de notre dataset, nous utilisons la libraire Pandas.
Le premier problème rencontré est que le dataset est en anglais et que Wikipast est en français, par conséquent nous commençons par traduire tous les sports, pays et toutes les villes en utilisant l'API du site DeepL.
De plus, certaines médailles ne sont pas encore attribuées officiellement, on a donc décidé de les supprimer du dataset.
Après cela nous effectuons une correction manuelle de certains termes qui n'ont pas été traduit comme on l'aurait voulu ( Par exemple, "Swimming" traduit en "Baignade" au lieu de natation).
La dernière étape du pre-processing est de transformer les codes de pays (CH par exemple) fournis dans le dataset par le nom effectif du pays (Suisse) (à l'aide du dictionnaire fourni avec le dataset) et en appliquant une correction manuelle pour certain pays qui n'existe pas dans le dictionnaire fourni avec le dataset.
Suite à cela, nous transformons tous les noms des athlètes en minuscules sauf les initiales qui sont en majuscules.
Comme les requêts à l'API gratuite sont limitées, une fois que toutes les traductions ont été effectué, on les sauvegarde dans un fichier sur la machine.
Création des lignes à insérer
Le but de ce module est de créer toutes les lignes qui devront être insérées dans les différentes pages sur Wikipast. L'objectif était de former un dictionnaire qui avait un mapping entre la page à modifier sur Wikipast (titre de la page) et une liste de ligne à ajouter de manière à minimiser le nombre de requêtes internet (la partie la plus lente de notre bot). Etant donné, une liste de médaille par Jeux Olympiques, le but est d'ajouter:
- Une ligne par athlète par médaille sur la page de l'athlète et sur la page de l'année des JO.
- Une ligne par pays par JO (avec un calcul cumulé des médailles pour ce pays par JO) sur la page du pays, la page de l'année des JO et sur la page de la ville qui accueillait les JO cette année-là.
Nous avons choisi de ne pas mettre une ligne par médaille pour la ville de manière à ne pas surchargé la page.
le format des lignes qui vont être ajoutées est le suivant:
- Pour un pays: Année / Lieu des Jo. Obtention de "Nombre de médailles resp or/argent/bronze" par l'Équipe olympique pays aux Jeux olympiques d'été/hiver.
- Pour un athlète: Année / Ville. Obtention de la médaille or/argent/bronze par Nom Prenom dans la discipline discipline pour l'épreuve epreuve, aux Jeux Olympiques d'été/hiver.
Vérification d'existence
Afin de ne pas créer des pages à double, nous vérifions dans un premier temps si il n'existe pas déjà la page que nous souhaitons créer. Dans les cas où elle est inexistante, nous l'a créons simplement en y ajoutant les entrées souhaitées. Dans le cas où la page existe déjà, nous appliquons une autre vérification pour voir si la page est vide. Si la page est vide, nous écrivons juste les nouvelles entrées (préalablement trié par ordre chronologique) sans passer par l'algorithme de tri. Dans le cas où il existe déjà des entrées sur la page, nous utilisons l'algorithme de tri chronologique qui vient lire les entrées déjà existantes sur la page puis place nos nouvelles entrées de manière chronologique.
Tri automatique croissant par date
Les données sont triées par ordre croissant de date, un algorithme (sort_year) s'occupe de réordonner les entrées. L'algorithme consiste à séparer le texte de la page par ligne et de détecter les dates des événements déjà existants. Ensuite on parcourt la liste d'années pour détecter où l'insertion se fait (ligne précédant l'endroit où l'on veut insérer la donnée). Enfin on ne modifie l'ancien texte de la page qu'en insérant la nouvelle donnée au bon endroit dans l'ancien texte.
Minimisation requête internet
Dans notre algorithme, les lignes de codes demandant le plus de temps sont les requêtes internet (lecture et écriture sur wikipast). Afin de minimiser ce nombre de requêtes dans le cas où nous devons écrire plusieurs lignes sur une même page nous copions dans un premier temps tout le texte de la page. Puis nous insérons les lignes que nous désirons dans cette copie local et pour finir nous réécrivons tout le texte de la page en une seule fois. Cela à l'avantage de faire uniquement deux requêtes internet pour un nombre potentiellement très grande de ligne à ajouté. Dans le cas où l'on ajouterai ligne par ligne nos entrées sur wikipast, nous aurions besoin de faire autant de requêtes que d'entrée, ce qui serai très couteux en temps.
Utilisation du bot
Notre bot est séparé en différents modules et le module central est sportbot.py
, il prend les paramètres suivants en entrée pour fonctionner correctement:
--input-file
le fichier qu'il faut utiliser--jo-type
qui doit valoirsummer
ouwinter
et qui sera utilisé pour formatter les lignes qui seront insérées dans Wikipast- (optionel)
--preprocessing
qui vaut1
si le pre-processing doit être fait et0
sinon. - (optionel)
--translate
qui vaut1
si le pre-processing doit également faire la traduction des termes et0
autrement. - (optionel)
--output-file-preprocessing
si on veut donner un nom précis pour le fichier de sortie du pre-processing.
Un exemple de commande pour lancer le bot est le suivant:
python3 sportbot.py --input-file medals.csv --jo-type summer --preprocessing 0 --translate 0
A noter que le fait de mettre --preprocessing
et --translate
à 0 est équivalent à ne pas les spécifier du tout.
Performances
Limitations
Exemples
Code
Le code source est disponible sur ce lien (Che !)
DATASET
Le dataset que nous utilisons provient du site kaggle. Plus précisément, nous utilisons le dataset suivant [1]