due immagini che raffigurano i layout dei documenti PDF generati con l'utilizzo dei Transformer su sfondo viola

Il Natural Language Processing per la generazione automatica di documenti

L’Intelligenza Artificiale, e nello specifico il Natural Language Processing (NLP), ci permette di ottenere risultati eccezionali in molti ambiti, tra i quali l'analisi del contenuto di documenti. Grazie ai sistemi addestrati con il Machine Learning è possibile gestire quei moduli e file testuali di ogni genere che ci accompagnano nelle attività quotidiane di tutti i giorni. Tuttavia, per il corretto addestramento di questi modelli, abbiamo bisogno di una grandissima quantità di dati, i quali vengono spesso generati manualmente, con un importante incremento di costi da sostenere, sia in termini di tempo che di risorse umane. Una situazione che si complica ancora di più se i dati con cui abbiamo bisogno di lavorare sono dei documenti: la categoria di dati non strutturati per eccellenza. Da problemi nascono opportunità: perché non sfruttare l'intelligenza delle macchine per generare automaticamente documenti e annotazioni sintetiche da utilizzare nel nostro quotidiano?

Lorenzo, sviluppatore backend del nostro team, ma anche ricercatore in ambito Machine Learning e Natural Language Processing all’Università degli Studi di Firenze, ha esplorato questo tema grazie a uno studio di ricerca che ha poi dato vita alla sua tesi di laurea. Da appassionato divulgatore ha condiviso il suo lavoro di ricerca partecipando come speaker alla conferenza italiana dedicata a Python, PyCon Italia.

In questo blog post, Lorenzo ci racconterà i punti salienti del suo talk, e quindi obiettivi, metodologia e le interessanti scoperte del suo lavoro di ricerca. Partiamo!

Document Layout Analysis

Vantaggi e limiti

""

La Document Layout Analysis (DLA) è quell'operazione che ci permette di individuare le regioni di interesse all’interno di un documento presentato sotto forma di immagine, per poi estrarne informazioni sintattiche e semantiche. Quello che conta è che grazie alla DLA siamo in grado di apprendere, in modo automatizzato, un certo dato, a partire da un documento di partenza. Per fare questo genere di operazioni, possiamo affidarci a tecniche di Machine Learning che lavorano su scansioni di qualità più o meno elevate. Per addestrare questo genere di sistemi, un team di persone deve provvedere alla scansione di migliaia di pagine di libri, moduli o di qualsiasi tipo di documento su cui si intende lavorare e, soprattutto, all’annotazione dei dati. Quest’ultima è il processo per cui ogni elemento ritenuto utile all'interno del dato grezzo iniziale viene classificato all'interno di una categoria:

  • per tipo: se è un titolo, una didascalia, un'immagine, ecc;
  • per informazioni geometriche: una volta individuato il tipo, viene indicato dove si trova spazialmente l'oggetto nella pagina.

In altre parole, per ogni pagina contenuta nel dataset di partenza, che verrà poi diviso opportunamente in training set, validation set e test set, è necessario avere un file che contenga l’annotazione di ogni elemento all’interno dei documenti di partenza. Questa procedura è altamente soggetta ad errori ed è estremamente costosa. Oltre a questo, dobbiamo anche considerare che questi task di Computer Vision sono computazionalmente molto onerosi.

Per superare questa problematica, l’idea che abbiamo proposto nello studio di ricerca, si basa sui seguenti capisaldi:

  • Automatizzare il processo di annotazione per ottenere un piccolo dataset di documenti annotato, afferenti ad uno specifico dominio di partenza;
     
  • Con l’utilizzo delle sole annotazioni, generare layout sintetici, a partire dal dataset di partenza, che appartengano quindi allo stesso dominio, sfruttando un’architettura in grado di apprendere il layout dei dati iniziali;
     
  • Generare, infine, pagine sintetiche a partire dai layout generati precedentemente e così aumentare il dataset iniziale.

Come raggiungere questi obiettivi?

Il metodo utilizzato

