Immaginiamo, dato un testo, di voler trovere quale sia la parola-tipo con rango di frequenza 5. Possiamo creare una “lista di liste”, ossia una lista che contiene una serie di liste, ciascuna delle quali contiene a sua volta il numero di occorrenze di una parola tipo e la parola tipo.
#creazione del testo dal corpus LDT import xml.etree.ElementTree as ET parole=ET.parse('testi/ldt-1.5.xml').getroot().findall('.//word') testo=[i.attrib['form'].lower() for i in parole] #creazione e ordinamento della lista di liste freq_parole=[[testo.count(i), i] for i in set(testo)] freq_parole=sorted(freq_parole, reverse=True) #o, in alternativa: freq_parole.sort(reverse=True) #stampa il 2° elemento (forma della parola) contenuto nel 5° elemento contenuto nella 'lista di liste' print(freq_parole[5-1][2-1]) #l'aggiunta di -1 è necessaria perché gli indici partono da 0
Lo stesso procedimento si può riscrivere sotto forma di funzione con il comando def, in modo da poter essere poi applicato ad altri testi e con altri numeri di rango. Nel codice seguente, all'interno della definizione della funzione trovaparola, t e r rappresentano rispettivamente il testo, che deve essere dato in forma di lista, e il rango.
def trovaparola(t,r): #tra parentesi sono scritte le variabili in input fp=[[t.count(i), i] for i in set(t)] fp=sorted(fp, reverse=True) #o, in alternativa: fp.sort(reverse=True) return fp[r-1][2-1] #il comando return definisce l'output della funzione
Una volta definita la funzione, per un qualsiasi testo in forma di lista basterà scrivere quanto segue per visualizzare la parola cercata:
print(trovaparola(testo,5))
Se può essere scritta in una sola riga (come accade nel nostro caso a patto che si usi sorted e non sort() per ordinare la lista), la funzione può essere definita in alternativa attraverso il comando lambda.
trovaparolabis = lambda t, r: sorted([[t.count(i), i] for i in set(t)], reverse=True)[r-1][2-1]
In un unico script:
def trovaparola(t,r): #tra parentesi sono scritte le variabili in input fp=[[t.count(i), i] for i in set(t)] fp=sorted(fp, reverse=True) #o, in alternativa: fp.sort(reverse=True) return fp[r-1][2-1] #il comando return definisce l'output della funzione trovaparolabis = lambda t, r: sorted([[t.count(i), i] for i in set(t)], reverse=True)[r-1][2-1] import xml.etree.ElementTree as ET parole=ET.parse('testi/ldt-1.5.xml').getroot().findall('.//word') testo=[i.attrib['form'].lower() for i in parole] print(trovaparola(testo,5)) print(trovaparolabis(testo,5))