Bobet, topio, panosse, clédar… Pour découvrir la définition des magnifiques termes du parler vaudois ou suisse-romand, il existe deux sites: topio.ch, et henrysuter.ch. Malheureusement ces deux sites sont archaïques et peu pratiques surtout sur mobile, et ne disposent pas d’outils de recherche dignes de ce nom. De plus certains termes sont dans un lexique et pas dans l’autre.

C’est pourquoi j’ai eu l’idée un jour de créer TopioSearch.

J’ai donc développé, grâce à un système d’API propulsé par Slim PHP Framework, un crawler qui, pour une requête, par exemple le terme suisse romand « gouille » ou « taborniau », va chercher celui-ci dans le contenu des pages de ces deux sites.

J’ai développé trois fonctions: « topio », « hsuter », « hsuternames » et qui vont aller chercher dans les contenus du lexique Topio.ch, et des deux lexiques Henrysuter.ch (celui des termes régionaux, et celui des noms de lieux). La requête AJAX va donc procéder aux trois requêtes l’une après l’autre avant d’afficher les résultats sur l’application frontend (réalisée avec Vue.js).

La problématique étant que les développeurs de ces lexiques ont géré les index arbitrairement. Alors que le lexique Topio.ch tient sur une page, celui d’Henrysuter.ch a une page par lettre, sauf pour les lettres avec peu de mots. Par exemple: un mot commençant par « A » est sur la page « A0.html » alors que le mot « Gouille » est sur la page « F0.html » car celle-ci contient les mots commençant par F et G. De même, la page « T0.html » contient les mots commençant par T, U, V, W, X, Y, Z.

Une première étape consiste donc à identifier sur quelle page est le mot, avec un gros « switch… case… » ou un tas de « if… else… ». Ensuite, on va charger le contenu de cette page, comme si un utilisateur allait dessus depuis son navigateur, puis avec des requêtes XPath, on parcourt le code source et on tente de trouver le titre contenant notre mot clé. Avec, à résoudre, les problématiques:

  1. des majuscules et des lettres accentuées dans le terme
  2. des multiples mots dans une entrée (variantes orthographiques)

Une fois qu’on pointe le bon terme avec XPath, on peut ensuite aller chercher les blocs HTML à la suite, qui contiennent la définition. À partir de là, on peut extraire les données, les sauvegarder en cache* et les renvoyer à notre contrôleur.

*J’ignore si j’ai le droit de faire ça, donc dans tous les cas, j’en appelle au Fair Use, c’est à dire à un usage éducatif, dans le cadre d’une formation. Et j’affiche toutes les données externes avec (C) topio.ch ou (C) henrysuter.ch dans mon application. Dans tous les cas, la chose serait faisable sans cache, en lisant uniquement les pages publiques des sites.

Et ainsi de suite pour les deux autres sites. Une fois que le contrôleur a pu récupérer (ou non) les données des 3 sites, il l’envoie à la vue, qui va afficher les résultats sur l’application. En l’occurence, le mot « taborniau » affiche 2 entrées: la définition selon le lexique de termes régionaux de H. Suter, et la définition selon le lexique de topio.ch (et ce n’est pas un nom de lieu). Le mot « gouille » en revanche affiche 3 entrées, car il existe aussi dans le lexique des noms de lieux.

L’avantage de TopioSearch, c’est que l’on peut chercher sur tous les lexiques en même temps. Et grâce à la mise des données en cache, on n’est pas obligé de « taper » sur les sites distants à chaque requête : la recherche est effectuée localement, puis de manière distante sur les sites si le terme n’existe pas dans le cache.

La version actuelle de TopioSearch est en Vue.JS + PHP, mais a des limitations techniques (ça bug avec les définitions qui contiennent des liens). Dans le cadre d’une formation, je suis en train de développer TopioSearch2, qui est une version développée en Python (Django), et qui utilise le module BeautifulSoup pour récupérer les données, plus performant. J’espère pouvoir vous proposer cette nouvelle version prochainement.