Introduction

La plateforme Kairntech donne aux utilisateurs l’accès à de puissantes capacités d’apprentissage machine, intégrées dans une interface graphique simple, intuitive et facile à utiliser. Bien que cela soit essentiel de permettre aux experts métier sans compétence informatique particulière d’utiliser la plateforme, il existe une deuxième approche pour travailler avec la plateforme : l’utilisation de l’API REST. Dans ce tutoriel, nous vous expliquerons comment implémenter un client en python donnant accès aux fonctionnalités de l’API.

Le code complet se trouve ICI, et nous vous expliquerons la mise en place étape par étape.

Prérequis

Dans ce qui suit, nous supposons que vous avez python 3 installé sur votre machine et que vous êtes habitué à utiliser un éditeur de texte pour écrire du code et enfin exécuter un script python en ligne de commande. Nous supposons également que vous avez accès à la plateforme Kairntech. Nous maintenons des instances de la plateforme en ligne pour des tests et des démonstrations. Si vous avez besoin d’un accès, veuillez nous en informer à l’adresse info@kairntech.com et nous vous recontacterons.

Enfin, le client que nous sommes sur le point de mettre en œuvre nécessite l’installation d’une poignée de modules python. Si au lancement du client, un message d’erreur vous informe que ce module spécifique n’est pas présent, vous pouvez l’ajouter facilement en utilisant les procédures python par défaut. Par exemple, si votre installation python ne contient pas encore la bibliothèque de pandas, la commande ci-dessous vous permet de l’ajouter rapidement :

# pip install pandas 
Collecting pandas 
  Downloading https://files.pythonhosted.org/packages/*******/pandas-0.24.2-cp35-cp35m-manylinux1_x86_64.whl (10.0MB) 
    100% |████████████████████████████████| 10.0MB 928kB/s 
Installing collected packages: pandas 
Successfully installed pandas-0.24.2 
#

Une introduction complète à l’utilisation de l’installateur du module python pip dépasse la portée de ce texte. Voir ici pour plus de détails sur pip.

L’API Rest

La plateforme est accessible par des appels aux méthodes de l’API REST via tout client qui « parle » REST. Une documentation complète de l’API est accessible ici. Cette page contient une liste complète des appels disponibles, les paramètres requis et le format des résultats renvoyés par l’appel respectif. Toutes les interactions utilisateur qui peuvent être effectuées sur l’interface web GUI peuvent également être exécutées via l’API, de sorte que vous avez un accès complet à toute la gamme de méthodes telles que la connexion, la vérification de la liste des projets existants, la création d’un nouveau projet, le téléchargement de documents, le lancement d’un travail de formation et la collecte des résultats d’une annotation et bien d’autres.

Il est en principe possible d’interagir de manière productive avec l’API simplement en vérifiant la documentation ci-dessus, mais le fait d’avoir un exemple de client qui explique comment les choses sont censées fonctionner permet souvent de gagner du temps. Alors, nous y voilà :

Dans ce qui suit, nous allons suivre un scénario spécifique, à savoir le processus de connexion à la plateforme, la vérification de la liste des projets installés, puis la vérification de la liste des modèles entrainés disponibles dans l’un d’entre eux et enfin l’envoi d’un texte (ou d’un répertoire de textes) pour être annoté avec ce modèle et le retour des résultats.

Authentification

Pour pouvoir interagir avec la plateforme, vous devez d’abord vous connecter. L’appel correspondant vous renvoie un « jeton au porteur » qui doit être soumis avec les appels suivants dans la même session. Le code respectif en python est assez simple :

import json
import requests
server = 'https://sherpa.kairntech.com/api'
login_info = json.dumps({"email": 'YOUR-LOGIN',
"password": 'YOUR-PASSWORD'})
headers = {"Accept": "application/json",
"Content-Type": "application/json"}
def get_token(server, login_info):
url = server + "/auth/login"
#print("calling sherpa server '%s' …" % url)
try:
response = requests.post(url,data=login_info, headers=headers)
json_response = json.loads(response.text)
except Exception as ex:
print("Error connecting to Sherpa server %s: %s" % (server, ex))
return
#print("response = %s" % response.text)
if 'access_token' in json_response:
token = json_response['access_token']
return token
else:
return
token = get_token(server,login_info)
print("token = %s" % token)

Lors de l’exécution du code ci-dessus, un « bearer token » sera renvoyé et imprimé. Cela montre que l’accès au serveur a réussi et que nous sommes maintenant prêts à utiliser le jeton obtenu pour accéder à l’API.

Liste des projets et modèles

Lorsque je travaille avec l’interface graphique de la plateforme, l’application me présente immédiatement la liste des projets installés, m’invitant à en sélectionner un (ou à en créer un nouveau). Cependant, lorsque je travaille avec l’API, il se peut que je ne sache pas quels sont les projets disponibles, c’est pourquoi nous demandons d’abord une liste des projets installés. Heureusement, il existe un appel de l’API pour cela. Et il en va de même pour la liste des modèles à l’intérieur d’un projet. Le code ci-dessous en est un exemple pour les projets :