Il metodo che abbiamo proposto per raggiungere gli obiettivi descritti sopra, consiste in quattro fasi distinte. Vediamole insieme:

  1. Collezionare un piccolo insieme di file in formato PDF (tra i formati più utilizzati al mondo); ristrutturarlo in modo da avere più facile accesso all’informazione; generare le annotazioni e correggerle, se necessario.

  2. Generare i layout plausibili rispetto a quelli dei dati originali, ottenendo quindi automaticamente le annotazioni dei dati sintetici.

  3. Generare le immagini dei dati sintetici.

  4. Fare Document Layout Analysis, utilizzando il dataset così aumentato, per valutare la bontà del metodo.

Collezionare e ristrutturare i dati

Fase uno

""

I dati di partenza sono stati collezionati dall’ICDAR (International Conference on Document Analysis and Recognition): si tratta di PDF che seguono lo stile a doppia colonna per le pubblicazioni scientifiche dell’IEEE (Institute of Electrical and Electronic Engineers).

Dal momento che il PDF non è uno standard che permette di accedere sistematicamente al contenuto dei file e riconoscere il tipo di testo, è stato utilizzato GROBID per convertire il PDF nella sua controparte XML. Quest’ultimo infatti è un formato di dato strutturato, che facilita l’accesso ai metadati degli oggetti presenti nel documento (ad esempio, proprio la categoria dell’oggetto testuale, se è un titolo, un sottotitolo, semplice testo).

A questo punto, ogni documento del nostro dataset di partenza è rappresentato da due tipi di file: il PDF, originale, e l’XML. Grazie all’utilizzo di due librerie Python (PDFMiner e beatifulSoup4) possiamo quindi annotare i nostri documenti, incrociando le informazioni derivanti dall’XML e dal PDF, in sinergia. Questo processo ha richiesto anche un intervento manuale per correggere le annotazioni così generate, per cui è stato usato un altro tool chiamato labelImg; in ogni caso, tutto il lavoro è stato estremamente velocizzato. In questa fase, chiamata di parsing, sono state anche memorizzate tutte le istanze testuali, per categoria, incontrate durante il lavoro.

In conclusione, dopo questa fase abbiamo rapidamente e correttamente annotato 375 articoli scientifici, per un totale di 2088 pagine. In ambito ML, un dataset del genere è estremamente scarno. Tuttavia, la sfida principale di questo lavoro è proprio quella di partire da pochi dati per ottenerne un numero arbitrariamente grande con un buon grado di eterogeneità. Quindi, il nostro dataset di partenza è perfetto per lo scopo e possiamo passare alla fase successiva.

""
""

Generare dei layout sintetici

Fase due

""

Arrivati a questo punto, possiamo passare alla vera e propria fase generativa utilizzando l’architettura che abbiamo scelto a questo scopo: LayoutTransformer. I Transfomer, come detto brevemente prima, sono dei sistemi noti per la loro eccezionale versatilità e capacità di ottenere ottimi risultati in ambito NLP, sfruttando il meccanismo della self-attention. La self-attention permette di imparare le relazioni tra i dati posti in ingresso all’architettura sotto forma di sequenza, ed è proprio per questo motivo che i Transformer lavorano bene con il testo, per la loro capacità di comprendere le relazioni che esistono tra le parole che compongono una frase. Qual è il soggetto di quel verbo? Quale, invece, il complemento oggetto? A quale sostantivo si riferisce quell’aggettivo?

Fatta questa doverosa (e rapidissima) premessa, possiamo affermare i seguenti punti:

  • Un layout di un documento non è altro che una sequenza di oggetti in relazione fra loro (come una didascalia con un’immagine o una tabella, un sottotitolo ad un paragrafo di testo, o le keyword ad un abstract).
     

  • Per la natura del dato, i Transformer possono quindi apprendere la composizione dei layout di un dominio di documenti per generarne altri sufficientemente plausibili, possibilmente partendo da pochi dati.

