Percorso: "Rappresentazione e analisi del testo e dei documenti" UNITA' 8 - I principali ambienti di tipo generale SINTESI Voyant NLTK spaCy ... 1. Tipologie di strumenti Destinatari A seconda degli utenti a cui sono destinati, possiamo distinguere gli strumenti in didattici e professionali. Il confine è spesso vago, sia perché gli autori a volte non prendono in considerazione tale distinzione, sia perché non è chiaro a che punto, partendo da un percorso di apprendimento formale o informale, i destinatari approdano ad un livello professionale e/o applicano le conoscenze acquisite a risolvere problemi del mondo reale. Modalità di fruizione In base alla modalità di fruizione, le principali tipologie sono: - applicazioni personali (di uso individuale) istallate/istallabili su macchina locale - applicazioni web-based le cui funzioni sono richiamabili in modo interattivo da browser; al giorno d'oggi la maggior parte delle applicazioni web popolari sono ospitate da server web in cloud - insiemi di funzioni richiamabili in modalità "web service"; di solito sono richiamate da applicazioni web-based diverse dai browser, con interfaccia "REST" (un'estensione del protocollo HTTP); a volte le funzioni individuali possono essere richiamate anche direttamente con un browser, impostando un url opportuno - insiemi di funzioni realizzate e distribuite sotto forma di librerie software; sono richiamabili attraverso API (application programming interface); possono essere integrate sia in applicazioni personali, sia in applicazioni web-based (applicazioni interattive o web services). Linguaggio di implementazione Per motivi storici, il linguaggio di programmazione più diffuso per lo sviluppo di siti e applicazioni web è tuttora il PHP. Tuttavia, nel campo dell'elaborazione del linguaggio naturale (NLP) in generale, incluse le applicazioni di text analysis e web mining, sono di solito preferiti altri linguaggi; i più noti sono: - Perl; si è diffuso a partire dagli anni '80, insieme al sistema operativo Unix; il nucleo di Perl, un linguaggio specialistico per il trattamento dei testi, era costituito dalle espressioni regolari; attualmente è poco usato in nuovi progetti - Java; è un avanzato linguaggio di programmazione di tipo generale "orientato agli oggetti", forse il più noto e apprezzato in campo professionale, sia in ambienti accademici che industriali; con esso sono state sviluppate estese librerie e complesse applicazioni in tutti i campi del NLP; per esempio, sono scritti in Java l'applicazione di text analysis Voyant e la libreria per la traduzione automatica Moses - Python; più recente di Java, ma ormai maturo, è da alcuni considerato un "Java light"; è un linguaggio molto elegante, popolare soprattutto per applicazioni web; rispetto a Java non permette il controllo statico (= al momento della compilazione) che le funzioni siano richiamate con argomenti del tipo corretto: è un linguaggio "interpretato" (che proprio non prevede la compilazione), molto flessibile, con capacità di "introspezione"; 2 tra i più importanti ambienti (= librerie e framework) per l'introduzione al NLP sono scritte in Python: NLTK e spaCy; è scritto in Python anche Scrapy. Finora non abbiamo citato Javascript (che non ha quasi niente a che fare con Java); si tratta di un linguaggio a nostro parere orrendo, ma di cui non si può fare a meno, perché è il principale linguaggio di "scripting" sul lato client, supportato da tutti i browser web; la sua importanza è dovuta al fatto che, per rendere le applicazioni web interattive e piacevoli, si tende a spostare l'implementazione di buona parte dell'interfaccia di utente sul lato client, estendendo il browser con librerie Javascript sempre più potenti; da un po' di tempo Javascript è usato anche in moderni ambienti di programmazione lato server. Supporto multilingue Non ci riferiamo qui all'interfaccia utente (UI) degli ambienti e strumenti presi in considerazione, ma al fatto che le tecniche di analisi del testo sono tanto più utili quanto più sono in grado di gestire in modo adeguato testi e corpora in lingue diverse. Un grosso limite di molti di loro è infatti che essi non mostrano alcuna consapevolezza al riguardo, dando per scontato che si faccia riferimento alla sola lingua Inglese. Come notiamo in un'altra sezione di questo percorso, parte del problema risiede nel fatto che tradizionalmente solo l'Inglese disponeva di un'ampio repertorio di "risorse linguistiche", quali corpora, lessici, grammatiche, algoritmi di apprendimento compatibili, corpora annotati per fungere da "test set", algoritmi già addestrati in diversi campi (tokenizzazione, POS-tagging, estrazione di entità nominate, segmentazione e allineamento, traduzione automatica, ecc.). Oltre all'Inglese, vi è un certo numero di lingue con una discreta dotazione di risorse linguistiche, grazie ad una multi-decennale tradizione di studi linguistici nel campo dell'analisi dei testi e della linguistica computazionale; innanzitutto Francese, Tedesco, Olandese, Giapponese e Spagnolo; poi, Italiano, Portoghese, Ceco, Ebraico, Polacco. Solo di recente, grazie anche agli interessi commerciali delle grandi "web company", sono state prodotte estese risorse linguistiche - non necessariamente aperte - per il Cinese, le lingue del sub-continente Indiano, il Coreano e l'Arabo. Pochi sono gli esempi di ambienti open-source/open-data che possono fruire di un accettabile livello di risorse linguistiche per un significativo numero di lingue diverse dall'Inglese; ancora meno sono quelli progettati fin dall'inizio avendo in mente il supporto multilingue. 2. Voyant [2][3][4][5] Voyant è un ambiente venerando (ha 15 anni!) per l'analisi di corpora e testi che può essere usato impacchettato così com'è o configurato a diversi livelli. E' un ambiente open-source, creato e usato in particolare dalla comunità degli "informatici umanisti" (cultori di "digital humanities"). Può essere usato come applicazione web, accedendo in linea ad un servizio gratuito sia in forma anonima che registrandosi. Ma può anche essere istallato in locale dopo aver scaricato il software dal repository GitHub: è implementato in Java, e anche se tale ambiente di programmazione è piuttosto complesso, l'istallazione del software e dei suoi prerequisiti è abbastanza semplice. Voyant accetta in ingresso documenti in diversi formati: testo semplice, HTML, XML, PDF, Microsoft-Word, ecc. Nella modalità di uso più immediato, l'utente specifica un testo, un elenco di documenti o un intero corpus mediante i rispettivi indirizzi web o li carica, dal proprio PC, nella memoria temporanea o a più lungo termine dell'applicazione. Questa, per default, crea una schermata web suddivisa in diversi pannelli, ciascuno dei quali visualizza in modalità testuale e/o grafica i risultati di un insieme di operazioni standard di analisi del singolo documento o dell'intero corpus. Si può interagire con questi risultati iniziali per impostare nuovi parametri di funzionamento, richiedere l'esecuzione di ulteriori operazioni, ispezionare l'elenco dei documenti. Voyant è focalizzato sugli elementi di più basso livello di interesse per l'analisi di un testo, principalmente caratteri e token; su di essi è in grado di eseguire operazioni statistiche piuttosto sofisticate e visualizzarne i risultati in modi ingegnosi, la cui interpretazione può richiedere un po' di allenamento. Proprio perché, entro una certa misura, le nozioni di carattere e token sono simili in (quasi) tutte le lingue, cioè sono abbastanza indipendenti dalla lingua, gli autori di Voyant possono dichiarare che <>. [5] 3. NLTK Natural Language ToolKit (NLTK) è probabilmente la più popolare e citata libreria software open source di tipo didattico; è usata come traccia di numerosissimi insegnamenti di livello universitario. Anche se NLTK non ha il taglio di un ambiente professionale (spesso gli algoritmi proposti non sono rappresentativi dello stato dell'arte) è probabile che molti professionisti dell'analisi dei testi, e del NLP in generale, l'abbiano usata come punto di partenza per la loro formazione. Scritto nel linguaggio Python, il toolkit è accompagnato da una documentazione molto ampia, facile, progressiva, che costituisce nello stesso tempo un ottimo tutorial per l'apprendimento di Python (e della programmazione tout-court) e un'introduzione di buon livello a molti argomenti teorici, sempre corredata da esempi pratici. NLTK tratta praticamente tutte le più interessanti problematiche che si incontrano nell'analisi dei testi, mette a disposizione una grande quantità di algoritmi, presenta insiemi organici di esempi in campi che vanno dalla codifica dei testi (Unicode) alla formattazione dei documenti, alla costruzione di web corpora, a tokenizzazione, conteggio di parole e frasi e calcolo di frequenze, correlazioni tra parole, POS-tagging, chunking di frasi nominali e verbali, estrazione di contenuti tipo NER (named entity) e concettuale, classificazione e clustering di documenti, tecniche di base statistiche e di apprendimento automatico, traduzione automatica su base statistica, plotting di risultati, ecc. Un pregio di NLTK è costituito dal fatto che il software è integrato da una vasta collezione di dati; questi includono corpora annotati e non, anche corpora allineati tra più lingue, dizionari, grammatiche, algoritmi già addestrati e anche un'estratto di WordNet (...); di solito ogni nuova release apporta significative estensioni alle funzioni e ai dati. In generale NLTK è "language-aware", cioè le sue funzioni sono predisposte per analizzare testi in lingue diverse o, più spesso, sono implementati come algoritmi di tipo abbastanza generale da poter essere addestrati, entro certi limiti, con corpora in lingue diverse. Tuttavia, come accade quasi sempre, la lingua Inglese è fortemente privilegiata; le risorse linguistiche per l'Italiano sono piuttosto scarse; e purtroppo, scorrendo i numerosi riferimenti a NLTK presenti nelle dispense di autori italiani, si può notare la grande pigrizia di questi nell'adattare le risorse e gli esempi all'Italiano. 4. Jupyter Jupyter è un ambiente interattivo molto popolare per esplorare idee e problemi nel settore dell’analisi dei dati. Non è di per sé né un linguaggio come Python né un'ambiente dedicato all'analisi del linguaggio, ma negli ultimi anni è diventato uno strumento prezioso per l'elaborazione del linguaggio e dei testi, specie in abbinamento con Python, NLTK e un corredo di altre librerie software per l'elaborazione statistica e la visualizzazione scientifica. Può essere usato come applicazione web, accedendo in linea ad un servizio, ma può anche essere istallato in locale dopo aver scaricato il software dal repository GitHub. E' implementato in Python ma supporta altri linguaggi di programmazione; per esempio R, che è orientato all'analisi statistica dei dati. Jupyter è un'applicazione document-oriented; un documento è chiamato "notebook"; un notebook viene salvato come file di testo. Un notebook è costituito da una sequenza di "celle", che possono essere di diversi tipi: codice, risultato, documentazione. Una cella può essere editata; una cella di codice può anche essere eseguita. Si accede a Jupyter in modo interattivo attraverso un’interfaccia web; come applicazione web, Jupyter supporta un intero ciclo di lavoro: sviluppo, documentazione, esecuzione e cattura dei risultati. Jupyter è un ambiente ideale per la formazione e l’autoformazione; questi sono alcuni dei vantaggi dell'uso di Jupyter: - modularità; la strutturazione di un notebook in celle invita alla modularità - persistenza e condivisione; un notebook assomiglia ad uno shell, cioè all’interfaccia interattiva console-oriented di un interprete di linguaggio come quello di Python, ma aggiunge la possibilità di editare e salvare il codice, visualizzare i risultati dell’esecuzione, aggiungere documentazione: sono tutti requisiti utili a documentare le esperienze fatte e a condividerle con altri - uso per la valutazione; un notebook può essere fornito da un docente agli studenti come specifica/traccia di un compito da svolgere; tale notebook può essere usato da uno studente per sviluppare gli spunti ricevuti, aggiungere il codice e testarlo, documentare il codice stesso, includere i risultati dell’esecuzione e restituire il tutto al docente. Con il nome di SWAN (Service for Web based ANalysis), Jupyter è parte dello "Application Toolbox Prototype" di Up2U; è un servizio gestito dal CERN che si appoggia sul servizio di cloud-based storage CERNBox, pure gestito dal CERN. L’enorme numero di notebook presenti su GitHub rispecchia la popolarità di Jupyter. Il repository "Tutorial: Natural Language Processing in Python", che fa uso di NLTK, è un esempio dell'uso di Jupyter per usi didattici. 5. spaCy spaCy è una libreria open source per il NLP, scritta in Python e Cython; Cython è un'estensione di Python che consente di ottimizzare le sezioni critiche del codice ricorrendo al linguaggio C; a differenza del codice Python, con cui si integra facilmente, il codice Cython viene compilato, come avviene per i linguaggi C e Java. A differenza di NLTK, spaCy mira a fornire del software valido non solo a scopi educativi ma anche per applicazioni del mondo reale, mantenendosi più vicino allo stato dell'arte della ricerca accademica e industriale. Per esempio, spaCy include modelli di "reti neuronali" su cui si fondano algoritmi di ultima generazione per l'apprendimento automatico ("deep learning"). NLTK include un repertorio molto esteso di algoritmi che spaziano in moltissimi campi, ma lo fa in modo un po' datato e disordinato, rispecchiando il fatto che negli anni questo prezioso toolkit si è accresciuto grazie a contributi svariati di numerosi autori. spaCy invece finora ha mantenuto il profilo di un'ambiente "di autore"; esso si è sviluppato intorno ad un modello di "pipeline" che include un numero relativamente ristretto di funzioni connesse tra loro in cascata secondo specifiche di interfaccia molto precise. Questo approccio, insieme con le linee guida che lo descrivono in dettaglio, secondo le intenzioni degli autori, dovrebbe facilitare la costruzione di risorse linguistiche "trasversali" agli algoritmi, che rendano disponibili le funzioni di spaCy per un ampio numero di lingue diverse. Infatti spaCy tratta le risorse linguistiche di supporto ad una lingua, chiamate collettivamente "modello del linguaggio", come componenti (package Python) che si possono istallare, al pari dei moduli funzionali, per estendere il nucleo originario dell'ambiente. Resta il fatto che è poi lasciato alla buona volontà dei contributori esterni di sfruttare queste aperture. Uno si aspetterebbe che i docenti italiani di NLP e di analisi testuale sfruttassero questo assist e varassero progetti mirati a estendere il pipeline di spaCy per l'Italiano, organizzando l'attività dei loro studenti; ma, ancora una volta, come abbiamo già notato a proposito di NLTK, sembra che negli ambienti accademici italiani predomini la pigrizia e il copia-copia. Il pipeline standard di elaborazione del testo include, nell'ordine, i seguenti elementi: tokenizzatore, POS-tagger, parser (analizzatore sintattico), riconoscitore di entità nominate (NER); altri elementi possono poi seguire in cascata. Caratteristica di tale pipeline è che esso opera in modo "monotono": quando inizialmente si legge il testo dall'esterno e lo si tokenizza, viene creato un modello del documento che si arricchisce via via di informazioni ad ogni stadio successivo, senza che mai venga scartata l'informazione accumulata dagli stadi precedenti; cioè, ogni elemento del pipeline riceve in input il modello del documento e lo arricchisce con nuove "feature", che possono riferirsi ai singoli token, a strutture varie costruite a partire da essi (per esempio un frammento di albero sintattico), all'intero documento. 6. Scrapy Scrapy è un framework per automatizzare l'esplorazione di siti web e l'estrazione di contenuti dalle loro pagine. E' una libreria Python che espone un'interfaccia di programma (API) per costruire applicazioni; ma le sue funzioni possono essere invocate anche in modo più diretto da una console Python. La funzionalità di esplorazione si basa su due operazioni elementari: il fetch, cioè la lettura in memoria di una pagina web di indirizzo specificato (url) e il riconoscimento, nel codice HTML della pagina, dei link (tag ) da seguire per accedere ad altre pagine (link following). Componendo ricorsivamente operazioni di questi due tipi, e utilizzando un insieme di regole per decidere quali link vanno seguiti e quali no, è possibile esplorare in modo automatico un intero sito o una sua parte, o anche una vasta porzione del web che si estenda su più siti. Mentre Scrapy è in grado di analizzare autonomamente il contenuto delle pagine per individuare i link da seguire, esso offre al programmatore strumenti per estrarre sistematicamente dalle pagine stesse l'informazione a cui egli è interessato. Tale informazione tipicamente è presente in forma poco strutturata, e quindi l'estrazione è un compito piuttosto complesso, che implica operazioni di pattern matching; dato che il formato HTML è, a parte eccezioni che si possono gestire, un caso speciale dello XML, i pattern da utilizzare si possono specificare usando il linguaggo XPath; un'espressione XPath consente di localizzare una o più porzioni del documento sulla base dei tag HTML tra cui queste sono racchiuse e della loro posizione all'interno del documento stesso. E' propriamente questa la funzionalità di "scraping" da cui il framework prende il nome. Se si conosce a priori che un insieme di pagine web presenta una certa regolarità, come è plausibile nel caso di un catalogo web, per esempio del catalogo di una casa editrice, estraendo in modo mirato i dati di interesse con espressioni XPath (o con formalismi equivalenti, per esempio con selettori CSS), sarebbe possibile creare con essi una o più tabelle di database, cioè convertire l'informazione da un formato poco strutturato ad uno più strutturato. Si noti che questo è esattamente il contrario di quello che probabilmente fa l'applicazione web nel creare dinamicamente le pagine del sito a partire da un database. Scrapy potrebbe anche essere usato per indicizzare un sito web o un insieme di siti web; in questo caso non si tratta di andare a cercare in specifiche sezioni della pagina i contenuti da estrarre. Servono invece degli strumenti di corredo per estrarre tutto e solo il contenuto testuale dalla pagina, eliminando formattazione HTML, immagini, codice Javascript, ecc.; e poi si dovrà applicare un "pipeline" di operazioni sul testo: tokenizzazione, segmentazione in frasi, POS-tagging, chunking (identificazione di brevi frasi nominale e/o verbali), riconoscimento di entità nominate e infine costruzione degli indici a partire dai chunk ritenuti più significativi. Ancora un altro caso d'uso di Scrapy potrebbe essere quello della costruzione di un corpus. In tal caso gli elementi critici dell'applicazione da costruire sarebbero: la scelta dei "semi", cioè degli url iniziali da cui effettuare l'esplorazione; i criteri con cui effettuare il "link following", con l'obbiettivo di raggiungere un insieme significativo ed equilibrato di pagine "campione"; l'estrazione del testo da ogni pagina, mediante filtraggio della formattazione ed eventuali ulteriori azioni di ripulitura. ACRONIMI RIFERIMENTI (webography) [1] Strumenti per l'analisi dei testi (morfologia, leggibilità), Accademia della Crusca, http://www.accademiadellacrusca.it/it/link-utili/strumenti-per-lanalisi-testi-morfologia-leggibilit, 2011 [2] Iman Salehian, UCLA Center for Digital Analysis, Intro to Digital Humanities, 2013, http://dh101.humanities.ucla.edu/?page_id=172 [3] Stéfan Sinclair and Geoffrey Rockwell, A Practical Guide to Text Analysis with Voyant Tools, http://docs.voyant-tools.org/ [4] VOYANT - see through your text (online service), https://voyant-tools.org/ [5] Voyant Tools Help - Languages, https://voyant-tools.org/docs/#!/guide/languages [6] Alyssa Anderson, Digital History Methods - Using Voyant for Text Analysis, http://ricedh.github.io/02-voyant.html [7] Steven Bird, Ewan Klein, and Edward Loper, Natural Language Processing with Python, https://www.nltk.org/book/ [8] Natural Language Toolkit, https://www.nltk.org/ [9] sentdex, Natural Language Processing With Python and NLTK p.1 Tokenizing words and Sentences, https://www.youtube.com/watch?v=FLZvOKSCkxY [10] Coursera, Applied Text Mining in Python, An Introduction to NLTK, https://www.coursera.org/learn/python-text-mining/lecture/KD8uN/basic-nlp-tasks-with-nltk [11] Jupyter (Jupyter Project site), http://jupyter.org/ [12] Marco Bonzanini and Miguel Martinez-Alvarez, Tutorial: Natural Language Processing in Python, https://github.com/bonzanini/nlp-tutorial [15] Matthew Honnibal, Introducing spaCy, https://explosion.ai/blog/introducing-spacy, 2015 [16] Industrial-Strength Natural Language Processing in Python, https://spacy.io/ Michael Yin, Scrapy Tutorial Series: Web Scraping Using Python, https://blog.michaelyin.info/2017/11/07/scrapy-tutorial-series-web-scraping-using-python/ DA WIKIPEDIA Voyant Tools, https://en.wikipedia.org/wiki/Voyant_Tools Informatica umanistica, https://it.wikipedia.org/wiki/Informatica_umanistica Digital humanities, https://en.wikipedia.org/wiki/Digital_humanities Natural Language Toolkit, https://en.wikipedia.org/wiki/Natural_Language_Toolkit Project Jupyter, https://en.wikipedia.org/wiki/Project_Jupyter SpaCy, https://en.wikipedia.org/wiki/SpaCy Web crawler, https://en.wikipedia.org/wiki/Web_crawler Crawler, https://it.wikipedia.org/wiki/Crawler Scrapy, https://en.wikipedia.org/wiki/Scrapy