« SportBot » : différence entre les versions

De Wikipast
Aller à la navigation Aller à la recherche
(Page créée avec « {| class="wikitable"} ==Description== Le MasterBot se charge de gérer et d'orchestrer les bots de wikipast. D'une part, il permet de lancer les bots de manière… »)
 
 
(46 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
{| class="wikitable"}
==Description==


Le [[MasterBot]] se charge de gérer et d'orchestrer les [[bots]] de wikipast. D'une part, il permet de lancer les bots de manière individuelle, en entrant des paramètres depuis un tableau de bord. D'autre part, il permet personaliser des séquences de lancement de bots, en spécifiant les paramètres (i.e. la fréquence le lancement, l'ordre, etc) de chaque bot.  
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 dans l’équipe olympique du pays en question.


==Implémentation et fonctionnalités==
==Implémentation et fonctionnalités==
Nous avons choisi d'implémenter le bot en 4 modules distincts:
* <code>traductor.py</code> qui s'occupe de faire le preprocessing ainsi que les traductions.
* <code>text_gen.py</code> qui s'occupe de générer toutes les lignes qui devront être insérées sur Wikipast.
* <code>wikipast.py</code> qui s'occupe de l'insertion des lignes sur wikipast.
* <code>sportbot.py</code> qui s'occupe de faire la liaison entre tous les autres modules.
=== Préprocessing du dataset ===
Afin de pouvoir lire et extraire les données de notre dataset, nous utilisons la librairie 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.


L'idée est d'avoir le code de chaque bot sur une page (ou section d'une page) spécifique. Cela permet de lancer les bots à partir du code disponible sur la page de chacun (ou même depuis Github). Une simple API créée avec flask  se charge de gérer les requêtes reçues. Tous les bots et leurs informations pertinentes (nom, adresse du code, ..description) sont stockés dans un dictionnaire. L'API est dotée d'une interface web graphique qui facilite l'interaction avec le bot.  
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).  


===Dictionnaire des bots===
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.


Le dictionnaire des bots contient le nom du bot, l'adresse où son code se trouve, le nom d'une fonction main à appeler (si nécessaire), et une brève description du bot.  
Suite à cela, nous transformons tous les noms des athlètes en minuscules sauf les initiales qui sont en majuscules.  


===Lancer un bot===
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.


Pour lancer un bot, il suffit d'effectuer une requête GET. Il faut passer en paramètre le nom du bot, et éventuellement, les paramètres requis. Par exemple, pour lancer le bot [[SummarizingBot]] sur les pages David Bowie et Mario Botta il suffit de faire:
=== Création des lignes à insérer ===
http://localhost:5000/api/v1/bots/run?name=SummarizingBot&params=David+Bowie+,+Mario+Botta
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:


Ceci va appeler la fonction run_bot_request(), qui va parser et formatter les paramètres de la requête (dans l'exemple, le nom et les deux pages), et appeler la méthode auxiliaire run_bot(). Cette dernière va récupérer le code du bot à l'aide de la fonction retrieve_bot() puis executer le code correspondant. Dans certains cas, il faut appeler une certaine fonction et lui donner des paramètres. Un message de succès s'affiche lors de la fin d'execution du bot, et tous les messages print du bot sont écrits dans un fichier (changement du stdout vers un fichier out.txt). Si le bot est introuvable, la fonction run_bot() retourne -1 et la fonction plus générale retourne un message d'erreur. L'affichage est formaté à l'aide d'un simple template html.
* 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-.


==== Récupérer le code d'un bot ====
Nous avons choisi de ne pas mettre une ligne par médaille pour la ville de manière à ne pas surchargé la page.


La fonction vérifie si l'adresse où se trouve le code (dans le dictionnaire des bots) contient le mot clé "GitHub" ou "wikipast". Si le code se trouve sur wikipast, la fonction assume qu'il est dans une seule section "Code" et entouré des tags "nowiki". Si le code se trouve sur GitHub, la fonction assume que le code est disponible dans un seul et unique fichier (et donc ne dépend pas de fichier externes). Après la réorganisation des bots, le code de chacun devrait se trouver sur une page wikipast au format Code_[nom du bot].
le format des lignes qui vont être ajoutées est le suivant:


===Obtenir de l'information sur les différents bots===
* 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 obtenir une brève description du bot il suffit d'effectuer la requête suivante (en passant le nom du bot en paramètre)
* 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 **épreuve**, aux Jeux Olympiques d'été/hiver.
http://localhost:5000/api/v1/bots/info?name=SummarizingBot


Pour avoir une vue d'ensemble sur tous les bots disponibles:
=== Vérification d'existence ===
http://localhost:5000/api/v1/bots/all


===Séquence de lancement des bots===
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.


Pour pouvoir lancer une séquence de bots, il faut pouvoir uploader un fichier texte contenant un nom de bot par ligne. La fonction upload_sequence() se charge de vérifier la validité du fichier (extension valide .txt et fichier existant), de le renommer en "sequence.txt", et de le sauvegarder. Le formulaire d'upload "upload_form.html" envoie donc une requête POST à l'adresse
===Tri automatique croissant par date===
http://localhost:5000/api/v1/config/sequence
lors de la soumission d'un fichier.


Ensuite, il faut pouvoir lire et parser les lignes de ce fichier, et pour chaque ligne, lancer le bot correspondant avec comme paramètre toutes les pages a traduire périodiquement (i.e. biographies ou les pages traduites récemment). Lors de la réception de la requête GET
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 modifie l'ancien texte de la page qu'en insérant les nouvelles données au bon endroit dans l'ancien texte.
http://localhost:5000/api/v1/bots/sequence
 
la fonction run_sequence() se charge de trouver le fichier, l'ouvrir, et lancer chaque bot dans l'ordre précisé à l'aide de la fonction run_bot(). Lors du lancement de la séquence, un registre documente toutes les actions effectuées (ouverture du fichier séquence, lancement d'un bot, son succès ou son échec...). Les bots n'étant pas tous parfaits, leur exécution sur chaque paramètre se fait dans un bloc try, pour ne pas empêcher l'exécution du reste de la séquence lors d'une erreur.  
 
