Blog

La nostra raccolta di articoli e approfondimenti tecnici

Video

Una raccolta di video dai nostri eventi, webinar e molto altro

Use case

Una raccolta dei nostri Casi di successo

Una delle grandi novità di Elasticsearch 6.5.0 è l’aggiunta di un nuovo plug-in per i field type: il mapper annotated text. Di seguito vi descriviamo le caratteristiche e i modi di utilizzo di questa nuova funzionalità:

 

Le limitazioni del testo “semplice”

Il field type testo, familiare alla maggior parte degli utenti di Elasticsearch serve per indicizzare il contenuto di un determinato testo. Elasticsearch suddivide una stringa di testo libero in più token, che rappresentano in genere una singola parola. I token vengono quindi organizzati in un indice in modo da poter identificare in modo corretto queste entità. Ma possono esserci alcuni problemi con la ricerca usando il testo non strutturato. Vediamone alcuni:

  1. Molti soggetti sono composti da parole multiple, ad esempio “John F. Kennedy”, ma sono indicizzati come token indipendenti john f and kennedy. Chi cerca John F Kennedy dovrebbe di conseguenza utilizzare una query di ricerca a frase per assicurarsi che i token siano raggruppati in modo da non dover semplicemente abbinare tutti quelli chiamati John.
  2. Le singole parole spesso riguardano molti argomenti, ad esempio “JFK” in un documento potrebbe riferirsi al celebre presidente americano, all’aeroporto di New York, oppure al film. I ricercatori del presidente potrebbero quindi erroneamente abbinare il risultato all’aeroporto.
  3. Un soggetto può avere più alias, ad esempio JFK o John F. Kennedy. Chiunque li cerca dovrebbe utilizzare le espressioni OR per abbinare tutti gli alias.

Queste criticità possono essere superate se cerchiamo “cose” e non “stringhe“, ovvero facendo una ricerca orientata all’entità e non al testo in senso stretto. Un tipo di approccio, questo, che richiede che gli argomenti di interesse per il testo siano etichettati con ID univoci.

 

Cos’è il testo “annotato”?

Come utenti di Internet abbiamo già abbastanza familiarità con l’uso delle annotazioni, e di conseguenza anche di collegamenti ipertestuali. Prendendo in esempio questo articolo che state leggendo, i collegamenti ipertestuali sono stati utilizzati per arricchire le parole selezionate utilizzate nel testo semplice con un collegamento all’articolo definitivo sull’argomento a cui si riferiscono. I valori di annotazione non devono essere necessariamente URL, ma qualsiasi forma di stringa che identifica in modo univoco un soggetto referenziato.

Elasticsearch dispone adesso di un nuovo tipo di campo specifico per contenere il testo annotato ed è definito nella mappatura dell’indice utilizzando il tipo di campo “annotated_text“:

 

“mappings”: { “_doc”: { “properties”: { “my_rich_text_field”: { “type”: “annotated_text”, “analyzer”: “my_analyzer” } } } }

 

Il contenuto dei campi di testo annotati utilizza una sintassi simile al markdown per aggiungere valori di annotazione a sezioni di testo selezionate, ad esempio:

 

“my_rich_text_field” : “Today [elastic](Elastic+Inc.) announced”

 

 

Altri esempi

Nell’esempio sopra, il testo “elastic”, potenzialmente ambiguo, è stato arricchito con un’annotazione riferita al nome completo dell’entità “Elastic Inc.”. Si noti che i valori di annotazione devono essere codificati per URL, quindi il carattere spazio nel nome è stato sostituito con “+”. Questo valore viene decodificato prima dell’inserimento nell’indice (ma non riportato in minuscolo o sottoposto ad altre forme di analisi).

Si possono vedere i risultati di questa operazione utilizzando l’API _analyze:

 

POST my_index/_analyze { “field”: “my_rich_text_field”, “text”: “Today [elastic](Elastic+Inc.) announced” }

 

I token prodotti sono i seguenti:

 

{ “tokens”: [ { “token”: “today”, “start_offset”: 0, “end_offset”: 5, “type”: “<ALPHANUM>”, “position”: 0 }, { “token”: “Elastic Inc.”, “start_offset”: 6, “end_offset”: 13, “type”: “annotation”, “position”: 1 }, { “token”: “elastic”, “start_offset”: 6, “end_offset”: 13, “type”: “<ALPHANUM>”, “position”: 1 }, { “token”: “announced”, “start_offset”: 14, “end_offset”: 23, “type”: “<ALPHANUM>”, “position”: 2 } ] }

 

 

