TEORIE E TECNICHE DEL RICONOSCIMENTO Python: Dizionari Pratica con Python … • www.codeacademy.com 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. 10-11 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