NLP avec Tensorflow: Analyse de sentiments

Amal Laouaj Nozieres
7 min readAug 5, 2020

--

Natural Language Processing ou traitement automatique du langage est le domaine de l’intelligence artificielle qui permet à la machine de comprendre notre langage humain et même de répondre à nos requêtes en langage humain. Nos commentaires sur Twitter ou Facebook peuvent avoir des nuances de sarcasmes et d’ironie et ce qui est formidable c’est que nous pouvons entraîner notre algorithme à les reconnaître. Avec les librairies Tensorflow de google, ceci devient possible en quelque lignes de code et gratuitement. N’est ce pas extraordinaire?!

Photo by Andy Kelly on Unsplash

Dans cet article, nous allons voir l’une des premières étapes de la compréhension du langage. Nous allons classifier des avis de films de la base de données IMDB. Tensorflow intègre une base de données de commentaires qui proviennent du site IMDB. Les commentaires sont déjà nettoyés et pré-traités et donc prêts à être utilisés. Ils ont été labellisés c-à-d qu’à chaque commentaire de la base de données nous avons un booléen associé : 0 ou 1 qui correspondent à avis négatif ou positif respectivement.

Commençons le code:

Charger les librairies et la base de données

Maintenant on sépare les données en une partie pour entraîner l’algorithme et une partie pour le tester. Donc l’algorithme ne verra que ce qu’il y a dans la partie pour l’entraînement. Toutefois il ne faudra pas oublier d’appliquer les mêmes modifications et traitements aux deux parties de la base de données pour que les prédictions de notre algorithme restent cohérentes.

Ici nous divisons en moitiés égales.

Voici un exemple d’avis et de sa labellisation

training_sentences[0]
'b"This was an absolutely terrible movie. Don\'t be lured in by Christopher Walken or Michael Ironside. Both are great actors, but this must simply be their worst role in history. Even their great acting could not redeem this movie\'s ridiculous storyline. This movie is an early nineties US propaganda piece. The most pathetic scenes were those when the Columbian rebels were making their cases for revolutions. Maria Conchita Alonso appeared phony, and her pseudo-love affair with Walken was nothing but a pathetic emotional plug in a movie that was devoid of any real meaning. I am disappointed that there are movies like this, ruining actor\'s like Christopher Walken\'s good name. I could barely sit through it."'
training_labels[0]
0

Maintenant que nos sets de données sont prêts, nous pouvons traiter les mots puis les phrases pour que ce soit dans un format d’entrée à un réseau de neurones.

Comment décomposer les mots et les phrases?

Tokenisation

La tokenisation est la découpe du texte en unité élémentaire — des tokens. Dans notre cas, vu que les données sont en anglais. Nous allons parcourir le texte et les séparer suivant les espaces en petites unités, ici ce sera les mots. Dans Tensorflow, lors de la tokenisation, chaque mot est attribué à un nombre, suivant la récurrence de ce mots dans notre texte et non dans le langage en général. Donc, les mots que la machine va rencontrer le plus souvent seront attribués aux premiers nombres. A la fin de la tokenisation nous obtenons un dictionnaire de tous les mots de notre texte avec leur association nombre.

Avant d’écrire le code de la tokenisation, nous allons stocker tous les paramètres qui nous permettront par la suite d’ajuster notre réseaux de neurones. Je les présenterai au fur et à mesure du code.

Voici le code pour faire la tokenisation:

Nous initions un objet de la classe Tokenizer puis nous appliquons la fonction fit_on_texts qui parcourt le texte et associe à chaque token-mot un nombre selon sa récurrence dans le texte. Donc à la fin word_index est notre index de mots et leurs identifiants nombres.

Séquençage

Le séquençage est l’étape suivante. Nous parcourons le texte et nous remplaçons chaque mots par son identifiant nombre et nous stockons le tout dans l’ordre de la phrase dans des vecteurs ou liste de nombre. Si le mot rencontré n’est pas connu, nous le remplaçons par ‘OOV’ Out Of Vocabulary — en dehors du vocabulaire ou ‘UNK’ Unknown — inconnu.

Dans Tensorflow nous appelons la fonctions texts_to_sequences sur nos deux sets de données et stockons la séquence de nombres

Padding ou le remplissage

