« DisambiguationBot » : différence entre les versions

De Wikipast
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Ligne 111 : Ligne 111 :
* Utiliser sinon un vrai système de base de données pour stocker localement Wikipast.
* Utiliser sinon un vrai système de base de données pour stocker localement Wikipast.
* Exécuter la recherche et l'analyse sur plusieurs threads.
* Exécuter la recherche et l'analyse sur plusieurs threads.
== Code ==
Le code est disponsible sur Github [https://github.com/jheiniger/DisambiguationBot]

Version du 25 mai 2021 à 19:59

Le DisambiguationBot génére des pages homonymie des personnes sur Wikipast.

Résumé des fonctionnalités

Le bot a pour but de chercher des désambiguations dans les titres des toutes les pages, mais seulement les pages qui sont identifiées comme une page d’une personne sont finalement prises en considération. Ensuite, le bot crée pour chaque désambiguation une page d’homonymie.

Description technique

Dépôt GitHub

Recherche des homonymies

Après tous titres des pages Wikipast sont récupérer, ils sont traités de sorte que :

  • Ils sont écrits en lettres minuscules
  • Ils ne contiennent pas de mots entre parenthèses
  • Ils ne contiennent que des lettres, ils ne contiennent ni des nombres ni des symboles
  • Ils ne contiennent que des mots de deux lettres au moins

Ex. ‘ (en) Alfonso Rodríguez G. from Ceballos’ -> ‘alfonso rodríguez from ceballos’
Ex. ‘ 24 Préludes. Violoncelle, piano. Op. 47 (Auerbach) ’ -> ‘préludes violoncelle piano op’

Pour trouver les homonymies seuls les premier et dernier mots des titres sont comparés (en supposant que les titres sont des noms et le premier mot est le prénom, le dernier mot est le nom de famille). Aussi, les titres qui se composent simplement d’un mot sont comparés car il existe beaucoup des pages de l’annuaire avec juste un seul nom.

Ex. ‘Alfred Martin’ -> ‘ alfred martin
‘Alfred Henri Martin’ -> ‘ alfred henri martin
‘Alfred Martin (19f0bfa)’ -> ‘ alfred martin

Identification des biographies

Après la recherche des homonymies, chaque page homonyme est lue pour en extraire les informations suivantes :

  • année de naissance avec le mot-clé Naissance
  • année de décès avec le mot-clé Décès
  • fonctions avec les mots-clés Nomination et Election
  • description Wikidata en anglais ou français lorsque l'identifiant correspondant est présent (généralement ajouté par le bot Wikidataficator)

La recherche des mots-clés essaie d'accepter un maximum de syntaxes, par exemple Election accepte l'élection de quelqu'un « en tant que », « comme » et « au poste de ». Néanmoins, les descriptions Wikidata fournissent l'essentiel des informations car elles sont souvent plus générales qu'une information sur une élection ou une nomination.

Identification des pages d'annuaires

Dans le cas de recherche de personne provenant d'annuaires, cette méthode n'est plus appropriée. En effet les informations concernant la naissance, la mort de l'entité ne sont pas contenues dans cette page homonyme. De plus les mots-clés Nomination et Election ne fonctionnent pas non plus et il n'existe pas de lien Wikidata créé.

Chaque pages extraites des annuaires sont construites sous une forme fixe, ces pages ayant été créées par des bots. Il y a eu six bots distincts créant chacun des milliers de pages et ayant une syntaxe différente. Trois syntaxes ont été extraites et ont permis la détection de page correspondant à une personne. Seule l'information suivante a été retenue :

  • fonction

En effet la date indiquée correspond seulement à celle où la personne à été enregistrée dans l'annuaire, ce qui n'apporte pas une information pertinente. De plus, l'adresse n'a pas non plus été retenue car toutes les entités proviennent de l'annuaire de Paris et leur rue ne nous paraissaient pas pertinentes.

Par exemple le bot BotBottin3 a choisi la nomenclature suivante :

* [[year]] / [[Paris]], [[street_clean]] number. Mention de [[name]] avec la catégorie [[job]] [url]

Ce qui a permis de trouver le travail de l'entité.

Création des pages d'homonymie

S'il y a au moins une information récupérée, alors on considère que la page en question correspond à une personne. S'il y a au moins deux personnes identifiées par groupe d'homonymie, alors on peut créer une page pour ce groupe. 62 179 groupes d'homonymes correspondent à ces critères.

Les page d'homonymie résultantes ressemblent à ce qui est visible sur Wikipédia, par exemple avec la page Barry Barnes (disambiguation) :

[[Barry Barnes (disambiguation)|Barry Barnes]] peut désigner :

* [[Barry K. Barnes]] (1906 – 1965), acteur britannique
* [[Barry Barnes]], basketball coach

Il arrive souvent que les pages citées correspondent à la même personne, par exemple pour André Masson (disambiguation). Le bot ne fusionne pas ces pages, mais il est facile pour un utilisateur de remarquer les similitudes.

[[André Masson (disambiguation)|André Masson]] peut désigner :

* [[André Masson]] (1896 – 1987), peintre français
* [[André Masson (3b24eb9)]], peintre français
* [[André Masson (44b9c7b)]], peintre français
* [[André Masson (6df93be)]], peintre français
* [[André Masson (d8fb9d8)]], économiste français

Pour les entrées provenant d'annuaires, le résultat est semblable, par exemple avec Evans (disambiguation) :

[[Evans (disambiguation)|Evans]] peut désigner :

* [[Evans (Dr John)]], dentifrices à Paris
* [[Evans (Thomas W.) (C. *)]], propriétaire à Paris
* [[Evans]], dentiste à Paris
* [[R. T. Evans]], Welsh Congregational minister and author
* [[Evans - tailleur (Richelieu)]], tailleur à Paris
* [[Evans - meubles (quai Saint-Michel)]], meubles à Paris
* [[Evans - ébéniste (quai de Béthune)]], ébéniste à Paris

Plus d'exemples sont visibles en recherchant le mot « disambiguation ». La page d'homonymie avec le plus d'entrées est Martin (disambiguation) avec 1 488 homonymes.

Discusion critique des performances

Le traitement des titres ne dure que des 20 s pour les 1'651'335 entrées sur Wikipast. La recherche des homonymies a besoin d'environ 4 min et trouve 148'441 groupes d'homonymes.

Concernant la lecture des pages, effectuer une requête à Wikipast pour chaque page, même en parallèle, est très long (~ 400 ms par groupe d'homonymes en série, ~ 30 ms en parallèle). De plus, Wikipast renvoie des erreurs HTTP 500 lorsqu'il reçoit trop de requêtes, probablement à cause d'un bug dans Mediawiki.

Pour ces raisons, le bot utilise un dump de Wikipast en JSON. Comme le fichier est très lourd (2 Go) et qu'il est donc difficile de travailler dessus, le bot réécrit le fichier avec une page au format JSON par ligne, permettant ainsi une lecture individuelle des pages en accès direct (random access). La recherche d'une page se fait par dichotomie après un tri des pages (les pages sont déjà triées mais pas dans le même ordre que celui défini par Python). Il faut une vingtaine d'itérations (logarithme binaire du nombre total de pages, soit environ 106) pour trouver une page, dont les dix premières sont mises en cache car les requêtes à ces pages seront probablement redondantes.

Une optimisation supplémentaire permet un arrêt prématuré lorsqu'au moins toutes sauf une page d'un groupe ne correspondent pas à des personnes ; la dernière page n'est alors pas analysée. Le temps de recherche étant très faible, l'essentiel du temps d'éxécution du bot est utilisé pour les requêtes à Wikidata, qui sont effectuées en parallèle avec une limite du nombre de connexions car le quota de Wikidata par adresse IP est assez faible.

La durée finale de recherche est de ~ 3 ms par groupe d'homonyme (150 000 entrées). La durée pour la création de chaque page est de ~ 20 ms en parallèle mais se fait sur un nombre plus faible d'entrées (60 000 entrées). Le temps total d'exécution est autour d'une demi-heure, ce qui est largement acceptable.

Parmi les améliorations possibles :

  • Prendre avantage du fait que la liste des groupes d'homonymes est elle même triée. Par exemple, l'utilisation d'un cache LRU lors de la recherche par dichotomie pourrait améliorer la vitesse de recherche.
  • Utiliser sinon un vrai système de base de données pour stocker localement Wikipast.
  • Exécuter la recherche et l'analyse sur plusieurs threads.

Code

Le code est disponsible sur Github [1]