def get_projects(server,token):
url = server + "/projects"
headers2 = {'Authorization': 'Bearer ' + token}
#print("calling sherpa server '%s' …" % url)
response = requests.get(url,headers=headers2)
json_response = json.loads(response.text)
projects = ", ".join([project['name'] for project in json_response])
print("Available projects on %s: %s" % (server, projects))

En utilisant le jeton que nous avons reçu à la suite de l’appel précédent, nous pouvons demander une liste des projets installés.

Envoi du contenu

Après avoir sélectionné le projet que nous voulons utiliser (et le modèle spécifique – il peut y avoir plusieurs modèles au sein d’un même projet correspondant à des entrainements avec les différents algorithmes disponibles), nous sommes maintenant prêts à envoyer le contenu et à le faire annoter.

def call_sherpa(text,model,annotator,server,token)
url = server+"/projects/"+model+"/annotators/"+annotator+"/_annotate"
results = {}
text = text.encode(encoding='utf-8')
headers = {"Accept": "application/json",
"Content-Type": "text/plain",
"Authorization": "Bearer " + token}
response = requests.post(url,data=text, headers=headers)
if (response.status_code != 200):
print("error from server: %s" % response.status_code)
return
json_response = json.loads(response.text)
documenttext = json_response['text']
annotations = json_response['annotations']
for annotation in annotations:
start = annotation['start']
end = annotation['end']
term = documenttext[start:end]
type = annotation['labelName']
if type in results:
results[type].extend([term])
else:
results[type] = [term]
for key in results.keys():
list_set = set(results[key])
results[key] = list(list_set)
return results

La fonction « call_sherpa » ci-dessus appelle le serveur avec le jeton, le projet et le modèle sur un morceau de texte et renvoie ensuite les annotations résultantes, où l’étiquette est le type d’entité (par exemple, PERSONNE ou LIEU ou tout ce que le modèle sélectionné a été entraîné à reconnaître). Les valeurs multiples pour la même étiquette sont renvoyées sous forme de liste.

Impression des résultats

Il ne reste plus qu’à décider comment notre client doit renvoyer les résultats de l’appel. Nous avons décidé ici que les résultats seront exportés dans un fichier CSV avec une ligne par fichier traité, les colonnes étant les types d’entités des modèles sélectionnés et chaque cellule contenant la liste des entités pour ce type d’entité dans ce fichier :

output = pd.DataFrame()
text = open(txtfile, "r",encoding='UTF-8', errors='ignore').read()
result = call_sherpa(text,project,model,server,mytoken)
result['document'] = txtfile
output = output.append(result, ignore_index=True)
output = output.set_index('document')
output.to_csv(MYOUTPUTFILE, sep='\t')

Lorsque nous lançons notre exemple de client sur un répertoire d’appels d’offres publics en anglais collectés sur le site web et que nous les envoyons à un modèle entrainé pour trouver certaines métadonnées telles que la date d’échéance de l’appel d’offres, le volume estimé et l’objet de l’appel d’offres, le script renvoie un fichier csv avec les informations correspondantes, ce qui permet de vérifier facilement, par exemple, le prochain appel d’offres qui est dû ou celui qui a le plus grand volume ou celui qui correspond le mieux au profil de mon entreprise – toutes ces questions m’auraient pris des heures si j’avais dû compiler manuellement ces informations.

Conclusion

Nous avons introduit l’utilisation de l’API REST de la plateforme Kairntech avec un exemple simple : Envoyer un fichier texte à un modèle d’extraction d’entité donné et renvoyer les résultats de l’annotation sous forme de tableau Excel CSV. Veuillez consulter le code complet ici afin d’avoir un exemple fonctionnel (les extraits ci-dessus ne présentent que l’approche de haut niveau).

Notre client suggéré répond déjà à un large éventail de cas d’utilisation : En utilisant le modèle approprié, on peut maintenant envoyer des documents sur des essais cliniques et générer automatiquement un tableau Excel indiquant quels médicaments sont étudiés pour quelle maladie ; ou en travaillant sur des appels d’offres publics, on peut générer un tableau indiquant quand quel type de projet et quel volume de contrat est dû ; ou en travaillant avec des factures, quel montant a été payé et à quel destinataire.

Comme mentionné au début, le scénario sélectionné ici ne sert que d’exemple d’utilisation potentielle de l’API. Veuillez nous faire part des autres scénarios que vous avez en tête. Veuillez également noter que l’API est en développement constant. Au moment où nous écrivons ce petit tutoriel, nous finalisons la prochaine version de l’API qui proposera également des appels à la catégorisation des documents et de plus en plus de fonctionnalités seront ajoutées dans un futur proche.