Analyse des tweets avec LUIS

“Sniffe le réseau” est un des trois projets de Hacking Industry Camp 2017 qui comptait des super-héros de Versusmind. L’objectif de notre équipe était de détecter des pannes de courant à partir des messages sur des réseaux sociaux et y répondre de deux façons :

  • proposer une assistance personnalisée aux utilisateurs concernés via notre chatbot ;
  • notifier des techniciens en leur proposant une carte avec les messages géolocalisés pour mieux visualiser les problèmes de réseau.

Vous trouverez la description complète du projet dans le billet de blog précédent.

Ce billet présente comment l'analyse des tweets est effectuée sur le projet, à l'aide de la technologie LUIS (Language Understanding Intelligent System) de Microsoft. Après une rapide présentation rapide du service et ses capacités, je vous présenterai comment s'en servir pour l’analyse des tweets afin de détecter les messages parlant d’un problème de courant. Enfin, je ferai le tour des questions que l’on peut se poser lors de la mise à l’échelle des projets utilisant LUIS.

Pourquoi utiliser LUIS ?

“Ah, il fait tout sombre ! Je n’ai plus de courant chez moi !”
“C’est quoi cette panne d’électricité ? “
“C’est juste chez moi qu’il n’y a plus de jus ou tout le monde est coupé ?”
“Blackout total à Neudorf !”

Tous ces messages peuvent être résumés au fait que les personnes concernées sont privées d’électricité. Toutefois, cette information est exprimée de quatre façons différentes et la liste est loin d’être exhaustive. Comment alors repérer ces messages parmi tant d’autres et détecter les pannes de courant ?

Vous pouvez me répondre : mais c’est évident, sur Twitter, on va détecter les hashtags ! Euh, c’est bien beau, mais comment prédire tous les hashtags possibles et imaginables qu’une personne peut associer à ces messages ? Si l’on se concentre seulement sur quelques-uns les plus simples, comme #pannedecourant, #blackout, #plusdélectricité, on risque de manquer des messages et donc sous-estimer des problèmes de réseau.

LUIS est conçu pour répondre à cette problématique : le système analyse les phrases en langage naturel, sans dépendre de hashtags, et les classe par rapport aux catégories connues dans son modèle. Ces catégories sont appelées intentions. En effet, on communique avec des autres avec une ou plusieurs intentions, par exemple dans les messages ci-dessus, on veut à la fois :

  • signaler le problème de courant électrique (tous les messages) ;
  • se renseigner (les messages 2 et 3) ;
  • exprimer éventuellement son désarroi.

Pour le projet “Sniffe le réseau”, la première intention est essentielle. Il faut donc focaliser le modèle LUIS sur la détection des messages qui signalent des pannes de courant.

Comment faire fonctionner LUIS ?

La mise en place d’une application LUIS est relativement simple : il faut créer un compte Microsoft et un compte LUIS. La politique de facturation de LUIS permet de tester et d’utiliser quelques applications gratuitement tant que le trafic n’atteint pas 10 K transactions par mois ou 50 transactions par seconde.

Ensuite, il faut créer une nouvelle application pour le projet et l’aventure commence !

Il est important de renseigner la langue, et plus précisément, la culture de l’analyse. La notion de la culture s’illustre bien sur l’exemple du français de la France et du français du Canada : les mêmes mots peuvent avoir un sens différent et il existe des expressions particulières qui peuvent influencer le modèle. A noter que la première version de LUIS est disponible pour seulement une douzaine de langues.

Une nouvelle application est créée. Voici son tableau de bord :

L’application contient déjà par défaut une intention sur 80 possibles.

Intentions et entités

Intentions et entités sont les éléments essentiels pour LUIS. On peut remarquer la présence des onglets dédiés dans le menu.

Intention “None”

Dans la rubrique “Intentions”, il existe par défaut l’intention “None” (aucune) qui n’a pas encore d’énonciations (utterances) associées.

Cette intention est très importante : elle permet de classer tout le bruit qui viendra perturber le modèle. En effet,dans l’ensemble de messages qui seront analysés avec LUIS, il y a aura seulement une partie à retenir. Pour cette partie de messages, je vais créer l’intention “signaler_blackout”. Le reste des messages devra être classé dans la première intention “None”.

Création d’une intention

