Les coulisses de la Dicothèque : rendre la recherche plus rapide que l’éclair !

Je travaille sur la Dicothèque depuis plus de 9 mois, selon mes disponibilités et mes envies du moment. Avec l’anniversaire du Wiktionnaire francophone qui approche (c’est le 22 mars), je me suis dit que ce serait cool d’avoir enfin une version utilisable par le grand public (et pas juste un truc de niche pour les wikimédien·nes).

Sauf que la Dicothèque, c’est un tout petit projet, qui peut faire beaucoup, mais qui doit le faire bien. Quand on veut proposer une interface pour consulter et comparer des dizaines de dictionnaires, les wikimédien·nes s’accommodent bien de plusieurs secondes de chargement (on a l’habitude :P) ; le grand public, beaucoup moins.

Alors cette semaine, j’ai rendu la recherche dans la Dicothèque plus rapide que l’éclair. Et dans ce billet de blog, je vais vous expliquer comment j’ai fait !

La Dicothèque, c’est quoi ?

La Dicothèque, pour faire simple, c’est un site web qui permet de comparer entre-elles les définitions des dictionnaires qui sont disponibles sur Wikisource, par exemple pour voir comment les sens évoluent avec le temps. Ce que les personnes qui passent beaucoup de temps à étudier les langues appellent un « outil de recherche dans un corpus diachronique de dictionnaires ». Me demandez pas ce que veut dire diachronique : j’oublie tout le temps !

Si ça vous intéresse, il y a cette vidéo de l’intervention « Une interface pour lire tous les dictionnaires dans Wikisource ? » de Lyokoï à la Wikiconvention francophone 2022, où il présente son envie d’avoir à sa disposition un tel outil :

Et, oui, cette intervention est la raison pour laquelle la Dicothèque existe aujourd’hui.

Pour faire simple, sur la Dicothèque, vous avez une trentaine de dicos disponibles, et en entrant un mot dans la barre de recherche, le site vous affiche côte à côte les définitions dudit mot dans chaque dictionnaire où il l’a trouvé (tous les dicos n’ont pas le mot « abreuvoir », par exemple).

Capture d’écran scindée en quatre partie. Chaque partie donne le titre d’un dictionnaire, puis la définition du mot recherché que propose ce dictionnaire. Dans l’ordre, il y a le dictionnaire de Trévoux (1771), le Dictionnaire de l’administration française (1877), le Dictionnaire d’architecture civile et hydraulique (1755) et l’Encyclopédie de Diderot et d’Alembert (1751).
Capture d’écran d’une partie des résultats obtenus en cherchant « abreuvoir ».

Enfin, et puisque le temps que je peux dédier à la rédaction de ce billet est assez limité, vous pouvez m’écouter parler anglais pendant 15 minutes et présenter le premier prototype de la Dicothèque à la WikidataCon 2023 sur YouTube : https://www.youtube.com/live/21TODVE1PTo?t=22455.

Un peu de contexte technique

Jusqu’à ce week-end, la Dicothèque était réalisée intégralement en JavaScript, avec Vue.js plus exactement. Les raisons à ça sont très simples : quand ça tourne sur le navigateur, directement chez l’utilisateur, y a pas besoin de logiciel spécialisé à télécharger ou d’infrastructure à maintenir. De surcroît, avec MediaWiki (le logiciel qui fait tourner tous les wikis de la Fondation Wikimedia), d’autres utilisateur·ices peuvent utiliser nos scripts JavaScript ; et surtout, depuis quelques années, la Fondation met des moyens pour l’adoption de Vue.js et de tout un ensemble de petits bouts de code qui permettent de « standardiser » pas mal de choses (si quelqu’un qui bosse sur Codex me lit un jour : cœur sur vous !).

Tout ça c’est bien sympa, mais c’est quand même assez limité : MediaWiki restreint ce qu’on peut faire avec les scripts (et c’est normal, pour diminuer les risques) ; et le problème des mises à jour du contenu se pose (en particulier si la Dicothèque est amenée à être utilisée sur une autre Wikisource que celle en français).

En plus, la demande à l’issue de la WikidataCon 2023 était claire : les autres éditions linguistiques de Wikisource voulaient elles aussi leur Dicothèque !

Bref, c’est vite devenu un casse-tête et ça m’a un peu submergé.

Jusqu’au jour fatidique de l’an de grâce 2024 où j’ai eu le courage d’entamer le changement d’architecture de la Dicothèque : désormais, le gros du travail sera fait par un serveur, toutes les données de toutes les Wikisources y seront centralisées, et l’interface servira juste à afficher ce que le serveur aura mouliné.

Et, oh boy!, ça a foutu un sacré bordel !

Mais ça a marché ! :D

Premier tour de magie : faire (presque) disparaître le temps de chargement au lancement !

Comme tout bon informaticien, je suis un flemmard — comprendre : si l’ordinateur peut faire quelque chose à ma place, il a grand intérêt à le faire ! Et que ça saute !

