Zephyrnet-logo

Zet een tekstsamenvattingsproject op met Hugging Face Transformers: Part 1

Datum:

. OpenAI de derde generatie van hun machine learning (ML) -model dat gespecialiseerd is in het genereren van tekst in juli 2020 uitbracht, wist ik dat er iets anders was. Dit model raakte een gevoelige snaar als geen ander. Plots hoorde ik vrienden en collega's, die misschien geïnteresseerd zijn in technologie, maar meestal niet veel geven om de nieuwste ontwikkelingen op het gebied van AI/ML, erover praten. Zelfs de Guardian schreef: een artikel over het. Of, om precies te zijn, de model schreef het artikel en de Guardian bewerkte en publiceerde het. Het viel niet te ontkennen - GPT-3 was een gamechanger.

Nadat het model was uitgebracht, begonnen mensen er meteen mogelijke toepassingen voor te bedenken. Binnen enkele weken zijn er vele indrukwekkende demo's gemaakt, die te vinden zijn op de GPT-3-website. Een specifieke toepassing die mijn aandacht trok, was: tekst samenvatting - het vermogen van een computer om een ​​bepaalde tekst te lezen en de inhoud ervan samen te vatten. Het is een van de moeilijkste taken voor een computer omdat het twee velden op het gebied van natuurlijke taalverwerking (NLP) combineert: begrijpend lezen en tekstgeneratie. Daarom was ik zo onder de indruk van de GPT-3-demo's voor tekstsamenvattingen.

Je kunt ze proberen op de Hugging Face Spaces-website. Mijn favoriet op dit moment is een toepassing die samenvattingen van nieuwsartikelen genereert met alleen de URL van het artikel als invoer.

In deze tweedelige serie stel ik een praktische gids voor organisaties voor, zodat u de kwaliteit van tekstsamenvattingsmodellen voor uw domein kunt beoordelen.

Tutorial overzicht