Nous disposons maintenant de séquence qui sont donc des matrices de différentes tailles. Le réseau de neuronnes n’acceptent pas cette différence de taille et donc nous devons procéder à une normalisation des tailles; ceci simplement en rajoutons des zéros au début ou à la fin du vecteurs. Selon le paramètre cité au-dessus trunc-type = ‘post’ nous allons rajouter ou remplir les vecteurs en rajoutant les zéros à la fin des vecteurs de manière à avoir tous les vecteurs qui font la longueur de la phrase ou séquence la plus longue.

Maintenant que nous avons traduits les mots en nombres et stockées dans des matrices de même taille comment saisir le contexte dans lequel sont utilisés les mots et donc comment comprendre la signification du mot et surtout de la phrase?

Plongements de mots ou Word Embedding

La solution est le cœur de ce merveilleux domaine. Elle consiste à donner à chaque mot un vecteur. Nous regroupons les vecteurs par distance entre eux. Nous pouvons utiliser la distance euclidienne. Par la suite nous regroupons les vecteurs par distance et créons des groupes de sens. Ainsi ‘pomme” et ‘poire’ doivent être dans le même groupe de mots ‘fruits’. Aussi les contraires sont représentés par des vecteurs opposés -angle 180 de même taille.

L’un des inconvénients de cette méthode est la qualité du texte. Si par exemple nous entraînons notre algorithme sur des données récoltées dans le web, nous pouvons apprendre à la machine du sexisme ou du racisme. Par exemple pour un nom commun qui va apparaître plusieurs fois comme étant un méchant ou un mauvais caractère va être stocké comme tel. Ainsi un algorithme, sans intervention humaine, à la phrase

“ L’homme est docteur et la femme est …”

la machine répond “infirmière”.

L’intervention de celui qui code est primordial dans ce cas. Mais ce n’est pas le sujet de cet article.

Dans tensorflow le embedding ou le plongement de mot est disponible de façon dynamique comme première couche de traitement.

Notre modèle -réseau de neurones

Écrivons un modèle très simple qui pourrait servir comme modèle de référence à améliorer. Nous commençons par une couche de Embedding, suivi d’un Flatten pour aplatir et mettre tous les neurones sur une seule lignes et enfin deux couches de Dense de neurones interconnectés. Nous appliquons la fonction sigmoid (1/1+e-x) au dernier nœud pour calculer la probabilités que l’avis soit négatif ou positif. Plus la probabilité se rapproche de 1, plus l’avis est positif. Nous pouvons définir un seuil, ici j’ai choisi au dessus 0.7 pour déterminer les avis positifs.

voici le sommaire de notre réseau de neurone

Entrainement du modèle

Notre réseau de neurones ou modèle est prêt à recevoir nos données.

A la fin de l’entraînement nous avons une précision de 80% sur les données de test jamais vues par le modèle. Ce qui n’est pas trop mal mais vu que la précision est de 1 sur les données d’entraînement, c’est que notre modèle est en sur-apprentissage c-à-d qu’il colle trop parfaitement à la distribution des données de l’entraînement pour être flexible pour les nouvelles données mais qu’importe le but de cet article était de développer un réseau de neurones rapidement. Testons le avec nos propres commentaires en anglais forcément.

Prédictions

et voici les résultats

Review:I loved this movie. sentiment:[0.7176274]

Review:This film is so boring. sentiment:[0.52462786]

Review:This movie is so hilarious. I had a really great time! sentiment:[0.83763087]

Review:Very linear scenario, no surprises at all sentiment:[0.8178184]

Review:Another amazing addition to the franchise with good story arcs and standalone episodes. sentiment:[0.6473206]

Review:Not for the hardened not even the casual fans. sentiment:[0.96109796]

J’ai rentré 6 phrases et à la fin nous remarquons que 2 phrases n’ont pas été classées correctement. Après plusieurs tests, on voit que le modèle arrive assez bien pour les phrases claires mais se trompe dans les tournures de style comme ‘Very linear scenario’ . Le programme ne détecte pas qu’un scénario linéaire est mauvais mais globalement il a des résultats corrects pour un jet de quelques lignes de code.

Conclusion

Dans cet article nous avons vu les bases du traitement automatique du langage et grâce à Tensorflow avons écrit un simple code en quelque lignes pour prédire la classification des avis.

Si cet article vous a inspiré, n’oubliez pas de l’applaudir.

--

--

Amal Laouaj Nozieres
Amal Laouaj Nozieres

No responses yet