Few-shot NER: utdragning av entiteter utan annotering och träning baserat på GPT

Förtränade modeller för utdragning av entiteter baserade på spaCy eller NLTK ger bra resultat men kräver en omständlig annoterings- och träningsprocess för att upptäcka icke-inhemska entiteter som jobbtitlar, momsnummer, läkemedel osv. Tack vare stora språkmodeller som GPT-3, GPT-J och GPT-NeoX är det nu möjligt att extrahera alla typer av entiteter med hjälp av inlärning i några få skott, utan annotering och träning. I den här artikeln visar vi hur man gör det.

NER (entitetsextraktion) handlar i princip om att extrahera strukturerad information från en ostrukturerad text. Om du är nybörjare på NER kan du först läsa vår korta introduktion: introduktion till NER.

NER med spaCy och NLTK: det traditionella sättet

SpaCy har i stort sett blivit de facto standard för NER de senaste åren. (se spaCy-webbplatsen). SpaCy är ett mycket attraktivt ramverk eftersom det är lätt att använda och dess snabbhet gör det väl lämpat för produktion.

SpaCy är ett ramverk för behandling av naturliga språk i Python som erbjuder många förtränade modeller på flera språk, så att det är enkelt att extrahera flera typer av enheter (företag, städer, adresser, datum osv.) på ditt eget språk utan att behöva träna en egen modell.

NLTK är också ett intressant val för att extrahera entiteter med Python, men den föreslår färre entiteter som standard och i allmänhet rekommenderas NLTK inte för produktion (det är mer ett ramverk för utbildning och forskning).

Du kommer dock snabbt att stöta på en gräns med dessa ramverk: antalet enheter som stöds av den egna enheten är begränsat. De flesta företag vill utnyttja NER för att extrahera specifik affärsinformation, t.ex. personinformation, finansiella uppgifter, medicinska behandlingar osv. Dessa enheter stöds naturligtvis inte som standard av de förtränade modellerna från spaCy, så för att uppnå detta måste du skapa ditt eget dataset och träna din egen modell utifrån det.

Att träna en egen spaCy-modell är en lång och tråkig annoteringsprocess: en eller flera personer måste samarbeta för att skapa en stor uppsättning bra exempel och annotera dem. Det krävs en mycket stor mängd exempel för att modellen ska kunna lära sig ordentligt. Det finns bra annoteringsverktyg (t.ex. Prodigy från spaCy), men det är fortfarande en smärtsam uppgift som får många NLP-projekt att avbrytas.

Illustration med kommentarer

Goda nyheter: med framväxten av stora språkmodeller som GPT-3, GPT-J och GPT-NeoX är det nu möjligt att extrahera alla enheter utan att annotera och träna en ny modell!

Textgenerering med GPT-3, GPT-J och GPT-NeoX

Stora språkmodeller för textgenerering har nyligen börjat dyka upp med GPT-3. (Läs mer om GPT-3 på OpenAI:s webbplats.). När OpenAI släppte sin GPT-3-modell, som består av 175 miljarder parametrar, var det en revolution eftersom den banade väg för många banbrytande AI-tillämpningar baserade på behandling av naturligt språk utan att kräva någon ytterligare utbildning.

Det första målet för GPT-modeller som GPT-3 är att generera text: du behöver bara ge modellen en inmatning och låta den generera resten åt dig. Baserat på textgenerering kan i stort sett alla användningsområden för behandling av naturligt språk uppnås: klassificering, sammanfattning, konversations-AI, parafrasering... och naturligtvis utvinning av entiteter!

Eftersom GPT-3 inte är en modell med öppen källkod har gemenskapen för öppen källkod arbetat med alternativ till GPT-3 och vi har nu två bra motsvarigheter med öppen källkod: GPT-J och GPT-NeoX. De är fortfarande inte lika stora som GPT-3, men det råder ingen tvekan om att det bara är en tidsfråga innan open source-samhället hinner ikapp OpenAI.

För att utnyttja dessa modeller på rätt sätt krävs en ny teknik som kallas "few-shot learning".

Inlärning med få skott

Dessa stora GPT-modeller är så stora att de snabbt kan lära sig av dig.

