Aller au contenu principal

Tester Annif : quelles données, quelles métadonnées ?

06/01/2020

Je rappelle préalablement que je ne suis un expert ni en indexation automatique, ni en machine learning, ni en intelligence artificielle. Bref, je rends compte ici de mes périples au fur et à mesure, avec potentiellement des erreurs de compréhensions ou de manipulations que tout un chacun est invité à corriger. Merci de votre indulgence et de votre bienveillance.

Le prochain billet sur ce logiciel sera consacré à la prise en main concrète d’Annif, pas à pas. Mais il se trouve que, après l’étape d’installation, ce n’est pas l’utilisation même de l’outil qui vient, mais : « quelles données je vais bien pouvoirlui fournir ? »

Rappelons les 3 étapes d’utilisation pour cet outil qui sert de surcouche d’indexation sujet automatisée à des algorithmes de traitement du langage par machine learning1 :

  1. fournir des données déjà indexées pour s’appelle l’entraînement (training) de l’IA
  2. vérifier, sur un autre jeu de données déjà indexées, si l’IA produit le même résultat (évaluation)
  3. fournir un jeu de données non indexées, à enrichir

Quel corpus à indexer ?

Pour ma part, j’ai envie de tester l’indexation automatique sur un corpus un peu ancien (antérieur à Rameau, lequel a été créé en 1980).

Premier écueil : il ne faudrait pas indexer des documents qui n’ont pas à l’être (la fiction…). Donc je sélectionne une cote idoine. Gardons pour le moment le lettrage Clément F, qui à la BnF contient des documents sur le droit.

Mais une fois le corpus de documents déterminé, quelles métadonnées extraire ?

  • Le titre, bien sûr (mais en fait, toutes les zones de titre, titre original, autre forme de titre, titre de forme, etc.)
  • les zones de notes ? Si elles contiennent des informations sur le contenu, c’est bien, mais si la note dit « Bibliogr. » ou « Suivi d’annexes », qu’en faire ? Et comment distinguer les notes intéressantes des autres ?
    Il faut sans doute prévoir un nettoyage pour supprimer les mots non signifiants (nettoyage peut-être différent pour les formes de titre et les informations de contenus)
  • les tables des matières et résumés (rarement renseignés dès qu’on remonte un peu dans le temps)
  • le titre de la collection peut-il aider à identifier le contenu ?
  • la langue des textes : n’extraire que les documents en français (dès lors qu’on entraîne l’IA avec un corpus français)
  • la date est-elle importante ? J’y reviens plus bas

L’objectif est d’identifier les métadonnées qui puissent être associées, de manière pertinente et anticipables, à une indexation. Un livre intitulé Histoire de la France rurale a de fortes chances d’avoir (entre autres ?) une indexation de type « Agriculture — France — Histoire ». C’est plus dur à deviner d’un titre comme Les Modèles de simulation comme outil pour la construction de fonctions de production. Donc il faut identifier dans la notice les zones contenant les métadonnées exploitables, associables à l’indexation.

Quelles (méta)données d’entraînement ?

Une des choses retenues des quelques lectures déjà faites, est qu’il ne faut pas entraîner notre IA avec n’importe quelles métadonnées : il lui faut le meilleur ! Et toutes les notices n’ont pas le même niveau de qualité et de richesse. On va donc lui expliquer qu’elle doit faire aussi bien que les notices du dépôt légal sur les années les plus récentes.

J’ai donc extrait toutes les notices (indexées en Rameau) du Dépôt légal des 20 dernières années, en en mettant 20% de côté pour l’évaluation. Ce qui me donne :

  • ~600.000 documents pour l’entraînement
  • ~125.000 documents pour l’évaluation

Pour les métadonnées à en extraire, mêmes questionnements — et, a priori, mêmes réponses.

Pan sur le bec

Je ne vais pas tenir le suspense plus longtemps : selon le processus décrit plus haut, on rencontre déjà plein de problèmes :

  • Jus de fruit et livre

    Un petit jus de fruit pour mieux faire passer le code civil ? – photo Pixabay

    des textes qui ne sont pas en français
    Notamment, pour un corpus juridique, on retrouve beaucoup de latin, ou de titres en latin (alors que le texte est dit selon la notice être en français).
    Donc en donnant comme corpus d’entraînement le dépôt légal, plein de manuels scolaires et de livres de cuisine, on risque de faire croire à la machine que le mot Jus permet d’indexer l’ouvrage avec « Jus de fruits« 

  • des métadonnées trop lacunaires : quand la notice contient seulement un titre, et que celui-ci est « La Bohême », quelle indexation espérer ?
    Faut-il ne prendre en compte que les titres ayant une longueur minimale (dont on puisse supposer que, passer un certain nombre de caractères, on y trouvera un semblant de description du contenu) ou enrichis de notes diverses ?
  • les concepts des parutions des 20 dernières années ne sont pas du tout les mêmes que ceux de publications juridiques des années 1750-1930 :
    • on ne trouve pas beaucoup dans ces vingt dernières années de publications d’arrêtés du Parlement ou autres édits royaux
    • un ouvrage d’actualité sur un crime fameux portait alors un titre comme Le crime de la rue Mouffetard. Sur le même sujet aujourd’hui, l’ouvrage s’appellerait plutôt La Mondaine : histoire et archives de la police des moeurs
      Il faut donc vraisemblablement que l’écart temporel ne soit pas trop long entre le corpus d’entraînement et le corpus à indexer
  • La phase n°2 dite d’évaluation consiste à confronter ce qu’aurait fait l’IA face à un corpus nouveau pour elle, et la manière dont celui-ci a réellement été indexé. Pour autant, même en cas de différences fortes, cela ne signifie pas que l’indexation proposée n’est pas fausse : on n’est pas dans une perspective de classification
  • la distribution statistique, c’est compliqué