Veel organisaties waarmee ik werk (liefdadigheidsinstellingen, bedrijven, NGO's) hebben enorme hoeveelheden teksten die ze moeten lezen en samenvatten - financiële rapporten of nieuwsartikelen, wetenschappelijke onderzoekspapers, octrooiaanvragen, juridische contracten en meer. Uiteraard zijn deze organisaties geïnteresseerd in het automatiseren van deze taken met NLP-technologie. Om de kunst van het mogelijke te demonstreren, gebruik ik vaak de demo's met tekstsamenvattingen, die bijna altijd indruk maken.

Maar wat nu?

De uitdaging voor deze organisaties is dat ze tekstsamenvattingsmodellen willen beoordelen op basis van samenvattingen voor vele, vele documenten - niet één tegelijk. Ze willen geen stagiaire in dienst nemen wiens enige taak is om de applicatie te openen, in een document te plakken, op de knop te drukken Samenvatten knop, wacht op de output, beoordeel of de samenvatting goed is en doe dat voor duizenden documenten opnieuw.

Ik heb deze tutorial geschreven met mijn vroegere zelf van vier weken geleden in gedachten - het is de tutorial die ik wou dat ik toen had toen ik aan deze reis begon. In die zin is de doelgroep van deze tutorial iemand die bekend is met AI/ML en al eerder Transformer-modellen heeft gebruikt, maar aan het begin staat van hun tekstsamenvattingsreis en er dieper in wil duiken. Omdat het is geschreven door een "beginner" en voor beginners, wil ik benadrukken dat deze tutorial is a praktische gids – niet de praktische gids. Behandel het alsjeblieft alsof George EP Box had gezegd:

In termen van hoeveel technische kennis is vereist in deze tutorial: er is wel wat codering in Python nodig, maar meestal gebruiken we de code alleen om API's aan te roepen, dus er is ook geen diepgaande codeerkennis vereist. Het is handig om bekend te zijn met bepaalde concepten van ML, zoals wat het betekent om: trein en implementeren een model, de concepten van opleiding, bevestiging en datasets testen, enzovoort. Ook geknutseld met de Transformers bibliotheek eerder kan handig zijn, omdat we deze bibliotheek in deze zelfstudie uitgebreid gebruiken. Ik voeg ook nuttige links toe om deze concepten verder te lezen.

Omdat deze tutorial is geschreven door een beginner, verwacht ik niet dat NLP-experts en gevorderde deep learning-beoefenaars veel van deze tutorial zullen krijgen. In ieder geval niet vanuit een technisch perspectief – misschien vind je het nog steeds leuk om te lezen, dus ga alsjeblieft nog niet weg! Maar je zult geduld moeten hebben met mijn vereenvoudigingen - ik heb geprobeerd te leven volgens het concept om alles in deze tutorial zo eenvoudig mogelijk te maken, maar niet eenvoudiger.

Structuur van deze tutorial

Deze serie strekt zich uit over vier secties die zijn opgesplitst in twee berichten, waarin we verschillende stadia van een tekstsamenvattingsproject doorlopen. In de eerste post (sectie 1) beginnen we met het introduceren van een statistiek voor tekstsamenvattingstaken - een prestatiemaatstaf waarmee we kunnen beoordelen of een samenvatting goed of slecht is. We introduceren ook de dataset die we willen samenvatten en creëren een basislijn met behulp van een no-ML-model - we gebruiken een eenvoudige heuristiek om een ​​samenvatting te genereren van een bepaalde tekst. Het creëren van deze baseline is een uiterst belangrijke stap in elk ML-project, omdat het ons in staat stelt te kwantificeren hoeveel vooruitgang we boeken door AI in de toekomst te gebruiken. Het stelt ons in staat om de vraag te beantwoorden: "Is het echt de moeite waard om te investeren in AI-technologie?"

In de tweede post gebruiken we een model dat al vooraf is getraind om samenvattingen te genereren (paragraaf 2). Dit is mogelijk met een moderne aanpak in ML genaamd overdracht leren. Het is weer een nuttige stap omdat we in feite een kant-en-klaar model nemen en dit testen op onze dataset. Dit stelt ons in staat om een ​​andere baseline te creëren, wat ons helpt te zien wat er gebeurt als we het model daadwerkelijk op onze dataset trainen. De aanpak heet zero-shot samenvatting, omdat het model geen blootstelling aan onze dataset heeft gehad.

Daarna is het tijd om een ​​vooraf getraind model te gebruiken en te trainen op onze eigen dataset (paragraaf 3). Dit wordt ook wel scherpstellen. Het stelt het model in staat om te leren van de patronen en eigenaardigheden van onze gegevens en zich er langzaam aan aan te passen. Nadat we het model hebben getraind, gebruiken we het om samenvattingen te maken (paragraaf 4).

Om samen te vatten:

  • Deel 1:
    • Sectie 1: Een model zonder ML gebruiken om een ​​basislijn vast te stellen
  • Deel 2:
    • Deel 2: Genereer samenvattingen met een zero-shot model
    • Deel 3: Een samenvattend model trainen
    • Deel 4: Evalueer het getrainde model

De volledige code voor deze tutorial is hieronder beschikbaar: GitHub repo.

Wat hebben we bereikt aan het einde van deze tutorial?

Aan het einde van deze tutorial hebben we zal niet een tekstsamenvattingsmodel hebben dat in de productie kan worden gebruikt. We hebben niet eens een goed samenvattingsmodel (vul hier schreeuwemoji in)!

Wat we in plaats daarvan zullen hebben, is een startpunt voor de volgende fase van het project, de e
experimentele fase. Dit is waar de 'wetenschap' in datawetenschap om de hoek komt kijken, want nu gaat het erom te experimenteren met verschillende modellen en verschillende instellingen om te begrijpen of een goed genoeg samenvattend model kan worden getraind met de beschikbare trainingsgegevens.

En, om helemaal transparant te zijn, de kans is groot dat de conclusie zal zijn dat de technologie gewoon nog niet rijp is en dat het project niet wordt uitgevoerd. En u moet uw zakelijke belanghebbenden op die mogelijkheid voorbereiden. Maar dat is een onderwerp voor een andere post.

Sectie 1: Een model zonder ML gebruiken om een ​​basislijn vast te stellen

Dit is het eerste deel van onze tutorial over het opzetten van een tekstsamenvattingsproject. In deze sectie stellen we een baseline vast met behulp van een heel eenvoudig model, zonder daadwerkelijk gebruik te maken van ML. Dit is een zeer belangrijke stap in elk ML-project, omdat het ons in staat stelt te begrijpen hoeveel waarde ML toevoegt gedurende de tijd van het project en of het de moeite waard is om erin te investeren.

De code voor de tutorial is hieronder te vinden: GitHub repo.

Gegevens, gegevens, gegevens

Elk ML-project begint met data! Indien mogelijk moeten we altijd gegevens gebruiken die betrekking hebben op wat we willen bereiken met een tekstsamenvattingsproject. Als het bijvoorbeeld ons doel is om octrooiaanvragen samen te vatten, moeten we ook octrooiaanvragen gebruiken om het model te trainen. Een groot voorbehoud voor een ML-project is dat de trainingsgegevens meestal moeten worden gelabeld. In de context van tekstsamenvatting betekent dit dat we zowel de samen te vatten tekst als de samenvatting (het label) moeten aanleveren. Alleen door beide te bieden, kan het model leren hoe een goede samenvatting eruitziet.

In deze tutorial gebruiken we een openbaar beschikbare dataset, maar de stappen en code blijven exact hetzelfde als we een custom of private dataset gebruiken. En nogmaals, als u een doel voor ogen heeft voor uw tekstsamenvattingsmodel en bijbehorende gegevens heeft, gebruik dan uw gegevens om hier het maximale uit te halen.

De gegevens die we gebruiken zijn de arXiv-gegevensset, die samenvattingen van arXiv-papers en hun titels bevat. Voor ons doel gebruiken we de samenvatting als de tekst die we willen samenvatten en de titel als de referentiesamenvatting. Alle stappen voor het downloaden en voorverwerken van de gegevens zijn hieronder beschikbaar: notitieboekje. We hebben een nodig AWS Identiteits- en toegangsbeheer (IAM)-rol die het mogelijk maakt om gegevens van en naar te laden Amazon eenvoudige opslagservice (Amazon S3) om deze notebook met succes uit te voeren. De dataset is ontwikkeld als onderdeel van de paper Over het gebruik van ArXiv als dataset en is gelicentieerd onder de Creative Commons CC0 1.0 Toewijding aan universeel publiek domein.

De gegevens zijn opgesplitst in drie gegevenssets: trainings-, validatie- en testgegevens. Als u uw eigen gegevens wilt gebruiken, zorg er dan voor dat dit ook het geval is. Het volgende diagram illustreert hoe we de verschillende datasets gebruiken.

Een veel voorkomende vraag op dit moment is natuurlijk: hoeveel data hebben we nodig? Zoals je waarschijnlijk al kunt raden, is het antwoord: het hangt ervan af. Het hangt af van hoe gespecialiseerd het domein is (octrooiaanvragen samenvatten is heel wat anders dan nieuwsartikelen samenvatten), hoe nauwkeurig het model moet zijn om bruikbaar te zijn, hoeveel de training van het model zou moeten kosten, enzovoort. We komen later op deze vraag terug wanneer we het model daadwerkelijk trainen, maar het komt er op neer dat we verschillende datasets moeten uitproberen wanneer we ons in de experimenteerfase van het project bevinden.

Wat maakt een goed model?

In veel ML-projecten is het vrij eenvoudig om de prestaties van een model te meten. Dat komt omdat er meestal weinig onduidelijkheid bestaat over de vraag of het resultaat van het model correct is. De labels in de dataset zijn vaak binair (True/False, Yes/No) of categorisch. In dit scenario is het in ieder geval gemakkelijk om de uitvoer van het model te vergelijken met het label en deze als juist of onjuist te markeren.

Bij het genereren van tekst wordt dit een grotere uitdaging. De samenvattingen (de labels) die we in onze dataset leveren, zijn slechts één manier om tekst samen te vatten. Maar er zijn veel mogelijkheden om een ​​bepaalde tekst samen te vatten. Dus zelfs als het model niet overeenkomt met ons label 1:1, kan de output nog steeds een geldige en bruikbare samenvatting zijn. Dus hoe vergelijken we de samenvatting van het model met de samenvatting die we bieden? De metriek die het vaakst wordt gebruikt in tekstsamenvattingen om de kwaliteit van een model te meten, is de ROUGE-score. Om de mechanica van deze metriek te begrijpen, raadpleegt u: De ultieme prestatiemaatstaf in NLP. Samengevat meet de ROUGE-score de overlap van n-gram (aaneengesloten reeks van n items) tussen de samenvatting van het model (kandidaatsamenvatting) en de referentiesamenvatting (het label dat we in onze dataset verstrekken). Maar dit is natuurlijk geen perfecte maatstaf. Om de beperkingen te begrijpen, check out ROUGE of niet ROUGE?

Dus, hoe berekenen we de ROUGE-score? Er zijn nogal wat Python-pakketten om deze statistiek te berekenen. Om consistentie te garanderen, moeten we gedurende ons hele project dezelfde methode gebruiken. Omdat we later in deze tutorial een trainingsscript uit de Transformers-bibliotheek zullen gebruiken in plaats van ons eigen script te schrijven, kunnen we een kijkje nemen in de broncode van het script en kopieer de code die de ROUGE-score berekent:

from datasets import load_metric
metric = load_metric("rouge") def calc_rouge_scores(candidates, references): result = metric.compute(predictions=candidates, references=references, use_stemmer=True) result = {key: round(value.mid.fmeasure * 100, 1) for key, value in result.items()} return result

Door deze methode te gebruiken om de score te berekenen, zorgen we ervoor dat we tijdens het project altijd appels met appels vergelijken.

Deze functie berekent verschillende ROUGE-scores: rouge1, rouge2, rougeL en rougeLsum. De "som" in rougeLsum verwijst naar het feit dat deze statistiek wordt berekend over een hele samenvatting, terwijl: rougeL wordt berekend als het gemiddelde over afzonderlijke zinnen. Dus, welke ROUGE-score moeten we gebruiken voor ons project? Nogmaals, we moeten verschillende benaderingen proberen in de experimentfase. Voor wat het waard is, de origineel ROUGE papier stelt dat "ROUGE-2 en ROUGE-L goed werkten bij het samenvatten van één document", terwijl "ROUGE-1 en ROUGE-L uitstekend presteren bij het evalueren van korte samenvattingen."

Creëer de basislijn

Vervolgens willen we de basislijn maken door een eenvoudig model zonder ML te gebruiken. Wat betekent dat? Op het gebied van tekstsamenvatting gebruiken veel onderzoeken een heel eenvoudige benadering: ze nemen de eerste n zinnen van de tekst en verklaren het de samenvatting van de kandidaat. Vervolgens vergelijken ze de kandidatensamenvatting met de referentiesamenvatting en berekenen ze de ROUGE-score. Dit is een eenvoudige maar krachtige aanpak die we in een paar regels code kunnen implementeren (de volledige code voor dit deel staat in het volgende notitieboekje):

import re ref_summaries = list(df_test['summary']) for i in range (3): candidate_summaries = list(df_test['text'].apply(lambda x: ' '.join(re.split(r'(?<=[.:;])s', x)[:i+1]))) print(f"First {i+1} senctences: Scores {calc_rouge_scores(candidate_summaries, ref_summaries)}")

Voor deze evaluatie gebruiken we de testdataset. Dit is logisch, want nadat we het model hebben getraind, gebruiken we dezelfde testdataset ook voor de eindevaluatie. We proberen ook verschillende nummers voor n: we beginnen met alleen de eerste zin als kandidaatsamenvatting, dan de eerste twee zinnen en tenslotte de eerste drie zinnen.

De volgende schermafbeelding toont de resultaten voor ons eerste model.

De ROUGE-scores zijn het hoogst, met alleen de eerste zin als kandidatensamenvatting. Dit betekent dat het opnemen van meer dan één zin de samenvatting te uitgebreid maakt en leidt tot een lagere score. Dat betekent dat we de scores voor de samenvattingen van één zin als basis zullen gebruiken.

Het is belangrijk op te merken dat, voor zo'n eenvoudige benadering, deze cijfers eigenlijk best goed zijn, vooral voor de rouge1 scoren. Om deze getallen in context te plaatsen, kunnen we verwijzen naar: Pegasus-modellen, die de scores van een state-of-the-art model voor verschillende datasets toont.

Conclusie en wat nu?

In deel 1 van onze serie hebben we de dataset geïntroduceerd die we tijdens het samenvattingsproject gebruiken, evenals een metriek om samenvattingen te evalueren. Vervolgens hebben we de volgende basislijn gemaakt met een eenvoudig model zonder ML.

In het volgende post, gebruiken we een zero-shot-model, met name een model dat specifiek is getraind voor het samenvatten van tekst in openbare nieuwsartikelen. Dit model wordt echter helemaal niet getraind op onze dataset (vandaar de naam “zero-shot”).

Ik laat het aan jou over als huiswerk om te raden hoe dit zero-shot-model zal presteren in vergelijking met onze zeer eenvoudige basislijn. Aan de ene kant zal het een veel geavanceerder model zijn (het is eigenlijk een neuraal netwerk). Aan de andere kant wordt het alleen gebruikt om nieuwsartikelen samen te vatten, dus het kan moeite hebben met de patronen die inherent zijn aan de arXiv-dataset.


Over de auteur

Heiko Hotz is Senior Solutions Architect voor AI & Machine Learning en leidt de Natural Language Processing (NLP)-gemeenschap binnen AWS. Voorafgaand aan deze functie was hij Head of Data Science voor Amazon's EU Customer Service. Heiko helpt onze klanten om succesvol te zijn in hun AI/ML-reis op AWS en heeft met organisaties in veel sectoren gewerkt, waaronder verzekeringen, financiële diensten, media en entertainment, gezondheidszorg, nutsbedrijven en productie. In zijn vrije tijd reist Heiko zoveel mogelijk.

spot_img

Laatste intelligentie

spot_img