Travaux
Pratiques
du cours
de Théorie de l' Information
APPROXIMATION D'UN LANGAGE
Définition et objectif.
Faire l'analyse à l'ordre L d'un texte
c'est déterminer les fréquences des mots de longueurs
L, les L-uplets,
qui composent ce texte. Il s'agit de prendre en compte tous
les mots obtenus en faisant glisser une fenêtre de longueur L
sur le texte. L'approximation à l'ordre 1 donne la fréquence
des lettres, l'approximation à l'ordre 2 donne la fréquence
des digrammes, l'approximation à l'ordre 3 celle des
trigrammes etc... Il s'agit d'une information plus précise
que la simple distribution des lettres du texte. Pour toute lettre
a, et pour tout mot x de longueur L-1, on note
p( a | x ) la probabilité que xa soit un mot du
texte, c'est la loi de probabilité assiociée à
x. L'analyse à l'ordre L permet de calculer les
lois des (L-1)-uplets. L'objectif de cette séance de
travaux-pratiques est d'écrire un programme qui génère
un texte aléatoire en respectant les lois de probabilités
des (L-1)-uplets d'une source.
Entropie.
Ecrire un progamme entropie [fichier] qui calcule la distribution des caractères dans un fichier. Il calculera l'entropie des caractères qui composent le fichier c'est-à-dire : la somme des - p(c) log( p(c) ) où p(c) est la probabilité du caractère c.
Appliquez la commande à la source C de votre commande ( entropie.c ?)
Appliquez la commande à l'exécutable lui même.
Appliquez la commande sur la source C compressée par gzip.
Analyse à l'ordre L.
Pour limiter la
complexité des expériences numériques, les
caractères lus dans un fichier texte seront transformés
dans un jeu de 32 c symboles : les lettres A,B, ..., Z, les espaces
\n, 032 et les caractères de ponctuations : 047, 054, 056,
073. Les symboles seront codés par les entiers : 0, 1, ...,
31. Un L-uplet est représenté par un mot de 5L
bits et l' ensemble des lois associées par un tableau de
32L-1 distribution
de probabilités. Dans vos implantations, vous pourrez
utiliser le type :
typedef float* distrib;
pour représenter une distribution de probabilité. Ainsi, les lois des (L-1)-uplets pourront être stockées dans des variables de type distrib *, un tableau dynamique indexé par les entiers inférieurs à 32L-1..
Estimez la valeur maximale que prendra L dans vos expériences numériques.
Ecrire une fonction int code( int c ) qui renvoie un nombre compris entre 0 et 31 correspondant au symbole le plus proche, -1 en cas d'échec.
Ecrire une fonction int caractere( int n ) qui renvoie le code ascii du caractère de code n.
Ecrire une fonction distrib* ( FILE *src , int L ) qui calcule les lois associées aux mots de longueur L dans le fichier src.
Génération.
Ecrire une fonction int alea( distrib p) renvoie un entier aléatoire compris entre 0 et 31 suivant la loi p.
Implanter une procédure pour engendrer une suite de n symboles respectant les lois des L-uplets.
void genere( distrib* dp , int L ,
int n );
{
etat = ...
while ( n-- ) {
s = alea( dp[etat] );
c = caractere( s )
...
etat = etat << 5 + s;
}
}
Philippe Langevin,
Février 2006.