Introduction

Dans le cadre de la résidence de Juliette De Maeyer1 au sein du HN Lab2, un travail d’étude et de recherche sur l’impact des Bot3 dans les activités de recherche en SHS a été lancé. Dans ce travail, une intéressante typologie de Bot a été proposée. En effet, depuis quelques années, de nombreux Bot ont été développés dans la recherche en SHS et remplissent plusieurs missions : de la collecte de données à la publication et la diffusions sélectives ou non de résultats de recherches. Dans ses missions, le HN Lab propose des développements, sous forme d’expérimentations ou de mise en place de preuves de concepts, issus des travaux que nous menons avec les chercheur·e·s en résidence. Dans le contexte de la résidence de Juliette De Maeyer, le développement d’un Bot expérimental autour des services proposés par Huma-Num s’imposait.

L’expérimentation s’est portée sur la création d’un Bot minimal, le ISIDOREBot4, autour du moteur de recherche et outil de découverte ISIDORE développé par Huma-Num depuis 10 ans5. L’accroche d’un Bot à un moteur de recherche est très classique. Il faut noter cependant, dès cette introduction, que cela n’avait pas été proposé par les communautés utilisatrices, alors qu’ISIDORE propose, et ce depuis 2010, plusieurs dispositifs favorisants ce type de développement : une API en JSON et XML, un SPARQL endpoint, des identifiants pour les auteurs et des URI normalisées. Ainsi, le dispositif socio-technique formé par ISIDORE autour des données et des documents de la recherche en SHS à l’échelle internationale est un éco-système très favorable au développement de Bot à la fois à vocation de veille scientifique mais aussi à vocation documentaire afin de repérer des thématiques de recherche émergentes. C’est le thème de la veille scientifique que nous avons pris pour le développement de l’ISIDOREBot. Au travers de cette expérimentation, il est possible d’entrevoir un champs de développement de Bot d’assistance aux utilisateurs mais aussi de partage des savoirs sous la forme d’une ou de plusieurs diffusions sélectives d’information.

Notre propos est donc centré sur les étapes de conception qui ont été réalisées pour ce Bot. Il faut cependant souligner que le fonctionnement du ISIDOREbot s’est heurté dès les premiers tests à la politique de Twitter qui vu ce bot comme un outil générant du Spam sur le réseau social. En effet, en postant un ou des liens, créés à partir du nom d’auteur, vers une plateforme externe à Twitter, il est considéré par le réseau social comme un outil de spam, quand bien même ISIDORE est un moteur de recherche académique, ayant traité en bonne et due forme les informations personnelles dans le cadre du RGPD, déclaration à la DPO du CNRS, etc. Après plusieurs échanges avec des auteurs de Bot et des développeurs utilisant l’API de Twitter, il semble complexe de comprendre les règles — parfois changeantes et très adaptatives, de ce qui est un Spam ou pas sur ce réseau social6. Mais il conviendra de voir comment faire pour mettre en production un tel Bot qui pose également des questions de qualité des données diffusées et dont les limites et perspectives doivent être analysées.

Le recours à un Bot :

S’il existe des Bot de tous types et pour toutes taches, la diffusion sélective d’information ou de données est l’une des plus courante. Dans cette catégorie, deux familles principales co-existent :

  • La diffusion aléatoire ou programmée d’information (à partir d’une base de données préétablie par exemple) ;
  • L’interaction par analyse de contenu pour la diffusion d’information programmée.

Cette dernière famille est très large, allant principalement de l’analyse des contenus par expressions régulières à l’usage d’outillage par intelligence artificielle entrainée (Deep Learning ou Machine Learning). Dans le cadre de ce travail nous optons pour un simple Bot d’interaction à analyse des contenus par expressions régulières des formes.

Création de l’ISIDOREBot

Le ISIDOREBot s’appuie sur la proposition faite par Pierre Chopinet (JaaJBLOG) et qui implémente en Python les principes minimaux de la création d’un Bot « répondant » pour Twitter. Nous partons de cette proposition (et nous remercions l’auteur) afin d’y ajouter la partie nécessaire à l’interaction par analyse des contenus.

Conception

