NLP en tensorflow: Ressusciter l’esprit de Baudelaire
Avez-vous déjà essayé d’écrire un poème ou continuer une prose? C’est l’une des tâches les plus complexes de notre esprit.
Dans cet article nous allons essayer d’entraîner notre modèle sur un recueil de poèmes de Charles Baudelaire “Les fleurs du mal” et voir si le modèle peut nous donner quelque vers dans l’esprit de la plume de Baudelaire.
Pour les concepts de base de traitement du langage, vous pouvez consulter mon précédent article ici.
Commençons à coder!
Après avoir importé les librairies et importé le recueil de poèmes “Les fleurs du mal” qui est disponible ici sur mon github, nous allons procéder à la tokenisation, le séquençage puis le padding.
Ensuite le sequencing et le padding:
Générer ou créer du texte est essentiellement une prédiction multi-classes. En effet, on crée notre corpus avec tous les mots existant dans le recueil de poèmes. L‘objectif’ de notre modèle est de prédire quel est le mot suivant dans la liste des mots du corpus. Une fois il a le premier mot, il recommence en alignant les mots à la suite des autres selon les probabilités qu’il a apprises du recueil. Facile non?!
Maintenant, que nous avons les mots dans un dictionnaire, nous sommes prêts à créer notre modèle(le cerveau apprenant de notre système). Nous allons partir sur un modèle assez simple pour voir comment les couches des tensorflow réagissent. Nous commençons par une première couche de neurones de Embedding. Pour rappel, la couche d’embedding permet d’associer à chaque mot un vecteur et en calculant la distance entre les vecteurs nous allons créer des paquets de vecteurs ou de mots qui ont le même sens ou employés dans le même contexte. Cette couche est assez efficace pour prédire des choses simples comme “L’herbe est …”, la réponse est “verte”. Mais des fois nous avons besoin de se rappeler d’information qui arrive en début du paragraphe ou du chapitre. Comment donc le modèle peut retenir ou garder en mémoire les choses importantes au fil du texte?
La réponse est: les Réseaux de Neurones Récurrents. Ce sont des réseaux de neurones très utiles pour toutes les données en séquence. Les séquences d’images dans une vidéo, la séquence de notes dans une partition ou la séquence de mots dans un texte.
Un neurone dans les réseaux de neurones récurrents est un neurone qui a une entrée Xt, une information cachée ht-1 et une sortie Yt, comme suit:
Le neurone multiplie l’entrée par un poids, rajoute un vecteur, fait la même chose pour la valeur cachée, applique la fonction d’activation qui dans ce cas est tanh et nous obtenons la sortie du neurone. L’explication en détail est disponible ici.
Lorsqu’on obtient notre vecteur Yt qui est notre prédiction, on peut le comparer assez facilement avec la réelle valeur. En minimisant cet écart, on maximise la précision de notre modèle. Pour minimiser une fonction, on a recourt aux dérivées partielles. Donc nous allons remonter les couches de neurones de la fin au début en minimisant l’écart. Le gradient, la dérivée partielle, devient de plus en plus petite et nous sommes confrontés au problème de la disparition du gradient. Pour palier à ce problème, nous changeons chaque neurone par un neurone LSTM Long Short-Term Memory.
Le neurone LSTM va prendre en plus de l’entrée et l’état caché, une autre variable qui est la mémoire de ce qui s’est passé avant. Et c’est là toute la beauté de la chose! Dans chaque cellule LSTM c’est comme si nous avions un mini réseau de neurones qui décide à l’instant t de ce qu’il va garder comme apprentissage et ce qu’il va oublier. N’est ce pas extraordinaire?!
Après cette petite parenthèse mathématique, revenons à notre modèle. Après la couche Embedding, nous rajoutons une couche LSTM qui parcourt dans les deux sens, ce qui a été dit et ce qui va être dit. Et on finit par une couche Dense.
J’espère que vous êtes aussi impatient que moi de voir ce que ce petit modèle peut créer comme poème.
Testons! Je commence par lui donner “L’amour” comme mot du début:
et voici la suite:
L'amour après s’être lavés au fond des mers profondes
aurore vives
païens morts dans la plus
plus ou de l’encre taciturne » »
de viennent quelque toujours cimetière il
mystique que la pendule enrhumée en leur esprits
que tu vous loue rose pour une pose étrange et gorge » vipères
pâme de morts
morts dans ta crinière funèbres
et pleine d’escargots funèbres
de mots » noire et l’onde blés
blés mange la pâme
des pâme des morts » —
pâme du vieux t il agathe
il agathe de front
pâlissant pâme sans bords
le pâme amour vipères
pâme dans cette pourriture
Essayons avec “La vie”
La vie impudente et criarde
beauté dites beauté noir et nu
» chère indolente deux blés
chère mange de froids
tissus blés imparfaite
analyse amère se se se voila pâme chère
se frayer se blés se cognant de morts
se blés souterraine imparfaite
se pâme se solennelle magie vipères vipères » mea
Même si le français n’est pas correct, dans toute cette création, il y a un trait poétique. La répétition de certains mots vient du fait que le recueil n’est pas assez conséquent. Mais dans l’ensemble, ce n’est pas trop mal pour un modèle qui s’entraîne en quelque minutes et qui fait à peine une dizaine de ligne de code. Cela pourrait même être une première version d’un poème à retravailler et à corriger pour que les vers aient plus de sens.
Conclusion
Tensorflow en quelque lignes nous permet de générer du texte et même garder l’esprit poétique sur-lequel il s’est entraîné. Chose que l’esprit humain peut trouver difficile à accomplir même après avoir lu toute l’œuvre poétique française. Le champ des possibles est très vaste et ceci est un bon début.
Si vous avez apprécié cet article, n’oubliez pas de l’applaudir!
N’hésitez à visiter mon code ici