View a markdown version of this page

Usando o fluxo de trabalho Analyze Lending - Amazon Textract

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Usando o fluxo de trabalho Analyze Lending

Para detectar texto ou analisar documentos de empréstimo de várias páginas usando o fluxo de trabalho Analisar Empréstimo, faça o seguinte:

  1. Crie o tópico do Amazon SNS e a fila do Amazon SQS.

  2. Inscreva-se na fila do tópico.

  3. Dê permissão ao tópico para enviar mensagens para a fila.

  4. Comece a processar o documento. StartLendingAnalysisOperação de chamada.

  5. Obtenha o status de conclusão na fila do Amazon SQS. O código de exemplo rastreia o identificador do trabalho (JobId) que é retornado pela Start operação. O código de exemplo só obtém os resultados da correspondência de identificadores de trabalho que são lidos a partir do status de conclusão. Isso é importante se outros aplicativos estiverem usando a mesma fila e tópico. Para simplificar, o código de exemplo exclui trabalhos que não coincidem. Considere adicionar as tarefas excluídas a uma fila de mensagens mortas do Amazon SQS para uma investigação mais aprofundada.

    Os resultados da StartLendingAnalysis operação podem ser enviados para um bucket Amazon S3 de sua escolha usando o OutputConfig recurso. Se você usar esse recurso, talvez seja necessário fazer alguma configuração adicional de sua função de usuário e serviço. Para obter informações sobre como permitir que o Amazon Textract envie documentos criptografados para seu bucket do Amazon S3, consulte. Permissões para configuração de saída

  6. Obtenha e exiba os resultados do processamento chamando a GetLendingAnalysis operação ou a GetLendingAnalysisSummary operação.

  7. Depois de concluir o processamento dos documentos, certifique-se de excluir o tópico do Amazon SNS e a fila do Amazon SQS. Se precisar processar documentos adicionais, você pode deixar o tópico do Amazon SNS e a fila do Amazon SQS como estão e reutilizá-los para os outros documentos.

Executando análise assíncrona de empréstimos

