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.