Worstel je met AI of full-stack ontwikkeling? Onze experts staan klaar om je te begeleiden: advies op maat, technische integratie en meer. Neem contact op met [email protected].

Few-shot NER: entiteit-extractie zonder annotatie en training op basis van GPT

Vooraf getrainde entiteit-extractiemodellen op basis van spaCy of NLTK geven goede resultaten, maar vereisen een omslachtig annotatie- en trainingsproces om niet-native entiteiten te detecteren, zoals functietitels, BTW-nummers, geneesmiddelen, enz. Dankzij grote taalmodellen zoals GPT-3, GPT-J, en GPT-NeoX, is het nu mogelijk om elk type entiteit te extraheren dankzij 'few-shot learning', zonder enige annotatie en training. In dit artikel laten we zien hoe je dat kunt doen.

NER (entiteit extractie) gaat in feite over het extraheren van gestructureerde informatie uit een ongestructureerde tekst. Als NER nieuw voor u is, kunt u eerst onze korte inleiding lezen: inleiding tot NER.

NER met spaCy en NLTK: de traditionele manier

SpaCy is de laatste jaren zo'n beetje de de facto standaard voor NER geworden (zie de spaCy website). SpaCy is een zeer aantrekkelijk framework omdat het eenvoudig in gebruik is, en zijn snelheid maakt het zeer geschikt voor productiegebruik.

SpaCy is een Python framework voor natuurlijke taalverwerking dat vele voorgetrainde modellen in meerdere talen voorstelt, zodat het gemakkelijk is om verschillende entiteittypes (bedrijven, steden, adressen, data, enz.) in uw eigen taal te extraheren zonder dat u uw eigen model hoeft te trainen.

NLTK is ook een interessante keuze voor entiteit-extractie met Python, maar het stelt standaard minder entiteiten voor, en in het algemeen wordt NLTK niet aanbevolen voor productie (het is meer een educatief en onderzoekskader).

Er is echter al snel een limiet aan deze frameworks: het aantal entiteiten dat van nature wordt ondersteund is beperkt. De meeste bedrijven willen NER gebruiken om specifieke bedrijfsinformatie te extraheren, zoals persoonsinformatie, financiële gegevens, medische behandelingen, enz. Natuurlijk worden deze entiteiten niet standaard ondersteund door de spaCy voorgetrainde modellen, dus om dit te bereiken, moet u uw eigen dataset maken en uw eigen model trainen op basis daarvan.

Het trainen van uw eigen spaCy-model is een lang en moeizaam annotatieproces: een of meer personen moeten samenwerken om een enorme verzameling goede voorbeelden te maken, en deze annoteren. Een zeer groot volume aan voorbeelden is nodig om het model goed te laten leren. Er bestaan goede annotatietools (zoals Prodigy, van spaCy), maar het blijft een pijnlijke taak die veel NLP-projecten doet afbreken.

Illustratie bij annotatie

Goed nieuws: met de opkomst van grote taalmodellen zoals GPT-3, GPT-J, en GPT-NeoX, is het nu mogelijk om entiteiten te extraheren zonder annotatie en training van een nieuw model!

Tekstgeneratie met GPT-3, GPT-J en GPT-NeoX

Grote taalmodellen voor tekstgeneratie zijn recentelijk op de markt gekomen met GPT-3 (zie meer over GPT-3 op de website van OpenAI). Toen OpenAI hun GPT-3 model uitbracht, dat uit 175 miljard parameters bestond, betekende dat een revolutie omdat het de weg vrijmaakte voor veel geavanceerde AI-toepassingen op basis van natuurlijke taalverwerking zonder dat daarvoor extra training nodig was.

Het oorspronkelijke doel van GPT-modellen zoals GPT-3 is het genereren van tekst: geef gewoon een input aan het model en laat het de rest voor u genereren. Op basis van tekstgeneratie kan zowat elke toepassing voor natuurlijke taalverwerking worden bereikt: classificatie, samenvatten, conversatie-AI, parafraseren... en natuurlijk entiteit-extractie!

Aangezien GPT-3 geen open-source model is, heeft de open-source gemeenschap gewerkt aan alternatieven voor GPT-3 en we hebben nu 2 geweldige open-source equivalenten: GPT-J en GPT-NeoX. Ze zijn nog steeds niet zo groot als GPT-3, maar het is ongetwijfeld slechts een kwestie van tijd voordat de open-source gemeenschap OpenAI inhaalt.

Om deze modellen goed te kunnen gebruiken, is een nieuwe techniek nodig die "leren in een paar stappen" wordt genoemd.

Few-shot leren

Deze grote GPT-modellen zijn zo groot dat ze heel snel van je kunnen leren.

Laten we zeggen dat u GPT-3 een korte productbeschrijving wilt laten genereren. Hier is een voorbeeld zonder paar-shot leren:

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

