1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
| #!/usr/bin/env python # -*- coding: utf-8 -*-
from math import log from random import random
#==================== 1ère partie ==============
def IncFreq(distribution:dict, letter:str): """ Incrémente le nombre d'occurrences de *letter* dans *distribution*. `distribution est un dictionnaire où une clé est une lettre et la valeur associée le nombre d'occurrences de cette lettre. """ if letter in distribution : distribution[letter] += 1 else: distribution[letter] = 1
#______________________________________________________________________________
def AnalFreq(distribution:dict, text:str): """ Ajoute à *distribution* les nombres d'occurrences des lettres de *text*. """ for letter in text: distribution[letter] = IncFreq(distribution, letter)
#______________________________________________________________________________
def string2distribution(text:str) -> dict: """ Retourne une nouvelle distribution qui donne les nombres d'occurrences des lettres de *text*. """ distribution = dict() AnalFreq(distribution, text) return distribution
#______________________________________________________________________________
def TotalFreq(distribution:dict) -> int: """ Retourne la somme des nombres d'occurrences de *distribution*. """ return sum(distribution.values())
#______________________________________________________________________________
def string2information(text:str) -> float: """ Retourne un dictionnaire une clé est une lettre et la valeur la quantité d'information portée par cette lettre. """ info = dict() distribution = string2distribution(text) TotalFreq = TotalFreq(dict) for letter in distribution : info[letter] = log(TotalFreq/distribution[letter], 2) return info #______________________________________________________________________________
def string2entropy(text:str) -> float: """ Retourne l'entropie du jeu de caractères du texte de référence *text*. """ dist = string2distribution(text) entropie = 0 for letter in dist : entropie -= ((dist(letter)/TotalFreq(dist))*log(dist(letter)/TotalFreq(dist), 2)) return entropie
#______________________________________________________________________________
def CumulDistrib(distribution:dict) -> dict: """ Retourne un dictionnaire qui donne la fréquence normalisée et cumulée de *distribution*. L'ordre des lettres dans le cumul est l'ordre ASCII croissant. """ T = TotalFreq(distribution) Frequence = dict() cumul = dict() old = 0 for letter in sorted(cumul.keys()) : Frequence[letter] = distribution[letter]/T for letter in sorted(distribution.keys()) : cumul[letter] = distribution[letter] + old old = cumul[letter] return cumul
#_________________________________________________________________________________
def FindFirstGreaterInCD(cumuldistribution:dict, freq:float) -> str: """ Retourne la première lettre dont la fréquence dans *cumuldistribution* est supérieure ou égale à *freq*. Retourne '$' si toutes les fréquences sont inférieures à *freq*. """ pass
#_________________________________________________________________________________
def RandLetter(cumuldistribution:dict) -> str: """ Retourne une lettre aléatoire avec une probabilité qui suit la distribution cumulée normalisée *cumuldistribution*. """ pass
#_________________________________________________________________________________
def RandText(cumuldistribution:dict, length:int) -> list: """ Retourne une liste de lettres aléatoires de longueur maximale *length* où chacune des lettres apparaît avec une probabilité qui suit la distribution cumulée normalisée *cumuldistribution*. """ pass
#_________________________________________________________________________________
def distribution2string(distribution:dict, length:int) -> str: """ Retourne un texte aléatoire de longueur maximale *length* où chacune des lettres apparaît avec une probabilité qui suit la distribution *distribution*. """ pass
#======================== 2ème partie ==================
def IncFreq_pfx(distribution:dict, prefix:str, letter:str): """ Incrémente le nombre d'occurrences du couple (prefix*, *letter*) dans *distribution*. `distribution est un dictionnaire où une clé est un prefixe et où la valeur associée est elle même un dictionnaire où une clé est une lettre et la valeur associée le nombre d'occurrences du couple préfixe/lettre. """ pass
#_________________________________________________________________________________
def AnalFreq_pfx(distribution:dict, prefix:str, text:str) -> dict: """ Ajoute à *distribution* les nombres d'occurrences des couples (*prefix*, *letters*) de *text*. """ pass
#_________________________________________________________________________________
def string2distribution_pfx(n:int, text:str) -> dict: """ Retourne une nouvelle distribution qui donne les nombres d'occurrences des couples préfixe/lettre de *text*. Un couple préfixe/lettre est composé de *n* lettres. """ pass
#_________________________________________________________________________________
def CumulDistrib_pfx(distribution:dict) -> dict: """ Retourne un dictionnaire qui donne la fréquence normalisée et cumulée de *distribution*. * une clé est un préfixe * une valeur est un dictionnaire de fréquences cumulées normalisées telles que celui utilisé dans la première partie. """ pass
#_________________________________________________________________________________
def RandLetter_pfx(cumuldistribution:dict, prefix:str) -> str: """ Retourne une lettre aléatoire avec une probabilité qui suit la distribution cumulée normalisée *cumuldistribution[*prefix*]*. """ pass
#_________________________________________________________________________________
def RandText_pfx(distribution:dict, prefix:str, maxlength:int) -> list: """ Retourne une liste de lettres aléatoires de longueur maximale *maxlength* où chacun des couples préfixe/lettre apparaît avec une probabilité qui suit la distribution cumulée normalisée *cumuldistribution*. *prefix* est le préfixe initial. """ pass
#_________________________________________________________________________________
def distribution2string_pfx(distribution:dict, maxlength:int) -> str: """ Retourne un texte aléatoire de longueur maximale *maxlength* où chacun des couples préfixe/lettre apparaît avec une probabilité qui suit la distribution *distribution*. """ pass
#================== PROGRAMME PRINCIPAL =============
if __name__ == '__main__': file = open('fable1.txt', 'r') text = file.read() |