Modelele de extracție a entităților preformulate bazate pe spaCy sau NLTK oferă rezultate excelente, dar necesită un proces de adnotare și de formare anevoios pentru a detecta entități non-native, cum ar fi titlurile de locuri de muncă, numere de TVA, medicamente etc. Datorită modelelor lingvistice de mari dimensiuni, precum GPT-3, GPT-J și GPT-NeoX, acum este posibilă extragerea oricărui tip de entități prin învățare în câteva momente, fără adnotare și instruire. În acest articol, vă arătăm cum să faceți acest lucru.
NER (extragerea entităților) constă, în esență, în extragerea informațiilor structurate dintr-un text nestructurat. Dacă sunteți nou în NER, puteți citi mai întâi scurta noastră introducere: introducere în NER.
SpaCy a devenit standardul de facto pentru NER în ultimii ani. (consultați site-ul spaCy). SpaCy este un cadru foarte atractiv, deoarece este ușor de utilizat, iar viteza sa îl face foarte potrivit pentru utilizarea în producție.
SpaCy este un cadru de procesare a limbajului natural Python care propune mai multe modele pre-antrenate în mai multe limbi, astfel încât este ușor să extrageți mai multe tipuri de entități (companii, orașe, adrese, date etc.) în propria limbă fără a fi nevoie să vă antrenați propriul model.
NLTK este, de asemenea, o alegere interesantă pentru extragerea entităților cu Python, dar propune mai puține entități în mod implicit și, în general, NLTK nu este recomandat pentru producție (este mai mult un cadru educațional și de cercetare).
Cu toate acestea, vă veți lovi rapid de o limită cu aceste cadre: numărul de entități suportate nativ este limitat. Cele mai multe companii doresc să utilizeze NER pentru a extrage informații comerciale specifice, cum ar fi informații despre persoane, date financiare, tratamente medicale etc. Desigur, aceste entități nu sunt acceptate în mod implicit de modelele preinstruite spaCy, astfel încât, pentru a realiza acest lucru, trebuie să vă creați propriul set de date și să vă instruiți propriul model pe baza acestuia.
Formarea propriului model spaCy este un proces de adnotare lung și anevoios: una sau mai multe persoane trebuie să colaboreze pentru a crea un set imens de exemple bune și pentru a le adnota. Este necesar un volum foarte mare de exemple pentru ca modelul să învețe în mod corespunzător. Există instrumente bune de adnotare (cum ar fi Prodigy, de la spaCy), dar rămâne totuși o sarcină dureroasă care face ca multe proiecte NLP să fie abandonate.
Ilustrație de adnotare
Vești bune: odată cu apariția modelelor lingvistice mari, cum ar fi GPT-3, GPT-J și GPT-NeoX, este acum posibil să extragem orice entitate fără a adnota și a antrena un nou model!
Modelele lingvistice mari pentru generarea de texte au început să apară recent, cu GPT-3 (vezi mai multe despre GPT-3 pe site-ul web al OpenAI). Atunci când OpenAI a lansat modelul GPT-3, alcătuit din 175 de miliarde de parametri, a fost o revoluție, deoarece a deschis calea pentru multe aplicații de ultimă generație de inteligență artificială bazate pe procesarea limbajului natural, fără a necesita o pregătire suplimentară.
Scopul inițial al modelelor GPT, cum ar fi GPT-3, este de a genera text: pur și simplu dați o intrare modelului și lăsați-l pe acesta să genereze restul pentru dumneavoastră. Pe baza generării de text, se poate realiza cam orice caz de utilizare a procesării limbajului natural: clasificare, rezumare, inteligență artificială conversațională, parafrazare... și, bineînțeles, extragerea de entități!
Deoarece GPT-3 nu este un model open-source, comunitatea open-source a lucrat la alternative la GPT-3 și acum avem 2 echivalente open-source excelente: GPT-J și GPT-NeoX. Acestea nu sunt încă la fel de mari ca GPT-3, dar fără îndoială că este doar o chestiune de timp până când comunitatea open-source va ajunge din urmă OpenAI.
Utilizarea adecvată a acestor modele necesită o nouă tehnică numită "few-shot learning".
Aceste modele GPT mari sunt atât de mari încât pot învăța foarte repede de la dumneavoastră.
Să spunem că doriți ca GPT-3 să genereze o scurtă descriere a produsului pentru dumneavoastră. Iată un exemplu fără învățare în câteva rânduri:
Generate a product description containing these specific keywords: t-shirt, men, $50
Răspunsul pe care îl veți primi va fi inutil. Ar putea fi ceva de genul acesta, de exemplu:
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
Vești bune: puteți obține rezultate mult mai bune prin simplul fapt de a da câteva exemple modelului!
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:
Rezultatul va fi ceva de genul acesta:
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.
După cum puteți vedea, răspunsul modelului este acum perfect intenționat, datorită celor 3 exemple pe care i le-am dat prima dată. Cu toate acestea, acest model nu a fost niciodată antrenat pe acest tip de sarcină de generare a descrierii produsului. Acesta este scopul tehnicii "few-shot learning": efectuați "învățarea prin transfer" din mers, doar cu câteva exemple. Pentru a obține acest tip de rezultat, de obicei, vă așteptați să antrenați un model de procesare a limbajului natural cu tone de exemple, dar nu și aici.
Acum vom efectua extragerea entităților datorită învățării în câteva focuri.
Să presupunem că doriți să extrageți titlurile de locuri de muncă de pe site-uri web. Pur și simplu dați câteva exemple de extragere a titlurilor de locuri de muncă înainte de a face cererea propriu-zisă:
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:
Rezultatul va fi următorul:
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
După cum ați observat, trebuie să fim isteți în ceea ce privește modul în care ne facem exemplele cu câteva fotografii. Se poate întâmpla să nu fie găsit niciun titlu de post, motiv pentru care am creat un exemplu care să returneze "niciunul" (evităm astfel falsurile pozitive). Poate doriți să extrageți mai multe titluri de locuri de muncă în același timp? În acest caz, este important să creați și exemple care să returneze mai multe titluri de locuri de muncă (titluri de locuri de muncă separate prin virgulă, de exemplu).
Veți obține rezultate și mai bune dacă adăugați și mai multe exemple. Și este important ca exemplele să fie cât mai apropiate de cererea dvs. finală reală. De exemplu, dacă știți că veți analiza paragrafe întregi în loc de simple propoziții, cel mai bine este să creați și exemple cu paragrafe.
Dacă nu aveți acces la un model GPT, puteți utiliza pur și simplu API-ul NLP Cloud. Sunt disponibili mai mulți clienți (Python, Go, Node.js, Ruby, PHP...). Să prezentăm aici un exemplu care utilizează GPT-J cu clientul 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
)
Rezultatul va fi: CTO
Permiteți-mi să vă dau o scurtă explicație cu privire la parametrii de generare a textului pe care tocmai i-am folosit.
Am stabilit o valoare p de top foarte mică pentru că nu dorim ca GPT-J să creeze rezultate prea originale: vrem doar să se limiteze la ceea ce a văzut în cererea dumneavoastră.
"length_no_input" înseamnă că valoarea maximă a lungimii nu trebuie să ia în considerare textul introdus.
"remove_input" înseamnă că textul de intrare trebuie eliminat din rezultat.
"end_sequence" înseamnă că, atunci când modelul întâlnește acest caracter, trebuie să înceteze să mai genereze text. Deoarece în exemplele noastre cu câteva fotografii am adăugat "###" la sfârșitul fiecărui răspuns, modelul va genera automat "###" după ce a generat răspunsul și se va opri acolo.
"remove_end_sequence" înseamnă că dorim să eliminăm "###" din răspuns.
Puteți vedea mai multe detalii în documentația NLP Cloud: vezi aici.
Extragerea entităților cu un model GPT oferă o mare libertate, deoarece orice entitate nouă poate fi extrasă din mers, chiar dacă modelul nu a fost antrenat pentru aceasta!
Totuși, acest lucru are un cost: aceste modele lingvistice mari sunt uriașe și relativ lente.
De exemplu, dacă doriți să folosiți GPT-J sau GPT-NeoX, veți avea nevoie de un GPU uriaș cu o cantitate mare de VRAM, cum ar fi un NVIDIA RTX A6000 sau A40. Și va exista o anumită latență (extragerea unei entități durează aproximativ 500ms). Dimpotrivă, spaCy sau NLTK vor fi mult mai rapide și mai puțin costisitoare din punct de vedere al infrastructurii.
În 2022, este posibil să se efectueze NER avansat foarte ușor, fără nicio adnotare și instruire! Acest lucru va ajuta foarte mult companiile să își livreze mai rapid proiectele de extragere a entităților și va permite, de asemenea, realizarea unor aplicații de ultimă oră bazate pe procesarea limbajului natural.
Cu toate acestea, modelele lingvistice mari, precum GPT-3, GPT-J și GPT-NeoX, sunt costisitoare, așa că nu trebuie să subestimați costurile de infrastructură implicate.
Sper ca acest articol să vă ajute să economisiți timp și bani!
Julien Salinas
CTO la NLP Cloud