== Utilisation du bot ==
Notre bot est séparé en différents modules et le module central est <code>sportbot.py</code>, il prend les paramètres suivants en entrée pour fonctionner correctement:
 
* <code>--input-file</code> le fichier qu'il faut utiliser
* <code>--jo-type</code> qui doit valoir <code>summer</code> ou <code>winter</code> et qui sera utilisé pour formatter les lignes qui seront insérées dans Wikipast
* (optionel) <code>--preprocessing</code> qui vaut <code>1</code> si le pre-processing doit être fait et <code>0</code> sinon.
* (optionel) <code>--translate</code> qui vaut <code>1</code> si le pre-processing doit également faire la traduction des termes et <code>0</code> autrement.
* (optionel) <code>--output-file-preprocessing</code> 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:
 
<code>python3 sportbot.py --input-file medals.csv --jo-type summer --preprocessing 0 --translate 0</code>
 
A noter que le fait de mettre <code>--preprocessing</code> et <code>--translate</code> à 0 est équivalent à ne pas les spécifier du tout.
 
==Performances==
 
===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 cherchons où placer nos entrées dans cette copie local de la page au lieu de faire une requête internet à chaque fois. Pour finir, nous insérons donc toute nos entrées qui vont sur la même page en une seule requête internet. 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.
La traduction via une API est également gourmande en ressource et prends beaucoup de temps. En laissant la possibilité lors de l'utilisation de traduire une seule fois le dataset et de stocker en fichier .csv le résultat, le bot est beaucoup plus rapide.
 
===Minimisation du preprocessing ===
 
Nous avons laisser la possibilité à l'utilisateur de preprocessed les données ou non pour réduire le temps d'execution executer le preprocessing uniquement en cas de besoin.


==Limitations==
==Limitations==


