Moteur de recherche sémantique et cartographie sémantique de collections

Convertir du texte en embeddings n'est pas nouveau et n'est pas propre aux LLMs, cette technique était déjà au coeur d'algorithmes tels que word2vec ou seq2seq largement utilisés en NLP. Par contre la nouveauté et la puissance des embeddings issus des Transformers tient dans leur modalité d'encodage du texte qui intègre les relations sémantiques entre chaque mot, ouvrant la voie à des calculs géométriques de distance entre vecteurs dans lesquels de faibles valeurs représentent des similarités sémantiques et non plus de simples proximités syntaxiques , ce qui au fond est le principe même d'un moteur de recherche sémantique. Dans ce cas, le principe de la recherche ne repose plus sur la reconnaissance de chaines de caractères entre des mots-clés en entrée et des champs préalablement indexés, mais sur la projection du contexte et de la signification d'une requête dans un espace de données sémantiquement encodées, rendant possible l'obtention de résultats de recherche plus pertinents quand bien même ils ne contiendraient aucun des mots de la requête initiale.

De même, l'encodage de la signification des mots et groupes de mots via leurs relations et associations conduit à représenter un corpus en espace de vecteurs de très hautes dimensions, cette multi-dimensionalité étant le moyen de saisir la complexité du langage. La visualisation de ces espaces dépassent à la fois nos capacités techniques de représentation et nos capacités cognitives d'appréhension, mais on peut recourir à des techniques de réduction dimensionnelle pour tout de même dresser des cartographies sémantiques de ces espaces en 2 ou 3 dimensions : on peut alors visualiser comment se répartissent spatialement les points de données, comment les points similaires se regroupent en clusters, et ainsi par exemple faire du topic modelling à partir des ces clusters.

Ce sont donc ces deux cas d'usage qui sont sont explorés ici, et le dataset qui servira de fil rouge à ces expérimentations est issu d'une extraction des données de l'archive ouverte Hal via son API. L'url de la requête utilisée est la suivante

https://api.archives-ouvertes.fr/search/UNIV-COTEDAZUR/?q=docType_s:ART&fq=abstract_s:[%22%22%20TO%20*]&fq=domain_s:*shs*&fq=publicationDateY_i:[2013%20TO%202023]&fl=halId_s,doiId_s,uri_s,title_s,subTitle_s,authFullName_s,producedDate_s,journalTitle_s,journalPublisher_s,abstract_s,fr_keyword_s,openAccess_bool,submitType_s&wt=csv

c'est-à dire :

  • la requête est restreinte aux données du portail UNIV-COTEDAZUR ;

  • on ne veut que les articles en SHS avec abstract publiés entre 2013 et 2023 ;

  • on récupère les champs d'identification principaux (id HAL et doi), les métadonnées descriptives basiques (titre, auteur, éditeur, titre de revue, date de publication, résumé, mots-clés) ainsi que les caractériques OA de la publication et le type de dépôt avec ou sans TI ;

  • on choisit le format d'export csv.

On obtient le tableau de données suivant enter image description here

Les embeddings sont ensuite calculés à partir des champs title, subtitle et abstract concaténés et stockés dans une nouvelle colonne "combined" afin de regrouper dans un même champs le contexte informationnel textuel le plus riche pour un LLM.

from sentence_transformers import SentenceTransformer
import pickle

model_id = "sentence-transformers/all-MiniLM-L6-v2"
embedder = SentenceTransformer(model_id)

# new column
df = pd.read_csv("hal_data.csv", sep=",", encoding="utf-8",dtype = str)
df["combined"] = df.title_s + ". " + df.subTitle_s + ". " +df.abstract_s

# Create embeddings on the combined column who concats title & abstract
corpus_embeddings = embedder.encode(df.combined.to_list(), show_progress_bar=True)

# Save
with open('hal_embeddings.pkl', "wb") as fOut:
  pickle.dump(corpus_embeddings, fOut)

Le code utilisé pour extraire les données de l'API, le fichier csv des métadonnées ainsi la couche d'embeddings sont accessibles via le README de ce dataset sur HuggigFace : https://huggingface.co/datasets/Geraldine/hal_univcotedazur_shs_articles_2013-2023