C’est pour ça que la liste des dictionnaires disponibles dans la Dicothèque n’en est pas vraiment une.

DICTIONARIES = [
  'Q19164492',
  'Q19164883',
  'Q60379293',
]

Hein ?! Mais c’est quoi ces noms chelous ? Ils sont où les titres ? Et les noms des auteurs ? Et les dates ?! — Vous, probablement, si vous n’avez pas déjà pris peur en voyant ces cinq lignes de code.

Pas de panique ! Tout ce dont vous me parlez est bien là. Mais pour le voir, il faut rajouter https://wikidata.org/wiki/ avant le Q et sa suite de chiffres.

Par exemple : https://wikidata.org/wiki/Q19164883 vous envoie vers une drôle de page un peu moche d’un site qui s’appelle Wikidata, et sur lequel il y a toutes les infos dont on a besoin pour faire fonctionner la Dicothèque : titre, auteur, langue, et même le lien vers la page sur la Wikisource francophone !

Ce que je viens de faire ici, c’est ce que la Dicothèque « 2023 » faisait pour chaque dictionnaire quand vous la lanciez. Elle allait récupérer elle-même les infos dont elle avait besoin.

Vous imaginez bien que pour 1, 2, 3 dicos, ça passe encore. Mais pour 29, ça commence à prendre pas mal de temps !

Sans compter le fait que si vous étiez sur une connexion à faible débit ou à volume limité, ça vous faisait télécharger pas mal de choses juste pour conserver quelques informations.

Bref. Vous vous rappelez de mon nouveau paradigme ? Le serveur qui fait le gros du travail.

Désormais, quand vous ouvrez la Dicothèque « 2024 » (oui mes noms sont pourris), elle se contente d’une seule requête au serveur. Imaginez : vous entrez dans un restaurant, un serveur vous installe à une table et vous donne la carte du restaurant. Et bien là, c’est à peu près la même chose qui se passe : en lançant la Dicothèque, elle demandera la liste des dictionnaires au serveur.

Mais, et le serveur alors, il connaît comment les informations de chaque dictionnaire ? — Quelqu’un, parce qu’il me fallait quelque chose pour faire une transition.

C’est là que c’est drôle (je trouve) : le serveur fait exactement ce que la Dicothèque 2023 faisait. Il demande à Wikidata les informations pour chaque dictionnaire.

MAIS ! Il ne le fait qu’une seule fois (on ignore la nécessité de mettre à jour occasionnellement les données pour le moment), puis il stocke ces informations dans sa base de données. Et envoie ensuite ces données à n’importe quelle Dicothèque qui les réclame.

Pour reprendre mon analogie avec un restaurant, imaginons que celui-ci est franchisé : à chaque fois qu’une cliente arrive en salle, le serveur ne va pas appeler la cheffe de salle pour qu’elle-même appelle la franchise pour leur demander la carte ! Non : la cheffe de salle a déjà appelé la franchise la veille, qui leur a fourni plusieurs exemplaires de la carte, que le serveur n’a plus qu’à aller chercher au comptoir pour donner à la cliente !

Et voilà comment la Dicothèque 2024 charge presque instantanément, au lieu d’avoir besoin de plusieurs secondes comme la Dicothèque 2023 !

Deuxième coup de magie : tous les résultats, d’un coup !

Si vous faites partie des rares personnes à avoir utilisé la Dicothèque 2023, vous vous êtes probablement rendu compte qu’au moment où vous pensiez avoir obtenu tous les résultats, d’autres apparaissaient encore !

La raison à ça, c’est que la Dicothèque faisait là aussi des requêtes pour chaque dictionnaire, via l’API de MediaWiki, pour demander si une page dont le titre était le mot recherché existait. Je trouvais ça assez ingénieux, malgré les excentricités de ladite API. Et ça avait le principal avantage de se mettre à jour en temps réel : vous trouviez une erreur (une page qui apparaît vide ? une page mal-orthographiée ?), vous la corrigiez, et en relançant la requête, c’était réglé !

Mais cet avantage contrebalançait-il tous les inconvénients ? Faut dire que la liste est longue : beaucoup de requêtes effectuées, dont une majorité reviennent sans résultats (car tous les dicos n’ont pas tous les mots !) et donc forte sensibilité aux aléas des connexions ; tributaire des restrictions sur l’API de MediaWiki ; une situation qui empirera au fur et à mesure que de nouveaux dictionnaires seront ajoutés…

Bref. Ça fonctionne très bien sur le papier et pour prototyper, mais là, il nous faut quelque chose de plus robuste.

Donnons-nous comme restriction : l’obligation, pour la Dicothèque 2024, de ne faire qu’une seule requête au serveur pour récupérer tous les résultats.

Et c’est là que le travail du serveur commence.

Pour tous les projets hébergés par la Fondation Wikimédia, il existe des « dumps », des exports des bases de données, en gros, qui sont accessibles sur ce site : https://dumps.wikimedia.org. Si ça vous tente, vous pouvez télécharger l’intégralité des pages de Wikipédia en français avec tout l’historique d’édition. Si, si. Mais ce qui nous intéresse nous, c’est un dump de la Wikisource francophone qui porte le doux nom de : frwikisource-20240301-all-titles-in-ns0.gz.

