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
| #!/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
#================== PROGRAMME PRINCIPAL =============
if __name__ == '__main__':
file = open('fable1.txt', 'r')
text = file.read() |
Partager