Iš anksto apmokyti esybių išskyrimo modeliai, pagrįsti spaCy arba NLTK, duoda puikių rezultatų, tačiau norint aptikti negimtąsias esybes, pavyzdžiui, darbo pavadinimus, PVM mokėtojų kodus, vaistus ir pan., reikia ilgai trunkančio anotavimo ir mokymo proceso. Naudojant didelius kalbos modelius, tokius kaip GPT-3, GPT-J ir GPT-NeoX, dabar galima išgauti bet kokio tipo esybes mokantis keliais etapais, be jokios anotacijos ir mokymo. Šiame straipsnyje parodysime, kaip tai padaryti.
NER (esybių išskyrimas) iš esmės yra susijęs su struktūrizuotos informacijos išskyrimu iš nestruktūruoto teksto. Jei esate naujokas NER srityje, pirmiausia galite perskaityti trumpą įvadą: įvadas į NER.
SpaCy pastaraisiais metais tapo de facto NER standartu (žr. spaCy svetainę). "SpaCy" yra labai patraukli sistema, nes ją lengva naudoti, o dėl savo greičio ji puikiai tinka gamybai.
"SpaCy" yra "Python" natūralios kalbos apdorojimo sistema, kurioje siūloma daug iš anksto apmokytų modelių keliomis kalbomis, todėl lengva išgauti keletą esybių tipų (įmonių, miestų, adresų, datų ir t. t.) savo kalba, netreniruojant savo modelio.
NLTK taip pat yra įdomus pasirinkimas esybių išskyrimui su "Python", tačiau pagal numatytuosius nustatymus ji siūlo mažiau esybių ir apskritai NLTK nerekomenduojama naudoti gamyboje (tai labiau mokomoji ir mokslinių tyrimų sistema).
Tačiau greitai susidursite su šių struktūrų apribojimais: natūraliai palaikomų esybių skaičius yra ribotas. Dauguma įmonių nori panaudoti NER, kad galėtų išgauti konkrečią verslo informaciją, pavyzdžiui, informaciją apie asmenis, finansinius duomenis, gydymo būdus ir pan. Žinoma, šių esybių pagal numatytuosius nustatymus nepalaiko spaCy iš anksto apmokyti modeliai, todėl, norėdami tai pasiekti, turite sukurti savo duomenų rinkinį ir iš jo apmokyti savo modelį.
Savo spaCy modelio mokymas yra ilgas ir varginantis anotavimo procesas: vienas ar keli asmenys turi bendradarbiauti, kad sukurtų didžiulį gerų pavyzdžių rinkinį ir juos anotuotų. Norint, kad modelis tinkamai išmoktų, reikia labai daug pavyzdžių. Yra gerų anotavimo įrankių (pvz., "Prodigy", spaCy), tačiau tai vis dar išlieka skausminga užduotis, dėl kurios daugelis NLP projektų nutraukiami.
Anotacijos iliustracija
Geros naujienos: atsiradus dideliems kalbos modeliams, tokiems kaip GPT-3, GPT-J ir GPT-NeoX, dabar galima išskirti bet kokias esybes neanotuojant ir netreniruojant naujo modelio!
Dideli kalbos modeliai, skirti tekstui kurti, neseniai pradėti naudoti su GPT-3 (daugiau informacijos apie GPT-3 rasite "OpenAI" svetainėje). Kai "OpenAI" išleido savo GPT-3 modelį, sudarytą iš 175 mlrd. parametrų, tai buvo revoliucija, nes jis atvėrė kelią daugeliui pažangiausių dirbtinio intelekto programų, pagrįstų natūralios kalbos apdorojimu, nereikalaujant jokio papildomo mokymo.
Pradinis GPT modelių, tokių kaip GPT-3, tikslas - generuoti tekstą: tiesiog pateikite įvestį modeliui ir leiskite jam už jus sugeneruoti likusią informaciją. Remiantis teksto generavimu, galima pasiekti beveik bet kokį natūralios kalbos apdorojimo atvejį: klasifikavimą, apibendrinimą, pokalbių dirbtinį intelektą, perfrazavimą... ir, žinoma, esybių išskyrimą!
Kadangi "GPT-3" nėra atvirojo kodo modelis, atvirojo kodo bendruomenė kūrė "GPT-3" alternatyvas ir dabar turime du puikius atvirojo kodo atitikmenis: GPT-J ir GPT-NeoX. Jie vis dar nėra tokie dideli kaip GPT-3, tačiau neabejoju, kad tik laiko klausimas, kada atvirojo kodo bendruomenė pasivys "OpenAI".
Norint tinkamai panaudoti šiuos modelius, reikia naujo metodo, vadinamo "mokymusi keliais šūviais".
Šie dideli GPT modeliai yra tokie dideli, kad gali labai greitai iš jūsų pasimokyti.
Tarkime, norite, kad "GPT-3" jums sukurtų trumpą produkto aprašymą. Pateikiame pavyzdį be kelių kadrų mokymosi:
Generate a product description containing these specific keywords: t-shirt, men, $50
Atsakymas, kurį gausite, bus nenaudingas. Jis gali būti, pavyzdžiui, toks:
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
Gera žinia: galite pasiekti daug geresnių rezultatų tiesiog pateikdami modeliui keletą pavyzdžių!
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:
Rezultatas bus maždaug toks:
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.
Kaip matote, modelio atsakas dabar yra visiškai tikslingas dėl 3 pavyzdžių, kuriuos jam pateikėme pirmą kartą. Vis dėlto šis modelis niekada nebuvo apmokytas atlikti tokio pobūdžio produkto aprašymo kūrimo užduotį. Būtent tai ir yra "mokymosi keliais šūviais" metodas: jūs atliekate "perkėlimo mokymąsi" skraidydami, naudodami tik porą pavyzdžių. Norint pasiekti tokį rezultatą, paprastai tikimasi natūralios kalbos apdorojimo modelį apmokyti su tonomis pavyzdžių, bet ne čia.
Dabar atliksime esybių išskyrimą naudodami kelių kadrų mokymąsi.
Tarkime, kad norite iš svetainių išgauti pareigų pavadinimus. Prieš pateikdami faktinį prašymą, tiesiog pateikite porą darbo pavadinimų ištraukimo pavyzdžių:
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:
Rezultatas bus toks:
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
Kaip pastebėjote, turime būti išmintingi kurdami kelių kadrų pavyzdžius. Gali atsitikti taip, kad apskritai nebus rastas joks pareigų pavadinimas, todėl sukūrėme pavyzdį, grąžinantį "nėra" (taip išvengiama klaidingų teigiamų rezultatų). Galbūt norite išgauti kelis pareigų pavadinimus vienu metu? Tokiu atveju svarbu sukurti pavyzdžius, grąžinančius ir kelis pareigų pavadinimus (pavyzdžiui, kableliais atskirtus pareigų pavadinimus).
Dar geresnių rezultatų pasieksite įtraukę dar daugiau pavyzdžių. Be to, svarbu, kad jūsų pavyzdžiai būtų kuo artimesni tikrajai galutinei užklausai. Pavyzdžiui, jei žinote, kad analizuosite ištisas pastraipas, o ne tik sakinius, geriausia kurti pavyzdžius ir su pastraipomis.
Jei neturite prieigos prie GPT modelio, galite tiesiog naudoti NLP Cloud API. Yra keli klientai (Python, Go, Node.js, Ruby, PHP...). Parodykime pavyzdį, kaip naudoti GPT-J su "Python" klientu:
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
)
Rezultatas bus toks: CTO
Leiskite trumpai paaiškinti, kokius teksto generavimo parametrus ką tik naudojome.
Nustatėme labai mažą viršutinę p reikšmę, nes nenorime, kad GPT-J sukurtų pernelyg originalius rezultatus: norime, kad ji laikytųsi to, ką matė jūsų užklausoje.
"length_no_input" reiškia, kad nustatant didžiausią ilgio reikšmę neturėtų būti atsižvelgiama į įvesties tekstą.
"remove_input" reiškia, kad įvesties tekstas turi būti pašalintas iš rezultato.
"end_sequence" reiškia, kad, kai modelis sutinka šį simbolį, jis turėtų nustoti generuoti tekstą. Kadangi mūsų kelių kadrų pavyzdžiuose kiekvieno atsakymo pabaigoje pridėjome "####", modelis, sugeneravęs atsakymą, automatiškai sugeneruos "####" ir sustos.
"remove_end_sequence" reiškia, kad iš atsakymo norime pašalinti "####".
Daugiau informacijos rasite "NLP Cloud" dokumentacijoje: žr. čia.
Esybių išskyrimas naudojant GPT modelį suteikia daug laisvės, nes bet kokią naują esybę galima išskleisti "ant bangos", net jei modelis tam nebuvo apmokytas!
Tačiau tai kainuoja brangiai: šie dideli kalbų modeliai yra didžiuliai ir palyginti lėti.
Pavyzdžiui, jei norite naudoti "GPT-J" arba "GPT-NeoX", reikės didžiulio GPU su daug VRAM, pavyzdžiui, "NVIDIA RTX A6000" arba "A40". Be to, bus tam tikras vėlavimas (išgauti vienetą užtrunka apie 500 ms). Priešingai, spaCy arba NLTK bus daug greitesni ir mažiau kainuos infrastruktūros požiūriu.
2022 m. galima labai lengvai atlikti pažangius NER be jokios anotacijos ir mokymo! Tai labai padės įmonėms greičiau įgyvendinti esybių išskyrimo projektus, taip pat leis sukurti daugiau pažangiausių natūralios kalbos apdorojimu pagrįstų programų.
Tačiau dideli kalbų modeliai, tokie kaip GPT-3, GPT-J ir GPT-NeoX, yra brangūs, todėl nereikėtų nuvertinti su tuo susijusių infrastruktūros išlaidų.
Tikiuosi, kad šis straipsnis padės jums sutaupyti laiko ir pinigų!
Julien Salinas
NLP Cloud techninis direktorius