Come convertire qualsiasi testo in un grafico di concetti |  di Rahul Nayak |  Novembre 2023

 | Intelligenza-Artificiale

Se dovessi chiedere a GPT, come creare un grafico della conoscenza a partire da un dato testo? potrebbe suggerire un processo come il seguente.

  1. Estrarre concetti ed entità dal corpo del lavoro. Questi sono i nodi.
  2. Estrarre le relazioni tra i concetti. Questi sono i bordi.
  3. Popolare i nodi (concetti) e gli spigoli (relazioni) in una struttura dati a grafo o in un database a grafo.
  4. Visualizza, se non altro per una gratificazione artistica.

I passaggi 3 e 4 sembrano comprensibili. Ma come si ottengono i passaggi 1 e 2?

Ecco un diagramma di flusso del metodo che ho ideato per estrarre un grafico di concetti da un dato corpus di testo. È simile al metodo sopra ma per alcune piccole differenze.

Diagramma creato dall’autore utilizzando draw.io
  1. Dividere il corpus di testo in blocchi. Assegna un Chunk_id a ciascuno di questi blocchi.
  2. Per ogni blocco di testo estrai i concetti e le loro relazioni semantiche utilizzando un LLM. Assegniamo a questa relazione un peso pari a W1. Possono esserci più relazioni tra la stessa coppia di concetti. Ogni relazione di questo tipo è un confine tra una coppia di concetti.
  3. Considera che i concetti che ricorrono nella stessa porzione di testo sono legati anche dalla loro vicinanza contestuale. Assegniamo a questa relazione un peso pari a W2. Si noti che la stessa coppia di concetti può verificarsi in più blocchi.
  4. Raggruppa coppie simili, somma i loro pesi e concatena le loro relazioni. Quindi ora abbiamo solo un vantaggio tra ogni coppia distinta di concetti. Il bordo ha un certo peso e un elenco di relazioni come nome.

Puoi vedere l’implementazione di questo metodo come codice Python, nel repository GitHub che condivido in questo articolo. Esaminiamo brevemente le idee chiave dell’implementazione nelle prossime sezioni.

Per dimostrare il metodo qui, sto utilizzando il seguente articolo di recensione pubblicato su PubMed/Cureus secondo i termini della licenza Creative Commons Attribution. Ringraziamo gli autori alla fine di questo articolo.

Il Maestrale e il Prompt

Il passaggio 1 nel diagramma di flusso sopra è semplice. Langchain fornisce numerosi divisori di testo che possiamo utilizzare per dividere il nostro testo in blocchi.

Il passaggio 2 è dove inizia il vero divertimento. Per estrarre i concetti e le loro relazioni, utilizzo il modello Mistral 7B. Prima di convergere sulla variante del modello più adatta al nostro scopo, ho sperimentato quanto segue:

Istruzioni Maestrale
Mistral OpenOrcaE
Zephyr (versione Hugging Face derivata da Mistral)

Ho utilizzato la versione quantizzata a 4 bit di questi modelli, in modo che il mio Mac non inizi a odiarmi, ospitata localmente con Ollama.

Questi modelli sono tutti modelli ottimizzati per le istruzioni con un prompt del sistema e un prompt dell’utente. Fanno tutti un ottimo lavoro nel seguire le istruzioni e nel formattare accuratamente la risposta in JSON se glielo diciamo.

Dopo alcuni round di colpi e prove, sono finalmente passato al Modello Zefiro con le seguenti indicazioni.

SYS_PROMPT = (
"You are a network graph maker who extracts terms and their relations from a given context. "
"You are provided with a context chunk (delimited by ```) Your task is to extract the ontology "
"of terms mentioned in the given context. These terms should represent the key concepts as per the context. \n"
"Thought 1: While traversing through each sentence, Think about the key terms mentioned in it.\n"
"\tTerms may include object, entity, location, organization, person, \n"
"\tcondition, acronym, documents, service, concept, etc.\n"
"\tTerms should be as atomistic as possible\n\n"
"Thought 2: Think about how these terms can have one on one relation with other terms.\n"
"\tTerms that are mentioned in the same sentence or the same paragraph are typically related to each other.\n"
"\tTerms can be related to many other terms\n\n"
"Thought 3: Find out the relation between each such related pair of terms. \n\n"
"Format your output as a list of json. Each element of the list contains a pair of terms"
"and the relation between them, like the follwing: \n"
"(\n"
" {\n"
' "node_1": "A concept from extracted ontology",\n'
' "node_2": "A related concept from extracted ontology",\n'
' "edge": "relationship between the two concepts, node_1 and node_2 in one or two sentences"\n'
" }, {...}\n"
")"
)

USER_PROMPT = f"context: ```{input}``` \n\n output: "

Se passiamo la nostra (non adatta) filastrocca con questo suggerimento, ecco il risultato.

(
{
"node_1": "Mary",
"node_2": "lamb",
"edge": "owned by"
},
{
"node_1": "plate",
"node_2": "food",
"edge": "contained"
}, . . .
)

Si noti che ha anche ipotizzato il concetto di “cibo”, che non era esplicitamente menzionato nel pezzo di testo. Non è meraviglioso?

Se lo eseguiamo in ogni porzione di testo del nostro articolo di esempio e convertiamo il json in un frame di dati Panda, ecco come appare.

Fonte: towardsdatascience.com

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *