« UniqueIDBot » : différence entre les versions

De Wikipast
Aller à la navigation Aller à la recherche
(Page créée avec « == Résumé des fonctionnalités == Le UniqueIDBot attribue un identifiant unique à chaque page Wikipast et l'ajoute à la page en question. == Description technique ==… »)
 
 
(14 versions intermédiaires par le même utilisateur non affichées)
Ligne 7 : Ligne 7 :
=== Répertoriage de toutes les pages Wikipast ===
=== Répertoriage de toutes les pages Wikipast ===


* Obtention de la [[Wikipast:toutes_les_pages|liste de toutes les pages]]
* Obtention de la liste de [http://wikipast.epfl.ch/wiki/Special:Toutes_les_pages toutes les pages]


* Balisage de la page via la librairie [https://pypi.org/project/beautifulsoup4/ Beautiful Soup]
* Balisage de la page via la librairie [https://pypi.org/project/beautifulsoup4/ Beautiful Soup]
Ligne 15 : Ligne 15 :
=== Navigation à travers les pages ===
=== Navigation à travers les pages ===


* Accès à la page demandée grâce à une requête HTML
* Accès à la page demandée grâce à une requête API
* Vérification de la présence d'un identifiant sur la page
* Vérification de la présence d'un identifiant sur la page


Ligne 29 : Ligne 29 :


* L'identifiant doit être généré à partir d'informations sur la page
* L'identifiant doit être généré à partir d'informations sur la page


Les deux premiers critères sont obligatoires pour garantir le fonctionnement de l'identifiant, dans le cas de la gestion d'une base de donnée par exemple. Une page répertoriée grâce à son identifiant doit toujours pouvoir être reconnue de façon certaine.
Les deux premiers critères sont obligatoires pour garantir le fonctionnement de l'identifiant, dans le cas de la gestion d'une base de donnée par exemple. Une page répertoriée grâce à son identifiant doit toujours pouvoir être reconnue de façon certaine.
Ligne 35 : Ligne 34 :
Le troisième critère est facultatif mais permet d'apporter un certain ordre dans la génération de l'identifiant. Il est possible d'utiliser une séquence complétement aléatoire, mais on préférera tout de même garder des informations contenues dans l'identifiant.
Le troisième critère est facultatif mais permet d'apporter un certain ordre dans la génération de l'identifiant. Il est possible d'utiliser une séquence complétement aléatoire, mais on préférera tout de même garder des informations contenues dans l'identifiant.


Le bot utilise donc la fonction de hachage [https://en.wikipedia.org/wiki/SHA-1/ SHA-1] sur l'URL de la page. Ceci permet de garantir que l'URL soit à la fois très probablement unique et constant, puisque le nom ou toutes les informations présentes sur la page sont susceptibles d'être non-uniques, erronées ou modifiées.
Afin de générer l’identifiant unique de la page, le bot se sert la librairie [https://docs.python.org/3/library/uuid.html UUID] de Python, plus précisément le méthode uuid5 qui génère un identifiant basé sur un ensemble de caractères données (dans notre cas l'URL de la page) et un namespace.  


La probabilité de collision de la fonction [https://en.wikipedia.org/wiki/SHA-1/ SHA-1] appliquée sur Y URLs est de 1 sur XXX. Il est donc peu probable que ce cas arrive durant la durée de vie de Wikipast.
Cette fonction utilise le hachage [https://en.wikipedia.org/wiki/SHA-1/ SHA-1] sur l'URL de la page, ce qui permet de garantir que l'identifiant généré soit à la fois (très probablement) unique et constant en fonction de l'URL donné, puisque le nom ou toutes les informations présentes sur la page sont susceptibles d'être non-uniques, erronées ou modifiées.


La probabilité de collision de la fonction [https://en.wikipedia.org/wiki/SHA-1/ SHA-1] appliquée sur un milliard d'URLs est de une chance sur sur 2*10^30. Il est donc très peu probable que ce cas arrive durant la durée de vie de Wikipast.


=== Ajout de l'identifiant ===
=== Ajout de l'identifiant ===
Afin d'obtenir le contenu des pages et de pouvoir les modifier, le bot utilise des requêtes API qui sont directement envoyer au web server.
Dans un premier temps, le bot va obtenir le contenu de la page courante afin de repérer si le texte contient un lien Wikidata [https://www.wikidata.org/wiki/Q5 Q5], indiquant si l'entité est un personnage ou non. Si ce n'est pas le cas, l'identifiant n'est pas ajouté. Le bot repère également les lien [https://www.bnf.fr Bnf] de la Bibiliothèque de France qui atteste de la véracité des entités trouvées.
En analysant le contenu de la page, le bot va également regarder si la page contient déjà un identifiant.
Si ces conditions sont remplies,  le bot va ajouté l'identifiant à la page au travers d'une deuxième requête API.


Une fois l'identifiant généré, on l'ajoute sur la page avec une requête HTML.
=== Code source ===
Code source disponible sur [https://github.com/eloigrndl/UniqueIDBot GitHub]


=== Discussion des performances du Bot ===
=== Discussion des performances du Bot ===


Ça fait le café.
La principale difficulté de conception de ce bot est la sélection des pages à identifier.
En effet, il existe certains types de pages que nous ne souhaitons pas identifier :
 
* Les [http://wikipast.epfl.ch/wiki/Special:Pages_sp%C3%A9ciales Pages spéciales]
* Certaines pages utilitaires non répertoriées dans les pages spéciales comme la page d'[http://wikipast.epfl.ch/wiki/Accueil Accueil]
* Des pages dont le nom semble erroné, comprenant des caractères inhabituels, telles que [http://wikipast.epfl.ch/wiki/!%27ean !'ean]
 
Nous voulions d'abord utiliser le librairie [https://spacy.io/ spaCy] de Python. Celle-ci permet d'identifier un ensemble de caractères comme étant soit une date, un lieu, une personne, etc, etc. Cependant après plusieurs tests, cette librairie présentait quelques failles concernant les dates et les personnes et nous préférions éviter de potentiels erreurs afin d'être sûr des pages qui seront modifiées par le bot.
Nous avons donc choisi de baser la recherche d'entité sur les balises Wikidata générées par un autre autre bot.
 
Enfin concernant le résultat en eux-même, vous pouvez voir sur [http://wikipast.epfl.ch/wiki/%22Blue%22_Gene_Tyranny cette page] un identifiant qui a été ajouté par le bot. De plus, le temps de traitement d'une page est estimée à environ 0.4 secondes mais ce temps peut varier en fonction des requêtes lancées (si la page possède déjà un identifiant ou ne répond pas aux critères afin d'en ajouter, la deuxième requête sera éviter et le temps d’exécution sur cette page sera réduit).
 
(Nous ajouterons plus d'informations lorsque le bot aura été lancée complètement)
 
=== Possibles améliorations futures ===
* Parcourir toutes les pages de Wikipast afin de repérer lesquelles nécessitent un identifiant n'est pas non plus une solution optimale : on peut imaginer que lors de la création d'une page, le bot sera automatiquement appelé afin de générer l'identifiant approprié ou du moins que les pages dont l'identifiant manque seront regroupées sur une page dédiée, ce qui évitera de devoir itérer aléatoirement comme nous le faisons maintenant.
* Générer des identifiants avec une hiérarchie : ceci n'était pas possible car pour l'instant, il existe peu voir pas de catégories/hiérarchies pour les différentes pages.
* Elargir les "critères d'identification" afin que plus de pages puissent recevoir un identifiant : cela passerait par une vérification des pages afin d'attester de leur véracité pour ensuite pouvoir leur attribuer un identifiant.

Dernière version du 25 mai 2021 à 20:57

Résumé des fonctionnalités

Le UniqueIDBot attribue un identifiant unique à chaque page Wikipast et l'ajoute à la page en question.

Description technique

Répertoriage de toutes les pages Wikipast

La librairie Beautiful Soup permet d'extraire facilement des informations du code HTML d'une page web. Les URLs de toutes les pages présentes sur Wikipast sont ainsi récupérées.

Navigation à travers les pages

  • Accès à la page demandée grâce à une requête API
  • Vérification de la présence d'un identifiant sur la page

Si la page accédée possède déjà un identifiant, le bot passe à la page suivante immédiatement.

Génération de l'identifiant

L'identifiant généré doit correspondre à plusieurs critères :

  • Tous les identifiants sont uniques
  • Si pour une raison quelconque l'identifiant venait à être supprimé de la page, le nouvel identifiant généré devrait être le même que l'ancien.
  • L'identifiant doit être généré à partir d'informations sur la page

Les deux premiers critères sont obligatoires pour garantir le fonctionnement de l'identifiant, dans le cas de la gestion d'une base de donnée par exemple. Une page répertoriée grâce à son identifiant doit toujours pouvoir être reconnue de façon certaine.

Le troisième critère est facultatif mais permet d'apporter un certain ordre dans la génération de l'identifiant. Il est possible d'utiliser une séquence complétement aléatoire, mais on préférera tout de même garder des informations contenues dans l'identifiant.

Afin de générer l’identifiant unique de la page, le bot se sert la librairie UUID de Python, plus précisément le méthode uuid5 qui génère un identifiant basé sur un ensemble de caractères données (dans notre cas l'URL de la page) et un namespace.

Cette fonction utilise le hachage SHA-1 sur l'URL de la page, ce qui permet de garantir que l'identifiant généré soit à la fois (très probablement) unique et constant en fonction de l'URL donné, puisque le nom ou toutes les informations présentes sur la page sont susceptibles d'être non-uniques, erronées ou modifiées.

La probabilité de collision de la fonction SHA-1 appliquée sur un milliard d'URLs est de une chance sur sur 2*10^30. Il est donc très peu probable que ce cas arrive durant la durée de vie de Wikipast.

Ajout de l'identifiant

Afin d'obtenir le contenu des pages et de pouvoir les modifier, le bot utilise des requêtes API qui sont directement envoyer au web server.

Dans un premier temps, le bot va obtenir le contenu de la page courante afin de repérer si le texte contient un lien Wikidata Q5, indiquant si l'entité est un personnage ou non. Si ce n'est pas le cas, l'identifiant n'est pas ajouté. Le bot repère également les lien Bnf de la Bibiliothèque de France qui atteste de la véracité des entités trouvées. En analysant le contenu de la page, le bot va également regarder si la page contient déjà un identifiant.

Si ces conditions sont remplies, le bot va ajouté l'identifiant à la page au travers d'une deuxième requête API.

Code source

Code source disponible sur GitHub

Discussion des performances du Bot

La principale difficulté de conception de ce bot est la sélection des pages à identifier. En effet, il existe certains types de pages que nous ne souhaitons pas identifier :

  • Les Pages spéciales
  • Certaines pages utilitaires non répertoriées dans les pages spéciales comme la page d'Accueil
  • Des pages dont le nom semble erroné, comprenant des caractères inhabituels, telles que !'ean

Nous voulions d'abord utiliser le librairie spaCy de Python. Celle-ci permet d'identifier un ensemble de caractères comme étant soit une date, un lieu, une personne, etc, etc. Cependant après plusieurs tests, cette librairie présentait quelques failles concernant les dates et les personnes et nous préférions éviter de potentiels erreurs afin d'être sûr des pages qui seront modifiées par le bot. Nous avons donc choisi de baser la recherche d'entité sur les balises Wikidata générées par un autre autre bot.

Enfin concernant le résultat en eux-même, vous pouvez voir sur cette page un identifiant qui a été ajouté par le bot. De plus, le temps de traitement d'une page est estimée à environ 0.4 secondes mais ce temps peut varier en fonction des requêtes lancées (si la page possède déjà un identifiant ou ne répond pas aux critères afin d'en ajouter, la deuxième requête sera éviter et le temps d’exécution sur cette page sera réduit).

(Nous ajouterons plus d'informations lorsque le bot aura été lancée complètement)

Possibles améliorations futures

  • Parcourir toutes les pages de Wikipast afin de repérer lesquelles nécessitent un identifiant n'est pas non plus une solution optimale : on peut imaginer que lors de la création d'une page, le bot sera automatiquement appelé afin de générer l'identifiant approprié ou du moins que les pages dont l'identifiant manque seront regroupées sur une page dédiée, ce qui évitera de devoir itérer aléatoirement comme nous le faisons maintenant.
  • Générer des identifiants avec une hiérarchie : ceci n'était pas possible car pour l'instant, il existe peu voir pas de catégories/hiérarchies pour les différentes pages.
  • Elargir les "critères d'identification" afin que plus de pages puissent recevoir un identifiant : cela passerait par une vérification des pages afin d'attester de leur véracité pour ensuite pouvoir leur attribuer un identifiant.