Låt oss säga att du vill att GPT-3 ska generera en kort produktbeskrivning åt dig. Här är ett exempel utan inlärning av några få skott:

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

Svaret du får kommer att vara meningslöst. Det kan till exempel vara något i stil med detta:

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

Goda nyheter: du kan uppnå mycket bättre resultat genom att helt enkelt ge ett par exempel till 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 ungefär så här:

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 är modellens svar nu helt och hållet korrekt, tack vare de tre exempel som vi gav den först. Ändå har modellen aldrig tränats för att skapa den här typen av produktbeskrivningar. Detta är vad tekniken "few-shot learning" handlar om: du utför "transfer learning" i farten med endast ett par exempel. För att uppnå den här typen av resultat förväntar man sig vanligtvis att träna en modell för behandling av naturliga språk med massor av exempel, men inte här.

Extraktion av entiteter med inlärning av få skott

Nu kommer vi att utföra utdragning av entiteter med hjälp av inlärning av några få skott.

Låt oss säga att du vill extrahera jobbtitlar från webbplatser. Ge ett par exempel på hur du kan extrahera jobbtitlar innan du gör din egentliga begäran:

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 följande:

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 märkte måste vi vara smarta när det gäller hur vi gör våra exempel med några få skott. Det kan hända att ingen yrkestitel hittas alls, och det är därför vi skapade ett exempel som returnerar "none" (det undviker falska positiva resultat). Kanske vill du extrahera flera jobbtitlar samtidigt? I så fall är det viktigt att skapa exempel som returnerar flera jobbtitlar också (till exempel kommaseparerade jobbtitlar).

Du får ännu bättre resultat om du lägger till ännu fler exempel. Och det är viktigt att dina exempel ligger så nära din slutliga begäran som möjligt. Om du till exempel vet att du kommer att analysera hela stycken i stället för bara meningar, är det bäst att skapa exempel med stycken också.

Om du inte har tillgång till en GPT-modell kan du helt enkelt använda NLP Cloud API. Flera klienter finns tillgängliga (Python, Go, Node.js, Ruby, PHP...). Låt oss visa ett exempel här där vi använder 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 kommer att bli: CTO

Låt mig ge dig en snabb förklaring om de parametrar för textgenerering som vi just använde.

Vi har satt ett mycket lågt högsta p-värde eftersom vi inte vill att GPT-J ska skapa alltför originella resultat: vi vill bara att det ska hålla sig till vad det såg i din begäran.

"length_no_input" innebär att det maximala längdvärdet inte ska ta hänsyn till den inmatade texten.

"remove_input" innebär att den inmatade texten ska tas bort från resultatet.

"end_sequence" betyder att när modellen möter detta tecken ska den sluta generera text. Eftersom vi i våra exempel med några få skott har lagt till "####" i slutet av varje svar kommer modellen automatiskt att generera "####" efter att ha genererat svaret och sluta där.

"remove_end_sequence" betyder att vi vill ta bort "####" från svaret.

Mer information finns i dokumentationen för NLP Cloud: se den här.

Överväganden om prestanda

Att extrahera enheter med en GPT-modell ger stor frihet eftersom alla nya enheter kan extraheras i farten även om modellen inte har tränats för det!

Det har dock ett pris: dessa stora språkmodeller är enorma och relativt långsamma.

Om du till exempel vill använda GPT-J eller GPT-NeoX krävs det en enorm GPU med mycket VRAM, till exempel en NVIDIA RTX A6000 eller A40. Och det kommer att finnas en viss latenstid (att extrahera en enhet tar cirka 500 ms). Tvärtom kommer spaCy eller NLTK att vara mycket snabbare och mindre kostsamt ur infrastruktursynpunkt.

Slutsats

År 2022 är det möjligt att utföra avancerad NER mycket enkelt utan annotering och utbildning! Det kommer att hjälpa företag att leverera sina projekt för utdragning av entiteter snabbare, och det möjliggör också mer banbrytande tillämpningar baserade på behandling av naturliga språk.

Stora språkmodeller som GPT-3, GPT-J och GPT-NeoX är dock kostsamma, så du bör inte underskatta infrastrukturkostnaderna.

Jag hoppas att den här artikeln hjälper dig att spara tid och pengar!

Julien Salinas
CTO på NLP Cloud