Formula della probabilità congiunta applicata ai bigrammi: $$ 1)\hspace{4pt} P(x_{t}=a,\hspace{4pt}x_{t+1}=b)=P(x_{t+1}=b\hspace{4pt}|\hspace{4pt} x_{t}=a)P(x=a) $$ Probabilità condizionata (discende da 1): $$ 2)\hspace{4pt} P(x_{t+1}=b\hspace{4pt}|\hspace{4pt} x_{t}=a)= \frac{P(x_{t}=a,\hspace{4pt}x_{t+1}=b)}{P(x=a)} $$
Mutua informazione puntuale: $$ 3)\hspace{4pt} IMP=log_{2}\hspace{4pt}\frac{P(x_{t+1}=b\hspace{4pt}|\hspace{4pt} x_{t}=a)}{P(x=b)} $$ Sostituendo in base a 2): $$ 4)\hspace{4pt} IMP=log_{2}\hspace{4pt}\frac{P(x_{t}=a,\hspace{4pt}x_{t+1}=b)}{P(x=a)P(x=b)} $$ In base alla definizione dell'informazione: $$ 5a)\hspace{4pt} I(x=a)\hspace{4pt}=\hspace{4pt}log_{2}\hspace{4pt}\frac{1}{P(x=a)}\hspace{4pt}=\hspace{4pt}-log_{2}P(x=a) $$ Da 4) e 5a), per le proprietà dei logaritmi: $$ 5b)\hspace{4pt} IMP\hspace{4pt}=\hspace{4pt} log_{2}\hspace{4pt}\frac{1}{P(x=a)}\hspace{4pt}+\hspace{4pt}log_{2}\hspace{4pt}\frac{1}{P(x=b)}\hspace{4pt} +\hspace{4pt} log_{2}\hspace{4pt} P(x_{t}=a,\hspace{4pt}x_{t+1}=b) \hspace{4pt} =$$ $$= \hspace{4pt} I(x=a)+I(x=b)-I(x_{t}=a,\hspace{4pt}x_{t+1}=b) $$
Se le probabilità dei due elementi del bigramma sono perfettamente indipendenti l'una dall'altra allora: $$ 6a)\hspace{4pt} P(x_{t+1}=b\hspace{4pt}|\hspace{4pt} x_{t}=a)= P(x=b) $$ Da 3) e 6a): $$ 6b)\hspace{4pt} IMP\hspace{4pt}=\hspace{4pt}log_{2}\hspace{4pt}\frac{P(x=b)}{P(x=b)}\hspace{4pt}=\hspace{4pt}log_{2}\hspace{4pt}1=0 $$
Se, data la conoscenza del primo elemento, si ha la certezza dell'occorrenza del secondo allora: $$ 7a) \hspace{4pt} P(x_{t+1}=b\hspace{4pt}|\hspace{4pt} x_{t}=a)= 1 $$ Da 3) e 7a): $$ 7b)\hspace{4pt} IMP\hspace{4pt}=\hspace{4pt}log_{2}\hspace{4pt}\frac{1}{P(x=b)}\hspace{4pt}=\hspace{4pt}I(x=b) $$
import re from numpy import log2 #preparazione del testo "Pinocchio" f=open('collodi_pinocchio.txt', mode='r', encoding='iso-8859-1') testo=f.read() testo=testo[1704:] testo=re.sub("'","' ", testo) testo=re.sub('[.,;:\-?!]','',testo) testo=testo.lower() testo=testo.split() #funzioni def NGRAMMI (n, testo): return [tuple(testo[i:i+n]) for i in range(len(testo)+1-n)] def I (x, testo): return -log2(testo.count(x)/len(testo)) def P (x, testo): return testo.count(x)/len(testo) def IMP (a,b,testo): bigrammi = NGRAMMI(2,testo) return log2(P((a,b),bigrammi)/(P(a,testo)*P(b,testo))) #return I(a,testo) + I(b,testo)-I((a,b),bigrammi) #test print("IMP di 'il burattino'") print(IMP('il', 'burattino', testo)) print("\n") print("IMP di 'capelli turchini'") print(IMP('capelli', 'turchini', testo)) print("\n") print("IMP di 'è di'") print(IMP('è', 'di', testo)) print("\n")
import re from numpy import log2 #preparazione del testo "Pinocchio" f=open('testi/collodi_pinocchio.txt', mode='r', encoding='iso-8859-1') testo=f.read() testo=testo[1704:] testo=re.sub("'","' ", testo) testo=re.sub('[\.,;:\-?!]{1}','',testo) testo=testo.lower() testo=testo.split() #funzioni NGRAMMI = lambda n, testo: [tuple(list(['$$$']*(n-1)+testo)[i:i+n]) for i in range(len(testo))] I = lambda x, testo: -log2(testo.count(x)/len(testo)) bigrammi = NGRAMMI(2,testo) print("IMP di 'il burattino'") print(I('il',testo) + I('burattino',testo)-I(('il','burattino'),bigrammi)) print("\n") print("IMP di 'capelli turchini'") print(I('capelli',testo) + I('turchini',testo)-I(('capelli','turchini'),bigrammi))