Le fonctionnement du ISIDOREBot est simple&nbps;: quand un utilisateur pose une question au Bot en utilisant une chaîne de caractères ou un mot-clic précis et en citant un auteur·e7, le Bot lui répond avec des liens directs sur les publications et la page de profil de l’auteur·e sur ISIDORE (et plus particulièrement sur le site Web https://isidore.science).

Ainsi les principales étapes sont :

  • « Écoute » des tweets via l’API de la plateforme Twitter ;
  • Repérage des tweets mentionnant le ou les mots-clic déterminés. Dans notre exemple, il s’agit d’un répérage de « Disidore » ou « Dis isidore ». Ces mots-clic vont activer le Bot ;
  • Analyse du tweet afin de repérer le prénom et le nom de l’auteur·e demandé·e ;
  • Fabrication d’un tweet de réponse contenant les bons liens vers les ressources de l’auteur·e dans ISIDORE ;
  • Postage du tweet de réponse en réponse au demandeur à l’aide de l’API de Twitter.

Le Bot contient donc 3 principales fonctions :

  • Répérer des tweets particuliers dans le flux des tweets qui passent sur l’API de Twitter ;
  • Analyser les contenus demandés ;
  • Répondre au demandeur ;

Mise en œuvre

L’ISIDOREBot utilise la class listener développée par P. Chopinet8 qui utilise la fonctionnalité stream de l’API twitter afin de repérer les tweets qui mentionne le ou les mots-clic définis et qui ont pour fonction d’activer le programme bot.py qui est le Bot lui-même. Nous renvoyons aussi le lecteur au fichier auth.py concernant l’authentification sur l’API de Twitter.

Répérer des tweets particuliers dans le flux des tweets qui passent sur l’API de Twitter

La class listener se présente telle que :

class listener(StreamListener):
    def on_data(self, data):
        all_data = json.loads(data)

        id_tweet = all_data['id_str']

        tweet = all_data['text']

        username = all_data['user']['screen_name']

        text = analyzer(tweet, username)

        if not contains_word(tweet, 'RT') and not contains_word(tweet, 'exemple'):
            print(username, tweet)

            api.update_status(
                status='@' + username + ' ' + text,
                in_reply_to_status_id=id_tweet
            )

        return True

    def on_error(self, status):
        print(status)

Cette class Python est complétée par une fonctionnalité qui détecte si le Tweet n’est pas un RT afin de ne pas « boucler » :

def contains_word(string, word):
    return (' ' + word + ' ') in (' ' + string + ' ')

Analyser les contenus demandés

Afin d’analyser par expressions régulières le tweet envoyé par le demandeur, nous avons développé une fonctionnalité dédiée pour cela. Il s’agit donc d’analyser la demande postée par rapport à ce que l’on veut répondre avec ISIDORE et ce en terme de recherche. Pour ce Bot nous avons choisi de travailler sur les auteur·e·s et donc de répondre aux questions du type : qu’est-il possible de trouver comme travaux publiés par un·e chercheur·e ?

Dans un Tweet de la forme : Dis @isidore___, qu'as-tu sur Stéphane Pouyllau ? nous allons :

  • Identifier l’ID unique du tweet pour pouvoir répondre : ` id_tweet = all_data[‘id_str’]`
  • Identifier le mot-clic ou le terme déclenchant la réponse : twitterStream.filter(track=["disidore", "dis @isidorebot___", "hey isidore"])
  • Identifier une forme prénom et une forme nom pour construire une URL de requête à ISIDORE :
# Name and fist name
    L = tweet.split()
    first, *middle, last = tweet.split()
    print(tweet)
    word_maj = []

    for word in L:
        if (word[0].isupper() and word[1].islower()):
            if word != first:
                word_maj.append(word)

    prenom = word_maj[0]
    nom = word_maj[1]

Nous utilisons les majuscules et minuscules des termes pour identifier les formes prénom et nom. Il serait possible d’utiliser aussi un référentiel de prénoms par exemple pour plus de fiabilité.

Il s’agit ensuite de préparer ces formes pour les différents besoins nécessaires à la création des paramètres des URLs pour ISIDORE :

prenom4api = word_maj[0].lower().replace("-", "_")
prenom4api = unidecode.unidecode(prenom4api)
prenom4url = unidecode.unidecode(prenom)

nom4api = word_maj[1].lower()
nom4url = unidecode.unidecode(nom)

Ces versions des formes prenom et nom vont permettre de construire deux URL qui seront placées dans le tweet de réponse :

  • URL vers la page de profil de l’auteur·e : https://isidore.science/a/"+nom4api+"_"+prenom4api+"
  • L’URL vers une recherche des publications de l’auteur·e: https://isidore.science/s?q=author%3A%22"+prenom4url+"+"+nom4url+"%22"

Enfin la construction complète du tweet de réponse :

text = "Bonjour @"+username+", peut-être devriez-vous regarder sur ISIDORE la page https://isidore.science/a/"+nom4api+"_"+prenom4api+", ou ses principaux travaux sur "+url+" #ISIDOREbot"
return(text)

Le texte du tweet est ensuite envoyé sur Twitter, en réponse au demandeur, avec :

api.update_status(
                status='@' + username + ' ' + text,
                in_reply_to_status_id=id_tweet
            )

Disponible dans la class listener.

Autorisé comme application dans l’API de Twitter, le bot peut être lancé ou programmé (via un crontab par exemple) par un serveur ou simplement par un ordinateur connecté en permanence à internet avec la commande : python3 bot.py.

Ressources

  1. Associate Professor à l’Université de Montréal. 

  2. Cette résidence se déroule dans le cadre de l’entente franco-canadienne entre Huma-Num et le Centre de recherche interuniversitaire sur les humanités numériques du Québec (CRIHN) qui regroupe huit universités, CEGEP et établissements de recherche québécois. 

  3. Les Bot (terme issus de robot) sont des programmes informatiques qui interagissent avec des plateformes Web et des réseaux sociaux le plus souvent à l’aide d’API. 

  4. Disponible sur @isidorebot

  5. POUYLLAU, S. et al., “ISIDORE à 10 ans”, 2021. https://humanum.hypotheses.org/6762 

  6. Lire l’échange sur twittercommunity.com 

  7. Il est possible de lui faire analyser d’autres chaînes, par exemple des questions d’actualités, etc. Cela fera l’objet d’une version ultérieure du ISIDOREBot

  8. Nous renvoyons le lecteur au détail sur le code lui-même sur le lien donné ci-dessus.