Het antwoord dat je zult krijgen zal nutteloos zijn. Het zou bijvoorbeeld iets als dit kunnen zijn:

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

Goed nieuws: u kunt veel betere resultaten bereiken door gewoon een paar voorbeelden aan het model te geven!

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:

Het resultaat zal er ongeveer zo uitzien:

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.

Zoals u kunt zien, is de respons van het model nu perfect op schema, dankzij de 3 voorbeelden die we het eerst gaven. Toch was dit model nooit getraind op dit soort taak om productbeschrijvingen te genereren. Dit is waar het bij de "few-shot-learning" techniek om gaat: je voert "transfer-learning" uit met slechts een paar voorbeelden. Om dit soort resultaat te bereiken, verwacht je gewoonlijk een natuurlijk taalverwerkingsmodel te trainen met tonnen voorbeelden, maar hier niet.

Entiteit Extractie met Few-shot Leren

Nu zullen we entiteit-extractie uitvoeren dankzij paar-schots leren.

Laten we zeggen dat u functietitels van websites wilt extraheren. Geef gewoon een paar voorbeelden van extractie van functietitels voordat u uw eigenlijke verzoek doet:

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:

Het resultaat zal het volgende zijn:

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

Zoals je hebt gemerkt, moeten we slim zijn met de manier waarop we onze voorbeelden maken. Het kan gebeuren dat er helemaal geen functietitel wordt gevonden, daarom hebben we een voorbeeld gemaakt dat "geen" teruggeeft (het vermijdt valse positieven). Misschien wil je meerdere functiebenamingen tegelijk vinden? In dat geval is het belangrijk om ook voorbeelden te maken die meerdere functietitels teruggeven (bijvoorbeeld functietitels gescheiden door komma's).

U zult nog betere resultaten krijgen door nog meer voorbeelden toe te voegen. En het is belangrijk dat je voorbeelden zo dicht mogelijk bij je eigenlijke eindvraag staan. Als u bijvoorbeeld weet dat u hele alinea's gaat analyseren in plaats van alleen maar zinnen, kunt u het beste ook voorbeelden met alinea's maken.

Als u geen toegang hebt tot een GPT-model, kunt u gewoon de NLP Cloud API gebruiken. Er zijn verschillende clients beschikbaar (Python, Go, Node.js, Ruby, PHP...). We tonen hier een voorbeeld waarbij GPT-J wordt gebruikt met de Python-client:

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
)

Het resultaat zal zijn: CTO

Laat me je een korte uitleg geven over de tekstgeneratie parameters die we net gebruikten.

We stellen een zeer lage p-waarde in omdat we niet willen dat GPT-J al te originele resultaten creëert: we willen gewoon dat het zich houdt aan wat het in uw verzoek heeft gezien.

"length_no_input" betekent dat de maximale lengtewaarde geen rekening moet houden met de ingevoerde tekst.

"remove_input" betekent dat de ingevoerde tekst uit het resultaat moet worden verwijderd.

"end_sequence" betekent dat wanneer het model dit teken tegenkomt, het moet stoppen met het genereren van tekst. Aangezien we in onze voorbeelden "###" hebben toegevoegd aan het eind van elk antwoord, zal het model automatisch "###" genereren nadat het antwoord is gegenereerd en zal het daar stoppen.

"remove_end_sequence" betekent dat we "###" uit het antwoord willen verwijderen.

Meer details vindt u in de NLP Cloud documentatie: zie het hier.

Prestatieoverwegingen

Entiteitsextractie met een GPT-model geeft veel vrijheid omdat elke nieuwe entiteit onmiddellijk kan worden geëxtraheerd, zelfs als het model daarvoor niet is opgeleid!

Daar hangt echter een prijskaartje aan: deze grote taalmodellen zijn enorm groot en relatief traag.

Als je bijvoorbeeld GPT-J of GPT-NeoX wilt gebruiken, heb je een enorme GPU nodig met veel VRAM, zoals een NVIDIA RTX A6000 of A40. En er zal enige latentie zijn (het extraheren van een entiteit duurt ongeveer 500ms). Daarentegen zullen spaCy of NLTK veel sneller zijn en minder kostbaar vanuit een infrastructuur standpunt.

Conclusie

In 2022 is het mogelijk om zeer gemakkelijk geavanceerde NER uit te voeren zonder enige annotatie en training! Dit zal bedrijven enorm helpen om hun projecten voor het extraheren van entiteiten sneller op te leveren, en het maakt ook meer geavanceerde toepassingen op basis van natuurlijke taalverwerking mogelijk.

Grote taalmodellen zoals GPT-3, GPT-J en GPT-NeoX zijn echter duur, zodat u de infrastructuurkosten niet moet onderschatten.

Ik hoop dat dit artikel u zal helpen tijd en geld te besparen!

Julien Salinas
CTO bij NLP Cloud