Vai al contenuto principale
Questa sezione presenta alcuni esempi di regole di estrazione create con l’editor di codice, che offre maggiore flessibilità rispetto all’interfaccia utente grafica (vedi la sezione Sintassi per una descrizione dettagliata della sintassi utilizzata).

Trovare l’ultima occorrenza di un’entità denominata

In questo esempio si utilizza una regola di estrazione per trovare il nome dell’organizzazione dell’inquilino in un contratto di locazione. Questo nome compare dopo i nomi di tutte le altre organizzazioni e non può essere estratto utilizzando le impostazioni della GUI, dove è possibile selezionare solo Instances > First. Tuttavia, è possibile usare una regola di estrazione per cercare il nome dell’organizzazione che precede da vicino la parola “Tenant” racchiusa tra parentesi. Per prima cosa individuiamo la parola chiave “Tenant” come elemento di ricerca ausiliario. Successivamente cerchiamo il nome dell’organizzazione che si trova prima di tale parola chiave. In questo esempio, ci sono due token intermedi — una parentesi di apertura e un segno di virgolette — quindi limitiamo la distanza a tre token, lasciando un margine di sicurezza. Se i tuoi documenti presentano più token intermedi che separano la parola chiave dal nome dell’organizzazione, aumenta di conseguenza questo numero.

Regola per estrarre l’ultima occorrenza dell’organizzazione

// Stiamo cercando una sola istanza
~TenantName
// Trova il nome dell'organizzazione che precede la parola chiave "Tenant"
// e che è separato da essa da non più di tre token
// I token intermedi non devono contenere il nome di un'altra organizzazione
[ t: @NEROrganization ]+ [ ~@NEROrganization ~@kw_Tenant ]{0,3} [ @kw_Tenant ]
=>
TenantName( t );

Esempio

Esempio di estrazione del nome del tenant

Estrazione di un importo indicato sia in lettere sia in cifre

In questo esempio viene utilizzata una regola di estrazione con espressioni regolari per trovare un importo che è scritto prima in lettere e poi in cifre tra parentesi tonde, ad esempio: Duemilacentoquarantasette dollari e sessanta centesimi ($2.147,60) Duemilacentoquarantasette dollari e sessanta centesimi (in cifre: $2.147,60)

Regola per l’estrazione di un importo di denaro

// La variabile a riceve l'entità denominata Money che non è espressa in cifre
// e non è ancora stata assegnata ad alcuna altra istanza dell'elemento di ricerca Money
[ a: @NERMoney( same ) ~@Money ~/\d+/ ]+
[ br: '(' ]
// Il punto interrogativo indica che le parole "in numbers" sono facoltative
// I simboli ^ e $ indicano che l'intera stringa deve corrispondere all'espressione regolare
// L'opzione i indica che la corrispondenza non fa distinzione tra maiuscole e minuscole
( [ e1: /^in$/i ] [ e2: /^numbers$/i ] [ e3: ':' ]? )?
// La variabile b riceve l'entità denominata Money posizionata all'interno delle parentesi
[ b: @NERMoney( same ) ~@Money ]+
=>
Money( a + br + e1 + e2 + e3 + b );

Esempio

Esempio di estrazione di importi

Trovare segmenti tramite parole chiave

In questo esempio si utilizzano regole di estrazione per individuare segmenti che non possono essere rilevati in modo affidabile dall’attività di Segmentazione. Le regole cercano parole chiave che aprono o chiudono un segmento ed estraggono il testo compreso tra di esse. Supponiamo che i nostri documenti presentino intestazioni di secondo livello numerate e scritte tutte in maiuscolo, ad esempio: 1.1 PREMISES, 2.3 LIABILITY AND INDEMNITY, e così via. Supponiamo inoltre di aver già estratto le intestazioni di primo livello in un elemento di ricerca denominato “kw_Heading1” (la relativa regola di estrazione è omessa per brevità). Per prima cosa cerchiamo le parole chiave che avviano ciascun paragrafo del documento e le estraiamo in un elemento di ricerca denominato “kw_Heading2”. Successivamente inseriamo il testo compreso tra due parole chiave consecutive in un elemento di ricerca denominato “Segment”. Nella versione attuale di Advanced Designer, l’editor del codice è disponibile solo per gli elementi di ricerca utilizzati per trovare entità denominate. Come soluzione alternativa, per estrarre tramite codice testo come intestazioni o segmenti, crea semplicemente un elemento di ricerca per una delle entità denominate supportate (ad esempio, Organization) e inserisci il codice della regola nell’editor del codice di tale elemento.

Regola per estrarre i titoli di secondo livello nell’elemento di ricerca kw_Heading2

// Cerca un'intestazione di secondo livello numerata che contenga fino a cinque parole in maiuscolo
// Il numero dell'intestazione può essere trovato come singolo token: 1.1
[ t1: /\d{1,2}\.\d{1,2}/ ] [ t2: <all_letters_capitalized> ]{1,5}
=>
kw_Heading2( t1 + t2 );
// Il numero dell'intestazione può essere trovato come tre token separati: 1, punto, 1
[ t1: /\d{1,2}/ ] [ t2: '.' ] [ t3: /\d{1,2}/ ] [ t4: <all_letters_capitalized> ]{1,5}
=>
kw_Heading2( t1 + t2 + t3 + t4 );