Moteur de recherche sémantique

Comme précisé ci-dessus, les vecteurs d'embeddings obtenus fournissent une représentation numérique sémantique du set de publications, et construire un moteur de recherche sémantique consiste alors à effectuer des calculs de similarité entre l'embedding des termes de recherche de l'utilisateur et les embeddings du dataset afin de repérer les vecteurs les plus proches, soit les publications conceptuellement les plus similaires au sens de la recherche effectuée.

# Reload embeddings
file = open("hal_embeddings.pkl",'rb')
corpus_embeddings = pickle.load(file)

# Prompt encoding
prompt = "Impact du changement climatique sur la gestion de l'eau"
prompt_embedding = embedder.encode(prompt,convert_to_tensor=True)

# Compute similarity
hits = util.semantic_search(prompt_embedding, corpus_embeddings, top_k=10)
df_hits = pd.DataFrame(hits[0], columns=['corpus_id', 'score'])
# returns
[[{'corpus_id': 2756, 'score': 0.6285728812217712},
  {'corpus_id': 2045, 'score': 0.5454307794570923},
  {'corpus_id': 2436, 'score': 0.5157469511032104},
  {'corpus_id': 1524, 'score': 0.5143352746963501},
  {'corpus_id': 2534, 'score': 0.504044771194458},
  {'corpus_id': 2658, 'score': 0.502112627029419},
  {'corpus_id': 2750, 'score': 0.483938992023468},
  {'corpus_id': 2276, 'score': 0.47608375549316406},
  {'corpus_id': 2493, 'score': 0.47438427805900574},
  {'corpus_id': 2656, 'score': 0.46912881731987}]]

# Find nearest articles
import pandas as pd

df = pd.read_csv("hal_data.csv", encoding="utf-8")
articles_list = []
for hit in hits[0]:
  hit_id = hit['corpus_id']
  article_data = df.iloc[hit_id]
  articls_list.append({"title": article_data["title_s"],
                                       "subtitle": article_data["subTitle_s"],
                                       "date": article_data["producedDate_s"],
                                       "journal" : article_data["journalTitle_s"],
                                       "pub": article_data["journalPublisher_s"],
                                       "abstract": article_data["abstract_s"]
                                  })
