NLP : Génération de texte par n-grams

Quand notre président a un coup dans le nez…

Françaises, Français, Mes chers compatriotes. Je veux ce soir remercier les services de sécurité intérieure par l'amélioration des mécanismes existants pour les contrôles frontaliers et douaniers dans les zones frontalières communes. À cet égard, une avancée significative a été réalisée en mars 2019 par la signature d'un accord cadre intergouvernemental visant à favoriser la coordination et l'harmonisation stratégique de leurs activités respectives dans le secteur public. Donc c'est en réflexion très active là ces jours ci. Réflexion très active ça veut dire quoi ? Ça veut dire que ce seront véritablement les normes les plus exigeantes et les moins polluantes. Là aussi, nous avons évidemment passé de nombreuses commandes nous importons. Nous avons la chance d'avoir plusieurs producteurs européens et en particulier lorsqu'elle ne leur assure pas tous les droits parce qu'ils vivent dans tel ou tel lieu de la République. C'est pourquoi, la stratégie qui est aussi ministre des cultes avec les préfets pour faire émerger des représentants aux niveaux départementaux un travail qui a commencé à le mettre en oeuvre dans chacun de nos pays. Ce qui m'inquiète c'est la maladie du chacun pour soi, si nous ne nous informons pas de ces mesures si nous ne sommes pas solidaires.

Vous l’avez peut-être compris, dans cet article nous allons générer automatiquement des discours.

Pour générer vos discours et tester l’algorithme, c’est possible ici : https://berangern.github.io/text_generation_react_app/ .

Nous allons nous intéresser à un concept de base du traitement de langage naturel (NLP) : les n-grams. Bien que cela soit un concept relativement simple à comprendre et à implémenter, il permet déjà de réaliser beaucoup de choses comme… des discours !

Mais avant tout, c’est quoi des n-grams ?

n-grams

Les n-grams sont des séquences de mots. Les unigrams sont des mots uniques, bigrams des séquences de deux mots, trigrams de trois mots et ainsi de suite.

Pour ce projet, nous allons nous intéresser aux modèles n-grams. Les modèles n-grams sont des modèles de langage, c’est-à-dire des modèles de probabilité de séquences de mots. En français, une séquence de mots est appelée “phrase”. Un modèle de langage permet de calculer P(“Mesdames, Messieurs les députés”).

Un modèle n-gram permet de modéliser chaque succession de mots par une probabilité. Par exemple, dans le cas d’un modèle bigram, la probabilité d’apparition d’un mot dépend du mot précédent : P(mot t|mot t-1), par exemple P(“Messieurs”|“Mesdames”) = 0,9.

Pour connaître ces probabilités, il suffit de compter. Compter le nombre d’apparitions de “Messieurs” après “Mesdames” et diviser ce nombre par le nombre d’apparitions de “Mesdames”. Soit P(“Messieurs”|“Mesdames”) = P(“Mesdames” -> “Messieurs”)/P(“Mesdames”).

Dans le cas de bigrams, l’information utile pour la prédiction du futur est entièrement contenue dans l’état présent du processus ; elle n’est pas dépendante des états antérieurs. Autrement dit, nous n’avons besoin que d’un mot pour prédire le suivant, c’est une chaîne de Markov.

Cela est vrai pour la probabilité qu’un bigram apparaisse (un mot suivi d’un autre mot). Mais qu’en est-il d’une phrase composée de plusieurs mots ?

Supposons que l’on ait la phrase “A B C”. En appliquant le Théorème de dérivation des fonctions composées (ou “Chain rule” en anglais, c’est quand même plus simple), on aura :

P(“A B C”) = P(“C”|”A B”)P(“B”|”A”)P(“A”)

Ceci est la théorie des n-grams. Dans un cas général, savoir que “B” apparaît 10 fois après “A” ne nous intéresse pas. Savoir qu’il apparaît dans 95 % des cas est déjà plus parlant . C’est pourquoi on préfère s’exprimer en probabilité plutôt qu’en quantité.

Cependant, dans cet exercice, pour des raisons de compréhension et parce que les probabilités en tant que telles ne nous intéressent pas, nous compterons simplement les occurrences sans calcul de probabilités et autres opérations (divisions, add-one smoothing…).

Données

Pour générer des discours, il nous faut apprendre des discours. Pour ce faire j’ai fait appel à mon ami Thomas (merci à lui !) qui m’a procuré un jeu de données contenant 600 discours d’Emmanuel Macron (il n’a pas chômé en effet).

Afin d’utiliser ces discours dans nos algorithmes, nous allons retirer la ponctuation.

Unigrams

Dans cette partie, nous allons générer un discours en utilisant des unigrams. C’est-à-dire que nous regarderons le dernier mot de la phrase pour deviner le mot suivant. Si l’on écrit “Mes chers”, le successeur le plus probable de “chers” sera sûrement “compatriotes”.

Pour connaître les successeurs probables de chaque mot, nous allons devoir apprendre à partir des discours d’Emmanuel Macron, puis créer le tableau suivant :

Pour connaître le successeur le plus probable de “chers”, il suffit de trouver la valeur maximale de la ligne encadrée en noir. Les valeurs du tableau correspondent aux occurrences des successeurs. C’est-à-dire que sur les 20 textes d’apprentissage, “chers” est suivi 10 fois de “compatriotes” et 2 fois de “je”.

La vérité, et vous le savez, c’est qu’un ordinateur ne connaît pas les mots mais seulement les nombres, les indices. Il nous faut donc attribuer un indice à chaque mot. Notre tableau unigrams-successeurs ressemblera plutôt à cela :

Nous avons remplacé les mots par leurs indices.

Les indices permettent d’accéder aux mots, ainsi unigrams[3]=“chers” et successeurs[4]=“compatriotes”.

Pour avoir cette correspondance mot-indice, nous avons besoin d’un tableau qui contiendra les mots et un dictionnaire qui contiendra les mots et leurs indices dans le tableau ; on aura alors dictionnaire[“mot”] = indice dans le tableau.

Il faut donc au préalable construire un word_to_index qui nous permettra d’accéder à l’index des mots (word_to_index[“successeur]=4) et un index_to_word pour connaître le mot correspondant à un index (index_to_word[4]=“successeurs”) :

Que fait la fonction create_word_index_unigram() ?

La fonction va parcourir les discours de notre ensemble d’apprentissage. Pour chaque mot nouveau, la fonction va l’ajouter dans un tableau (le vocabulaire) et lui assigner un indice qui correspond à sa place dans le tableau. Ainsi :

index_to_word[word_to_index[“bonjour]] = “bonjour”

Maintenant que nous avons transformé les mots en index, nous pouvons créer le tableau unigrams-successeurs :

La fonction create_unigram_matrix() va simplement créer le tableau unigrams-successeurs vu précédemment. L’essentiel de la fonction est contenu ici :

matrix[word_to_index[sentence[i-1]], word_to_index[sentence[i]]]+= 1

Pour chaque mot (sentence[i]), nous allons chercher son index (word_to_index) et ajouter 1 dans la matrix à la ligne word_to_index[sentence[i-1]] et colonne word_to_index[sentence[i]].

Si notre discours était “Mesdames, Messieurs, ça va ?”, il résulterait ce tableau :

START nous permet de savoir par quel mot commencer et FIN permet de savoir que la suite de mot est terminée . START et FIN ont besoin d’un traitement particulier, c’est pourquoi nous avons deux “if” dans la fonction create_unigram_matrix().

Si cela est compris, il ne reste qu’à appeler ces deux fonctions avec nos textes :

Je pense que la génération de discours commence à devenir évidente. Pour chaque mot, nous allons chercher son successeur dans unigram_matrix.

Comment fait-on pour choisir le successeur ? N’y a-t-il pas un risque de boucle infinie ?

En effet, pour choisir le successeur, on pourrait se contenter d’aller chercher le successeur le plus habituel (où le nombre d’occurrences est maximal dans la ligne des successeurs). En faisant cela, on tombe très rapidement dans une boucle. Pour éviter cette situation, je choisis un mot au hasard parmi les top 10 mots les plus probables ; s’il y a moins de 10 successeurs possibles, je choisis parmi les N successeurs (N<10).

La génération de discours est simplement une boucle qui va sans cesse chercher le successeur du mot précédent. Dans le cas des unigrams, nous avons des résultats de ce type :

madame la crise on ne pourront ainsi être à culture dans ce n'est donc qu'on va encore aujourd'hui en tout faire des Finances doit Europe J'ai tenu justement pour ça a eu aussi le ministre Covid 19 Tools ACT A ces dispositifs cela il avec les plus durement l'Afrique et République n'effacera aucune trace ni renforcées Elles sont autour du 1er janvier 2021 La Nouvelle Zélande nous aurons choisie systèmes mais reprendre frontières nos pays africains qui était bizarre ou telle somme C'est plan mondial que j'ai voulu lancer au long de partenaires doivent pouvoir fait Commission se multiplier par l'Union

C’est très moyen, et c’est normal car un unique prédécesseur ne permet pas de comprendre le contexte, la négation, le sujet. C’est pourquoi nous allons nous intéresser aux bigrams, c’est-à-dire que nous allons trouver un successeur à partir des deux mots précédents.

Bigrams

La logique reste la même que pour les unigrams :

  • Créer un dictionnaire
  • Créer une matrix bigram-successeur

A l’issue de ces deux traitements, nous aurons le tableau suivant :

La fonction create_word_index_bigram() va créer le dictionnaire et le tableau de bigrams dont voici un extrait :

word_to_index_bigram = {'START START': 0,
'END': 1,
'START Comme': 2,
'Comme chaque': 3,
'chaque 14': 4,
'14 Juillet': 5,
'Juillet nous': 6,
'nous nous': 7,
'nous rassemblons': 8,
"rassemblons aujourd'hui": 9,
"aujourd'hui autour": 10,
'autour de': 11,
...}
index_to_word_bigram = ['START START',
'END',
'START Comme',
'Comme chaque',
'chaque 14',
'14 Juillet',
'Juillet nous',
'nous nous',
'nous rassemblons',
"rassemblons aujourd'hui",
"aujourd'hui autour",
'autour de'
...]

La fonction create_bigram_matrix() va, comme son nom l’indique, créer le tableau de bigrams. Cette fois, c’est cette ligne la plus importante :

matrix[word_to_index_bigrams[sentence[i-1]+' '+sentence[i]], word_to_index_unigram[sentence[i+1]]] += 1

Avec chaque mot (sentence[i]), nous allons créer un bigram avec le mot précédent (sentence[i-1]+’ ‘+sentence[i]). En retrouvant l’indice de ce bigram et l’indice du mot suivant (sentence[i+1]), nous allons pouvoir ajouter 1 à la ligne d’indice du bigram et colonne d’indice du mot suivant.

Pour trouver le successeur, il nous suffit de regarder les mots d’occurrences maximales de la ligne d’un bigram.

Après “Mes chers”, “compatriotes” apparaît 10 fois dans l’ensemble des 15 discours d’apprentissage.

En répétant ce processus N fois, nous pouvons générer le discours suivant :

START START Un an après l'incendie dramatique qui a donné une triste image de notre Europe Cela passera par un plan bilatéral parce que les choses renforcer encore les financements Vous l'avez dit Madame la Présidente Nous tirons ce faisant toutes les règles c'est énorme Et puis la question du modèle économique durable plus fort de travailler et de notre accord franco allemand Je ne serai pas plus long Merci infiniment Et courage Merci END