Si può notare che il token “Elastic Inc.” appare esattamente nella stessa posizione e sfalsato rispetto alla parola “elastic” a cui era ancorato. In questo senso si comporta come un sinonimo, ma a differenza dei sinonimi, non si sta impiegando una regola valida per tutti che dice che tutti gli usi della parola “elastic” devono anche essere etichettati come “Elastic Inc.”. Un’annotazione è più focalizzata, limitando l’ambito a questo specifico uso della suddetta parola in un particolare documento e frase. Un testo che tratta ad esempio di “elastici di gomma” non sarebbe etichettato in modo simile.
È inoltre possibile inserire più token nella stessa posizione usando un carattere “&” per separare i valori (nello stesso modo in cui i parametri URL sono separati):

 

Today [elastic](Elastic+Inc.&Search_Company) announced

 

Come usare un testo annotato?

Con questa nuova funzionalità è possibile cercare il testo usando ID non ambigui e normalizzati per il vostro oggetto di interesse. Poiché adesso è possibile memorizzare le informazioni sulla posizione dei token di annotazione, c’è anche l’opportunità di:

  • Evidenziare il testo per mostrare esattamente dove è stato menzionato il soggetto.
  • Utilizzare query posizionali, ad esempio per trovare i documenti in cui è stato menzionato un “Search_Company” accanto al testo “annunciato” o “rilasciato”.

 

Da dove si estraggono i dati annotati?

Generalmente ci sono due fonti di questo tipo di dati: ovvero, il contenuto annotato dall’uomo, ad esempio articoli di Wikipedia,e il contenuto annotato dalla macchina, ad es. Output del software NER (Named Entity Recognition).

Gli esempi utilizzati fino ad ora in questo articolo erano basati sul contenuto Wikipedia, quindi da parte di un autore umano. Il contenuto originale è in formato XML e, utilizzando un parser Wikimedia, è possibile estrarre gli URL del collegamento ipertestuale e utilizzarli come valori di annotazione attorno al testo che coprono. L’ontologia di DBPedia può essere utilizzata per aggiungere ulteriori annotazioni, ad esempio che l’articolo di Wikipedia con l’ID “John F. Kennedy” sia dei tipi “OfficeHolder” e “Person”. Pertanto, ogni documento che include un collegamento di annotazione a JFK può avere collegamenti arricchiti con queste informazioni di tipo extra. Una volta che disponete ID univoci come questo è possibile inserire tutti i tipi di informazioni collegate.

Lavorare con gli strumenti Named Entity Recognition

Strumenti NER di tipo commerciale come Rosette o open source come OpenNLP possono identificare entità denominate come persone, organizzazioni e luoghi in testo normale. Con alcune codifiche client-side queste API possono essere utilizzate per creare il formato di testo annotato specifico utilizzato in Elasticsearch.
Va reso evidente che che alcuni strumenti di estrazione di entità individuano solo “riferimenti di entità”, ovvero risalire soltanto ad una sezione di testo si riferisce al nome di una persona, ad esempio “John Smith”, ma non risolvono il riferimento all’entità per determinare esattamente quale tra i tanti potrebbe essere il potenziale mondo reale di John Smith. Il collegamento di entità rappresenta il tentativo di fornire un ID univoco per un riferimento di entità, superando ambiguità (stesso nome, persone diverse), o alias (stessa persona, nomi diversi).

Quando si aggiungono annotazioni al testo è importante che i valori di annotazione non si scontrino con le stringhe regolari che potrebbero esistere nel testo o che le ricerche effettuate abbiano corrispondenze irrilevanti.
Se le entità da prendere in esame sono nomi di persone conterranno spazi bianchi per separare il nome e il cognome e utilizzeranno le maiuscole per i primi caratteri, pertanto è improbabile che si scontrino con i token di testo prodotti dagli analizzatori standard. Tuttavia, se si tratta ad esempio di una singola parola in minuscolo, ad esempio la società “elastic”, allora potrebbe esserci un potenziale disallineamento.
Il prefisso del valore di annotazione con una stringa di testo e un carattere che viene rimosso dalla pipeline di analisi del testo rappresenta un modo per assicurarsi che non vi siano sovrapposizioni, ad esempio preferibile “azienda: elastic” piuttosto che “elastic”.

Credits: Mark Harwood

 

 

Contatta Seacom

Vuoi rimanere aggiornato su tutte novità Elastic o richiedere una consulenza a Seacom?
Visita la pagina dedicata, oppure