Zephyrnet-logo

Creëer een documentmeer met behulp van grootschalige tekstextractie uit documenten met Amazon Textract | Amazon-webservices

Datum:

AWS-klanten in de gezondheidszorg, financiële dienstverlening, de publieke sector en andere sectoren slaan miljarden documenten op als afbeeldingen of pdf's Amazon eenvoudige opslagservice (Amazone S3). Ze kunnen echter geen inzichten verwerven, zoals het gebruik van de informatie die in de documenten is opgesloten voor grote taalmodellen (LLM's) of zoeken totdat ze de tekst, formulieren, tabellen en andere gestructureerde gegevens hebben opgehaald. Met AWS intelligente documentverwerking (IDP) met behulp van AI-services zoals Amazon T-extract, kunt u profiteren van toonaangevende machine learning (ML)-technologie om snel en nauwkeurig gegevens uit PDF's of documentafbeeldingen (TIFF, JPEG, PNG) te verwerken. Nadat de tekst uit de documenten is gehaald, kunt u deze gebruiken om een ​​funderingsmodel te verfijnen, vat de gegevens samen met behulp van een funderingsmodelof stuur het naar een database.

In dit bericht concentreren we ons op het verwerken van een grote verzameling documenten in onbewerkte tekstbestanden en deze op te slaan in Amazon S3. Wij bieden u twee verschillende oplossingen voor deze use case. Met de eerste kunt u een Python-script uitvoeren vanaf elke server of instantie, inclusief een Jupyter-notebook; dit is de snelste manier om aan de slag te gaan. De tweede aanpak is een kant-en-klare implementatie van verschillende infrastructuurcomponenten met behulp van AWS Cloud-ontwikkelingskit (AWS-CDK) constructies. De AWS CDK-constructie biedt een veerkrachtig en flexibel raamwerk om uw documenten te verwerken en een end-to-end IDP-pijplijn op te bouwen. Door het gebruik van de AWS CDK kunt u de functionaliteit ervan uitbreiden met redactie, sla de uitvoer op in Amazon OpenSearchof voeg een aangepaste versie toe AWS Lambda functioneren met uw eigen bedrijfslogica.

Met beide oplossingen kunt u snel vele miljoenen pagina's verwerken. Voordat u een van deze oplossingen op grote schaal uitvoert, raden we u aan te testen met een subset van uw documenten om er zeker van te zijn dat de resultaten aan uw verwachtingen voldoen. In de volgende secties beschrijven we eerst de scriptoplossing, gevolgd door de AWS CDK-constructieoplossing.

Oplossing 1: gebruik een Python-script

Deze oplossing verwerkt documenten voor onbewerkte tekst via Amazon Textract zo snel als de service mogelijk maakt, in de verwachting dat als er een fout in het script optreedt, het proces verdergaat waar het was gebleven. De oplossing maakt gebruik van drie verschillende services: Amazon S3, Amazon DynamoDBen Amazon Textract.

Het volgende diagram illustreert de volgorde van gebeurtenissen binnen het script. Wanneer het script eindigt, wordt een voltooiingsstatus samen met de benodigde tijd teruggestuurd naar de SageMaker studioconsole.

diagram

Wij hebben deze oplossing verpakt in een .ipynb-script en .py-script. U kunt elk van de inzetbare oplossingen gebruiken volgens uw vereisten.

Voorwaarden

Om dit script uit te voeren vanaf een Jupyter-notebook, moet het AWS Identiteits- en toegangsbeheer (IAM)-rol die aan de notebook is toegewezen, moet machtigingen hebben waarmee deze kan communiceren met DynamoDB, Amazon S3 en Amazon Textract. De algemene richtlijn is om voor elk van deze services machtigingen met de minste bevoegdheden aan uw gebruikers te verlenen AmazonSageMaker-ExecutionRole rol. Raadpleeg voor meer informatie Ga aan de slag met door AWS beheerd beleid en ga over op machtigingen met de minste rechten.

Als alternatief kunt u dit script uitvoeren vanuit andere omgevingen, zoals een Amazon Elastic Compute-cloud (Amazon EC2) instantie of container die u zou beheren, op voorwaarde dat Python, Pip3 en de AWS SDK voor Python (Boto3) zijn geïnstalleerd. Ook hier moet hetzelfde IAM-beleid worden toegepast dat ervoor zorgt dat het script kan communiceren met de verschillende beheerde services.

walkthrough

Om deze oplossing te implementeren, moet u eerst de repository klonen GitHub.

U moet de volgende variabelen in het script instellen voordat u het kunt uitvoeren:

  • volg_tabel – Dit is de naam van de DynamoDB-tabel die wordt gemaakt.
  • invoer_bucket – Dit is uw bronlocatie in Amazon S3 die de documenten bevat die u naar Amazon Textract wilt sturen voor tekstdetectie. Geef voor deze variabele de naam van de bucket op, bijvoorbeeld mybucket.
  • uitvoer_bucket – Dit is voor het opslaan van de locatie waar u wilt dat Amazon Textract de resultaten naartoe schrijft. Geef voor deze variabele de naam van de bucket op, bijvoorbeeld myoutputbucket.
  • _input_prefix (optioneel) – Als u bepaalde bestanden uit een map in uw S3-bucket wilt selecteren, kunt u deze mapnaam opgeven als invoervoorvoegsel. Anders laat u de standaardwaarde leeg om alles te selecteren.

Het script is als volgt:

_tracking_table = "Table_Name_for_storing_s3ObjectNames"
_input_bucket = "your_files_are_here"
_output_bucket = "Amazon Textract_writes_JSON_containing_raw_text_to_here"

Het volgende DynamoDB-tabelschema wordt gemaakt wanneer het script wordt uitgevoerd:

Table              Table_Name_for_storing_s3ObjectNames
Partition Key       objectName (String)
                    bucketName (String)
                    createdDate (Decimal)
                    outputbucketName (String)
                    txJobId (String)

Wanneer het script voor de eerste keer wordt uitgevoerd, wordt gecontroleerd of de DynamoDB-tabel bestaat en wordt deze indien nodig automatisch gemaakt. Nadat de tabel is gemaakt, moeten we deze vullen met een lijst met documentobjectreferenties van Amazon S3 die we willen verwerken. Het script by design zal objecten in het opgegeven gebied opsommen input_bucket en onze tabel automatisch vullen met hun namen wanneer deze worden uitgevoerd. Het duurt ongeveer 10 minuten om meer dan 100,000 documenten op te sommen en die namen vanuit het script in de DynamoDB-tabel in te vullen. Als je miljoenen objecten in een bucket hebt, kun je als alternatief de inventarisfunctie van Amazon S3 gebruiken die een CSV-bestand met namen genereert, en vervolgens de DynamoDB-tabel uit deze lijst vooraf vullen met je eigen script en de functie genaamd fetchAllObjectsInBucketandStoreName door er commentaar op te geven. Raadpleeg voor meer informatie Amazon S3-inventaris configureren.

Zoals eerder vermeld is er zowel een notebookversie als een Python-scriptversie. Het notitieboekje is de meest eenvoudige manier om aan de slag te gaan; voer eenvoudig elke cel van begin tot eind uit.

Als u besluit het Python-script vanuit een CLI uit te voeren, is het raadzaam een ​​terminalmultiplexer zoals tmux te gebruiken. Dit is om te voorkomen dat het script stopt als uw SSH-sessie eindigt. Bijvoorbeeld: tmux new -d ‘python3 textractFeeder.py’.

De volgende is de het ingangspunt van het script; vanaf hier kunt u methoden die niet nodig zijn, becommentariëren:

"""Main entry point into script --- Start Here"""
if __name__ == "__main__":    
    now = time.perf_counter()
    print("started")

De volgende velden worden ingesteld wanneer het script de DynamoDB-tabel vult:

  • objectnaam – De naam van het document in Amazon S3 dat naar Amazon Textract wordt verzonden
  • bucketNaam – De bucket waarin het documentobject is opgeslagen

Deze twee velden moeten worden ingevuld als u besluit een CSV-bestand uit het S3-inventarisrapport te gebruiken en het automatisch invullen van het script over te slaan.

