top of page
Bruno Guimaraes

Détection d’expressions de tonalités-sentiments dans un document avec un algorithme de NER

Comment nous utilisons un algorithme de NER pour extraire des expressions de tonalités dans nos projets clients

Introduction

La tâche de classification de la polarité (sentiment) d’un document est une tâche standard et largement connue dans le milieu du NLP. Elle s’inscrit dans divers cas d’application et dans plusieurs domaines (études de satisfaction, détection de contenus offensant dans les réseaux sociaux…). On aborde classiquement ce problème de “Sentiment Analysis” ou bien “Opinion mining” par un classifier binaire (Positif, Négatif) ou multi-classes (Positif, Négatif, Neutre). Cette classification peut être :

  • Simple : on transforme les textes en vecteurs avec des méthodes classiques (CountVectorizer, Tf-Idf, …) suivi d’une régression logistique, SVM…

  • Avancée : on utilise des techniques de deep learning pour encoder et classer les textes conjointement (en utilisant la librairie transformers de Hugging Face par exemple). Ce genre de méthodes permet d’exploiter les informations contextuelles des textes traités afin d’améliorer et affiner encore plus la qualité de la classification (contrairement aux techniques “simples” qui traitent les mots de façons indépendantes).

Contexte

Or, chez La Javaness R&D, on a décelé des besoins plus avancés :

  • Situer exactement ce qui est positif et ce qui est négatif dans un document à des fins d’études, d’amélioration d’expériences clients ou d’utilisateurs.

  • Décliner les sentiments en tonalités afin d’enclencher des actions (positif en Satisfaction ou Joie, négatif en Insatisfaction, Colère, Agressivité…)

  • Situer dans le document les passages positifs, négatifs, ou porteurs de tonalité

  • Déterminer quand c’est possible les causes qui ont engendré ces tonalités

Et ce afin d’être plus fins dans la compréhension du message, et donc dans les actions à déclencher. Exemple : Mon conseiller est très aimable, mais je suis quand même très inquiète que mon dossier n’ait toujours pas été traité - Analyse de sentiment : neutre ou légèrement négatif. - Avec une analyse plus fine : satisfaction sur la relation humaine, et inquiétude causée par le délai de traitement.

Une solution pour déterminer ce qui donne une caractéristique positive ou négative d’un document serait de coupler le classifier classique à des techniques d’interprétation (Shapley Values, Saliency maps) afin de comprendre ce qui a fait pencher la décision de l’IA vers une prédiction ou une autre (et donc par la même occasion, situer ces éléments décisifs dans le document).

Situer exactement ce qui est positif et ce qui est négatif dans un document”

Cependant, l’approche que l’on a choisi d’explorer est d’utiliser un “Sequence tagger” (NER) pour effectuer cette tâche. Ce choix nus permettra de :

  • Localiser et classer chaque token d’un document.

  • Avoir plus de flexibilité dans la déclinaison de sentiments en tonalités (le nombre de classes du sequence tagger)

  • Lier précisément les expressions de tonalités à des causes (éléments déclencheurs de tonalités)

N.B 1: On peut aussi résoudre ce problème avec une classification multi-labels, mais cela ne permettra pas de situer la tonalité exactement dans le texte.

N.B 2 : Dans cet article, nous nous focaliserons seulement sur le modèle de détection et classifications des tonalités et nous n’aborderons pas le modèle de classifications de causes (nous l’avons néanmoins mentionnés car ce modèle a influé sur nos choix et décisions sur les règles d’annotations)

Étude des datasets disponibles

La première phase de cette étude a débuté par la détermination du dataset d’entrainement sur lequel on va se baser. On a concentré nos recherches et nos études sur ce que comporte l’existant concernant un dataset d’émotion/tonalité :

  • Le plus gros dataset et celui utilisé pour le benchmark des diverses solutions sur cette tâche est GoEmotions, constitué de 58k textes anglais issus de Reddit et construit par Google répartis en 27 classes : admiration, amusement, anger, annoyance, approval, caring, confusion, curiosity, desire, disappointment, disapproval, disgust, embarrassment, excitement, fear, gratitude, grief, joy, love, nervousness, optimism, pride, realization, relief, remorse, sadness, surprise.

  • Un autre dataset existant est “Sentiment analysis in text” de CrowdFlower. Ce dernier compote 40k tweets répartis en 13 classes différentes : Tristesse, enthousiasme, neutre, vide… or l’origine des tweets et des annotations sont inconnues.

  • Créé par la Swiss National Center of Competence in Research, ISEAR est un dataset qui prend la forme d’une sorte de compte rendu écrit d’entretien avec des sujets (7600 instances/phrases ) qui s’expriment sur des expériences passées ainsi que leur ressenti. Ce dataset contient pleins de metadata concernant le sujet (Age, sexe, religion, nationalité, la tonalité prise par le sujet quand il parlait). Et notamment un label émotion parmi sept. C’est le dataset le plus fiable vu que l’annotation a été faite par des psychologues.

  • CARER, un dataset de messages twitter répartis en 8 emotions : anger, anticipation, disgust, fear, joy, sadness, surprise, and trust.

Certes tous ces datasets (pris indépendamment ou bien en les combinant) constituent une grande volumétrie de données et nous éviteraient de passer par une annotation qui serait lourde et très couteuse. Or tous ces datasets sont en Anglais, cela impliquerait qu’il faudrait passer par une API de traduction Anglais-Français avant de pouvoir les utiliser. Mais cela risque de “casser” les contextes, mal traduire des expressions ou bien des tournures de phrases qui sont à priori primordiales pour la determination des émotions contenues dans les textes. En outre, ces annotations représentent quelques fois des erreurs (Learn bad labels — Dataset — calmcode ) ou des flous dûs à la nature subjective de la tâche (un texte peut être annoté de différentes manières selon la compréhension propre de l’annotateur).

En ce qui concerne des datasets en Français, les participants à la tâche 2.2 du DEFT 2015 (un atelier annuel d’évaluation francophone en fouille de texte qui consistait à la Classification fine des tweets : Identification de la classe spécifique de l’opinion, sentiment ou émotion) avaient pour objectif d’identifier la classe de l’opinion, sentiment ou émotion parmi 18 classes : COLÈRE, PEUR, TRISTESSE, DÉGOÛT, ENNUI, DÉRANGEMENT, DÉPLAISIR, SURPRISE NÉGATIVE, APAISEMENT, AMOUR, PLAISIR, SURPRISE POSITIVE, INSATISFACTION, SATISFACTION, ACCORD, VALORISATION, DÉSACCORD, et DÉVALORISATION. Mais l’impossibilité d’obtention du dataset (tweets datants de 2015 impossible à récupérer avec un compte Developer Twitter Standard) a fait que l’on a abandonné cette piste.

Pour toutes ces raisons, on a opté pour la constitution d’un dataset en partant de zéro et de l’annoter nous même pour être sûr de sa qualité et de la cohérence entre le dataset et les besoins clients recueillis. On a commencé par scrapper les avis Google maps (en utilisant ce repo comme base de notre scrapper) de plusieurs agences de service publiques : Pôle Emploi, la CAF, La Poste, Centre des finances publiques… On a aussi récupéré des tweets sur les pages des relations clients de ces mêmes organisations ainsi que des avis sur le site Truspilot.com.

Annotations

À l’aide d’Annotto, notre outil d’annotation à La Javaness R&D, nous avons annoté près de 1000 textes. Le guide d’annotation et les consignes d’annotations ont été définies et enrichies au fur et à mesure de la phase d’annotation avec pour but de : trancher sur les points d’ambiguïtés / doutes et pour permettre de mener à bien les phases de modélisations ultérieures ainsi que couvrir un panel assez large de possibilités que nos clients seraient susceptibles de rencontrer dans leurs divers cas d’usage.

On a pensé à une approche de type Relation-NER : annoter causes et tonalités comme des entités séparées et les lier à l’aide d’un lien de causalité. Or nous avons observé que ces entités sont le plus souvent indissociables (par la manière dont le message a été formulé) ce qui rend cette approche impossible à mettre en place.

C’est pour cette raison que l’on a annoté “le plus large possible” : il faut que la tonalité soit annotée avec la cause qui l’a engendrée dans le même span. En incluant les ponctuations car elles sont de forts indicateurs sur la tonalité à détecter.


Annotation des tonalités : On annote la cause dans le span de tonalité pour que la classification de cause soit possible.



Projet Causes : exemple d’item à annoter

Caractéristiques du dataset La Javaness R&D


split de 75%/ 12.5% / 12.5%


Les textes (pour la plupart des avis Google maps) sont relativement courts.


Taille des séquences dans le set de train


Certains textes ne contiennent pas de tonalités (negative samples) afin de permettre au modèle d‘apprendre également à reconnaître les cas où on n’a pas de tonalité.


training set nettoyé, annonymisé et labellisé


