====== Distribuzione delle frequenze ======
Esemplificazione su una singola frase. Si noti, innanzitutto, la funzione set(), che crea un insieme privo di elementi ripetuti. La lunghezza della frase 'splittata' equivale al numero di parole-token (occorrenze), mentre la lunghezza dell'insieme ottenuto attraverso la funzione set() equivale al numero di parole-type (forme). Si noti, inoltre, la sintassi della riga 10 detta 'comprensione di lista' (ingl. 'list comprehension', cf. [[http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions|documentazione]]).
import matplotlib.pyplot as plt
frase='quando un uomo con la pistola incontra un uomo con il fucile quello con la pistola è un uomo morto'
print(frase)
#Se si è in ambiente shell
#(interfaccia a riga di comando richiamabile da terminale/prompt dei comandi)
#anziché utilizzare il comando “print” è possibile digitare solamente
#il nome della variabile di cui si vuole ispezionare il valore.
#Ad es., anziché digitare “print(frase)”INVIO basta digitare “frase”INVIO.
frase=frase.split()
print(frase)
print(len(frase))
print(set(frase))
print(len(set(frase)))
print(frase.count('con'))
fd=[frase.count(i) for i in set(frase)]
print(fd)
fd.sort(reverse=True)
print(fd)
sequenza=range(1,len(fd)+1)
for i in sequenza: print(i)
plt.plot(sequenza,fd,'.')
plt.show()
----
Applicazione al testo 'Pinocchio':
import re
import matplotlib.pyplot as plt
f = open('testi/collodi_pinocchio.txt', mode='r', encoding='iso-8859-1')
testo = f.read()
testo=testo[1704:]
# istruzioni per l'affinamento della tokenizzazione
testo=re.sub("'","' ", testo)
testo=re.sub("([^\.]+)([\.,;:\!-]+)","\g<1> \g<2>", testo)
testo=testo.lower()
# fine istruzioni per l'affinamento della tokenizzazione
testo=testo.split()
fd=[testo.count(i) for i in set(testo)]
fd.sort(reverse=True)
plt.plot(range(1,51),fd[0:50],'.')
plt.show()
----
Il codici seguente usano una lista di tuple, denominata "occ_forma", di struttura (numero_occorrenze, forma) per ordinare contemporaneamente, secondo l'ordine decrescente di frequenza, tanto i valori di frequenza quanto le forme secondo la frequenza. In questo modo è possibile creare una lista di forme ordinata per frequenza, denominata 'forme', da usare per le etichette dell'asse orizzontale del grafico (mediante la funzione plt.xticks).
frase='quando un uomo con la pistola incontra un uomo con il fucile quello con la pistola è un uomo morto'
frase=frase.split()
occ_forma=[(frase.count(i),i) for i in set(frase)]
print(occ_forma)
occ_forma.sort(reverse=True)
print(occ_forma)
fd=[i[0] for i in occ_forma]
forme=[i[1] for i in occ_forma]
plt.plot(range(len(fd)),fd, '.')
plt.xticks(range(len(fd)),forme, rotation='vertical')
plt.show()
import re
import matplotlib.pyplot as plt
f = open('testi/collodi_pinocchio.txt', mode='r', encoding='iso-8859-1')
testo = f.read()
testo=testo[1704:]
# istruzioni per l'affinamento della tokenizzazione
testo=re.sub("'","' ", testo)
testo=re.sub('[\.,;:\-?!]{1}','',testo)#elimina gli interpunti
testo=testo.lower()
# fine istruzioni per l'affinamento della tokenizzazione
testo=testo.split()
occ_forma=[(testo.count(i),i) for i in set(testo)]
occ_forma.sort(reverse=True)
fd=[i[0] for i in occ_forma]
forme=[i[1] for i in occ_forma]
n=50
plt.plot(range(n),fd[0:n], '.')
plt.xticks(range(n),forme[0:n], rotation='vertical')
plt.show()
{{::frequenze_etichettate.png?800|}}