Nu de tabel is gemaakt en gevuld met de documentobjectreferenties, is het script klaar om Amazon Textract aan te roepen StartDocumentTextDetection API. Amazon Textract heeft, vergelijkbaar met andere beheerde services, een standaardlimiet op de API's die transacties per seconde (TPS) worden genoemd. Indien nodig kunt u een quotumverhoging aanvragen via de Amazon Textract-console. De code is ontworpen om meerdere threads tegelijkertijd te gebruiken bij het aanroepen van Amazon Textract om de doorvoer met de service te maximaliseren. U kunt dit binnen de code wijzigen door het threadCountforTextractAPICall variabel. Standaard is dit ingesteld op 20 threads. Het script leest in eerste instantie 200 rijen uit de DynamoDB-tabel en slaat deze op in een lijst in het geheugen die is omwikkeld met een klasse voor threadveiligheid. Elke callerthread wordt vervolgens gestart en loopt binnen zijn eigen zwembaan. Kortom, de Amazon Textract-bellerthread haalt een item op uit de in-memory-lijst die onze objectreferentie bevat. Het zal dan het asynchroon aanroepen start_document_text_detection API en wacht op de bevestiging met de taak-ID. De taak-ID wordt vervolgens weer bijgewerkt naar de DynamoDB-rij voor dat object, en de thread wordt herhaald door het volgende item uit de lijst op te halen.

Het volgende is de belangrijkste orkestratiecode script:

while len(results) > 0:
        for record in results: # put these records into our thread safe list
            fileList.append(record)    
        """create our threads for processing Amazon Textract"""
        	  threadsforTextractAPI=threading.Thread(name="Thread - " + str(i), target=procestTextractFunction, args=(fileList,)) 

De threads van de beller blijven zich herhalen totdat er geen items meer in de lijst staan. Op dat moment zullen de threads allemaal stoppen. Wanneer alle threads die binnen hun zwembanen actief zijn, zijn gestopt, worden de volgende 200 rijen uit DynamoDB opgehaald en wordt een nieuwe set van 20 threads gestart. Het hele proces herhaalt zich totdat elke rij die geen taak-ID bevat, is opgehaald uit DynamoDB en bijgewerkt. Mocht het script crashen vanwege een onverwacht probleem, dan kan het script opnieuw worden uitgevoerd vanuit het orchestrate() methode. Dit zorgt ervoor dat de threads doorgaan met het verwerken van rijen die lege taak-ID's bevatten. Houd er rekening mee dat bij het opnieuw uitvoeren van de orchestrate() methode nadat het script is gestopt, bestaat de kans dat een paar documenten opnieuw naar Amazon Textract worden verzonden. Dit aantal is gelijk aan of kleiner dan het aantal threads dat actief was op het moment van de crash.

Wanneer er geen rijen meer zijn met een lege taak-ID in de DynamoDB-tabel, stopt het script. Alle JSON-uitvoer van Amazon Textract voor alle objecten is te vinden in de output_bucket standaard onder de textract_output map. Elke submap binnen textract_output krijgt de naam met de taak-ID die overeenkomt met de taak-ID die voor dat object in de DynamoDB-tabel is opgeslagen. In de taak-ID-map vindt u de JSON, die een numerieke naam krijgt, beginnend bij 1, en mogelijk extra JSON-bestanden kan omvatten met de naam 2, 3, enzovoort. Het overspannen van JSON-bestanden is het resultaat van documenten met een hoge dichtheid of meerdere pagina's, waarbij de hoeveelheid geëxtraheerde inhoud de standaard JSON-grootte van Amazon Textract van 1,000 blokken overschrijdt. Verwijzen naar Blok voor meer informatie over blokken. Deze JSON-bestanden bevatten alle Amazon Textract-metagegevens, inclusief de tekst die uit de documenten is geëxtraheerd.

U kunt de Python-codenotebookversie en het script voor deze oplossing vinden in GitHub.

Opruimen

Wanneer het Python-script voltooid is, kunt u kosten besparen door het programma af te sluiten of te stoppen Amazon SageMaker Studio notitieboekje of container die je hebt gesponnen.

Nu verder met onze tweede oplossing voor documenten op schaal.

Oplossing 2: gebruik een serverloze AWS CDK-constructie

Deze oplossing maakt gebruik van AWS Stap Functies en Lambda-functies om de IDP-pijplijn te orkestreren. Wij gebruiken de IDP AWS CDK-constructies, waardoor het eenvoudig is om op grote schaal met Amazon Textract te werken. Daarnaast gebruiken wij een Stap Functies gedistribueerde kaart om alle bestanden in de S3-bucket te doorlopen en de verwerking te starten. De eerste Lambda-functie bepaalt hoeveel pagina's uw documenten hebben. Hierdoor kan de pijplijn automatisch de synchrone (voor documenten met één pagina) of asynchrone (voor documenten met meerdere pagina's) API gebruiken. Wanneer u de asynchrone API gebruikt, wordt een extra Lambda-functie aangeroepen voor alle JSON-bestanden die Amazon Textract voor al uw pagina's in één JSON-bestand zal produceren, zodat uw downstream-applicaties eenvoudig met de informatie kunnen werken.

