Few-shot NER: estrazione di entità senza annotazione e addestramento basato su GPT

I modelli di estrazione di entità pre-addestrati basati su spaCy o NLTK danno grandi risultati ma richiedono un noioso processo di annotazione e addestramento per rilevare entità non native come titoli di lavoro, numeri di partita IVA, farmaci, ecc. Grazie a grandi modelli linguistici come GPT-3, GPT-J e GPT-NeoX, è ora possibile estrarre qualsiasi tipo di entità grazie all'apprendimento in pochi colpi, senza alcuna annotazione e addestramento. In questo articolo, mostreremo come farlo.

La NER (estrazione di entità) riguarda fondamentalmente l'estrazione di informazioni strutturate da un testo non strutturato. Se sei nuovo alla NER, puoi prima leggere la nostra breve introduzione: introduzione alla NER.

NER con spaCy e NLTK: il modo tradizionale

SpaCy è diventato praticamente lo standard de facto per NER negli ultimi anni (vedere il sito web di spaCy). SpaCy è un framework molto attraente perché è facile da usare, e la sua velocità lo rende adatto all'uso in produzione.

SpaCy è un framework Python per l'elaborazione del linguaggio naturale che propone molti modelli pre-addestrati in più lingue, quindi è facile estrarre diversi tipi di entità (aziende, città, indirizzi, date, ecc.) nella propria lingua senza dover addestrare il proprio modello.

NLTK è anche una scelta interessante per l'estrazione di entità con Python, ma propone meno entità di default, e in generale NLTK non è raccomandato per la produzione (è più un framework educativo e di ricerca).

Tuttavia si incontra rapidamente un limite con questi framework: il numero di entità supportate nativamente è limitato. La maggior parte delle aziende vuole sfruttare la NER per estrarre informazioni di business specifiche come informazioni sulle persone, dati finanziari, trattamenti medici, ecc. Naturalmente, queste entità non sono supportate di default dai modelli pre-addestrati di spaCy, quindi per raggiungere questo obiettivo, dovete creare il vostro dataset e addestrare il vostro modello su di esso.

Addestrare il proprio modello spaCy è un processo di annotazione lungo e noioso: una o più persone devono collaborare per creare un enorme insieme di buoni esempi e annotarli. Un volume molto grande di esempi è necessario per far sì che il modello apprenda correttamente. Esistono buoni strumenti di annotazione (come Prodigy, di spaCy), ma rimane ancora un compito doloroso che fa interrompere molti progetti NLP.

Illustrazione dell'annotazione

Buone notizie: con l'aumento di grandi modelli linguistici come GPT-3, GPT-J e GPT-NeoX, è ora possibile estrarre qualsiasi entità senza annotare e addestrare un nuovo modello!

Generazione di testo con GPT-3, GPT-J e GPT-NeoX

I grandi modelli linguistici per la generazione di testo hanno iniziato ad apparire recentemente con GPT-3 (vedere di più su GPT-3 sul sito web di OpenAI). Quando OpenAI ha rilasciato il loro modello GPT-3, composto da 175 miliardi di parametri, è stata una rivoluzione perché ha aperto la strada a molte applicazioni AI all'avanguardia basate sull'elaborazione del linguaggio naturale senza richiedere alcun addestramento aggiuntivo.

L'obiettivo iniziale dei modelli GPT come GPT-3 è quello di generare testo: basta dare un input al modello e lasciare che generi il resto per voi. Sulla base della generazione del testo, praticamente qualsiasi caso d'uso dell'elaborazione del linguaggio naturale può essere raggiunto: classificazione, riassunto, AI conversazionale, parafrasi... e naturalmente estrazione di entità!

Poiché GPT-3 non è un modello open-source, la comunità open-source ha lavorato su alternative a GPT-3 e ora abbiamo 2 grandi equivalenti open-source: GPT-J e GPT-NeoX. Non sono ancora grandi come GPT-3, ma senza dubbio è solo una questione di tempo prima che la comunità open-source raggiunga OpenAI.

Sfruttare correttamente questi modelli richiede una nuova tecnica chiamata "few-shot learning".

Apprendimento a pochi colpi

Questi grandi modelli GPT sono così grandi che possono imparare molto rapidamente da voi.

Diciamo che volete che GPT-3 generi una breve descrizione del prodotto per voi. Ecco un esempio senza apprendimento di pochi scatti:

Generate a product description containing these specific keywords: t-shirt, men, $50

La risposta che otterrete sarà inutile. Potrebbe essere qualcosa del genere, per esempio:

Generate a product description containing these specific keywords: t-shirt, men, $50 and short.

The product description needs to be a few words long. Don’t use plurals, use the keywords in the order they are

Buone notizie: si possono ottenere risultati molto migliori semplicemente dando un paio di esempi al modello!

Generate a product description containing specific keywords.

Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1499
Result:

Il risultato sarà qualcosa del genere:

