TP 5 : IA, IA, IA comme un hiatus

Introduction aux concepts de l’Intelligence Artificielle

28 Mars 2024

  1. Découvrir les modèles de langue n-grams
  2. Comprendre leur fonctionnement
  3. Comprendre leurs limites

Introduction

Dans ce petit TP, on va explorer une idée permettant de générer du texte. On vise à créer un modèle probabiliste du langage. Plus précisément, on veut être capable d’évaluer la probabilité qu’un mot w apparaisse dans un mot après les mots w1, …, wt. On notera cette probabilité P(w|w1,…,wt).

Par exemple, on comprend bien que les mots piste ou pelouse ont une probabilité bien plus grande d’apparaître à la fin de la phrase “Elle court sur la” que le mot confiture. C’est cet aspect du langage qu’on va essayer de représenter ici.

Comment peut-on évaluer cette probabilité ? On va supposer qu’on a un très large corpus de texte. On pourrait tout simplement compter le nombre de fois que w apparaît après les mots w1, …, wt et diviser par le nombre total de fois où w1, …, wt apparaissent dans le corpus. Si le corpus est assez grand, ce ratio serait évidemment une bonne approximation de la probabilité qu’on cherche à évaluer. Cependant, afin d’approximer significativement cette quantité pour tout mot w et pour toutes suites w1, …, wt de mots, il faudrait un corpus de texte plus gros que le web entier !

Dans ce TP, on va voir une technique qui simplifie cela et permet de générer des textes passables mais intéressant à partir de corpus de taille raisonnable.

Le modèle n-gram

Calcul du modèle

Un modèle de langue n-gram approxime la probabilité P(w|w1,…,wt) par P(w|wt − n + 1,…,wt), c’est-à-dire, qu’on évalue la probabilité qu’un mot w apparaissent après les mots w1, …, wt en ne regardant que les n derniers mots de la séquence. Pour évaluer cela depuis un large corpus de texte, on va utiliser l’approximation suivante :

P(w|w1,…,wn) ≃ C(w1,…,wn,w)/C(w1,…,wn)

C(u1,…,uk) est le nombre de fois où la séquence u1, …, uk apparait dans le corpus.

Le fichier create_model.py contient un code qui calcule ces probabilités pour une valeur de n donnée au début du fichier et un corpus fichiers. Vous trouverez quelques oeuvres de poésies pour générer des poèmes avec votre corpus ci-dessous :

Vous pouvez constituer un corpus personnalisé en récupérant des oeuvres tombées dans le domaine public ici : Project Gutenberg. On veillera à télécharger une version textuelle des oeuvres en choisissant “Plain Text UTF-8” comme option de téléchargement.

En exécutant le script create_model.py, vous créez un fichier model.json dans le même répertoire qui contient une représentation de ces probabilités qu’on va utiliser plus tard.

Générez votre propre modèle de langue à partir d’un corpus que vous vous serez constitué (on pourra y mettre 5 ou 6 oeuvres pour garder un temps de calcul raisonnable). On mettra les fichiers txt dans le même dossier que le script et on modifiera la variables fichiers au début du script.

Utilisation du modèle

Une fois le modèle calculé, on va l’utiliser pour générer du texte ! Pour cela, admettons qu’on a déjà généré la séquence w1, …, wt. On va générer un nouveau mot wt + 1 en fonction de la probabilité P(wt + 1|wt − n,…,wt) donnée par notre modèle. On va faire cela plusieurs fois jusqu’à avoir un texte ! On va utiliser l’algorithme suivant :

Le script generate.py charge le modèle model.json (qui doit se trouver dans le même dossier donc) et génére 20 mots après le début de phrase “POURQUOI”.

Générez votre premier texte en utilisant generate.py et le modèle que vous avez calculé à la question précédente.

Essayez de varier les corpus et ainsi de générer plusieurs modèles de langue différents : par exemple, un corpus poésie et un corpus théâtre. Qu’observez-vous sur la sortie ?

En modifie create_model.py, générez des modèles 1-gram, 2-grams, 3-grams et 4-grams avec le même corpus. Qu’observez-vous sur la qualité de la sortie ?

Que se passe-t-il si on choisit K = 1 ? Menez plusieurs expériences, quel est le principal défaut de cette approche ?

Que se passe-t-il si on choisit K = 0 ? Essayez de générer des textes avec cette approche.

Essayez de générer des textes en anglais !