Sliter du med AI eller fullstack-utvikling? Ekspertene våre er her for å veilede deg: skreddersydde råd, teknisk integrasjon og mer. Ta kontakt på [email protected].

NER med få skudd: Enhetsuttrekk uten annotasjon og opplæring basert på GPT

Forhåndsopplærte entitetsekstraksjonsmodeller basert på spaCy eller NLTK gir gode resultater, men krever en langtekkelig annoterings- og opplæringsprosess for å oppdage ikke-innfødte entiteter som stillingstitler, momsnumre, legemidler osv. Takket være store språkmodeller som GPT-3, GPT-J og GPT-NeoX er det nå mulig å trekke ut alle typer enheter takket være læring med få skudd, uten annotasjon og opplæring. I denne artikkelen viser vi hvordan du gjør det.

NER (entitetsekstraksjon) handler i utgangspunktet om å trekke ut strukturert informasjon fra en ustrukturert tekst. Hvis NER er nytt for deg, kan du først lese vår korte introduksjon: introduksjon til NER.

NER med spaCy og NLTK: den tradisjonelle måten

SpaCy har stort sett blitt de facto-standarden for NER de siste årene. (se spaCy-nettstedet). SpaCy er et veldig attraktivt rammeverk fordi det er enkelt å bruke, og hastigheten gjør det godt egnet for produksjonsbruk.

SpaCy er et Python-rammeverk for naturlig språkbehandling som foreslår mange forhåndsopplærte modeller på flere språk, slik at det er enkelt å trekke ut flere enhetstyper (selskaper, byer, adresser, datoer osv.) på ditt eget språk uten å måtte trene din egen modell.

NLTK er også et interessant valg for enhetsuttrekk med Python, men det foreslår færre enheter som standard, og generelt anbefales ikke NLTK for produksjon (det er mer et utdannings- og forskningsrammeverk).

Du vil imidlertid raskt støte på en grense med disse rammeverkene: antallet enheter som støttes i utgangspunktet, er begrenset. De fleste selskaper ønsker å utnytte NER for å hente ut spesifikk forretningsinformasjon som personinformasjon, økonomiske data, medisinske behandlinger osv. Disse enhetene støttes selvfølgelig ikke som standard av spaCys forhåndsopplærte modeller, så for å oppnå dette må du opprette ditt eget datasett og trene din egen modell ut fra det.

Opplæring av din egen spaCy-modell er en lang og omstendelig kommentarprosess: en eller flere personer må samarbeide for å lage et stort sett med gode eksempler og kommentere dem. Det kreves et svært stort volum av eksempler for at modellen skal lære på riktig måte. Det finnes gode annoteringsverktøy (som Prodigy, av spaCy), men det er fortsatt en smertefull oppgave som får mange NLP-prosjekter til å avbryte.

Annotasjon illustrasjon

Gode nyheter: med fremveksten av store språkmodeller som GPT-3, GPT-J og GPT-NeoX er det nå mulig å trekke ut alle enheter uten å kommentere og trene en ny modell!

Tekstproduksjon med GPT-3, GPT-J og GPT-NeoX

Store språkmodeller for tekstgenerering har nylig begynt å dukke opp med GPT-3. (se mer om GPT-3 på OpenAIs nettsted.). Da OpenAI lanserte sin GPT-3-modell, som består av 175 milliarder parametere, var det en revolusjon fordi den banet vei for mange banebrytende AI-applikasjoner basert på naturlig språkbehandling uten å kreve ytterligere opplæring.

Det opprinnelige målet med GPT-modeller som GPT-3 er å generere tekst: bare gi input til modellen og la den generere resten for deg. Basert på tekstgenerering kan stort sett alle brukstilfeller for naturlig språkbehandling oppnås: klassifisering, oppsummering, samtale-AI, parafrasering ... og selvfølgelig enhetsutvinning!

Siden GPT-3 ikke er en åpen kildekode-modell, har åpen kildekode-fellesskapet arbeidet med alternativer til GPT-3, og vi har nå to gode åpen kildekode-ekvivalenter: GPT-J og GPT-NeoX. De er fortsatt ikke like store som GPT-3, men det er ingen tvil om at det bare er et spørsmål om tid før åpen kildekode-fellesskapet tar igjen OpenAI.

Riktig utnyttelse av disse modellene krever en ny teknikk som kalles "few-shot learning".

Læring med få skudd