Abbiamo quindi tutto l’occorrente per avviare la generazione. Per farlo, abbiamo suddiviso il nostro dataset annotato di partenza in training set e validation set (90% e 10% delle pagine, rispettivamente). È importante ribadire che in questa fase vengono usate esclusivamente le annotazioni, e non le immagini: oltre ad usare pochi dati, questi sono anche leggeri e velocemente processabili. Gli esperimenti sono stati condotti con l’ausilio di una GPU NVIDIA GeForce RTX 3090.

Una volta addestrato il modello è possibile fare inferenza, generare quindi un numero arbitrario di layout andando a campionare dal modello stesso. Abbiamo deciso di generarne 10.000.

Avendo usato pochi dati, ci aspettavamo un po' di errori, come ad esempio sovrapposizioni tra i vari bounding boxes generati. Per sistemare il modello abbiamo quindi implementato una pipeline di post-processing che ci permettesse di fare due operazioni fondamentali:

  1. Mergiare annotazioni sovrapposte afferenti alla stessa categoria.
     
  2. Separare annotazioni sovrapposte afferenti a categorie diverse.

Il risultato è un set di layout plausibili considerando il dominio di partenza. Di per sé questo è già un gran risultato, se teniamo conto della scarsa quantità di dati da cui siamo partiti.

""

Generare i documenti

Fase tre

Finalmente, siamo in grado di passare alla generazione dei documenti, sulla base dei layout ottenuti nello step precedente con i Transformer. La generazione dei documenti è stata affidata alla libreria FPDF che permette di generare PDF ed inserire al loro interno testo e immagini secondo precise coordinate: avendo layout generati automaticamente, abbiamo ovviamente a disposizione tutte le informazioni necessarie per individuare i bounding boxes degli oggetti generati stessi.

Per generare i documenti abbiamo ovviamente bisogno di elementi appartenenti a queste macro-categorie: testo, immagini, tabelle e formule.

  1. Per quanto riguarda il testo, abbiamo deciso di generarlo utilizzando un semplice modello 3-grams, a partire dal testo raccolto, per ogni categoria testuale (per esempio, titolo, abstract, testo semplice, sottotitoli…) durante la fase di parsing. Questo passaggio può essere sicuramente migliorato in sviluppi futuri, scegliendo di utilizzare modelli NLP avanzati per generare dataset di documenti sintetici che parlino di un topic ben definito e così addestrare reti per task più specifici. Per l’implementazione e l’addestramento del modello a 3-grams abbiamo utilizzato la libreria NLTK.

  2. Le immagini e le tabelle sono state liberamente scaricate da un database online, VISImageNavigator, ed adattate alla dimensione dell’annotazione generata utilizzando Pillow.

  3. Infine, le formule sono state scaricate in formato LaTeX dal sito equationsheet.com, ed integrate della generazione dei documenti utilizzando la libreria pylatex che, come ci si può immaginare, espone una API per lavorare con un compilatore LaTeX via Python.

L’algoritmo sviluppato per la sintesi dei documenti, dopo aver creato le pagine PDF, le converte sotto forma di PNG per passare alla fase di valutazione del metodo utilizzando una rete neurale per l’object detection, la ResNeXt.

""

Fare Document Layout Analysis

Fase quattro

Dopo tutto il lavoro svolto, dobbiamo valutare la bontà del metodo proposto. Riassumendo, siamo partiti da un piccolo dataset di documenti in formato PDF; dopo aver generato la loro controparte XML con l’ausilio di GROBID, questi sono stati annotati con una pipeline di annotazione semi-automatica, per poi utilizzare le stesse annotazioni nella fase di generazione di layout sintetici sfruttando la potenza dei Transformer. Dai layout ottenuti, abbiamo quindi generato 10.000 documenti sintetici da utilizzare per fare la data augmentation del dataset di partenza, sperando di migliorare la detection di oggetti testuali nei documenti.

Per fare una valutazione qualitativa, ci siamo affidati alla potenza della ResNeXt, una rete d’avanguardia per quanto riguarda l’object detection. È importante sottolineare che la ResNeXt è stata pre-addestrata con DocBank, un dataset di documenti che utilizza esattamente le stesse categorie definite nel metodo utilizzato.