Ce dump contient un fichier texte avec la liste des noms de toutes les pages qui sont dans l’espace principal (autrement dit, pour Wikisource : les bouquins qu’on peut lire, et leurs sections : chapitres, poèmes, etc.).

Ça donne quelque chose comme ceci :

Le_Lit_29
Le_Lit_clos
Le_Lit_de_Procuste
Le_Lit_de_mort
Le_Littoral_de_la_France
Le_Littoral_de_la_France/01
Le_Littoral_de_la_France/02
Le_Littoral_de_la_France/03
Le_Littoral_de_la_France/04
Le_Littré_de_la_Grand’Côte
Le_Littré_de_la_Grand’Côte/2e_éd.,_1903
Le_Littré_de_la_Grand’Côte/2e_éd.,_1903/Approbation
Le_Littré_de_la_Grand’Côte/2e_éd.,_1903/Avant-propos
Le_Littré_de_la_Grand’Côte/2e_éd.,_1903/Avertissement_de_l’éditeur
Le_Littré_de_la_Grand’Côte/2e_éd.,_1903/Index_alphabétique_-_A
Le_Littré_de_la_Grand’Côte/2e_éd.,_1903/À_la_mémoire
Le_Littré_de_la_Grand’Côte/3e_éd.,_1903
Le_Littré_de_la_Grand’Côte/3e_éd.,_1903/*Cataplame
Le_Littré_de_la_Grand’Côte/3e_éd.,_1903/Abader_(s’)
Le_Littré_de_la_Grand’Côte/3e_éd.,_1903/Abandon
Le_Littré_de_la_Grand’Côte/3e_éd.,_1903/Abat
Le_Littré_de_la_Grand’Côte/3e_éd.,_1903/Abat-joue
Le_Littré_de_la_Grand’Côte/3e_éd.,_1903/Abat-jour
Le_Littré_de_la_Grand’Côte/3e_éd.,_1903/Abatage

On remarque qu’on a bien toutes les pages de chaque dictionnaire (ici : le Littré de la Grand’Côte) !

Pour chaque ligne, je récupère donc la partie finale (Abandon, Abat, Abat-joue) qui correspond au mot que je pourrai rechercher, et je stocke dans la base de données de mon serveur des couples (dictionnaire, mot) pour peu que le titre de la page Wikisource du dictionnaire corresponde au reste de la ligne.

Après avoir laissé mouliner le serveur pendant 10 bonnes minutes, le résultat de la moisson est tombé : 97 995 couples !

Eh oui ! Un des avantages de cette méthode, c’est que je sais désormais combien de « mots » sont disponibles dans la Dicothèque. Ce qui appelle, je pense, un autre billet de blog où l’on va analyser plus en détails ces différentes statistiques — stay tuned!

Un petit peu de jus de cerveau, trois verres d’eau, et un délicieux kebab dans le ventre plus tard : le serveur est capable de répondre à une recherche, et la Dicothèque 2024 est capable de poser sa question au serveur plutôt que d’aller fouiner dans Wikisource.

Et le mieux : les résultats apparaissent en même temps (c’était voulu), mais également : quasi instantanément !

Conclusion

La Dicothèque 2024 n’est pour l’heure (au moment de la publication du billet) pas encore disponible publiquement. Ça arrivera très bientôt ! En revanche, le code est déjà disponible sur le GitLab de la Fondation Wikimédia !

Avec ce billet, j’ai souhaité vous présenter la Dicothèque, et surtout montrer une partie du processus créatif qu’il y a derrière le développement de cet outil. Les situations rencontrées ici sont souvent balayées d’un revers dans la main en disant : « bien sûr qu’une façon de faire aussi naïve, ça allait poser des problèmes » ; or on oublie trop volontiers que cela fait partie de l’apprentissage !

J’ai fait le choix, en créant la Dicothèque 2023, de prototyper, tester, expérimenter, sans me préoccuper du « futur » de l’outil. C’est quelque chose que, je trouve, on s’autorise trop peu souvent en informatique, puisqu’on nous habitue très vite à modéliser, problématiser, analyser les besoins et cahier-des-charges-iser.

Mais comme je ne suis pas très bon pour les mots de la fin, si ce billet vous a plu, n’hésitez pas à faire coucou à @Poslovitch@wikis.world — c’est mon compte Mastodon — et je serai ravi de discuter :)


Ce billet est rendu disponible sous licence CC BY-SA 4.0. Vous pouvez soutenir financièrement mon travail avec LiberaPay. Abonnez-vous à ce blog sur le Fédivers avec le handle @Poslovitch@blog.poslovitch.fr. Flux RSS : blog.poslovitch.fr/feed/. Jetez un œil à cette liste de blogs francophones qui valent la peine d'être découverts.