Un sens général commence à se dégager de tout cela, mais nous pouvons aller plus loin en nous intéressant aux trigrams. Nous allons utiliser 3 mots pour prédire le successeur.

Trigrams

Je pense que le principe est compris maintenant. Pour les trigrams, nous allons créer ce tableau. Notez que le tableau successeurs[] n’a pas changé au cours des différents traitements ; on conserve le même ordre et les mêmes indices :

En relançant la génération de discours, nous obtenons le résultat suivant :

START START START Ce 8 mai ne ressemble pas à un truc pour l'année prochaine Et on va devoir mettre du sport de la culture et la ministre du Travail le ministre de la Culture aura l'occasion en détail de revenir à l'issue de cet échange par un point avec la presse sur tout ce qu'il a très bien rappelé le travail qui a commencé à être fait pour que le muguet du 1er mai cet esprit de concorde que j'ai demandé aux Présidents des deux chambres parlementaires et du Conseil économique social et environnemental de proposer quelques priorités susceptibles de rassembler le plus grand nombre de retourner travailler redémarrer notre industrie nos commerces et nos services Le Gouvernement préparera sans délai ces réouvertures avec les partenaires sociaux pour que des règles soient établies afin de protéger les salariés au travail C'est la priorité Les lieux rassemblant du public restaurants cafés et hôtels cinémas théâtres salles de spectacles et musées resteront en revanche fermés à ce stade Les grands festivals et événements avec un public nombreux ne pourront se tenir au moins jusqu'à mi juillet prochain.

Ensuite ?

On pourrait continuer, créer des quadrigrams, etc. Cependant, en utilisant des trigrams et 15 discours d’apprentissage, nous avons très peu de possibilités de successeurs. Par exemple, “on va devoir” n’a que 2 successeurs possibles : “mettre” et “sans”. Dans 95 % des cas, il n’y a qu’une seule possibilité. Pour augmenter les possibilités et l’intérêt de cet article, nous allons augmenter le nombre de discours d’apprentissage. A la fin de cet article, je mettrai un exemple de discours généré à partir de 100 discours d’apprentissage.

Améliorations

Pour améliorer ces algorithmes, nous pourrions :

  • Ajouter la ponctuation
  • Catégoriser les matrices par tag de discours (international, santé, économie…) afin d’éviter d’avoir un Emmanuel Macron qui parle du Sahel et du Covid dans la même phrase.
  • Utiliser des algorithmes NLP (CorEx, Bert ?) pour comprendre les sujets de chaque phrase pour qu’elles soient cohérentes.

Perles

Après l’effort, le réconfort, voilà quelques perles macroniennes :

La chance ne sourit qu'aux esprits bien préparés. Ces mots sont ceux de zones cycloniques.

Très poli Mr. Macron :

START START START Merci Peter merci à vous Monsieur le Professeur Monsieur le Recteur Mesdames Messieurs les ministres Mesdames Messieurs Monsieur l'Ambassadeur cher Frédéric et Madame merci de nous avoir acheminé et à monsieur le maire mesdames messieurs les élus Monsieur le PrésidentSTART START START Bonjour À toutes les personnes qui sont dangereuses Jusqu'à présent parce que notre droit n'était pas clair il y avait aussi la partie formation parce que nous savons et il y a un instant la chute du mur de Berlin tombait Et avec lui des divisions de notre continent européen qui a suivi les dernières années Ils ont été plus courageux que nous parce que quand l'un de nos hauts lieux de la mémoire nationale Soldats marins aviateurs morts pour la France ni pour l'Etat ni pour les cotisations sociales Les factures d'eau de gaz ou d'électricité ainsi que les

Apprentissage 100 discours

Plus nous apprenons de discours, plus les trigrams ont des successeurs possibles. Après apprentissage de 100 discours, le nombre de successeurs était le suivant :