Régression logistique, assurances et classifications

C’est notamment sur ce point que j’espère particulièrement des retours de bâton (sur le bec ?) qui me permettront de progresser plus vite.

Revenons sur le principe initial de l’indexation automatique. Je vous invite à consulter la documentation sur FastText (l’algorithme développé par Facebook et mis en open source), ou au moins son tutoriel pour la classification de textes :

Text classification is a core problem to many applications, like spam detection, sentiment analysis or smart replies

La présence de certains termes dans une chaîne de texte permet de reconnaître (avec un taux d’erreur/de fiabilité lié au contenu du corpus d’entraînement) si un texte relève de telle ou telle catégorie, par un processus de text classification.

C’est la mise en oeuvre de régressions logistiques, tant utilisées notamment dans les assurances : par exemple, j’indique à mon assureur si je suis célibataire/en couple, avec/sans enfants, fumeur/non fumeur, fonctionnaire/salarié/sans emploi/etc., 21-30 ans/31-40 ans/41-50 ans/50…, et en combinant les différents critères, il me met dans la catégorie des conducteurs très sûrs, moyennement à risque ou très risqués. Il réduit un ensemble de critères catégoriels (non chiffrés) à une valeur unique dans un référentiel. La corrélation entre « avec/sans enfants » et « prudent/à risque » est établi par les statistiques d’accidents des années antérieures2.

De même, si dans un corpus d’entraînement j’ai un ensemble de textes indexés à « Guerre mondiale (1939-1945)« , et que certains de ces textes ont des titres contenant les mots Hitler, Camps de concentrations, Nazisme, Pearl Harbor ou Collaboration, l’indexation me proposera le même genre d’association pour les textes non indexés ayant des titres similaires.

On traite donc l’indexation comme une forme de classification, où chaque titre est à ranger dans une (ou plusieurs) catégories.

J’y vois deux problèmes essentiels : l’un conceptuel, l’autre statistique :

  • Conceptuel : Si on définit des cases en amont, et que seules ces cases-là seront des cibles autorisées pour l’IA, cela veut dire que l’ensemble des cases à définir, ce n’est pas le vocabulaire Rameau (190.000 concepts), mais toutes les chaînes d’indexation possibles… Or les combinaisons sont à peu près infinies. A défaut, pourrait-on se dire qu’un gros catalogue, comme le sont ceux de la BnF et du Sudoc, contiendrait suffisamment de documents indexés pour être considérés (faute de mieux) comme l’univers des possibles ?
    Tout en sachant que c’est évidemment faux, et qu’il suffit que soit traduit un livre sur les relations entre deux pays un peu éloignés de la France, donc sur un sujet assez rare — du point de vue des collections françaises — pour que ce qui est possible pour Rameau (Relations internationales — Pays 1 — Pays 2) ne le soit pas pour l’IA qui ne connaît pas cette combinaison-là.
  • Statistique : on a un vrai problème de distribution
    Si ce sont les chaînes d’indexation qui définissent les catégories, cela veut dire que chaque « case » sera plus rare que si on considérait les concepts Rameau individuellement : si les catégories sont les concepts Rameau eux-mêmes, il y aurait alors au maximum 190.000 cases ; si ce sont les chaînes d’indexation, il y en a potentiellement une infinité, dont certaines ne sont représentées, dans le corpus d’apprentissage, qu’une seule fois.
    Or de même que pour qu’une IA sache correctement ce qu’est un chat, il faut lui fournir beaucoup d’images de chats, de même pour chaque chaîne d’indexation définie comme une case, il faut le plus possible d’exemples.

Le fait de définir pour l’IA les chaînes d’indexation comme la cible a comme conséquence immédiate que chaque case envisagée aura peu d’exemples pour l’apprentissage (ou moins que si on avait considéré les concepts « nus »).