Regola per estrarre il segmento nell’elemento di ricerca Segment

// Trova il segmento di testo tra due intestazioni di sezione consecutive
// Escludi anche eventuali intestazioni di primo livello
[ @kw_Heading2 ] [ interval: ~@kw_Heading2 ~@kw_Heading1 ]+
=>
Root.Segment( interval );

Esempio

Esempio che mostra l'estrazione dei segmenti In questo esempio, le diciture “3.1 FIRSTLY” e “3.2 SECONDLY” vengono estratte nell’elemento di ricerca kw_Heading2, quindi il testo compreso tra due istanze consecutive dell’elemento di ricerca kw_Heading2 viene estratto in un’istanza dell’elemento di ricerca Segment.

Raggruppare le informazioni su ciascuna entità

In questo esempio, le regole di estrazione vengono utilizzate per garantire che i dettagli relativi a ciascuna parte di un accordo siano raggruppati correttamente (ossia, il nome e l’indirizzo di ciascuna parte appartengono a un’unica istanza di gruppo e non sono suddivisi in più istanze o mescolati con i dettagli dell’altra parte). L’idea è individuare informazioni identificative su una parte che compaiono sempre per prime. Ci sono diversi modi per farlo, a seconda di come sono redatti gli accordi. In questo esempio, assumiamo che il nome di ciascuna organizzazione compaia sempre per primo, seguito dal suo indirizzo e dal suo ruolo nell’accordo. Pertanto, procederemo come segue:
  1. Cercare i nomi delle organizzazioni, creare una nuova istanza dell’elemento di ricerca di gruppo Party_Group per ciascun nome trovato e valorizzare il relativo elemento di ricerca figlio denominato “Organization_Name.”
  2. Cercare l’indirizzo e il ruolo che siano distanti non più di, diciamo, 20 token da ciascuna istanza del nome dell’organizzazione, accedere all’istanza di Party_Group che è il genitore del nome dell’organizzazione e valorizzare gli elementi di ricerca figli denominati “Address” e “Role” in quella istanza.
I dati verranno cercati solo all’interno del segmento individuato dall’attività Segmentation e passato all’attività Extraction Rules come field di input denominato “Parties_Segment.”

Regola per l’estrazione dell’elemento di ricerca Organization_Name

// Trova il nome dell'organizzazione e crea una nuova istanza di gruppo per ciascuna
[ org: @NEROrganization( same ) ~@Party_Group.Organization_Name @Parties_Segment ]+
=>
// Crea una nuova istanza di Party_Group e inserisci Organization_Name
Party_Group.Organization_Name( org );

Regola per l’estrazione dell’elemento di ricerca Address

// Ora cerca l'indirizzo separato da non più di 20 token
// dal nome dell'organizzazione
// e che non è ancora stato assegnato ad alcuna organizzazione in Party_Group
[ org: @Party_Group.Organization_Name( same ) ]+
[ ~@NERAddress ]{0,20}
[ t: @NERAddress( same ) ~@Party_Group.Address @Parties_Segment ]+
=>
// Accedi all'istanza di Party_Group che è il padre del nome dell'organizzazione
// e compila il suo elemento figlio Address
parent( obj( org )).Address( t );

Regola per l’estrazione dell’elemento di ricerca “Role”

// Ripetere la stessa operazione per il ruolo
// Per trovare il ruolo, utilizzare parole chiave
[ org: @Party_Group.Organization_Name( same ) ]+
[ ~("Tenant" | "Landlord" | "Broker") ]{0,20}
[ t: "Tenant" | "Landlord" | "Broker" ~@Party_Group.Role @Parties_Segment ]+
=>
parent( obj( org )).Role( t );

Esempio

Gli elementi di ricerca verranno estratti come segue: Example showing grouped data extraction Nel modulo dati puoi anche vedere che il nome, l’indirizzo e il ruolo di ciascuna azienda sono raggruppati in istanze di gruppo separate: Example showing grouped data fields I dettagli di ciascuna organizzazione sono raggruppati, come indicato dai numeri dell’istanza tra parentesi.

Trovare data e ora insieme

In questo esempio viene utilizzata una regola di estrazione per individuare una combinazione di ora e data. Per prima cosa utilizziamo un elemento di ricerca denominato “Time” di tipo Value from Regular Expression (l’espressione regolare utilizzata è [1]?\d:\d{2}\s+(([ap]\.m\.)|([AP]M))?). Successivamente, cerchiamo un’entità denominata Date situata nelle vicinanze. Infine, concateniamo le sequenze di token trovate e assegniamo il risultato a un elemento di ricerca denominato “TimeAndDate”.

Regola per l’estrazione combinata di data e ora

// Utilizza un valore dall'elemento di ricerca con espressione regolare per trovare l'ora
// Utilizza @NERDate per trovare un'entità denominata Date vicina all'ora
[ time: @Time ~@TimeAndDate ]+ [ t: ~@NERDate ]{0,3} [ date: @NERDate( same ) ]+
=>
// Combina i valori per scriverli in un unico field
// Solo le sequenze di token consecutive possono essere combinate, quindi viene aggiunto anche il token ausiliario
TimeAndDate( time + t + date );

Esempio

Esempio dell'estrazione di data e ora