Deze oplossing bevat bovendien twee extra Lambda-functies. De eerste functie parseert de tekst uit de JSON en slaat deze op als een tekstbestand in Amazon S3. De tweede functie analyseert de JSON en slaat die op voor statistieken over de werklast.

Het volgende diagram illustreert de stapfuncties-workflow.

Diagram

Voorwaarden

Deze codebasis maakt gebruik van de AWS CDK en vereist Docker. U kunt dit implementeren vanuit een AWS-Cloud9 instance, waarin de AWS CDK en Docker al zijn ingesteld.

walkthrough

Om deze oplossing te implementeren, moet u eerst het repository.

Nadat u de repository hebt gekloond, installeert u de afhankelijkheden:

pip install -r requirements.txt

Gebruik vervolgens de volgende code om de AWS CDK-stack te implementeren:

cdk bootstrap
cdk deploy --parameters SourceBucket=<Source Bucket> SourcePrefix=<Source Prefix>

Voor deze oplossing moet u zowel de bronbucket als het bronvoorvoegsel (de locatie van de bestanden die u wilt verwerken) opgeven.

Wanneer de implementatie is voltooid, navigeert u naar de Step Functions-console, waar u de statusmachine zou moeten zien ServerlessIDPArchivePipeline.

Diagram

Open de pagina met details van de statusmachine en op de executies tabblad, kies Start de uitvoering.

Diagram

Kies Start de uitvoering opnieuw om de statusmachine uit te voeren.

Diagram

Nadat u de statusmachine hebt gestart, kunt u de pijplijn controleren door naar de kaartuitvoering te kijken. Je ziet een Status van artikelverwerking sectie zoals de volgende schermafbeelding. Zoals u kunt zien, is dit gebouwd om uit te voeren en bij te houden wat succesvol was en wat mislukte. Dit proces blijft doorgaan totdat alle documenten zijn gelezen.

Diagram

Met deze oplossing zou u miljoenen bestanden in uw AWS-account moeten kunnen verwerken zonder dat u zich zorgen hoeft te maken over hoe u goed kunt bepalen welke bestanden u naar welke API moet sturen of hoe u corrupte bestanden kunt beschadigen die niet in uw pijplijn passen. Via de Step Functions-console kunt u uw bestanden in realtime bekijken en controleren.

Opruimen

Nadat uw pijplijn is uitgevoerd, kunt u, om deze op te ruimen, teruggaan naar uw project en de volgende opdracht invoeren:

cdk destroy

Hiermee worden alle services verwijderd die voor dit project zijn geïmplementeerd.

Conclusie

In dit bericht hebben we een oplossing gepresenteerd waarmee u eenvoudig uw documentafbeeldingen en PDF's naar tekstbestanden kunt converteren. Dit is een belangrijke voorwaarde voor het gebruik van uw documenten voor generatieve AI en zoeken. Voor meer informatie over het gebruik van tekst om uw funderingsmodellen te trainen of te verfijnen, raadpleegt u Verfijn Llama 2 voor het genereren van tekst op Amazon SageMaker JumpStart. Raadpleeg voor gebruik met zoeken Implementeer een slimme documentzoekindex met Amazon Textract en Amazon OpenSearch. Voor meer informatie over de geavanceerde documentverwerkingsmogelijkheden die worden aangeboden door AWS AI-services, raadpleegt u Leidraad voor intelligente documentverwerking op AWS.


Over de auteurs

Tim CondelloTim Condello is een senior specialist in kunstmatige intelligentie (AI) en machine learning (ML) oplossingen bij Amazon Web Services (AWS). Zijn focus ligt op natuurlijke taalverwerking en computervisie. Tim vindt het leuk om klantideeën om te zetten in schaalbare oplossingen.

David Girling is een senior AI/ML-oplossingenarchitect met meer dan twintig jaar ervaring in het ontwerpen, leiden en ontwikkelen van bedrijfssystemen. David maakt deel uit van een gespecialiseerd team dat zich richt op het helpen van klanten bij het leren, innoveren en gebruiken van deze zeer capabele services met hun gegevens voor hun gebruiksscenario's.

spot_img

Laatste intelligentie

spot_img