Forudtrænede modeller til udtrækning af enheder baseret på spaCy eller NLTK giver gode resultater, men kræver en kedelig annotation og træningsproces for at opdage ikke-indfødte enheder som jobtitler, momsnumre, lægemidler osv. Takket være store sprogmodeller som GPT-3, GPT-J og GPT-NeoX er det nu muligt at udtrække alle typer enheder ved hjælp af få indlæringssituationer uden annotering og træning. I denne artikel viser vi, hvordan man gør det.
NER (entity extraction) handler grundlæggende om at udtrække struktureret information fra en ustruktureret tekst. Hvis du er nybegynder i NER, kan du først læse vores korte introduktion: introduktion til NER.
SpaCy er stort set blevet de facto-standard for NER i de seneste år (se spaCy-webstedet). SpaCy er et meget attraktivt framework, fordi det er let at bruge, og fordi dets hastighed gør det velegnet til produktionsbrug.
SpaCy er en Python-ramme til behandling af naturligt sprog, der tilbyder mange forudtrænede modeller på flere sprog, så det er nemt at udtrække flere enhedstyper (virksomheder, byer, adresser, datoer osv.) på dit eget sprog uden at skulle træne din egen model.
NLTK er også et interessant valg til udtrækning af enheder med Python, men den foreslår færre enheder som standard, og NLTK anbefales generelt ikke til produktion (det er mere en ramme til uddannelse og forskning).
Du vil dog hurtigt støde på en grænse med disse frameworks: antallet af enheder, der understøttes af den native teknologi, er begrænset. De fleste virksomheder ønsker at udnytte NER til at udtrække specifikke forretningsoplysninger som f.eks. personoplysninger, finansielle data, medicinske behandlinger osv. Selvfølgelig understøttes disse enheder ikke som standard af de forud trænede modeller fra spaCy, så for at opnå dette skal du oprette dit eget datasæt og træne din egen model ud fra det.
Træning af din egen spaCy-model er en lang og besværlig annotationsproces: en eller flere personer skal samarbejde for at skabe et stort sæt gode eksempler og annotere dem. Der kræves en meget stor mængde eksempler, for at modellen kan lære ordentligt. Der findes gode annotationsværktøjer (som Prodigy fra spaCy), men det er stadig en smertefuld opgave, som får mange NLP-projekter til at afbryde.
Illustration med anmærkninger
Godt nyt: med fremkomsten af store sprogmodeller som GPT-3, GPT-J og GPT-NeoX er det nu muligt at udtrække alle enheder uden at annotere og træne en ny model!
Store sprogmodeller til tekstgenerering er for nylig begyndt at dukke op med GPT-3 (Se mere om GPT-3 på OpenAI's websted). Da OpenAI frigav deres GPT-3-model, der består af 175 milliarder parametre, var det en revolution, fordi det banede vejen for mange banebrydende AI-applikationer baseret på naturlig sprogbehandling uden at kræve yderligere træning.
Det oprindelige mål med GPT-modeller som GPT-3 er at generere tekst: du skal blot give et input til modellen og lade den generere resten for dig. Baseret på tekstgenerering kan stort set alle anvendelsesområder for naturlig sprogbehandling opnås: klassificering, opsummering, AI i forbindelse med samtaler, parafrasering ... og naturligvis udtræk af enheder!
Da GPT-3 ikke er en open source-model, har open source-fællesskabet arbejdet på alternativer til GPT-3, og vi har nu to gode open source-modeller, der svarer til GPT-3: GPT-J og GPT-NeoX. De er stadig ikke lige så store som GPT-3, men der er ingen tvivl om, at det kun er et spørgsmål om tid, før open source-fællesskabet indhenter OpenAI.
En korrekt udnyttelse af disse modeller kræver en ny teknik, der kaldes "few-shot learning".
Disse store GPT-modeller er så store, at de meget hurtigt kan lære af dig.
Lad os sige, at du vil have GPT-3 til at generere en kort produktbeskrivelse for dig. Her er et eksempel uden indlæring af få skud:
Generate a product description containing these specific keywords: t-shirt, men, $50
Det svar, du vil få, vil være ubrugeligt. Det kunne f.eks. være noget som dette:
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
Den gode nyhed er, at du kan opnå langt bedre resultater ved blot at give modellen et par eksempler!
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:
Resultatet vil se nogenlunde sådan her ud:
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.
Som du kan se, er modellens reaktion nu helt korrekt takket være de tre eksempler, som vi først gav den. Alligevel er denne model aldrig blevet trænet til at generere denne form for produktbeskrivelsesopgave. Det er det, som "few-shot learning"-teknikken går ud på: man udfører "transfer learning" on the fly med kun et par eksempler. For at opnå den slags resultater forventer man normalt at træne en model til behandling af naturligt sprog med tonsvis af eksempler, men ikke her.
Nu vil vi udføre udtrækning af enheder takket være indlæring af få skud.
Lad os sige, at du ønsker at udtrække stillingsbetegnelser fra websteder. Du skal blot give et par eksempler på udtræk af jobtitler, før du fremsætter din egentlige anmodning:
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:
Resultatet vil være følgende:
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
Som du har bemærket, skal vi være smarte med hensyn til, hvordan vi laver vores eksempler på få skud. Det kan ske, at der slet ikke findes nogen jobtitel, og derfor har vi lavet et eksempel, der returnerer "none" (det undgår falske positive resultater). Måske vil du udtrække flere jobtitler på samme tid? I så fald er det vigtigt at oprette eksempler, der også returnerer flere jobtitler (f.eks. kommaseparerede jobtitler).
Du vil få endnu bedre resultater ved at tilføje endnu flere eksempler. Og det er vigtigt, at dine eksempler er så tæt som muligt på din endelige anmodning. Hvis du f.eks. ved, at du skal analysere hele afsnit i stedet for blot sætninger, er det bedst at oprette eksempler med afsnit også.
Hvis du ikke har adgang til en GPT-model, kan du blot bruge NLP Cloud API'et. Der er flere klienter til rådighed (Python, Go, Node.js, Ruby, PHP...). Lad os vise et eksempel her ved hjælp af GPT-J med Python-klienten:
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
)
Resultatet vil være: CTO
Lad mig give dig en kort forklaring på de tekstgenereringsparametre, som vi lige har brugt.
Vi har sat en meget lav højeste p-værdi, fordi vi ikke ønsker, at GPT-J skal skabe alt for originale resultater: Vi ønsker bare, at den skal holde sig til det, den så i din anmodning.
"length_no_input" betyder, at den maksimale længdeværdi ikke skal tage hensyn til den indtastede tekst.
"remove_input" betyder, at den indtastede tekst skal fjernes fra resultatet.
"end_sequence" betyder, at når modellen møder dette tegn, skal den stoppe med at generere tekst. Da vi i vores eksempler med få skud har tilføjet "####" i slutningen af hvert svar, vil modellen automatisk generere "####" efter at have genereret svaret, og den vil stoppe der.
"remove_end_sequence" betyder, at vi ønsker at fjerne "####" fra svaret.
Du kan se flere oplysninger i dokumentationen til NLP Cloud: se den her.
Udførelse af enhedsudtræk med en GPT-model giver stor frihed, da enhver ny enhed kan udtrækkes i farten, selv om modellen ikke er trænet til det!
Det har dog en pris: disse store sprogmodeller er enorme og relativt langsomme.
Hvis du f.eks. ønsker at bruge GPT-J eller GPT-NeoX, kræver det en stor GPU med meget VRAM som f.eks. en NVIDIA RTX A6000 eller A40. Og der vil være en vis latenstid (det tager ca. 500 ms at udtrække en enhed). Derimod vil spaCy eller NLTK være meget hurtigere og mindre omkostningsfuldt set ud fra et infrastrukturmæssigt synspunkt.
I 2022 er det muligt at udføre avanceret NER meget nemt uden annotation og træning! Det vil i høj grad hjælpe virksomheder med at levere deres projekter til ekstraktion af enheder hurtigere, og det giver også mulighed for flere avancerede applikationer baseret på naturlig sprogbehandling.
Store sprogmodeller som GPT-3, GPT-J og GPT-NeoX er imidlertid dyre, så du bør ikke undervurdere de infrastrukturomkostninger, der er forbundet hermed.
Jeg håber, at denne artikel vil hjælpe dig med at spare tid og penge!
Julien Salinas
Teknisk direktør hos NLP Cloud