array([[     0,      1],
[ 1, 243787],
[ 2, 15768],
[ 3, 4377],
[ 4, 1981],
[ 5, 991],
[ 6, 616],
[ 7, 385],
[ 8, 273],
[ 9, 212],
[ 10, 151],
[ 11, 122],...]

Dans 90 % des cas, l’algorithme n’a pas le choix et doit choisir l’unique successeur possible. Mais dans 10 % des cas (1 mot sur 10), plusieurs propositions sont possibles, ce qui nous permet d’avoir les sublimes perles que nous avons vues.

Après apprentissage, nous n’avons aucun problème pour générer des discours de 10 000 mots qui ne soient pas redondants :

START START START Bonjour à vous Bonjour Mesdames Messieurs Je suis heureux d'être parmi vous de vous retrouver On n'y est pas encore mais ça ne veut pas être stigmatisé à juste titre de trouver l'Etat français pour les accompagner en capital en activité pour que les forêts abritent 80 de la biodiversité et ce sont nos valeurs qui sont en silo et beaucoup de choses ont commencé à déserter parce qu'il y en a d'autres qui seront plus généreux mais on le fait On avait abandonné parfois ce raisonnement Et donc c'est un vrai mécanisme par solidarité Je crois que votre mère alors avait su vous accueillir Vous n'avez jamais gardé sic ce contact avec le public et en effet Et puis je prends votre exemple votre entreprise si elle marche moins bien demain vous allez passer dans le nouveau système Olivier BISCAYE animateur Monsieur le Président Alors on n'a pas le choix de l'Aveyron vous avez fait honneur à la France de son développement futur de sa transition écologique et de la sécurité civile de la Croix Rouge qui ont évacué la cathédrale sécurisé ses alentours mis les oeuvres à l'abri Envers les 340 000 donateurs du monde entier de mieuxSTART START START La propagation rapide de l'épidémie de COVID 19 a soumis les systèmes de refroidissement les climatisations et ce qui se travaillera avec les chambres on va regarder sur la base de ce à quoi elles sont confrontées aujourd'hui qu'il y ait de fatalité Et je veux que vous mesuriez cela et je voulais vraiment m'en excuser auprès de vous D'abord par courtoisie parce que vous avez dit en la matière mais nous devons agir aussi ensemble Nous ne pourrons pas répondre avec les cadres d'hier aux réalités d'aujourd'hui Le système commercial multilatéral fondé sur le droit où le recours à la force est ce que c'est une nécessité opérationnelle Parce qu'il n'y a plus les 26 de cotisation mais rien de ce qui fait que les Etats veillent à protéger évidemment leurs populations et particulièrement des jeunes générations dans les deux années à venir c'est notre ambition européenne La Commission européenne a très tôt su lever les règles qui leur permettent de continuer leur vie normale leurs activités Je veux aussi ce soir adresser mes félicitations républicaines aux candidats élus au premier tour évitant les frais d'un deuxième scrutin Votre record personnel à 69 des voix en 2008 témoigne d'ailleurs de votre mobilisation de votre part et si on ne sait pas on ne documente pas on n'évalue pas et donc l'investissement dans notre science sur le temps ensuite une réflexion sur le sens de l'article 5 et j'ai pu me rendre lors de mon déplacement en Argentine en 2018 au parc de la Mémoire à Buenos Aires redire aussi cette amitié et de ce rapport C'est comme le premier rapport du Giec il y a la troisième ligne celles et ceux que je viens d'annoncer ce soir cette inquiétude économique va évidemment s'accroître Nous n'ajouterons pas aux difficultés sanitaires la peur de la faillite pour les entrepreneurs l'angoisse du chômage et des fins de formation et d'entraînement et de consolider également la relation de défense et nos coopérants militaires pourraient en témoigner ce soir j'en suis sûr un souffle à la source permet d'aller dans ce sens collectivement après 2013 2014 pour des bonnes raisons parce que ça correspond à notre esprit et je suis venu en octobre 2017 avec un projet celui de monsieur DECAYEUX comme eux les salariés j'y croyais comme eux j'ai été déçu C'est un échec pour lui aussi SIBETH NDIAYE Eh bien écoutez il faut être assez oecuménique sur ce sujet C'est un fait vérifié à travers les deux salles dans les espaces verts les travaux d'entretien Homme de lien de contact vous avez développé les associations locales qui permettent de se protéger MARC FAUVELLE On poursuit dans un instant du modèle économique parce que c'est une nécessité opérationnelle Parce qu'il n'y a aucune absurdité que l'entêtement ne saurait faire céder Si l'on demande aux habitants de Gargilesse Vous qui depuis des mois à ses réédifications Nos architectes nos artisans nos ouvriers ces compagnons que je viens ici et j'ai le plaisir de vous retrouver de retrouver beaucoup de visages amis d'entreprises visitées durant ces dernières décennies Et elle peut conduire à un troisième risque qui serait une énorme faute Mais ce séparatisme islamiste est incompatible avec la liberté de l'innovation Je crois que ce n'est quand même pas la même vision tragique si je puis dire et il y a quelques éléments de bon sens dans lesquelles les journalistes ont pu faire l'objet de discussions voire de critiques dans cette assemblée sur la place de ses artistes et le rôle que la culture serait en quelque sorte ce que nous proposons ensemble Allemagne France aux 27 pays membres c'est d'une part de risque qui d'ailleurs si vous m'y autorisez à souhaiter aussi une bonne année à tous nos principes Cette situation implique donc une réflexion profonde sur les moyens de les comptabiliser Mais on a un système unique des points unique et pas deux ou trois comptes à gérer Ensuite dans votre cas sera même plutôt plus juste Aujourd'hui vous avez tout à la fois les forces du Fonds mondial c'est l'engagement aussi qu'Unitaid porte lutter contre ces grandes pandémies qui ont profondément jalonné l'intelligence l'esthétique l'art du 20ème siècle de Kandinsky jusqu'à Messager de Delaunay en passant par l'Asie Centrale et le Moyen Orient aujourd'hui a besoin C'est ça ce à quoi on doit aller beaucoup plus loin Il y a une chose pour moi qui est venu dans mon bureau il me disait en Suède il y a quelques autres sujets en termes de bonus liés à l'enfant d'être plus juste Ensuite c'est un modèle qui aujourd'hui a créé des dispositifs il faut maintenant mais il faut constamment qu'on s'adapte en quelque sorte la conscience de soi Cette part de spécularité qui va avec votre pratique et votre profession Sur ce sujet la responsabilité et les sanctions des sites pornographiques qui permettent aux mineurs d'accéder à leur contenu doivent aussi être renforcées et là dessus dans notre projet de loi audiovisuelle il y a la transmission de savoir faire Il y a un rapport de la Commission sur ces sujets ce que je dis tous les jours Donc cette prime qu'on a annoncée hier que j'ai annoncée hier au nom du gouvernement elle va permettre de répondre à des questions que ce soit Je pense que peu de gens réalisent sans doute ce qu'est vraiment votre tâche Combien elle est immense Et à quel point sur nos territoires et j'y reviendrai concilier ces objectifs et ces usages la préservation de sa primauté à l'occasion de cette cérémonie militaire qui est très bon Par contre je ne veux pas vous accabler mais je veux être jugé sur les actes Les actes c'est ce travail quotidien résolu pour faire en sorte pour ceux qui commencent à travailler plus tôt Monsieur TRABELSI merci pour votre enthousiasme Non le point que je vais vous demander Il atteint maintenant sa vingtième année Voilà 20 ans Merci beaucoup Merci à vous

Le code du notebook utilisé pour ce projet est disponible ici.

Future Unicorn Founder — Using tech for good

Future Unicorn Founder — Using tech for good

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store