Pour bien s’en rendre compte, voici la distribution pour les documents (monographies imprimées) des 20 dernières années du dépôt légal, à la fois pour les chaînes d’indexation (qui peuvent ne contenir qu’un seul concept) et pour les concepts eux-mêmes :

 

  • Nombre de chaînes d’indexation : 848.299
  • Nombre de chaînes d’indexation distinctes : 263.454
  • Nombre de chaînes d’indexation utilisées 1 à 2 fois : 182.840
  • Nombre de chaînes d’indexation utilisées 100 fois et plus : 728

 

  • Nombre de concepts utilisés : 2.381.009
  • Nombre de concepts distincts : 54.147
  • Nombre de concepts utilisées 1 à 2 fois : 18.538
  • Nombre de concepts utilisés 100 fois et plus : 2680

Cela signifie que quand on prend en compte les chaînes d’indexation, dans 21% des cas on n’a qu’une ou deux occurrences dans le corpus d’entraînement pour faire comprendre à l’IA dans quel cas appliquer cette chaîne d’indexation. Autant dire qu’il faut que le titre soit le même pour qu’il s’y retrouve…

Alors que si on considère les concepts (notez au passage que le DL 1999-2019 pour les monographies imprimées n’utilise qu’un quart du vocabulaire Rameau…), cela ne concerne que 0,8% des concepts : la plupart sont utilisés 3 fois et plus.

Et de l’autre côté de la distribution : seuls 728 (0,2%) chaînes d’indexation sont utilisées 100 fois et plus ; alors que 2680 concepts sur 54.147 (soit 5%) sont utilisés plus de 99 fois.

Peut-on décider de demander à l’IA de proposer des concepts (en la nourrissant avec des chaînes d’indexation éclatées, donc) ? L’IA serait ainsi en mesure de nous suggérer plus facilement des « mots-clés ». Mais suivant les règles d’utilisation actuelles de Rameau, cela ne nous servirait à rien, puisque ça ne correspondrait pas une indexation Rameau valide.

Mais nous n’en sommes heureusement qu’au début de cette exploration. J’espère bien que des pistes se dégagent au fur et à mesure ! L’année commence à peine !

——————————————-

1. Kamoulox !

2. Il est possible que j’aie mal compris ques mécanismes sous-jacents — ou que ça dépend des algos — et que ça fonctionne plutôt comme un modèle de graphes (façon Gephi) : quand on entraîne l’IA, à chaque association d’un terme/expression d’un titre avec un mot-clé, elle resserre la proximité entre l’expression et le mot-clé, et génère un graphe où les noeuds sont les mots-clés et les termes libres. Dès qu’on lui donne un terme ou une expression, il propose le mot clé le plus proche. Ou peut-être est-ce encore un autre modèle que je ne soupçonne même pas (hypothèse encore plus vraisemblable !)

2 commentaires
  1. 06/01/2020 14:02

    Annif author here – and sorry, French isn’t my strongest language…

    Thanks for a very insightful post! I feel your pain when it comes to the extremely uneven distribution of subjects used in any bibliographic collection. There is simply no way to avoid a heavily skewed power law distribution in databases like this – and the precoordination used with Rameau certainly doesn’t make it any easier!

    I must say that Annif really wasn’t designed with precoordinated subject indexing in mind – it assumes you have a vocabulary with a fixed number of (SKOS-like) concepts, and these are used individually, not as combinations (« chains ») determined by the indexer. You could, of course, create a vocabulary with all the Rameau subject combinations that were used at least once in the training data, but then your training data would become extremely thin. So I think it makes sense to put aside the precoordination practice for now and concentrate on predicting individual concepts, not their combinations.

    By the way, once you get to actual experiments, be sure to check out the Omikuji and Maui algorithms/backends. These are currently the strongest algorithms available in Annif and often give far better results than either TFIDF or fastText.

    I noticed from the previous post that you have installed Annif in Windows. It should work, but please be aware that there may be problems further on, especially with optional extra features such as the Omikuji backend. I recommend using Ubuntu Linux (for example in a VirtualBox VM) or if you want to use Windows, you can also try the Docker installation which gives you all features in a self-contained image.

  2. 10/01/2020 21:19

    @OsmaSuominen Thanks a lot for coming here and comment my hesitations : I am very grateful of any advice, because I have to discover a lot of things (« everything » would probably be more appropriate).
    Actually, I can’t really choose to test Annif with indidual concepts : I certainly would obtain more accurate results, but I couldn’t use them, because they would be false, on the Rameau point of view. But I needed to make some statements (and probably some others : I am not done with Annif and Rameau) by myself.
    I probably will continue with other methods (full text, for example ?) and other vocabularies (we have them at the BnF).
    The difficulties I found will probably be an interesting point about the ongoing transformation of Rameau, about which I have to write some post very soon.
    I thank you a lot about what you said about Maui and Omikuji. My problem is, for now I have no available Linux machine, but that certainly can be solved. I already have some problems to install FastText… I never used Docker yet. I might use a virtual machine too (like VirtualBox). We’ll see.
    But for now, my next post about Annif will just be the first steps to start with it : create a project, train it, eval, suggest… Nothing very ambitious but pedagogical, or so I hope — and in French !
    You will be welcome to react on anything I will write about your software, which is great and very easy to discover. That is a great contribution to librarians !

Commentaires fermés

%d blogueurs aiment cette page :