L’intention “signaler_blackout” fraîchement créée ne contient aucune énonciation. Je vais donc y ajouter la première de mes quatre phrases exemples.

Une fois j’appuie sur “Enter”, LUIS essaie de prédire l’intention pour cette phrase.

Etant donné que je n’ai pas encore entraîné le modèle, LUIS ne peut pas classer cette phrase. Je vais l’aider au début et indiquer qu’il s’agit de l’intention “signaler_blackout” en appuyant sur sauvegarder.

Maintenant, je peux essayer d’entraîner le modèle dans l’onglet Train&Test. Une fois l’entraînement terminé (quasi instantané), je peux tester le modèle en mettant un énoncé, par exemple, un bout de notre phrase de départ :

On voit que le modèle contient bien l’exemple et y assigne le taux de confiance de 99%.

Toutefois, que se passe-t-il si l’utilisateur a employé un synonyme à la place de “courant” ?

Le taux de confiance baisse et LUIS ne sait pas à cette étape qu’il s’agit des synonymes.

Ajout des entités

Pour lui fournir cette information, je vais créer une entité regroupant les mots “courant” et “électricité”.
Pour cela, il existe l’onglet “Entities”. Je crée une entité propre à notre projet (“Custom entity”) et sélectionner le type List.

Ce type d’entités permet de définir une forme canonique et y associer des synonymes. Il existe d’autres types d’entités : des mots simples (par exemple, “blackout”), des entités composées qui regroupent plusieurs entités simples ou des listes, et des entités hiérarchiques qui organisent les mots en super-classes.

Maintenant, je vérifie que l’entité est bien repérée. Pour cela, je vais dans l’intention “signaler_blackout” et y ajoute ma deuxième phrase exemple :

La phrase est bien associée à l’intention “signaler_blackout” et l’entité est en place. Pour LUIS, cela signifie que les phrases “C’est quoi cette panne de courant ?” et “C’est quoi cette panne d’électricité ?” sont identiques. Et si l’utilisateur fait une faute de frappe et saisit “electricité” ?

Il faut noter que les variantes graphiques et les fautes sont à prévoir et à renseigner dans les entités, ce qui peut être fait au fur et à mesure.

Entraîner le modèle

Bien que les taux de confiance soient hauts à ce moment, il faut se rappeler que le modèle contient une seule phrase pour “signaler_blackout” et zéro pour “None”.

Pourquoi entraîner l’intention “None”

Voici les conséquences de ce modèle très pauvre et mal équilibré :

La structure de la phrase “je n’ai plus de fromage chez moi” est très proche de ma phrase d’entraînement “je n’ai plus de courant chez moi” et le système se sent à l’aise pour les classer dans la même intention. La deuxième phrase “il y a un grand chat sur ma fenêtre” classée dans cette intention est la conséquence directe de l’absence d’exemples pour l’intention “None”. La troisième phrase,  “J’ai vu un gars partir en courant”, illustre le cas de la polysémie où un mot, dans notre cas “courant”, peut avoir plusieurs sens.

Pour améliorer le modèle, il faut ré-assigner ces trois phrases à l’intention “None” et relancer l’entraînement.

Repérer des cas problématiques et ajuster le modèle

Après l’entraînement du modèle sur les 6 phrases (3 par intention), l’amélioration des résultats est évidente :

LUIS a bien repéré l’entité dans le premier exemple et a associé des taux de confiance très hauts aux phrases du modèle. Quant à l’intention “None”, le modèle contient maintenant les contre-exemples :

Si je reteste notre cas problématique avec le mot “courant”, la phrase “il est parti en courant” est bien classée parmi les non importantes :

Le travail sur le modèle pour LUIS est constitué des cycles où on ajoute des phrases dans les intentions, les mots dans les entités et on teste. Après, on ré-assigne les phrases mal classées et on ré-entraîne le modèle.

Quel effort pour avoir une application qui marche ?

Le modèle de LUIS créé pendant le hackathon #HIC2017, s’est montré efficace pour le projet d’analyse des tweets. Après des cycles d’entraînement, le repérage des messages pertinents était bien efficace (tous les tweets envoyés par l’équipe ont été bien captés par LUIS).

Les moyens mis en oeuvre ont été assez modestes :

Tout comme dans l’exemple ci-dessus, l’analyse a été menée par rapport à l’intention “signaler_blackout” et quelques entités. Au total, le modèle a été entraîné sur 135 tweets.