# returns
[{'title': 'Le changement climatique en France : croyances\\, comportements\\, responsabilités',
  'subtitle': '',
  'date': '2018',
  'journal': 'OFCE Policy Brief',
  'pub': 'OFCE',
  'abstract': "À l'heure où la grogne monte\\, où les promesses de manifestation se multiplient\\, force est de constater qu'au-delà des solutions technologiques attendues et des politiques de soutien à l'innovation verte\\, la préservation de notre environnement passera forcément par une modification de nos habitudes les plus profondément ancrées. Ce Policy Brief présente les résultats d’une étude sur la connaissance des Français du changement climatique\\, sur leurs valeurs et les comportements adoptés comme réponses à celui-ci. Les résultats dressent le profil d’une nation inquiète au sujet du changement climatique\\, mais encore trop peu mobilisée. Le sentiment d’efficacité de nos actions est faible et l’idée est très répandue que la responsabilité d’agir face au changement climatique incombe aux autres (aux entreprises\\, aux gouvernements et à la communauté internationale) plutôt qu’aux individus eux-mêmes. Ces résultats laissent entrevoir des défis réels mais surmontables pour mobiliser les Français dans une révision durable de leurs comportements."},
 {'title': 'Agriculture et Environnement,Agriculture and Environment',
  'subtitle': '',
  'date': '2021',
  'journal': "Droit de l'environnement [La revue jaune]",
  'pub': 'Victoires éditions [1990-2018] - MCM Presse [2019-2022] - Cogiterra Éditions |2023-....]',
  'abstract': "Le thème de notre chronique est de plus en plus au cœur de l’actualité et de l’urgence : « Le changement climatique\\, dont les effets sont déjà perceptibles\\, aura des conséquences lourdes sur l’agriculture comme sur les ressources en eau et les milieux aquatiques dans les prochaines décennies. Il va nécessiter à la fois des transformations importantes de l'agriculture et la sécurisation de la ressource en eau dans le respect des équilibres naturels. (…) Les [prescripteurs de politiques publiques] peuvent être tentés de temporiser\\, considérant que les incertitudes qui existent dans les projections justifieraient d'attendre. La mission recommande au contraire d’engager dès maintenant les changements proposés. On peut voir d’ailleurs un appel au changement de pratiques dans l’actualité\\, notamment contentieuse\\, foisonnante que suscitent l’emploi des produits phytopharmaceutiques. Pour le reste\\, en revanche\\, l’année 2020 est relativement calme\\, en raison peut-être d’un « effet Covid »."},

Pour explorer la recherche sémantique sur ce jeu de données, on peut de reporter à cette application déployée sur HuggingFace et qui expose une interface web de recherche, ainsi qu'une iframe encapsulant les résultats de la même requête avec le moteur de recherche traditionnel de HAL à des fins de comparaison. enter image description here


A noter que ce type de procédé peut également servir de base à un moteur de recommandation qui servirait à déterminer pour chaque notice les notices les plus similaires.


Cartographie sémantique de collection

Visualiser l'espace des embeddings dans un espace ramené à deux dimensions revient à dresser une cartographie d'un genre nouveau par rapport aux représentantations graphiques dont nous avons l'habitude, ici c'est l'espace informationnel des éléments bibliographiques descriptifs qui est traduit en espace sémantique de datapoints : dans cet espace, les datapoints se spatialisent naturellement par proximité, ce qui permet de visualiser immédiatement les grappes de publications traitant de sujets voisins, et en sur-chargeant le tout avec un algorithme de topic modelling appliqué aux clusters de datapoints sémantiquement proches, on obtient alors une spatialisation globale des publications en fonction des thématiques traitées.

Pour cette réalisation on utilise la librairie nomic qui fournit les wrappers nécessaires pour loader les données, générer les embeddings correspondants, organiser les datapoints en clusters hiérarchiques labelisés, convertir les embeddings de haute dimension en embeddings 2D et visualiser la représentation graphique des données ainsi obtenue.

Rem : il faut d'abord se créer un compte et générer une API key (gratuit) sur https://www.nomic.ai/

import nomic
from nomic import atlas
import csv

NOMIC_API_KEY = "..."
nomic.login(NOMIC_API_KEY)

with open('hal_data.csv','r',encoding="utf-8") as f:
    reader = csv.DictReader(f)
    my_data = [row for row in reader]

dataset = atlas.map_data(data=my_data,
                          indexed_field='combined',
                          identifier='hal_univcotedazur_shs_articles_2013-2023',
                          description='dataset of HAL publications',
                          )

dataset.maps[0]

Voilà pour le code qui créé la visualisation, mais il est aussi possible de tout simplement uploader son fichier csv directement sur https://atlas.nomic.ai/


On obtient alors ce type de cartographie dynamique https://atlas.nomic.ai/data/grldngeoffroy/hal-univcotedazur-shs-articles-2013-2023/map

sur laquelle on peut appliquer un code couleur selon le statut OA de chaque publication afin de voir si les pratiques de publication en OA diffèrent selon les thématiques

enter image description here

ou idem selon le type de dépôt (avec ou sans fichier joint) enter image description here


Que ce soit via l'interface ou dans un script, la librarie fournit aussi les fonctions nécessaires pour manipuler et rechercher sémantiquement dans l'espace des embeddings


A titre d'exemple supplémentaire, et pour illustrer les multiples exploitations possibles de ce type de procédé, voici selon le même principe la cartographie des demandes de documents sortants pour la bibliothèque de l'EPFL dans le cadre du prêt dans le réseau Swisscovery, qui permet de se faire une idée de l'(in)adéquation des collections par rapport aux besoins des usagers (analyse bien évidemment à affiner).

https://atlas.nomic.ai/data/grldngeoffroy/epfl-slsp-courier---borrowing-requests-2021-2023/map

enter image description here

"> ');