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('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))