Le code des bots est soit sur gitub, soit directement sur la page wiki du bot. Cependant, la structure des bots n'est pas homogène. Certains bots sont programmés pour agir sur des pages spécifiques, ou sur toutes les pages des biographies: il n'y a aucun moyen de spécifier une page précise. D'autre part, le code de certains bots est éparpillé sur plusieurs fichiers python: cela n'est plus en accord avec les assomptions de la fonction qui récupère le code des bots.
===Traduction===
Pour remédier à cela, une page Wikipast a été crée pour stocker le code de chaque bot. Cela facilitera la lecture du code par le MasterBot, et permettra de définir une "convention" pour les futurs bots.
Le système de traduction utilisé est limité en version gratuite [https://www.deepl.com/pro?/pro?cta=header-prices=header-pro] et le bot ne fonctionne donc pas avec des dataset avec trop de donnée.  
Aussi, la structure des bots a été harmonisée de façon à ce que chaque bot ait une fonction main prenant en paramètre un nombre indéfini de noms de pages.  
Les traductions de certains sport sont parfois mauvaise, par exemple "swimming" qui a été traduit en "baignade" alors qu'il fallait traduire en "natation". Nous avons donc du ajouter un module de correction de traduction pour les mauvaises traductions.  


Du point de vue performances, le temps d'execution d'une séquence du MasterBot depend vraiment des performances individuelles de chaque bot. Vu que chaque job est exécuté séquentiellement et que l'ordre d'exécution est important, il est difficile d'optimiser les performances du MasterBot. Il faut attendre qu'un premier bot s'execute pour pouvoir lancer le suivant.
===Versatilité du code===
Notre bot n'est pas adapté si le dataset change de forme et notre bot devrait être adapté. En résumé, nous avons un bot qui manque de versatilité.


Ci-dessous, un tableau qui résume les bots posants problème pour l'intégration au MasterBot
==Exemples==


{| class="wikitable"
Par exemples, la page [[1896]] aura plusieurs nouvelles entrée comme:
! style="text-align: center;" | Name
* [[1896]] / [[Athènes]]. Obtention de la médaille d'or par [[ Aristidis Konstantinidis]] dans la discipline route cycliste pour l'épreuve course sur route individuelle aux Jeux Olympiques d'été.[https://www.kaggle.com/the-guardian/olympic-games]
! style="text-align: center;" | Code Location
* [[1896]] / [[Athènes]]. Obtention de 2 médaille(s) d'or, 2 médaille(s) d'argent, 2 médaille(s) de bronze par la nation [[Equipe mixte aux Jeux Olympiques]] aux Jeux olympiques d'été.[https://www.kaggle.com/the-guardian/olympic-games]
! style="text-align: center;" | Problem
Le premier exemple est un ajout d'une personne et le second un ajout du nombre de médaille pour une nation.
! style="text-align: center;" | Function
|-
| style="text-align: center;" | BioPathBot
| style="text-align: center;" | [[Code_BioPathBot]]
| style="text-align: center;" | Problem installing some dependency
| style="text-align: center;" | main()
|-
| style="text-align: center;" | ChronoBot
| style="text-align: center;" |
| style="text-align: center;" | Source code scattered on multiple files
| style="text-align: center;" |
|-
| style="text-align: center;" | CreatoBot
| style="text-align: center;" | [[Code_Creatobot]]
| style="text-align: center;" | -
| style="text-align: center;" | main()
|-
| style="text-align: center;" | EntryMakerBot
| style="text-align: center;" |
| style="text-align: center;" | Source code scattered on multiple files
| style="text-align: center;" |
|-
| style="text-align: center;" | FormatBot
| style="text-align: center;" | [[Code_FormatBot]]
| style="text-align: center;" | -
| style="text-align: center;" | main()
|-
| style="text-align: center;" | GallicaSpqarqlBot
| style="text-align: center;" |
| style="text-align: center;" |
| style="text-align: center;" |
|-
| style="text-align: center;" | GraderBot
| style="text-align: center;" | [[Code_GraderBot]]
| style="text-align: center;" | -
| style="text-align: center;" | main()
|-
| style="text-align: center;" | ImageBot
| style="text-align: center;" | [[Code_ImageBot]]
| style="text-align: center;" | -
| style="text-align: center;" | main()
|-
| style="text-align: center;" | LinkBot
| style="text-align: center;" | [[Code_LinkBot]]
| style="text-align: center;" | -
| style="text-align: center;" | main()
|-
| style="text-align: center;" | MinerRegExBot
| style="text-align: center;" |
| style="text-align: center;" |
| style="text-align: center;" |
|-
| style="text-align: center;" | OrthoBot
| style="text-align: center;" | [[Code_OrthoBot]]
| style="text-align: center;" | -
| style="text-align: center;" | main()
|-
| style="text-align: center;" | PageUpdaterBot
| style="text-align: center;" | [[Code_PageUpdaterBot]]
| style="text-align: center;" | -
| style="text-align: center;" | main()
|-
| style="text-align: center;" | SimilarBot
| style="text-align: center;" | [[Code_SimilarBot]]
| style="text-align: center;" | -
| style="text-align: center;" | main()
|-
| style="text-align: center;" | SliderBot
| style="text-align: center;" |
| style="text-align: center;" | Uses a graphical user interface
| style="text-align: center;" |
|-
| style="text-align: center;" | SourceBot
| style="text-align: center;" | [[Code_SourceBot]]
| style="text-align: center;" | -
| style="text-align: center;" | main()
|-
| style="text-align: center;" | SparqlBot
| style="text-align: center;" |
| style="text-align: center;" | Source code scattered on multiple files
| style="text-align: center;" |
|-
| style="text-align: center;" | SummarizingBot
| style="text-align: center;" | [[Code_SummarizingBot]]
| style="text-align: center;" | -
| style="text-align: center;" | main()
|-
| style="text-align: center;" | TangoBot
| style="text-align: center;" |
| style="text-align: center;" | Problem installing some dependency
| style="text-align: center;" |
|-
| style="text-align: center;" | TranslatorBot
| style="text-align: center;" | [[Code_TranslatorBot]]
| style="text-align: center;" | -
| style="text-align: center;" | main()
|-
| style="text-align: center;" | Triplificator
| style="text-align: center;" | [[Code_Triplificator]]
| style="text-align: center;" | -
| style="text-align: center;" | main()
|-
| style="text-align: center;" | VandalBot
| style="text-align: center;" |
| style="text-align: center;" | Source code scattered on multiple files
| style="text-align: center;" |
|-
| style="text-align: center;" | Wikidataficator
| style="text-align: center;" |
| style="text-align: center;" |
| style="text-align: center;" |
|}


==Exemples==  
==Code==


Ce bot ne produit pas de résultats particulièrement visibles. En guise de test, j'ai lancé une séquence "ImageBot, TranslatorBot" sur les 1000 pages modifiées récemment. L'activité récente du bot est visible sur cette [http://wikipast.epfl.ch/wikipast/index.php/Spécial:Contributions/MasterBot page]. Le lancement est satisfaisant, mais les résultats ne sont pas forcément bons. La traduction n'est pas tout le temps complète, et elle répète parfois quelque mots. Les images ne correspondent pas toutes au sujet de la page. Ceci est hors de la portée du MasterBot.
Le code source est disponible sur ce lien [https://github.com/Palmisano-Enzo/sportbot]


==Code==
==Dataset==


Le code source est disponible sur ce [https://github.com/karimassi/masterbot repo GitHub]
Le dataset que nous utilisons provient du site kaggle. Plus précisément, nous utilisons le dataset suivant [https://www.kaggle.com/the-guardian/olympic-games]

Dernière version du 31 mai 2021 à 05:50

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 dans l’équipe olympique du pays en question.

Implémentation et fonctionnalités

Nous avons choisi d'implémenter le bot en 4 modules distincts:

  • traductor.py qui s'occupe de faire le preprocessing ainsi que les traductions.
  • text_gen.py qui s'occupe de générer toutes les lignes qui devront être insérées sur Wikipast.
  • wikipast.py qui s'occupe de l'insertion des lignes sur wikipast.
  • sportbot.py qui s'occupe de faire la liaison entre tous les autres modules.

Préprocessing du dataset

Afin de pouvoir lire et extraire les données de notre dataset, nous utilisons la librairie 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 athlète: Année / Ville. Obtention de la médaille or/argent/bronze par Nom Prenom dans la discipline **discipline** pour l'épreuve **épreuve**, 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 modifie l'ancien texte de la page qu'en insérant les nouvelles données au bon endroit dans l'ancien texte.


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 valoir summer ou winter et qui sera utilisé pour formatter les lignes qui seront insérées dans Wikipast
  • (optionel) --preprocessing qui vaut 1 si le pre-processing doit être fait et 0 sinon.
  • (optionel) --translate qui vaut 1 si le pre-processing doit également faire la traduction des termes et 0 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

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 cherchons où placer nos entrées dans cette copie local de la page au lieu de faire une requête internet à chaque fois. Pour finir, nous insérons donc toute nos entrées qui vont sur la même page en une seule requête internet. 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. La traduction via une API est également gourmande en ressource et prends beaucoup de temps. En laissant la possibilité lors de l'utilisation de traduire une seule fois le dataset et de stocker en fichier .csv le résultat, le bot est beaucoup plus rapide.

Minimisation du preprocessing

Nous avons laisser la possibilité à l'utilisateur de preprocessed les données ou non pour réduire le temps d'execution executer le preprocessing uniquement en cas de besoin.

Limitations

Traduction

Le système de traduction utilisé est limité en version gratuite [1] et le bot ne fonctionne donc pas avec des dataset avec trop de donnée. Les traductions de certains sport sont parfois mauvaise, par exemple "swimming" qui a été traduit en "baignade" alors qu'il fallait traduire en "natation". Nous avons donc du ajouter un module de correction de traduction pour les mauvaises traductions.

Versatilité du code

Notre bot n'est pas adapté si le dataset change de forme et notre bot devrait être adapté. En résumé, nous avons un bot qui manque de versatilité.

Exemples

Par exemples, la page 1896 aura plusieurs nouvelles entrée comme:

Le premier exemple est un ajout d'une personne et le second un ajout du nombre de médaille pour une nation.

Code

Le code source est disponible sur ce lien [4]

Dataset

Le dataset que nous utilisons provient du site kaggle. Plus précisément, nous utilisons le dataset suivant [5]