Disse store GPT-modellene er så store at de veldig raskt kan lære av deg.

La oss si at du vil at GPT-3 skal generere en kort produktbeskrivelse for deg. Her er et eksempel uten læring med få skudd:

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

Svaret du får vil være ubrukelig. Det kan for eksempel være noe sånt 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

Gode nyheter: Du kan oppnå mye bedre resultater ved ganske enkelt å gi et par eksempler til modellen!

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 blir noe sånt som dette:

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 responsen fra modellen nå perfekt med vilje, takket være de tre eksemplene vi først ga den. Likevel ble denne modellen aldri trent på denne typen generering av produktbeskrivelser. Dette er hva "few-shot learning"-teknikken handler om: du utfører "transfer learning" på farten med bare et par eksempler. For å oppnå denne typen resultater forventer du vanligvis å trene en naturlig språkbehandlingsmodell med mange eksempler, men ikke her.

Enhetsuttrekk med læring med få skudd

Nå vil vi utføre enhetsutvinning takket være læring med få skudd.

La oss si at du ønsker å trekke ut stillingstitler fra nettsteder. Bare gi et par eksempler på uttrekk av stillingstitler før du sender inn selve forespørselen:

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 blir som følger:

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 lagt merke til, må vi være smarte med hvordan vi lager eksemplene våre med få treff. Det kan hende at ingen stillingstittel blir funnet i det hele tatt, og derfor har vi laget et eksempel som returnerer "ingen" (det unngår falske positiver). Kanskje du ønsker å hente ut flere stillingstitler samtidig? I så fall er det viktig å lage eksempler som returnerer flere stillingstitler også (for eksempel kommaseparerte stillingstitler).

Du får enda bedre resultater ved å legge til enda flere eksempler. Og det er viktig at eksemplene dine er så nær den endelige forespørselen din som mulig. Hvis du for eksempel vet at du skal analysere hele avsnitt i stedet for bare setninger, er det best å lage eksempler med avsnitt også.

Hvis du ikke har tilgang til en GPT-modell, kan du ganske enkelt bruke NLP Cloud API. Flere klienter er tilgjengelige (Python, Go, Node.js, Ruby, PHP ...). La oss vise et eksempel her ved hjelp av 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 bli: CTO

La meg gi deg en rask forklaring om tekstgenereringsparametrene vi nettopp brukte.

Vi setter en veldig lav topp p-verdi fordi vi ikke vil at GPT-J skal skape for originale resultater: vi vil bare at den skal holde seg til det den så i forespørselen din.

"length_no_input" betyr at den maksimale lengdeverdien ikke skal ta hensyn til inndatateksten.

"remove_input" betyr at inndatateksten skal fjernes fra resultatet.

"end_sequence" betyr at når modellen møter dette tegnet, skal den slutte å generere tekst. Ettersom vi i eksemplene med få bilder la til "###" på slutten av hvert svar, vil modellen automatisk generere "###" etter å ha generert svaret, og den vil stoppe der.

"remove_end_sequence" betyr at vi ønsker å fjerne "###" fra svaret.

Du kan se flere detaljer i NLP Cloud-dokumentasjonen: se den her.

Ytelseshensyn

Å utføre entitetsekstraksjon med en GPT-modell gir mye frihet ettersom enhver ny entitet kan ekstraheres på farten selv om modellen ikke ble trent for det!

Det har imidlertid en pris: disse store språkmodellene er enorme og relativt langsomme.

Hvis du for eksempel vil bruke GPT-J eller GPT-NeoX, vil det kreve en enorm GPU med mye VRAM som en NVIDIA RTX A6000 eller A40. Og det vil være en viss ventetid (å trekke ut en enhet tar rundt 500 ms). Tvert imot vil spaCy eller NLTK være mye raskere og billigere fra et infrastrukturperspektiv.

Konklusjon

I 2022 er det mulig å utføre avansert NER veldig enkelt uten annotasjon og opplæring! Det vil i stor grad hjelpe selskaper med å levere sine entitetsekstraksjonsprosjekter raskere, og det åpner også for mer banebrytende applikasjoner basert på naturlig språkbehandling.

Store språkmodeller som GPT-3, GPT-J og GPT-NeoX er imidlertid kostbare, så du bør ikke undervurdere infrastrukturkostnadene.

Jeg håper denne artikkelen vil hjelpe deg med å spare tid og penger!

François
Fullstack-ingeniør hos NLP Cloud