Il faut noter que la qualité du modèle dépend de sa capacité d’éliminer le bruit. Pour cela, il faut fournir des phrases exemples, mais surtout des contre-exemples (plus de 80% de phrases pour l’intention “None” dans le modèle).

Evidemment, lorsque l’on sort du cadre d’un hackathon, cette quantité de données d’entraînement risque de ne pas suffire.

Mise à l’échelle : les questions à se poser

Pouvoir analyser et classer les contenus rédigés en langage naturel peut apporter plusieurs avantages pour le business : une meilleure interaction avec les clients, une meilleure recherche dans le catalogue des produits, une analyse des sentiments et une réactivité sans précédent en cas de crise. Toutefois, le passage à l’échelle industrielle nécessite nettement plus d’efforts qu’une application pour un hackathon.

Je voudrais évoquer dans ce billet les points positifs de LUIS, mais aussi quelques questions à se poser avant d’opter pour cette technologie.

Points forts de LUIS

L’avantage principal de LUIS à mes yeux est la simplicité de la création d’une application pour des tâches simples. Les interfaces (disponibles uniquement en anglais à ce jour) sont bien pensées et les explications sont généralement suffisantes.

Un des points forts de LUIS est la suggestion des phrases analysées (par exemple, à partir d’un flux de tweets) pour les prendre en compte dans l’ajustement du modèle. Cela évite de les stocker ailleurs et recopier à la main.

De plus, il existe de nombreuses options d’importation/exportation des listes des entitées, des données passées par une appli LUIS, voire d’applications entières en Json.

Pour un développeur, il est possible d’exploiter des intentions fournies par LUIS pour les inclure dans une chaîne de traitement (mais cet aspect sera traité dans un billet de blog à part).

Limites du nombre d’intentions et d’entités

Une application LUIS est limitée à 80 intentions et à 30 entités qui peuvent, certes, être organisées en hiérarchies. Dans la foire aux questions de LUIS, on retrouve la recommandation d’éviter des intentions trop proches (par exemple, réserver un vol international et réserver un vol national). Ils suggèrent aussi de créer une séquence d’applications LUIS où l’application d’entrée catégorise les phrases par rapport à des intentions génériques, pour ensuite les renvoyer vers des applications LUIS plus spécialisées.

En outre de la question des coûts, ce mode de fonctionnement complique la gestion des entitées qui peuvent rester communes entre plusieurs applications. Un outil à part doit alors être développé afin de préserver l’harmonie des données.

Absence de gestion multilingue des entités

De même, si un projet a besoin de deux applications LUIS pour des langues différentes, la FAQ conseille de traduire une des applications exportée sous le format Json en l’autre langue (les phrases et les entités).

Bien évidemment, il sera difficile de coordonner l’évolution des deux applications dans le temps et un effort complémentaire sera nécessaire.

Comment faire si une des langues cibles n’est pas supportée ?

Si une grande entreprise internationale adopte LUIS, le problème de langues risque de se poser. En effet, LUIS couvre déjà douze langues et va certainement en supporter davantage. Toutefois, si le business d’une entreprise est concentré en Italie, en France et en Espagne, c’est dommage de ne pas pouvoir traiter l’espagnol par la même technologie que le français et l’italien. De plus, il faut tenir compte du coût des l’infrastructure lié au choix d’une technologie d’analyse linguistique.

Ces questions ne seront peut être plus pertinentes pour les futures versions de LUIS.

Conclusion

Le projet “Sniffe le réseau” m’a donné l’occasion de tester LUIS et je suis globalement satisfaite de cette expérience. User-friendly et efficace, ce système apporte une valeur ajoutée au projet en permettant de s’en passer des hashtags pour identifier les tweets importants.

Si ce billet vous donne envie de mettre les mains dans la farine, n’hésitez pas ! Plus d’une soirée amusante garanties :) On peut inventer plusieurs façon d’intégrer LUIS dans des applications existantes ou en créer des nouveaux usages.

Retrouvez les autres billets (architecture, chatbot, application mobile, carte en 3D, etc.) du projet “Sniffe le réseau” sur le blog de Versusmind !

Yuliya Korenchuk

Java EE, traitement automatique des langues (TAL) et technologies sémantiques