Indexation automatique : nouvelle approche (bayesienne) ?
La lecture d’un article du dernier numéro de Code4Lib m’a remis dans les affres de l’indexation automatique, que j’avais commencé à expérimenter juste avant le Covid, à travers l’outil Annif.
Rappel : aviez-vous oublié Annif ?
Moi, non, même si je n’avais rien écrit depuis avant le Covid. Donc pour rappel, ce billet de décembre 2019 explique de quoi il s’agit.
Et je m’étais retrouvé confronté à un certain nombre de questions, et même de problèmes, insolubles à ce moment-là — j’avais donc un peu tout laissé en plan (en testant quelques trucs en plus, sur les corpus, les modèles, etc.). En outre, j’avais rencontré un blocage technique (une librairie C++ que je n’arrivais pas à installer pour ajouter des options et logiquement de la pertinence à mes résultats)
Parmi les problèmes / questions rencontrées :
- quelles métadonnées utiliser pour entraîner une IA ?
(sachant que dans mes corpus disponibles je considère pour le moment les résumés et textes intégraux comme inaccessibles, jusqu’à ce qu’il soit démontré que s’en passer est impossible)
L’éditeur, le nom de la collection, les codes fonctions, sont-ils des informations utiles ? - comment gérer la dispersion statistique des indexations Rameau ?
l’indexation Rameau est construite, et non sous forme de mots-clés –> chaque chaîne d’indexation est, sinon unique, du moins très peu représentée dans les notices récupérées - comment gérer l’hétérogénéité des notices : dans leur traitement catalographique comme dans leur contenu intellectuel ?
Les notices du XIXe siècle ne ressemblent pas à celles du Dépôt Légal récent ; et leurs sujets ne sont pas non plus les mêmes. En outre, Rameau ayant été créé dans les années 1980, les notices indexées sont surtout postérieures à cette date. Est-il raisonnable d’indexer des notices de 1880 à partir d’une IA entraînée sur des notices d’ouvrages de 2010 ? - quel algorithme de classification/indexation utiliser (Annif en propose plusieurs) ? Et quelles règles de lemmatisation (quand on ramène les différentes variantes d’un mot, en genre et en nombre notamment, à la racine commune) ?
- ne faudrait-il pas plutôt définir des IA thématiques (une pour le droit, une pour les sciences, etc.) qui du coup seraient plus ciblées et potentiellement plus pertinentes ? Mais si oui, d’où viendrait l’information sur la thématique d’une ressource donnée, qui permettrait de sélectionner l’IA compétente ?
Surtout, j’essayais en un seul coup de :
- m’approprier Annif comme logiciel (ou comme solution technique) en devant développer les scripts appropriés pour le manipuler
- comprendre les algorithmes impliqués et sélectionner les « meilleurs »
- traiter un lot de notices et de collections complètement hétéroclites
- obtenir un résultat « définitif », c’est-à-dire des chaînes d’indexation qu’on pourrait injecter directement dans le catalogue
- alors même qu’on est en plein dans la réforme Rameau
C’était déraisonnable.
Simplifions le problème
Du coup, j’ai revu mes ambitions pour avoir des problèmes plus simples à traiter.
Plutôt que d’essayer d’emblée de produire des chaînes d’indexation (objectif qui correspondait à mes missions à la BnF : travailler à l’amélioration des données existantes dans le catalogue), j’en reviens à une démarche plus expérimentale :
- s’approprier Annif comme logiciel de traitement
- essayer de générer simplement des mots-clés pertinents (donc associer des documents à un ou plusieurs concepts Rameau), sans se préoccuper de construire d’emblée des chaînes d’indexation :
cela permet notamment de ne pas devoir respecter une certaine syntaxe ; et d’atténuer les problèmes de dispersion statistique (trop faible représentativité dans les données d’entraînement, donc les document eux-mêmes, de chaînes d’indexation trop peu utilisées en combinaisons) - au lieu de partir d’une extraction de notices bibliographiques, partir des notices Rameau pour récupérer des cas d’utilisation en nombre suffisant pour chacune des notices :
c’est là une révélation toute bête de la lecture de l’article de Code4lib mentionné plus haut. Plutôt que d’extraire un lot de XXX.000 notices et d’y trouver plein de concepts trop peu représentés, je pars de la liste des concepts, et je cherche à récupérer 5 à 10 notices bibliographiques qui leur soient liées.
Donc je recentre sur :
- mieux comprendre l’outil
- voir à quelles conditions on peut l’utiliser pour obtenir une indexation simple (sous forme de mots-clés)
Sérions le problème
Comme je l’évoquais, j’imagine (hypothèse de travail) que l’indexation sera plus pertinente si on indique déjà à l’IA la thématique concernée.
Pour le dire autrement, j’envisage de concevoir et d’entraîner une IA par discipline (ou par département thématique de la BnF, j’hésite encore) : chacune de ces n IA aura donc un nombre moindre de mots-clés à prendre en compte (on va considérer que la théorie quantique est peu présente au département des Lettres, même s’il y évidemment des contre-exemples.
Cela veut dire que pour chaque document, j’aurai par exemple le choix de l’indexer avec les propositions de chacune des n IA thématiques, chacune spécialisée dans son domaine :
Par exemple si le titre contient le mot fatigue, on a affaire à deux grandes sémantiques : la fatigue des métaux (leur endommagement sous certaines contraintes), et la fatigue pour les êtres vivants. Et en fonction des termes du référentiel rencontré dans les données d’entraînement, Annif va me proposer plusieurs termes d’indexation, avec des statistiques de probabilité.
Mais le fait de savoir que le livre relève des Sciences, techniques et médecine, ou du département Droit, économie, politique, orientera le choix de l’IA « Sciences & techniques » (entraînée à partir des collections de ce département) ou de l’IA « Droit, éco, politique » (entraînée de même). Et pour chacune de ces IA, la probabilité de choisir la plante ou le logiciel n’est pas la même.
On peut supposer une situation de ce type :
- Sur une IA générique, un titre comme Théorie de la fatigue se verra attribuer par Annif :
- Matériaux — fatigue : 85%
- Epuisement professionnel : 62%
- Fatigue (épuisement) : 77%
- Mais si on a déterminé au préalable l’information sur le département :
- sur une IA Sciences, techniques & médecine :
- Matériaux — fatigue : 92%
- Epuisement professionnel : 22%
- Fatigue (épuisement) : 88%
- sur une IA « Droit, éco, politique » :
- Matériaux — fatigue : 5%
- Epuisement professionnel : 95%
- Fatigue (épuisement) : 58%
- sur une IA Sciences, techniques & médecine :
Mais pour cela, il faut d’abord savoir si la ressource relève de tel ou tel département. Or au moment du catalogage cette information n’existe pas encore (dans le cas du Dépôt légal, par exemple) : en revanche elle peut elle même faire l’objet d’un calcul de classification avec une autre IA préalable (entraînée grâce à Annif aussi) :
On aurait donc une première étape d’attribution à un certain département, avec un calcul de probabilités : 55% Sciences, techniques et Médecine ; 90% Droit, économie, politique. Et selon la branche choisie, l’indexation retenue. Cette indexation finale se fait donc sous condition de la première classification.
C’est précisément (bon, pour ce que j’en ai compris) le principe du bayésianisme en calcul des probabilités : calculer la probabilité de X sachant Y1.
Il s’agit ici, dans un contexte de catalogage, d’enchaîner les choix successifs de classification et de s’appuyer dessus pour prendre les décisions suivantes.
- Si on ne sait rien de plus que son titre, il est assez probable (85%) que cet ouvrage Théorie de la fatigue porte sur la fatigue des matériaux.
- Si on sait que l’ouvrage relève des sciences, techniques et médecine, il peut autant porter sur les matériaux que sur la physiologie (ou les psychopathologies)
- Si on sait que c’est un ouvrage de droit, économie, politique (parce que l’éditeur est plutôt spécialisé en droit du travail), alors il y a de fortes chance que ce soit un ouvrage portant sur l’épuisement professionnel

On pourrait donc envisager une indexation automatisée comme une succession de décisions, que le catalogueur valide et ou l’étape suivante est recalculée en fonction des choix réalisés.
Mais ça vaudrait aussi le coup de considérer la probabilité de chacun des termes finaux au regard de la probabilité des choix précédents : il y a une formule pour prendre en compte l’inférence bayésienne qu’on étudiera (peut-être ?) une autre fois.
Pourquoi ça peut ne pas marcher
L’idée me semble très séduisante, suffisamment stimulante pour m’inciter à remettre le nez dans toute cette question. Néanmoins il y a plusieurs facteurs d’échecs possibles (et je suis incapable dans évaluer les probabilités…) :
- manque de temps pour concrétiser ce beau rêve (mais si vous vous sentez de le faire, ne vous en privez pas !)
- incompréhension complète de ma part du modèle bayesien et des manières correctes de s’en servir.
Ou en plus vicieux : l’hypothèse initiale pourrait être pertinente (concevoir l’indexation matière comme une succession de choix à décomposer) mais en identifiant mal les étapes ou le bon ordre de leur enchaînement fait foirer les résultats obtenus (et décourage le chaland). - métadonnées disponibles insuffisantes ou mal utilisées (je reste tributaire de notices, alors que souvent les algorithmes d’indexation travaillent sur du texte intégral, ou au moins des résumés et/ou tables des matières
Bon, si ça s’avère infructueux, au moins entre temps j’aurai remis les main dedans, réfléchi de nouveau à la question préalable de la lemmatisation (qui est le sujet de l’article cité plus haut, et qui rend compte d’un travail comparatif très intéressant sur différents algos existants), etc.
Pourquoi ça peut marcher
- Parce que la démarche me semble avoir une certaine cohérence quand même
- Parce que je me suis donné une ambition moindre (des données simplifiées, on n’essaie pas de produire du Rameau pour l’instant !)
- Parce que je vais me doter d’outils mieux conçus pour suivre mes expérimentations
Il y a deux ans, j’accumulais les fichiers de données, les fichiers de prise de notes (sous Evernote, ou avec des documents de type readme.md, etc.) et des scripts Python enrichis de plus ou moins de commentaires pour expliquer la démarche.
Comme je pars d’emblée sur une hypothèse d’architecture plus complexe, avec plusieurs IA qui ne sont pas en concurrence, ou ne sont pas des versions successives les unes des autres mais doivent fonctionner en parallèle au sein d’un même dispositif, je vais d’emblée élaborer :- une table de correspondance qui, pour chaque IA, fournit le code et un descriptif de son contenu (pour pouvoir s’y retrouver)
- un notebook qui documente les étapes
Ah oui, il faudra que je vous parle des notebooks [update : c’est fait], ces petits (ou grands) documents merveilleux pour architecturer un peu plus efficacement ce genre de projet, en mélant plus harmonieusement code, données et paratexte.
Et puis un petit billet sur ce sujet des notebooks me permettra de procrastiner le billet suivant concernant l’indexation automatique !
1. Pour avoir un aperçu du bayesianisme, vous pouvez par exemple regarder cette vidéo de Monsieur Phi (2016) : La loi de Bayes (1/2), voire la seconde : La loi de Bayes (2/2) (qui est très éloignée des questions d’indexation, mais est sympa quand même).
Commentaires fermés