Il setup degli esperimenti prevedeva la definizione dei seguenti dataset:

  1. Un training set formato da 1044 immagini (metà delle 2088 pagine di partenza) con le annotazioni generate dalla pipeline.

  2. Un training set aumentato, quindi formato dalle stesse 1044 immagini del punto precedente e, inoltre, le 10.000 pagine generate dal metodo proposto, accompagnate ovviamente dalle annotazioni generate con LayoutTransformer.

  3. Un test set formato dalle rimanenti 1044 pagine (metà delle 2088 pagine di partenza).

L’obiettivo degli esperimenti è chiaro: fare il fine-tuning della ResNeXt (sfruttando quindi il transfer learning) utilizzando prima il dataset formato dalle sole pagine originali, dopo il dataset aumentato, per poi testare la capacità dei modelli ottenuti di classificare gli oggetti all’interno del test set. Sperabilmente, la data augmentation effettuata aiuterà la rete a generalizzare meglio e quindi ad affinare la detection nei documenti usati per il test. Il framework utilizzato per questi esperimenti è detectron2 by FacebookAI Lab. La GPU è sempre la GPU NVIDIA GeForce RTX 3090.

La metrica utilizzata è la mAP (mean Average Precision), in particolare, mediata, oltre che sulle AP ottenute su tutte le categorie, anche su dieci diverse thresholds di IoU (Intersection Over Union): da 0.50 a 0.95 con uno step di 0.05.

""

I risultati ci permettono di constatare che il modello ottenuto con la data augmentation ci permette di migliorare i risultati di 1% nella mAP.

Conclusioni

Le ricerche che abbiamo condotto, raccontate nel mio talk e in questo blog post, presentano diversi risultati importanti: è possibile utilizzare i Transformer per, a partire da un piccolo dataset di documenti di partenza, generare pagine sintetiche che ci permettano di migliorare la Document Layout Analysis, utilizzando una rete d’avanguardia nell’ambito dell’object detection, come la ResNeXt. Questo può portare tantissimi benefici, garantendo un maggior controllo sui documenti dai quali, seppure non strutturati, diventa più facile estrarre informazioni. Oltre a questo, è importante sottolineare che questo è un approccio estremamente scalabile: è facilmente migliorabile, con l’utilizzo iniziale di più dati.

Per gli sviluppi futuri, resta aperta la sfida per generare dataset aumentati che abbiano topic specifici e provare il metodo utilizzando, in partenza, PDF con layout diversi rispetto alla doppia colonna.

____________

Il nostro viaggio nella generazione automatica di documenti con i Transformer è giunto al termine. Se vuoi approfondire il tema alla fine dell’articolo puoi trovare una lista di risorse utili e riferimenti. Se invece hai domande o riflessioni da condividere, scrivici nei commenti. Ci fa sempre piacere confrontarci sui temi tecnologici che più ci appassionano. Ti aspettiamo!

Puoi anche recuperare il video del talk di Lorenzo a PyConIT22 sul canale Youtube di Python Italia.

Alla prossima!

____________

Risorse Utili

  1. Grobid. [ https://github.com/kermitt2/grobid, 2008–2022 ]

  2. A. Vaswani, N. Shazeer, N. Parmar, J. Uszkoreit, L. Jones, A. N. Gomez, L. Kaiser, and I. Polosukhin. ”Attention is all you need.”, 2017

  3. K. Gupta, J. Lazarow, A. Achille, L. S Davis, V. Mahadevan, and A. Shrivastava. ”LayoutTransformer: Layout generation and completion with self-attention.”, 2021

  4. C. Szegedy, S. Ioffe, V. Vanhoucke, and A. A. Alemi. ”Inception-v4, inception-resnet and the impact of residual connections on learning.”, In AAAI, 2017

  5. M. Li, Y Xu, L. Cui, S. Huang, F. Wei, Z. Li, and M. Zhou. ”Docbank: A benchmark dataset for document layout."