Le dataset final comprend 10 classes assez générales et qui convient à la majorité des cas rencontrés dans notre dataset.


distribution des classes dans le training set


Modélisation

Métrique d’évaluation

Habituellement pour une tâche de NER, on évalue les performances du modèle avec le f1 score calculé sur la base du “true” et “pred” spans à trouver.


– Comment délimitons-nous un span ?

C’est ce que l’on appelle dans les tâche de NER : le schéma de tagging. Le schéma le plus utilisé est IOB :(abréviation de Inside, Outside, Beginning). Il a été introduit par Ramshaw & Marcus dans ce papier. Le préfixe B- avant un tag (par exemple B-Adresse) indique que le token associé marque le début d’un span Adresse et I-(par exemple I- Adresse) indique que le token associé se situe au milieu d’un span Adresse. En ce qui concerne les tags qui n’appartiennent à aucun span, le tag associé est O.

N.B : Un autre schéma fréquemment utilisé est le BIOES (E : End, S : Singleton) mais on n’a utilisé que le BIO dans ce projet. – Illustration :



  • Si on prédit la totalité des 5 tokens (token = entité textuelle située entre deux espaces), alors la prédiction est juste.

  • Sinon, la prédiction est fausse (si on rate un token ou qu’on en prédit un en plus dans le span)

Cette évaluation dite “entity-level” est trop stricte pour la tâche que l’on veut accomplir. En effet, un span d’émotion n’est pas aussi bien défini/délimité qu’un span d’adresse ou un span de numéro de téléphone…

Exemple d’annotation


Exemple de prediction


L’exemple ci-dessus l’illustre bien, on pourrait bien annoter de la première manière tout comme la seconde sans être dans l’erreur dans les deux cas. Et on ne voudrait pas non plus pénaliser sévèrement le modèle s’il n’arrive à détecter qu’une partie d’un span de tonalité (ou inversement, des tokens en plus)

Dans cette optique, on effectue une évaluation des spans au niveau des tokens (“token-level”) et pas au niveau de l’entité (groupe de tokens tagués) comme cela est fait habituellement.

En outre, pour palier le problème des limites floues des spans à détecter, le calcul des performances est fait en ignorant les préfixes B- et I-.

– Illustration en reprenant l’exemple précédent :


TP = 4, FP = 0, FN = 5 => Precision = 1, Recall = 4/9= 0.44, F-score= 0.61 Alors qu’avec le schéma d’évaluation standard (au niveau de l’entité) :


F-score = 0 N.B : Dans le calcul des scores globaux (micro et macro), on va exclureles scores de la classe “O” car les inclure “gonflerait” les scores vu la prépondérance des mots labellisés “O”.


Le nombre de tokens (mots) associé à chaque label dans le dataset de train


Cela se traduit par : On n’évalue pas nos modèles sur leur capacité à discerner entre ce qui appartient à un span de tonalité ou pas (mais par contre, le mix entre tonalités n’est pas toléré).

Conclusion

Nous voici arrivé à terme de la première partie de cet article, nous avons :

  • introduit le contexte général et les motivations derrière cette initiative de La Javaness R&D.

  • ensuite exposé nos recherches préliminaires sur les données à utiliser et pourquoi on a choisi de partir sur un dataset personnalisé.

  • abordé notre méthode d’annotation et pourquoi on a choisi d’annoter de la sorte.

  • montré des exemples du dataset constitué.

  • enfin parlé de la métrique d’évaluation adaptée adoptée pour notre problème d’extraction d’entités “non normées”.

Dans la partie II, nous aborderons la modélisation, l’entrainement et l’évaluation des performances du modèle entraîné.

References

  • GoEmotions: A Dataset of Fine-Grained Emotions

  • DENS: A Dataset for Multi-class Emotion Analysis

  • Text‐based emotion detection: Advances, challenges, and opportunities

  • EmoBank: Studying the Impact of Annotation Perspective and Representation Format on Dimensional Emotion Analysis

  • ADVANSE: Sentiment, Opinion and Emotion Analysis in French Tweets

  • A Survey on Sentiment and Emotion Analysis for Computational Literary Studies

  • CARER: Contextualized Affect Representations for Emotion Recognition

  • ABSApp: A Portable Weakly-Supervised Aspect-Based Sentiment Extraction System

Remerciement

Merci à nos collègues Nhut DOAN NGUYEN and Paul DUMAITRE pour la revue de l’article.

A propos de l’auteur

KILANI Al Houceine est data scientist à La Javaness depuis octobre 2020.




4 views0 comments

Comments


bottom of page