Le 04/07/2021
Avant de commencer
J’ai commencé à m’intéresser à l’IA lorsque j’étais à la fac il y a plus de 25 ans.
L’IA est un vaste domaine. À l’époque, je m’étais spécialisé en intelligence artificielle distribuée. Mais le traitement du langage naturel a toujours exercé un attrait particulier sur moi.
J’ai connu la préhistoire de l’IA. À cette époque, ses possibilités étaient bien plus limitées qu’aujourd’hui. Mais je me suis toujours plus ou moins informé sur le sujet.
Pendant des années, j’ai suivi le blog de Jean Véronis avec intérêt.
Il y a une quinzaine d’années, j’ai créé un agrégateur RSS qui classait automatiquement les articles par thématique, un genre de wikio artisanal qui utilisait une approche lexicale.
Il y a 5 ans, je me suis intéressé aux algorithmes sémantiques de type LSI (latent semantic indexing) et LDA (latent dirichlet allocation). J’ai installé Gensim et j’ai suivi quelques tutos.
Présentation du projet
Depuis cette époque, je me dis que la création d’un outil permettant de démocratiser cette technologie serait d’une grande utilité pour les webmasters et les référenceurs.
En proposant des contenus similaires, on améliore le taux de rebond et on conserve plus longtemps les visiteurs sur son site. Et bien entendu, plus on garde les visiteurs sur son site, plus on augmente les conversions.
L’algorithme de Google donne plus de poids aux liens lorsque les pages ont une certaine proximité thématique. Un algorithme sémantique pourrait être utilisé par les SEO pour générer automatiquement un maillage interne « de base ». Ainsi, ils gagneraient du temps et pourraient se concentrer sur l’optimisation du contenu ou la création d’arbres de liens pour pousser les pages de leur choix. Au passage, un algorithme sémantique pourrait également faire des suggestions pour les aider à créer leurs structures de liens.
Même si j’ai toujours été persuadé de l’utilité d’un tel outil, j’ai laissé cette idée de côté pendant des années. Il faut dire que depuis une douzaine d’années, j’ai un peu laissé la technique de côté pour me concentrer sur d’autres domaines. Mais depuis quelques mois, je retrouve ma passion de débutant. Il y a quelques semaines, j’ai repensé à mon idée d’outil sémantique/SEO et je suis vraiment motivé pour le développer.
Dans le vif du sujet
Pour ne pas faire mon développeur de base qui code dans sa cave sans communiquer, je me suis dit qu’il fallait que je parle de ce projet au plus tôt. J’étais prêt à en parler avant même d’avoir commencé.
Mais il y a trois jours, je me suis mis à douter. Je me suis dit qu’avant d’en parler, ça serait judicieux d’avoir une maquette qui donne ses premiers résultats.
J’ai installé Gensim, spaCy et j’ai passé ma soirée à coder le début d’une maquette.
Comme je suis plus à l’aise avec PHP, j’ai commencé par extraire les données d’un site WordPress en utilisant ce langage. Après un premier nettoyage des données, je génère une liste Python. Puis je continue à nettoyer les données dans Python avec spaCy puis Gensim.
Le lendemain matin, je continue ma maquette. J’utilise Gensim pour créer un index LSI ou LDA et je fais mes premières requêtes de similarités.
Et là, c’est le drame
Ça ne fonctionne pas du tout ! Les résultats que j’obtiens n’ont aucune pertinence. Je me dis que j’ai bien fait de ne pas parler de ce projet et que je vais probablement devoir passer à autre chose.
Même si je le savais déjà, je me rends compte que suivre un tuto et utiliser des données réelles, c’est très différent.
Mon jeu de donnée de 100 articles est peut-être trop petit. J’essaye avec un autre site de 1000 articles. Je persévère.
Je passe ma journée à étudier les modèles et à comprendre comment on les optimise. Pour m’aider, je mets en place des calculs de cohérence et de stabilité qui m’aident à évaluer d’une manière statistique la pertinence des paramètres que j’utilise.
Ça marche !
En fin d’après-midi, je commence à un peu mieux comprendre ce que je fais et je j’obtiens mes premiers résultats pertinents. En réalité, ils sont pertinents pour la plupart des articles. Mais pour les articles un peu éloignés du reste du corpus, cela donne parfois des résultats bizarres.
C’est normal avec ce genre d’algorithmes. Si vous regardez ce que Google croit connaître de vous, c’est parfois extrêmement pertinent et parfois, on se demande d’où il sort ses « infos ». Moi par exemple il pense que je suis célibataire et fan de foot.
Je laisse tomber le LDA qui semble peu pertinent sur les petits corpus. Je ferais de nouveaux tests plus tard, mais dans un premier temps, je me concentre sur le LSI.
Le surlendemain, je fais de nombreux tests et j’arrange un peu tout cela. J’ai maintenant un premier programme PHP qui extrait les données de WordPress et les rends utilisables par Python. J’ai un programme Python pour m’aider à optimiser la configuration du modèle. Un autre qui crée les index. Et j’ai un dernier programme Python qui me permet d’interroger les index et de faire des requêtes de similarité pour un article donné.
Bouclons la boucle
Je me dis qu’il serait peut-être temps de renvoyer tout cela dans WordPress. Je passe ma soirée à coder une solution simple. Pour ne pas me compliquer la vie, j’utilise le système de « post meta » de WordPress. Je créé un script Python qui pour chaque article, interroge l’index et génère la requête SQL pour créer le post meta. Je code le voisinage de chaque article sous la forme d’une variable sérialisée qui deviendra un tableau dans WordPress.
Je bricole un widget WordPress pour afficher les posts voisins en fonction du post meta. Pour 1000 articles, la génération des requêtes prend environ 15 minutes. J’exécute mes requêtes et en fin de soirée, j’ai une maquette complète qui fonctionne.
Hello World !
Ce que j’ai réalisé ces deux derniers jours n’est que le « Hello World ! » de l’outil que j’ai en tête. Je souhaite proposer un service hébergé avec une interface d’admin, une API et un plugin WordPress (et sûrement d’autres options en fonction de la demande) pour permettre une intégration en un clic.
Mais j’ai une maquette qui permet de faire cela d’une manière artisanale et je sais maintenant que je peux arriver au bout de ce projet.
À suivre…