View a markdown version of this page

Menggunakan Alur Kerja Analisis Pinjaman - Amazon Textract

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggunakan Alur Kerja Analisis Pinjaman

Untuk mendeteksi teks dalam, atau menganalisis dokumen pinjaman multihalaman, menggunakan alur kerja Analisis Pinjaman, Anda melakukan hal berikut:

  1. Buat topik Amazon SNS dan antrian Amazon SQS.

  2. Berlangganan antrian topik.

  3. Berikan izin topik untuk mengirim pesan ke antrian.

  4. Mulai memproses dokumen. StartLendingAnalysisOperasi panggilan.

  5. Dapatkan status penyelesaian dari antrean Amazon SQS. Kode contoh melacak pengidentifikasi pekerjaan (JobId) yang dikembalikan oleh Start operasi. Kode contoh hanya mendapatkan hasil untuk pencocokan pengidentifikasi pekerjaan yang dibaca dari status penyelesaian. Ini penting jika aplikasi lain menggunakan antrian dan topik yang sama. Untuk kesederhanaan, kode contoh menghapus pekerjaan yang tidak cocok. Pertimbangkan untuk menambahkan pekerjaan yang dihapus ke antrian surat mati Amazon SQS untuk penyelidikan lebih lanjut.

    Hasil StartLendingAnalysis operasi dapat dikirim ke bucket Amazon S3 pilihan Anda dengan menggunakan OutputConfig fitur ini. Jika Anda menggunakan fitur ini, Anda mungkin harus melakukan beberapa konfigurasi tambahan Peran Pengguna dan Layanan Anda. Untuk informasi tentang cara mengizinkan Amazon Textract mengirim dokumen terenkripsi ke bucket Amazon S3 Anda, lihatIzin untuk Konfigurasi Output.

  6. Dapatkan dan tampilkan hasil pemrosesan dengan memanggil GetLendingAnalysis operasi atau GetLendingAnalysisSummary operasi.

  7. Setelah Anda selesai memproses dokumen, pastikan untuk menghapus topik Amazon SNS dan antrian Amazon SQS. Jika Anda perlu memproses dokumen tambahan, Anda dapat meninggalkan topik Amazon SNS dan antrian Amazon SQS sebagaimana adanya dan menggunakannya kembali untuk dokumen lain.

Melakukan Analisis Pinjaman Asinkron

Contoh kode untuk prosedur ini disediakan untuk Python dan AWS CLI. Sebelum Anda mulai, instal AWS SDK yang sesuai. Untuk informasi selengkapnya, lihat Langkah 2: Siapkan AWS CLI and AWS SDK.

  1. Konfigurasikan akses pengguna ke Amazon Textract, dan konfigurasikan akses Amazon Textract ke Amazon SNS. Untuk informasi selengkapnya, lihat Mengon figurasi Amazon Textract untuk Operasi Asinkron. Untuk menyelesaikan prosedur ini, Anda memerlukan file dokumen multipage dalam format PDF. Anda dapat melewati langkah 3 — 6 dalam instruksi konfigurasi, karena kode contoh membuat dan mengonfigurasi topik Amazon SNS dan antrian Amazon SQS. Jika menyelesaikan contoh CLI, Anda tidak perlu mengatur antrian SQS.

  2. Unggah file dokumen multihalaman dalam format PDF atau TIFF ke bucket Amazon S3 Anda (Anda juga dapat memproses dokumen satu halaman dalam format JPEG, PNG, TIFF, atau PDF). Untuk petunjuk, lihat Meng unggah Objek ke Amazon S3 di Panduan Pengguna Layanan Penyimpanan Sederhana Amazon.

  3. Gunakan kode AWS SDK for Python (Boto3) atau AWS CLI berikut untuk menganalisis teks dalam dokumen pinjaman multihalaman. Dalam fungsi utama:

    • Ganti nilai roleArn dengan peran IAM ARN yang Anda simpan di Memberi Akses Amazon Textract ke Topik Amazon SNS Anda.

    • Ganti nilai bucket dan document dengan bucket dan nama file dokumen yang sebelumnya Anda tentukan dalam Langkah 2 yang sedang berlangsung.

    • Ganti nilai parameter type input ProcessDocument fungsi dengan jenis pemrosesan yang ingin Anda gunakan. Misalnya, gunakan ProcessType.DETECTION untuk mendeteksi teks, atau gunakan ProcessType.ANALYSIS untuk menganalisis teks.

    • Untuk contoh Python, ganti nilai region_name dengan wilayah tempat klien Anda beroperasi.

    Untuk kode contoh AWS CLI yang akan datang, lakukan hal berikut:

    • Saat memanggil StartLendingAnalysis operasi, ganti nilai bucket-name dengan nama bucket S3 Anda, dan ganti FileName dengan nama file yang Anda tentukan pada langkah 2. Tentukan wilayah bucket Anda dengan mengganti region-name dengan nama wilayah Anda. Perhatikan bahwa contoh CLI tidak menggunakan SQS.

    • Saat memanggil GetLendingAnalysis operasi atau GetLendingAnalysisSummary operasi, ganti jobId dengan yang jobId dikembalikan oleh StartLendingAnalysis. Tentukan wilayah bucket Anda dengan mengganti region-name dengan nama wilayah Anda.

  4. Jalankan kode untuk SDK atau AWS CLI pilihan Anda.

    Operasi mungkin membutuhkan waktu beberapa saat untuk menyelesaikan. Setelah selesai, daftar blok untuk teks yang terdeteksi atau dianalisis ditampilkan oleh contoh berikut:

    AWS CLI

    Untuk memulai analisis dokumen pinjaman gunakan perintah CLI berikut. Jika Anda ingin melihat dokumen yang dipisahkan, gunakan output-config argumen, jika tidak, Anda dapat menghapusnya:

    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'

    Untuk mendapatkan hasil analisis dokumen pinjaman gunakan perintah CLI berikut. max-resultsArgumen ini opsional, dan jika Anda tidak ingin membatasi jumlah hasil yang dikembalikan, Anda dapat menghapusnya:

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

    Untuk mengambil ringkasan hasil:

    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()