O código de exemplo para esse procedimento é fornecido para Python e o. AWS CLI Antes de começar, instale o AWS SDK apropriado. Para obter mais informações, consulte Etapa 2: configurar o AWS CLI and AWS SDKs.

  1. Configure o acesso do usuário ao Amazon Textract e configure o acesso do Amazon Textract ao Amazon SNS. Para obter mais informações, consulte Configuração do Amazon Textract para operações assíncronas. Para concluir esse procedimento, você precisa de um arquivo de documento de várias páginas em formato PDF. Você pode pular as etapas 3 a 6 nas instruções de configuração, porque o código de exemplo cria e configura o tópico do Amazon SNS e a fila do Amazon SQS. Ao concluir o exemplo da CLI, você não precisa configurar uma fila SQS.

  2. Faça upload de um arquivo de documento de várias páginas em formato PDF ou TIFF para seu bucket do Amazon S3 (você também pode processar documentos de página única nos formatos JPEG, PNG, TIFF ou PDF). Para obter instruções, consulte Carregar objetos no Amazon S3 no Guia do usuário do Amazon Simple Storage Service.

  3. Use o seguinte código do AWS SDK para Python (Boto3) ou do AWS CLI para analisar texto em um documento de empréstimo de várias páginas. Na função principal:

    • Substitua o valor de roleArn pelo ARN da função do IAM que você salvou em Conceder ao Amazon Textract acesso ao seu tópico do Amazon SNS.

    • Substitua os valores document de bucket e pelo nome do arquivo do bucket e do documento que você especificou anteriormente na etapa 2 seguinte.

    • Substitua o valor do parâmetro de type entrada da ProcessDocument função pelo tipo de processamento que você deseja usar. Por exemplo, use ProcessType.DETECTION para detectar texto ou ProcessType.ANALYSIS para analisar texto.

    • Para o exemplo do Python, substitua o valor de region_name pela região em que seu cliente está operando.

    Para o próximo código de exemplo da AWS CLI, faça o seguinte:

    • Ao chamar a StartLendingAnalysisoperação, substitua o valor de bucket-name pelo nome do seu bucket do S3 e FileName substitua pelo nome do arquivo especificado na etapa 2. Especifique a região do seu bucket region-name substituindo-a pelo nome da sua região. Observe que o exemplo da CLI não faz uso do SQS.

    • Ao chamar a GetLendingAnalysisoperação ou a GetLendingAnalysisSummaryoperação, jobId substitua pela jobId retornada por StartLendingAnalysis. Especifique a região do seu bucket region-name substituindo-a pelo nome da sua região.

  4. Execute o código para o SDK ou a AWS CLI de sua escolha.

    A operação pode demorar um pouco para ser concluída. Depois de concluído, uma lista de blocos para texto detectado ou analisado é exibida nos exemplos a seguir:

    AWS CLI

    Para iniciar a análise do documento de empréstimo, use o seguinte comando da CLI. Se você quiser ver documentos divididos, use o output-config argumento, caso contrário, você pode removê-lo:

    aws textract start-lending-analysis \ --document-location '{"S3Object":{"Bucket":"S3Bucket","Name":"FileName"}}' \ --output-config '{"S3Bucket": "S3Bucket", "S3Prefix": "S3Prefix"}' \ --kms-key-id '1234abcd-12ab-34cd-56ef-1234567890ab' \ --region 'region-name'

    Para obter os resultados da análise do documento de empréstimo, use o seguinte comando CLI. O max-results argumento é opcional e, se você não quiser limitar o número de resultados retornados, pode removê-lo:

    aws textract get-lending-analysis \ --job-id 'jobId' \ --region 'us-west-2' \ --max-results 30

    Para recuperar um resumo dos resultados:

    aws textract get-lending-analysis-summary \ --job-id 'jobId' \ --region 'us-west-2'
    Python
    import boto3 import json import sys import time class DocumentProcessor: def __init__(self, role, bucket, document, region): self.roleArn = role self.bucket = bucket self.document = document self.region_name = region self.textract = boto3.client('textract', region_name=self.region_name) self.sqs = boto3.client('sqs') self.sns = boto3.client('sns') def ProcessDocument(self): jobFound = False response = self.textract.start_lending_analysis( DocumentLocation={'S3Object': {'Bucket': self.bucket, 'Name': self.document}}, NotificationChannel={'RoleArn': self.roleArn, 'SNSTopicArn': self.snsTopicArn}) print('Processing type: Analysis') print('Start Job Id: ' + response['JobId']) dotLine = 0 while jobFound == False: sqsResponse = self.sqs.receive_message(QueueUrl=self.sqsQueueUrl, MessageAttributeNames=['ALL'], MaxNumberOfMessages=10) if sqsResponse: if 'Messages' not in sqsResponse: if dotLine < 40: print('.', end='') dotLine = dotLine + 1 else: print() dotLine = 0 sys.stdout.flush() time.sleep(5) continue for message in sqsResponse['Messages']: notification = json.loads(message['Body']) textMessage = json.loads(notification['Message']) print(textMessage['JobId']) print(textMessage['Status']) if str(textMessage['JobId']) == response['JobId']: print('Matching Job Found:' + textMessage['JobId']) jobFound = True self.GetResults(textMessage['JobId']) self.GetSummary(textMessage['JobId']) self.sqs.delete_message(QueueUrl=self.sqsQueueUrl, ReceiptHandle=message['ReceiptHandle']) else: print("Job didn't match:" + str(textMessage['JobId']) + ' : ' + str(response['JobId'])) # Delete the unknown message. Consider sending to dead letter queue self.sqs.delete_message(QueueUrl=self.sqsQueueUrl, ReceiptHandle=message['ReceiptHandle']) print('Done!') def CreateTopicandQueue(self): millis = str(int(round(time.time() * 1000))) # Create SNS topic snsTopicName = "AmazonTextractTopic" + millis topicResponse = self.sns.create_topic(Name=snsTopicName) self.snsTopicArn = topicResponse['TopicArn'] # create SQS queue sqsQueueName = "AmazonTextractQueue" + millis self.sqs.create_queue(QueueName=sqsQueueName) self.sqsQueueUrl = self.sqs.get_queue_url(QueueName=sqsQueueName)['QueueUrl'] attribs = self.sqs.get_queue_attributes(QueueUrl=self.sqsQueueUrl, AttributeNames=['QueueArn'])['Attributes'] sqsQueueArn = attribs['QueueArn'] # Subscribe SQS queue to SNS topic self.sns.subscribe( TopicArn=self.snsTopicArn, Protocol='sqs', Endpoint=sqsQueueArn) # Authorize SNS to write SQS queue policy = """{{ "Version":"2012-10-17", "Statement":[ {{ "Sid":"MyPolicy", "Effect":"Allow", "Principal" : {{"AWS" : "*"}}, "Action":"sqs:*", "Resource": "{}", "Condition":{{ "ArnEquals":{{ "aws:SourceArn": "{}" }} }} }} ] }}""".format(sqsQueueArn, self.snsTopicArn) response = self.sqs.set_queue_attributes( QueueUrl=self.sqsQueueUrl, Attributes={ 'Policy': policy }) def DeleteTopicandQueue(self): self.sqs.delete_queue(QueueUrl=self.sqsQueueUrl) self.sns.delete_topic(TopicArn=self.snsTopicArn) # Display information about a block def DisplayExtractInfo(self, response): results = response['Results'] for page in results: print("Page Classification: {}".format(page["PageClassification"]["PageType"])) print("Page Number: {}".format(page["Page"])) for extract in page["Extractions"]: for fields, vals in extract['LendingDocument'].items(): for val in vals: print("Document Type: {}".format(val['Type'])) detections = val['ValueDetections'] for i in detections: print(i['Text']) print('Geometry') print('\tBounding Box: {}'.format(i['Geometry']['BoundingBox'])) print('\tPolygon: {}'.format(i['Geometry']['Polygon'])) def GetSummary(self, jobId): maxResults = 1000 response = self.textract.get_lending_analysis_summary(JobId=jobId, MaxResults=maxResults) doc_groups = response['DocumentGroups'] print("Summary info:") for group in doc_groups: print("Document type: " + group['Type']) split_docs = group['SplitDocuments'] for doc in split_docs: print(doc) for idx, page in doc.items(): print(str(idx) + " - " + str(page)) def GetResults(self, jobId): maxResults = 1000 paginationToken = None finished = False while finished == False: response = None if paginationToken == None: response = self.textract.get_lending_analysis(JobId=jobId, MaxResults=maxResults) else: response = self.textract.get_lending_analysis(JobId=jobId, MaxResults=maxResults, NextToken=paginationToken) print('Detected Document Text') print('Pages: {}'.format(response['DocumentMetadata']['Pages'])) self.DisplayExtractInfo(response) if 'NextToken' in response: paginationToken = response['NextToken'] else: finished = True def main(): roleArn = '' bucket = '' document = '' region_name = '' analyzer = DocumentProcessor(roleArn, bucket, document, region_name) analyzer.CreateTopicandQueue() analyzer.ProcessDocument() analyzer.DeleteTopicandQueue() if __name__ == "__main__": main()