{"id":6013,"date":"2023-07-07T09:00:00","date_gmt":"2023-07-07T07:00:00","guid":{"rendered":"https:\/\/blog.besharp.it\/?p=6013"},"modified":"2023-07-07T12:36:01","modified_gmt":"2023-07-07T10:36:01","slug":"estrazione-di-dati-da-documenti-strutturati-con-amazon-textract-aws-lambda-e-amazon-s3","status":"publish","type":"post","link":"https:\/\/blog.besharp.it\/it\/estrazione-di-dati-da-documenti-strutturati-con-amazon-textract-aws-lambda-e-amazon-s3\/","title":{"rendered":"Estrazione di dati da documenti strutturati con Amazon Textract, AWS Lambda e Amazon S3"},"content":{"rendered":"\n

Nell’era digitale, elaborare e gestire efficacemente grandi quantit\u00e0 di documenti \u00e8 una priorit\u00e0 per le aziende di ogni settore. Molte organizzazioni si trovano ad affrontare il compito di digitalizzare grandi volumi di documenti cartacei o di elaborare dati provenienti da documenti strutturati, come fatture o contratti, in modo automatico. In questo contesto, l’Optical Character Recognition (OCR) si \u00e8 rivelato uno strumento indispensabile per automatizzare i processi e migliorare l’efficienza complessiva.<\/p>\n\n\n\n

Tuttavia, riuscire ad estrarre il testo da un documento \u00e8 solo parte di quello di cui la maggior parte delle applicazioni hanno bisogno. Se vogliamo la si pu\u00f2 considerare una funzione primitiva. Spesso l\u2019obiettivo \u00e8 di estrarre specifiche informazioni, selezionando il testo in base alla struttura del documento.<\/p>\n\n\n\n

Per selezionare correttamente le informazioni di valore, diventa quindi importante ottenere informazioni sulla struttura del documento, come ad esempio su come il testo \u00e8 raggruppato, intabellato o sulla posizione occupata all\u2019interno della pagina.<\/p>\n\n\n\n

Trovare risposta a queste domande \u00e8 esattamente l’area in cui Amazon Textract<\/strong> si distingue.<\/p>\n\n\n\n

Oltre a fornire la capacit\u00e0 di estrarre testo da documenti, Amazon Textract \u00e8 in grado di identificare e restituire informazioni sulla struttura della pagina<\/strong>, aprendo la strada a una vasta gamma di possibilit\u00e0 di elaborazione dei dati. <\/p>\n\n\n\n

A differenza dei tradizionali software OCR, che richiedono configurazioni manuali e aggiornamenti continui per adattarsi ai cambiamenti dei moduli, Amazon Textract utilizza modelli di machine learning<\/strong> per elaborare qualsiasi tipo di documento, garantendo un’estrazione accurata di testo, scrittura a mano, tabelle e altri dati senza alcun intervento manuale.<\/p>\n\n\n\n

Senza ulteriori preamboli, passiamo quindi alla descrizione di uno use case.<\/p>\n\n\n\n

Estrazione delle informazioni da una fattura<\/h2>\n\n\n\n

Per esplorare le potenzialit\u00e0 di Amazon Textract ci avvarremo di un caso (neanche troppo) ipotetico, in cui la necessit\u00e0 sia quella di estrarre in maniera automatica alcune informazioni dalle fatture degli acquisti aziendali, in modo da inserire gli importi e la data in un database che viene periodicamente importato nel software gestionale.<\/p>\n\n\n\n

Dobbiamo quindi costruire un sistema automatico<\/strong> in grado di estrarre l\u2019importo e la data dalle fatture che riceve. Per semplicit\u00e0, poniamo che le fatture abbiano tutte la medesima struttura perch\u00e8 provengono dal sito del fornitore da cui la nostra azienda si rifornisce di beni di consumo, anche se Textract pu\u00f2 tranquillamente analizzare fatture eterogenee.<\/p>\n\n\n\n

Le fatture sono documenti PDF pensati per essere letti da un umano. Contengono intestazioni, l\u2019immagine del logo del fornitore, testo e tabelle in diverse posizioni della pagina.<\/p>\n\n\n\n

Il sito invia tramite email una fattura per ogni ordine. Nel nostro scenario, l\u2019indirizzo fa riferimento ad un gruppo mail, pertanto possiamo fare in modo che il sistema automatico ne riceva una copia senza intaccare i processi che coinvolgono i nostri operatori.<\/p>\n\n\n\n

In questa situazione potremmo abbozzare la seguente soluzione ad alto livello<\/p>\n\n\n\n

<\/p>\n\n\n

\n
\"infrastructure<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

Sottoscrivedo un indirizzo email ad-hoc al gruppo email possiamo indirizzare una copia delle email contenenti le fatture al nostro sistema.<\/p>\n\n\n\n

Per ricevere le email e processarle possiamo sfuttare Amazon SES; sebbene sia comunemente noto per l\u2019invio delle email in ambiente AWS, pu\u00f2 anche essere utilizzato per la ricezione e la conseguente integrazione con i servizi AWS utili all\u2019elaborazione delle email. <\/p>\n\n\n\n

La ricezione di email supporta diverse integrazioni, ma per il nostro caso quella pi\u00f9 pratica \u00e8 certamente quella con Amazon S3.<\/p>\n\n\n\n

Mediante l\u2019integrazione, Amazon SES salva un oggetto contenente i dati grezzi della mail, in formato MIME, sul bucket S3 designato. Questo ci consente quindi di mantenere lato AWS uno storico dei body raw di ogni messaggio ricevuto, utile sia per archiviazione sia per indagare eventuali malfunzionamenti. <\/p>\n\n\n\n

L\u2019utilizzo dello spazio di storage comporta costi minimi e, in caso di grandissime quantit\u00e0 di messaggi ricevuti, \u00e8 possibile ottimizzare il billing sfruttando tutte le funzioni di Amazon S3 come ad esempio le Lifecycle policy<\/strong> e le classi di storage<\/strong> a basso costo.<\/p>\n\n\n\n

A questo punto un S3 trigger entra in funzione, avviando una Lambda Function che si occupa di fare il parsing del corpo della mail ed estrarre l\u2019allegato. Il file pu\u00f2 essere quindi salvato in un bucket S3 dedicato.<\/p>\n\n\n\n

In questo articolo non esploreremo il codice necessario all\u2019estrazione degli allegati perch\u00e8 non \u00e8 il nocciolo di quanto intendiamo trattare. Tuttavia, esistono librerie per la maggior parte dei linguaggi pi\u00f9 diffusi che si occupano di semplifare il parsing e la manipolazione di dati in formato MIME. Per esempio, questa<\/a> \u00e8 una libreria da cui partire per sviluppare la funzione usando NodeJs.<\/p>\n\n\n\n

A questo punto, se la fattura \u00e8 salvata in uno dei formati supportati da Amazon Textract, \u00e8 possibile procedere all\u2019estrazione delle informazioni. In caso contrario, \u00e8 possibile aggiungere una ulteriore funzione, oppure estendere quella che manipola la mail, per effettuare una conversione verso un formato universale, come ad esempio PDF.<\/p>\n\n\n\n

Un secondo trigger S3 avvia una Lambda function adibita ad invocare Amazon Textract passandogli in input l\u2019oggetto di cui effettuare l\u2019analisi. La lambda andr\u00e0 poi a navigare il risultato dell\u2019analisi per prelevare importo e data di emissione della fattura, e a salvare le informazioni interessate all\u2019interno del database.<\/p>\n\n\n\n

L\u2019integrazione con Amazon Textract \u00e8 piuttosto assistita ed esistono i metodi in tutti gli SDK di AWS per i principali linguaggi di programmazione, come boto3 per Python e l\u2019AWS SDK per JavaScript.<\/p>\n\n\n\n

La fattura di riferimento<\/h2>\n\n\n\n

Nel nostro scenario, useremo delle fatture generate da Amazon Business, che sono fatte pi\u00f9 o meno cos\u00ec:<\/p>\n\n\n\n

<\/p>\n\n\n

\n
\"extracting<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

Il documento presenta il totale sia fuori dalla tabella con il dettaglio, sia in fondo alla tabella.<\/p>\n\n\n\n

Si tratta di un elemento da tenere in considerazione, perch\u00e8 potremo selezionare il totale pi\u00f9 facile da individuare con Textract, o costruire logiche per cercare il totale sia in tabella che fuori, e selezionare quello presente o se presenti entrambi e di diverso valore, quello con la confidenza maggiore.<\/p>\n\n\n\n

L\u2019API di Textract<\/h2>\n\n\n\n

Il servizio mette a disposizione diverse chiamate API, sia di tipo sincrono che di tipo asincrono.<\/p>\n\n\n\n

Le versioni sincrone permettono di inviare un documento per un’analisi immediata e la risposta alla chiamata API \u00e8 il risultato stesso dell\u2019analisi. Queste chiamate API presentano importanti limitazioni sui formati accettati, e sul fatto che il chiamante deve necessariamente attendere il termine dell\u2019analisi, il che pu\u00f2 richiedere diversi secondi.<\/p>\n\n\n\n

Le versioni asincrone, invece, restituiscono immediatamente un JOBID mediante il quale \u00e8 possibile richiedere il risultato dell\u2019analisi in un secondo momento. Esiste anche un meccanismo per ottenere notifica dell\u2019avvenuta analisi mediante SNS<\/a>; in sintesi \u00e8 possibile specificare il topic SNS quando si avvia l\u2019analisi asincrona.<\/p>\n\n\n\n

Occorre considerare accuratamente l\u2019utilizzo della versione asincrona, soprattutto se la computazione \u00e8 basata su Lambda. Questo consente di disaccoppiare meglio le componenti infrastrutturali, di costruire meccanismi di retry robusti, aumentando l\u2019alta affidabilit\u00e0 complessiva della soluzione e riducendo i costi eliminando il pagamento del tempo di computazione Lambda occupato dall\u2019attesa sincrona del risultato dell\u2019analisi.<\/p>\n\n\n\n

Al momento in cui sto scrivendo questo articolo, le chiamate API disponibili sono le seguenti: <\/p>\n\n\n\n