« LinkBot2 » : différence entre les versions
(14 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 9 : | Ligne 9 : | ||
==Description technique== | ==Description technique== | ||
Le bot consiste de deux modules | Le bot consiste de deux modules, exécutés consécutivement, qui accomplissent deux fonctionnalités distinctes: | ||
# Compléter les liens entre les pages en créant les | # Compléter les liens entre les pages en créant les entrées réciproques manquantes pour chaque entrée d'une datafication biographique | ||
# | # Diviser les pages trop longues en sous-pages, qui sont classées par décennie | ||
===Compléter les liens=== | ===Compléter les liens=== | ||
Le bot utilise un dump de wikipast en local, il faut donc avoir une archive correspondante pour lancer cette partie du bot. Il effectue une recherche sur ces différentes pages en local | Le bot utilise un dump de wikipast en local, il faut donc avoir une archive correspondante pour lancer cette partie du bot. Il effectue une recherche sur ces différentes pages en local pour observer quelles entrées doivent être mises à jour et les pages qui doivent être créées. Le bot les créé ensuite sur le site wikipast et ajoute l'entrée sur la nouvelle page. Si la page existe déjà, le bot ajoute seulement l'entrée, si elle n'est pas déjà présente sur la page. | ||
pour observer quelles entrées doivent être mises à jour et les pages qui doivent être créées. Le bot les créé ensuite sur le site wikipast et ajoute l'entrée sur la nouvelle page. Si la page | |||
existe déjà, le bot ajoute seulement l'entrée, si elle n'est pas déjà présente sur la page. | |||
====Exemple de fonctionnement==== | ====Exemple de fonctionnement==== | ||
Prenons l'entrée suivante : | Prenons l'entrée suivante : | ||
Ligne 27 : | Ligne 25 : | ||
===Division en sous-pages=== | ===Division en sous-pages=== | ||
[[File:Exemple_naissance_linkbot2.PNG|thumb|La page [[Naissance]] après avoir été divisé]] | |||
[[File:Exemple_naissance_linkbot2_2.PNG|thumb|[[Naissance 1870-1879]]], une des sous-pages de [[Naissance]]]] | |||
====Hypothèses==== | ====Hypothèses==== | ||
Le bot suppose que pour cette opération: | Le bot suppose que pour cette opération: | ||
*Toutes les entrées des | *Toutes les entrées des datafications biographiques commencent avec un <code>*</code> et sont suivies par une date et par un <code>/</code>. | ||
*Toutes les entrées se trouvent dans la même section du wikitext. | *Toutes les entrées se trouvent dans la même section du wikitext. | ||
*La date de chaque entrée d'une chronologie biographique <code>*</code> est dans le format <code>yyyy.mm.dd</code>, <code>yyyy.mm</code> ou bien <code>yyyy</code>. Les entrées qui ne suivent pas se format ne seront pas détectes et donc pas comptées. | *La date de chaque entrée d'une chronologie biographique <code>*</code> est dans le format <code>yyyy.mm.dd</code>, <code>yyyy.mm</code> ou bien <code>yyyy</code>. Les entrées qui ne suivent pas se format ne seront pas détectes et donc pas comptées. | ||
*Le | *Le flag <code>LINKBOT2_SUBPAGE_FLAG = "<nowiki><!--Automatically generated LinkBot2 subpage--></nowiki>"</code> et <code>LINKBOT2_MOTHERPAGE_FLAG = "<nowiki><!--Automatically generated LinkBot2 references to subpages--></nowiki>"</code> ne sont utilisés par aucun autre bot et n'ont pas été modifiées ou supprimées par les autres bots et utilisateurs et utilisatrices humaines sur le wiki. | ||
====Condition sur la division==== | ====Condition sur la division==== | ||
La division d'une page en sous-pages est | La division d'une page en sous-pages est effectuée si: | ||
*La page | *La page considérée n'est pas déjà une sous-page. | ||
*Le titre de la page n'est pas une date | *Le titre de la page n'est pas une date (pour éviter de diviser les pages comme [[1997]] p.ex.) | ||
*La taille de la page dépasse un certain taux (par défaut 30kB). | *Les deux conditions suivantes sont simultanément vraies: | ||
* | **La taille de la page dépasse un certain taux (par défaut 30kB). | ||
**Le nombre d'entrées dans une datafication biographique (caractérisées par <code>*</code>, suivi par une date entre des <code>[ ]</code>) dépasse un certain nombre (par défaut 150 entrées). | |||
====Traitement des données==== | ====Traitement des données==== | ||
Notez d’abord que cette partie du bot ne travaille par sur l'archive dump mais retire directement toutes les informations dont il a besoin directement de | Notez d’abord que cette partie du bot ne travaille par sur l'archive dump mais retire directement toutes les informations dont il a besoin directement de l'api du wiki. | ||
# Les candidats pour la division en sous-pages sont | # Les candidats pour la division en sous-pages sont obtenus en effectuant une query sur les pages avec un taille minimale spécifiée (par défaut 30kB). Ceci est réalisé en utilisant le paramètre "apminsize". | ||
# Les | # Les pages dont le titre est une date sont exclues du lot. | ||
# | # Le nombre d'entrées de datafications biographiques est déterminé et seulement les pages avec un minimum d'entrées et qui ne sont pas des sous-pages (identifiées grâce à un "tag") sont considérées pour la suite du processus. | ||
# Les pages restantes | # Les pages restantes sont divisées en sous-pages. | ||
## Les entrées de | ## Les entrées de datafications biographiques sont triées et regroupées par décennie. | ||
## Les sous-pages contenant les entrées correspondantes sont | ## Les sous-pages contenant les entrées correspondantes sont créées et marquées avec le tag <code><nowiki><!--Automatically generated LinkBot2 subpage--></nowiki></code>. De plus un lien vers la "page mère" (la super-page qui est divisée) est créé sur les sous-pages. | ||
##Si jamais le tableau des sous-pages sur la "page mère" existe déjà il est | ##Si jamais le tableau des sous-pages sur la "page-mère" existe déjà, il est supprimé. Ceci se fait en écrasant tout le contenu entre les deux tags <code><nowiki><!--Automatically generated LinkBot2 references to subpages--></nowiki> </code> | ||
## La "page mère" obtient un tableau pointant vers ses propres sous-pages. Le contenu | ## La "page-mère" obtient un tableau pointant vers ses propres sous-pages. Le contenu originel de la page n'est pas supprimé. | ||
====Exemple de fonctionnement==== | ====Exemple de fonctionnement==== | ||
Un exemple de fonctionnement | Un exemple de fonctionnement: le résultat de la division en sous-pages pour la page [[Naissance]] qui remplit les deux critères par défaut (plus que 30kB en taille et plus que 150 entrées dans la datafication biographique) peut être trouvé dans les images à droite. | ||
==Discussion== | ==Discussion== | ||
Ligne 64 : | Ligne 62 : | ||
===Complétion des liens=== | ===Complétion des liens=== | ||
====Performance==== | ====Performance==== | ||
Lors d'un test en lançant le bot seulement sur les dix premières pages du dump utilisé, le bot a effectué la complétion des liens en approximativement 5-6 sec. | Lors d'un test, réalisé en lançant le bot seulement sur les dix premières pages du dump utilisé, le bot a effectué la complétion des liens en approximativement 5-6 sec. | ||
Ce n'est pas très optimisé, mais cela parait difficile à améliorer. En effet, disons qu'il y a "m" nombre d’hyper-mots dans chaque entrée et qu'il y a en tout "n" entrées : | Ce n'est pas très optimisé, mais cela parait difficile à améliorer. En effet, disons qu'il y a "m" nombre d’hyper-mots dans chaque entrée et qu'il y a en tout "n" entrées : | ||
* Alors le temps d’exécution du bot sera en O(m*n) pour chaque page, donc s'il y a "k" pages l’exécution totale du bot sera donc en O(k*m*n) | * Alors le temps d’exécution du bot sera en O(m*n) pour chaque page, donc s'il y a "k" pages l’exécution totale du bot sera donc en O(k*m*n) | ||
C'est un ordre de grandeur assez élevé, | C'est un ordre de grandeur assez élevé, sachant que wikipast a plus d'un million de pages maintenant. | ||
=====Idées d'améliorations===== | =====Idées d'améliorations===== | ||
*La partie de complétion de liens utilise un dump du site pour parcourir toutes les pages de manière plus rapide et en générant moins de trafic avec wikipast. Malgré tout, cela est plus compliqué à l'utilisation et nécessite un travail en amont pour obtenir le dump. L'utilisation du dump empêche aussi de lancer le bot deux fois de suite, car il ne sera pas au courant des modifications qu'il a faites si on utilise deux fois le même dump. Il faudrait créer un dump à chaque mise à jour de wikipast, ce qui n'est pas optimal. Il faudrait donc peut-être envisager de modifier cette partie pour tenir le dump à jour, ou alors directement faire les queries sur wikipast et ne plus utiliser de dump. | |||
===Division en sous-pages=== | ===Division en sous-pages=== | ||
====Performance==== | ====Performance==== | ||
La query qui cherche les pages plus | La query qui cherche les pages plus grandes qu'une certaine taille prend seulement quelques secondes à exécuter pour une taille limite de 30kB, et retourne environ 300 candidats (selon l'état de wikipast au 25.05.2021). La triage de ces 300 candidats pour la division prend moins d'une minute (selon l'état de wikipast au 25.05.2021). Ce triage trouve ainsi environ 150 candidats pour la division. La créations des sous-pages pour ces 150 candidats dure 20 minutes. | ||
=====Idées d'améliorations===== | =====Idées d'améliorations===== | ||
*Comprendre différents formats de dates, et éventuellement modifier les dates des entrées pour les uniformiser/corriger. On pourrait aussi assurer que le [[LinkBot2]] tourne seulement après le [[FormatBot]] sur le wiki | *Comprendre différents formats de dates, et éventuellement modifier les dates des entrées pour les uniformiser/corriger. On pourrait aussi assurer que le [[LinkBot2]] tourne seulement après le [[FormatBot]] sur le wiki | ||
*Pour la page d'un mot qui a été découpée en décennies, séparer la page qui comprend les liens vers les sous-pages de la page qui comprend toutes les entrées. Par exemple, pour [[Naissance]], séparer la page "Naissance" qui recenserait les liens (Naissance 1870-1879, Naissance 1880-1889, ...) de la page "Naissance (archive)" qui comprend toutes les entrées de datafications biographiques qui utilisent | *Pour la page d'un mot qui a été découpée en décennies, séparer la page qui comprend les liens vers les sous-pages de la page qui comprend toutes les entrées. Par exemple, pour [[Naissance]], séparer la page "Naissance" qui recenserait les liens (Naissance 1870-1879, Naissance 1880-1889, ...) de la page "Naissance (archive)" qui comprend toutes les entrées de datafications biographiques qui utilisent l’hypermot "Naissance". | ||
*Diviser les pages en sous-pages d'une façon dynamique, selon la distribution des dates, en utilisant des divisions en siècles si jamais la division en décennies est trop | *Diviser les pages en sous-pages d'une façon dynamique, selon la distribution des dates, en utilisant des divisions en siècles si jamais la division en décennies est superflue (en cas d'entrées trop peu nombreuses par exemple). | ||
*Diviser les pages en sous-pages selon d'autres critères | *Diviser les pages en sous-pages selon d'autres critères, comme par exemple le lieu. | ||
*[[LinkBot2]] ne supprime pas les sous-pages qui ont déjà été | *[[LinkBot2]] ne supprime pas les sous-pages qui ont déjà été créées lors de la dernière exécution. Ceci fonctionne seulement puisqu'on suppose à la fois que la taille des pages croît avec le temps et que le critère de division est fixe. Ceci devrait être changé si jamais on veut changer la façon de diviser en sous-pages, car sinon on finirait avec des pages abandonnées qui ne sont plus référencées par la page-mère, selon le code actuel. On pourrait supprimer toute les sous-pages grâce au "tag" place par le bot. | ||
*On pourrait modifier [[DisambiguationBot]] d'une façon qu'il regroupe les sous- | *On pourrait modifier [[DisambiguationBot]] d'une façon à ce qu'il regroupe les sous-pages crées par [[LinkBot2]] pour améliorer la lisibilité de la désambiguïsation. | ||
*Ajuster le critère de selection des candidats pour éviter un découpage d'une page qui contient seulement des entées qui datent toute de la même décennie. | |||
*Résoudre le problème que le conflit avec le [[ArtBot]] qui a déjà ça propre structure temporelle pour éviter le découpage de pages comme [[Ventes d'œuvres le 1690.02.20]] (le tableau de sous pages a été écrasé par ArtBot faut donc faire tourner [[LinkBot2]] après [[ArtBot]]). Exemple de la sous-page crée dans ce cas là [[Ventes d'œuvres le 1690.02.20 1670-1679]]. | |||
==Code== | ==Code== | ||
Le code est disponible sur l'instance GitLab de l'EPFL. [https://gitlab.epfl.ch/digital_humanities_wikipast_linkbot2/linkbot2] | Le code est disponible sur l'instance GitLab de l'EPFL. [https://gitlab.epfl.ch/digital_humanities_wikipast_linkbot2/linkbot2] |
Dernière version du 1 juin 2021 à 12:13
Résumé des fonctionnalités
LinkBot2 a comme but d'augmenter le nombre de liens entre les datafications biographiques sur Wikipast. Ceci est un but important afin de pouvoir augmenter la visibilité de Wikipast sur les moteurs de recherche (SEO).
Le bot a deux fonctionnalités principales:
- Faire en sorte que sur chaque page de datafication biographique, chaque lien pointe sur une page qui, elle, pointe sur cette page en retour. Pour cela, le bot regarde dans un premier temps si la page pointée existe, et si ce n'est pas le cas, la créé. Puis il vérifie si la ligne qui comprend le lien est présente sur la page pointée. Si ce n'est pas le cas, il copie cette ligne et la colle dans la page pointée. Ce bout de texte comprend un lien qui pointe vers la page originale. Pour cette partie du bot, le code se base sur PageUpdaterBot et a été amélioré.
- Diviser les pages comprenant un grand nombre d'entrées en tranches temporelles (décennies), afin d'éviter d'avoir des pages qui soient trop longues, et ainsi améliorer l'expérience d'utilisation pour un humain qui utilise le wiki.
Description technique
Le bot consiste de deux modules, exécutés consécutivement, qui accomplissent deux fonctionnalités distinctes:
- Compléter les liens entre les pages en créant les entrées réciproques manquantes pour chaque entrée d'une datafication biographique
- Diviser les pages trop longues en sous-pages, qui sont classées par décennie
Compléter les liens
Le bot utilise un dump de wikipast en local, il faut donc avoir une archive correspondante pour lancer cette partie du bot. Il effectue une recherche sur ces différentes pages en local pour observer quelles entrées doivent être mises à jour et les pages qui doivent être créées. Le bot les créé ensuite sur le site wikipast et ajoute l'entrée sur la nouvelle page. Si la page existe déjà, le bot ajoute seulement l'entrée, si elle n'est pas déjà présente sur la page.
Exemple de fonctionnement
Prenons l'entrée suivante :
- 2032 / Lune. Présentation du moonwalk sur la Lune par Michael Jackson.
Ici, la page "2032" n'existe pas encore, le bot va donc créer cette page et y ajouter l'entrée complète. Mais le bot va aussi modifier les pages : "Lune", "Présentation", "Michael Jackson", pour y ajouter l'entrée si elle n'y est pas déjà présente.
Division en sous-pages
Hypothèses
Le bot suppose que pour cette opération:
- Toutes les entrées des datafications biographiques commencent avec un
*
et sont suivies par une date et par un/
. - Toutes les entrées se trouvent dans la même section du wikitext.
- La date de chaque entrée d'une chronologie biographique
*
est dans le formatyyyy.mm.dd
,yyyy.mm
ou bienyyyy
. Les entrées qui ne suivent pas se format ne seront pas détectes et donc pas comptées. - Le flag
LINKBOT2_SUBPAGE_FLAG = "<!--Automatically generated LinkBot2 subpage-->"
etLINKBOT2_MOTHERPAGE_FLAG = "<!--Automatically generated LinkBot2 references to subpages-->"
ne sont utilisés par aucun autre bot et n'ont pas été modifiées ou supprimées par les autres bots et utilisateurs et utilisatrices humaines sur le wiki.
Condition sur la division
La division d'une page en sous-pages est effectuée si:
- La page considérée n'est pas déjà une sous-page.
- Le titre de la page n'est pas une date (pour éviter de diviser les pages comme 1997 p.ex.)
- Les deux conditions suivantes sont simultanément vraies:
- La taille de la page dépasse un certain taux (par défaut 30kB).
- Le nombre d'entrées dans une datafication biographique (caractérisées par
*
, suivi par une date entre des[ ]
) dépasse un certain nombre (par défaut 150 entrées).
Traitement des données
Notez d’abord que cette partie du bot ne travaille par sur l'archive dump mais retire directement toutes les informations dont il a besoin directement de l'api du wiki.
- Les candidats pour la division en sous-pages sont obtenus en effectuant une query sur les pages avec un taille minimale spécifiée (par défaut 30kB). Ceci est réalisé en utilisant le paramètre "apminsize".
- Les pages dont le titre est une date sont exclues du lot.
- Le nombre d'entrées de datafications biographiques est déterminé et seulement les pages avec un minimum d'entrées et qui ne sont pas des sous-pages (identifiées grâce à un "tag") sont considérées pour la suite du processus.
- Les pages restantes sont divisées en sous-pages.
- Les entrées de datafications biographiques sont triées et regroupées par décennie.
- Les sous-pages contenant les entrées correspondantes sont créées et marquées avec le tag
<!--Automatically generated LinkBot2 subpage-->
. De plus un lien vers la "page mère" (la super-page qui est divisée) est créé sur les sous-pages. - Si jamais le tableau des sous-pages sur la "page-mère" existe déjà, il est supprimé. Ceci se fait en écrasant tout le contenu entre les deux tags
<!--Automatically generated LinkBot2 references to subpages-->
- La "page-mère" obtient un tableau pointant vers ses propres sous-pages. Le contenu originel de la page n'est pas supprimé.
Exemple de fonctionnement
Un exemple de fonctionnement: le résultat de la division en sous-pages pour la page Naissance qui remplit les deux critères par défaut (plus que 30kB en taille et plus que 150 entrées dans la datafication biographique) peut être trouvé dans les images à droite.
Discussion
Complétion des liens
Performance
Lors d'un test, réalisé en lançant le bot seulement sur les dix premières pages du dump utilisé, le bot a effectué la complétion des liens en approximativement 5-6 sec. Ce n'est pas très optimisé, mais cela parait difficile à améliorer. En effet, disons qu'il y a "m" nombre d’hyper-mots dans chaque entrée et qu'il y a en tout "n" entrées :
- Alors le temps d’exécution du bot sera en O(m*n) pour chaque page, donc s'il y a "k" pages l’exécution totale du bot sera donc en O(k*m*n)
C'est un ordre de grandeur assez élevé, sachant que wikipast a plus d'un million de pages maintenant.
Idées d'améliorations
- La partie de complétion de liens utilise un dump du site pour parcourir toutes les pages de manière plus rapide et en générant moins de trafic avec wikipast. Malgré tout, cela est plus compliqué à l'utilisation et nécessite un travail en amont pour obtenir le dump. L'utilisation du dump empêche aussi de lancer le bot deux fois de suite, car il ne sera pas au courant des modifications qu'il a faites si on utilise deux fois le même dump. Il faudrait créer un dump à chaque mise à jour de wikipast, ce qui n'est pas optimal. Il faudrait donc peut-être envisager de modifier cette partie pour tenir le dump à jour, ou alors directement faire les queries sur wikipast et ne plus utiliser de dump.
Division en sous-pages
Performance
La query qui cherche les pages plus grandes qu'une certaine taille prend seulement quelques secondes à exécuter pour une taille limite de 30kB, et retourne environ 300 candidats (selon l'état de wikipast au 25.05.2021). La triage de ces 300 candidats pour la division prend moins d'une minute (selon l'état de wikipast au 25.05.2021). Ce triage trouve ainsi environ 150 candidats pour la division. La créations des sous-pages pour ces 150 candidats dure 20 minutes.
Idées d'améliorations
- Comprendre différents formats de dates, et éventuellement modifier les dates des entrées pour les uniformiser/corriger. On pourrait aussi assurer que le LinkBot2 tourne seulement après le FormatBot sur le wiki
- Pour la page d'un mot qui a été découpée en décennies, séparer la page qui comprend les liens vers les sous-pages de la page qui comprend toutes les entrées. Par exemple, pour Naissance, séparer la page "Naissance" qui recenserait les liens (Naissance 1870-1879, Naissance 1880-1889, ...) de la page "Naissance (archive)" qui comprend toutes les entrées de datafications biographiques qui utilisent l’hypermot "Naissance".
- Diviser les pages en sous-pages d'une façon dynamique, selon la distribution des dates, en utilisant des divisions en siècles si jamais la division en décennies est superflue (en cas d'entrées trop peu nombreuses par exemple).
- Diviser les pages en sous-pages selon d'autres critères, comme par exemple le lieu.
- LinkBot2 ne supprime pas les sous-pages qui ont déjà été créées lors de la dernière exécution. Ceci fonctionne seulement puisqu'on suppose à la fois que la taille des pages croît avec le temps et que le critère de division est fixe. Ceci devrait être changé si jamais on veut changer la façon de diviser en sous-pages, car sinon on finirait avec des pages abandonnées qui ne sont plus référencées par la page-mère, selon le code actuel. On pourrait supprimer toute les sous-pages grâce au "tag" place par le bot.
- On pourrait modifier DisambiguationBot d'une façon à ce qu'il regroupe les sous-pages crées par LinkBot2 pour améliorer la lisibilité de la désambiguïsation.
- Ajuster le critère de selection des candidats pour éviter un découpage d'une page qui contient seulement des entées qui datent toute de la même décennie.
- Résoudre le problème que le conflit avec le ArtBot qui a déjà ça propre structure temporelle pour éviter le découpage de pages comme Ventes d'œuvres le 1690.02.20 (le tableau de sous pages a été écrasé par ArtBot faut donc faire tourner LinkBot2 après ArtBot). Exemple de la sous-page crée dans ce cas là Ventes d'œuvres le 1690.02.20 1670-1679.
Code
Le code est disponible sur l'instance GitLab de l'EPFL. [1]