TEORIE E TECNICHE DEL RICONOSCIMENTO Python: Dizionari
Pratica con Python …
USO DI DIZIONARI IN NLTK: FREQUENCY DISTRIBUTIONS Text: indicizzato usando INTERI text1[100] Frequency distributions: indicizzate usando PAROLE fdist[‘monstruous’] Frequency distributions sono implementate in Python come oggetti di tipo DICTIONARY, un terzo tipo di dati fondamentale nel trattamento dei testi – Equivalente di hash maps / associative arrays in altri linguaggi di programmazione NLTK book, 5.3, pp
DIZIONARI: ACCESSO AD ELEMENTI eng2sp['one'] = 'uno' (NB Il termine ‘dizionari’ e’ dovuto al fatto che queste strutture dati sono ideali per implementare dei dizionari, p.e., Inglese / Spagnolo.)
DIZIONARI: CREAZIONE ED AGGIUNTA DI ELEMENTI Creazione dizionario – Vuoto eng2sp = dict() pos = {} – Con elementi eng2sp = {'one': 'uno', 'two': 'dos', 'three': 'tres'} Aggiunta di oggetti eng2sp[‘one’] = ‘uno’
Visualizzazione dei contenuti >>> print eng2sp {'one': 'uno', 'three': 'tres', 'two': 'dos'} >>> len(eng2sp) 3 >>> print eng2sp['four'] KeyError: 'four' >>> 'one' in eng2sp True
COME IMPLEMENTARE HISTOGRAMS (E FREQDIST) Immaginate di voler implementare una funzione che calcola la frequenza dei caratteri in una parola (o delle parole in un testo) Opzioni: 1.Usare 26 variabili diverse come contatori 2.Usare una lista con 26 posizioni 3.Usare un dizionario 1. e 2. impensabili per una freqdist!
HISTOGRAMS USANDO DIZIONARI def histogram(s): d = dict() for c in s: if c not in d: d[c] = 1 else: d[c] += 1 return d
Esempio di uso >>> h = histogram('brontosaurus’) >>> print h {'a': 1, 'b': 1, 'o': 2, 'n': 1, 's': 2, 'r': 2, 'u': 2, 't': 1}
LESSICO USANDO DIZIONARI NLTK, cap. 5.1, p. 12 (Web version)
DEFAULT DICTIONARIES NLTK, cap. 5.1, p. 14 (Web version)
CHIAVI E VALORI COMPLESSI NLTK, cap. 5.1, p. 17 (Web version)
MEMOIZATION Un altro uso molto comune dei dizionari e’ per aumentare l’efficienza di programmi evitando di ricalcolare valori due volte
ESEMPIO: FIBONACCI NUMERI DI FIBONACCI: fibonacci(0) = 0 fibonacci(1) = 1 fibonacci(n) = fibonacci(n − 1) + fibonacci(n − 2); Sequenza: 0, 1, 1, 2, 3, 5, 8, 13, …
FIBONACCI IN PYTHON, VERSIONE RICORSIVA: def fibonacci (n): if n == 0: return 0 elif n==1: return 1 else: return fibonacci(n-1) + fibonacci(n-2)
DUPLICAZIONE
FIBONACCI + MEMO known = {0:0, 1:1} def fibonacci(n): if n in known: return known[n] res = fibonacci(n-1) + fibonacci(n-2) known[n] = res return res