Generate a product description containing specific keywords.

Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1,499
Result: The best gaming GPU on the market, at the price of $1,499 only.

Come potete vedere, la risposta del modello è ora perfettamente a proposito, grazie ai 3 esempi che gli abbiamo dato inizialmente. Eppure, questo modello non è mai stato addestrato su questo tipo di compito di generazione della descrizione del prodotto. Questa è la tecnica del "few-shot learning": si esegue il "transfer learning" al volo con un paio di esempi soltanto. Per ottenere questo tipo di risultato, di solito ci si aspetta di addestrare un modello di elaborazione del linguaggio naturale con tonnellate di esempi, ma non qui.

Estrazione di entità con apprendimento a pochi colpi

Ora eseguiremo l'estrazione di entità grazie all'apprendimento a pochi colpi.

Diciamo che volete estrarre i titoli di lavoro dai siti web. Date semplicemente un paio di esempi di estrazione di titoli di lavoro prima di fare la vostra richiesta effettiva:

Extract job titles from the following sentences.

Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title:

Il risultato sarà il seguente:

Extract job titles from the following sentences.

Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title: CTO

Come avete notato, dobbiamo essere intelligenti su come stiamo creando i nostri esempi di pochi colpi. Può succedere che non venga trovato nessun titolo di lavoro, ecco perché abbiamo creato un esempio che restituisce "nessuno" (evita i falsi positivi). Forse vuoi estrarre diversi titoli di lavoro allo stesso tempo? In questo caso è importante creare degli esempi che restituiscano anche diversi titoli di lavoro (titoli di lavoro separati da virgola, per esempio).

Otterrete risultati ancora migliori aggiungendo ancora più esempi. Ed è importante che i tuoi esempi siano il più vicino possibile alla tua richiesta finale effettiva. Per esempio, se sai che dovrai analizzare interi paragrafi invece di semplici frasi, è meglio creare esempi anche con paragrafi.

Se non hai accesso a un modello GPT, puoi semplicemente usare l'API NLP Cloud. Sono disponibili diversi client (Python, Go, Node.js, Ruby, PHP...). Mostriamo qui un esempio usando GPT-J con il client Python:

import nlpcloud

client = nlpcloud.Client("gpt-j", "your API token", gpu=True)
client.generation("""Extract job titles from the following sentences.

    Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
    Job title: Linux Engineer
    ###
    Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
    Job title: none
    ###
    Sentence: Marc Simoncini | Director | Meetic
    Job title: Director
    ###
    Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
    Job title: CEO
    ###
    Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
    Job title:""",
top_p=0.1,
length_no_input=True,
remove_input=True,
end_sequence="###",
remove_end_sequence=True
)

Il risultato sarà: CTO

Lasciate che vi dia una rapida spiegazione sui parametri di generazione del testo che abbiamo appena usato.

Abbiamo impostato un valore p massimo molto basso perché non vogliamo che GPT-J crei risultati troppo originali: vogliamo solo che si attenga a ciò che ha visto nella tua richiesta.

"length_no_input" significa che il valore della lunghezza massima non deve tenere conto del testo inserito.

"remove_input" significa che il testo di input dovrebbe essere rimosso dal risultato.

"end_sequence" significa che quando il modello incontra questo carattere, dovrebbe smettere di generare testo. Poiché nei nostri esempi di pochi scatti abbiamo aggiunto "####" alla fine di ogni risposta, il modello genererà automaticamente "###" dopo aver generato la risposta e si fermerà lì.

"remove_end_sequence" significa che vogliamo rimuovere "###" dalla risposta.

Puoi vedere maggiori dettagli nella documentazione di NLP Cloud: vedere qui.

Considerazioni sulle prestazioni

Eseguire l'estrazione di entità con un modello GPT dà molta libertà in quanto qualsiasi nuova entità può essere estratta al volo anche se il modello non è stato addestrato per questo!

Tuttavia ha un costo: questi grandi modelli linguistici sono enormi e relativamente lenti.

Per esempio, se volete usare GPT-J o GPT-NeoX richiederà una GPU enorme con molta VRAM come una NVIDIA RTX A6000 o A40. E ci sarà una certa latenza (l'estrazione di un'entità richiede circa 500ms). Al contrario, spaCy o NLTK saranno molto più veloci e meno costosi dal punto di vista dell'infrastruttura.

Conclusione

Nel 2022, è possibile eseguire NER avanzato molto facilmente senza alcuna annotazione e formazione! Aiuterà molto le aziende a consegnare i loro progetti di estrazione di entità più velocemente, e permette anche applicazioni più all'avanguardia basate sull'elaborazione del linguaggio naturale.

Tuttavia i grandi modelli linguistici come GPT-3, GPT-J e GPT-NeoX sono costosi, quindi non bisogna sottovalutare i costi dell'infrastruttura.

Spero che questo articolo vi aiuti a risparmiare tempo e denaro!

Julien Salinas
CTO di NLP Cloud