Il codice seguente traccia il grafico della distribuzione delle frequenze in scala logaritmica. Le rr. 16-17 creano un 'subplot' denominato 'ax'; le rr.18-19 definiscono la scala di questo elemento come logaritmica; la r. 20 traccia, in blu, i punti relativi ai valori di frequenza osservati. Le righe 21-23 tracciano, in rosso, una retta che corrisponde al modello ideale secondo la legge di Zipf con parametri C=5850,7 e a=1,03372 (vedi sotto).
import re import matplotlib.pyplot as plt import numpy as np with open('testi/collodi_pinocchio.txt', mode='r', encoding='iso-8859-1') as f: testo = f.read() testo=testo[1704:] testo=re.sub("'","' ", testo) testo=re.sub('[\.,;:\-?!]{1}','',testo) testo=testo.lower() testo=testo.split() fd=[testo.count(i) for i in set(testo)] fd.sort(reverse=True) V=len(set(testo)) fig=plt.figure() ax=fig.add_subplot(1,1,1) ax.set_xscale('log') ax.set_yscale('log') ax.plot(range(1,V+1),fd, 'b.') x=np.arange(1,V+1) y=5850.7/(x**1.03372) ax.plot(x,y, 'r-') plt.show()
Dovrebbe prodursi un grafico di questo tipo:
Il codice seguente ricava i parametri C=5850,7 e a=1,03372 attraverso la tecnica della regressione lineare. Per eseguire questo script è necessario aver installato il modulo scikit-learn mediante il comando pip install sklearn (Windows) o pip3 install sklearn (MacOs e Linux).
import re import numpy as np from sklearn.linear_model import LinearRegression with open('testi/collodi_pinocchio.txt', mode='r', encoding='iso-8859-1') as f: testo = f.read() testo=testo[1704:] testo=re.sub("'","' ", testo) testo=re.sub('[\.,;:\-?!]{1}','',testo) testo=testo.lower() testo=testo.split() fd=[testo.count(i) for i in set(testo)] fd.sort(reverse=True) V=len(set(testo)) Y=np.array([np.log(i) for i in fd]) X=np.array(list(np.log(i) for i in range(1,V+1))).reshape((-1, 1)) model = LinearRegression().fit(X, Y) C=np.exp(model.intercept_) a=model.coef_[0]*-1 print('C:', C) print('a:', a)