====== Distribuzione delle frequenze in scala logaritmica ======
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:
{{ :zipf.png?nolink |}}
----
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)