Manipulation de Modèles de Langage Statistiques


Outils


Travail à réaliser

Tous le tp se fera dans l'environnement python

Exercice 1 : ouvrir le fichier de chaque langue et les séparer en deux parties contenant un nombre de mots égal (par exemple, on coupe le fichier fr.txt en une liste train_fr et un liste test_fr)

import nltk
import codecs
import sys

fichier_text = codecs.open('fr.txt','r','utf8')
corpus_fr = [mot for line in fichier_text for mot in line.split()]

# apprend sur 50% du corpus et test sur le reste
spl = 50*len(corpus_fr)/100
train_fr = corpus_fr[:spl]
test_fr = corpus_fr[spl:]

Exercice 2 : Construire un vocabulaire pour chaque langue en enlevant les mots de faible fréquence :

# créer une mesure de distance basée sur la frequence
fdist = nltk.FreqDist(w for w in corpus_fr)
# fixer le seuil à une valeur
th = 5
#créé le lexique dans lequel tous les mots n'apparaissant pas au moins th fois
lexique_fr = set(map(lambda x: x[0], filter(lambda x: x[1] >= th, fdist.iteritems())))

# on remplace tous les mots inconnus par "*unknown*"
train_fr = map(lambda x: x if x in lexique_fr else "*unknown*", train_fr)
test_fr = map(lambda x: x if x in lexique_fr else "*unknown*", test_fr)

Exercice 3 : Construire un modèle de langage à trigrammes pour chaque fichier d'apprentissage créé précédemment en utilisant les commandes suivantes :

from nltk.model import NgramModel
from nltk.probability import LidstoneProbDist
estimator = lambda fdist, bins: LidstoneProbDist(fdist, 0.2)
ml_fr = NgramModel(3, train_fr, estimator=estimator)

Exercice 4 : Calculer la perplexité de chaque texte test par rapport à chaque modèle ml

print "perplexity(test_fr) =", lm.perplexity(test_fr)

Exercice 5 : Refaire le meme système avec des modèles n-grammes de CARACTÈRES.

#generation de la liste des lettres qui composent le corpus
lettres = [lettre for lettre in ' '.join([mot for mot in corpus_fr])]  
# apprentissage d'un modele 4-gram
lm_lettre_fr = NgramModel(4, lettres,estimator)  

Exercice 6 : Utiliser le model pour generer des phrases avec le modèle de mots et de lettres

# application du modele de mots
sample_fr = lm_fr.generate(50)  
text_output = ''.join([mot for mot in sample_fr])  
print text_output  
# application du modele de lettres sample_letters_fr = lm_lettre_fr.generate(200) text_output = ''.join([lettre for lettre in sample_letters_fr]) print text_output

Aide : Un modèle peut être considéré plus performant qu'un autre si, pour un texte de la même langue, la perplexité est inférieure et, pour un texte dans une autre langue, la perplexité est supérieure.