Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Mengekstrak dan Mengirim Teks ke AWS Comprehend untuk Analisis
Amazon Textract memungkinkan Anda menyertakan deteksi dan analisis teks dokumen dalam aplikasi Anda. Dengan Amazon Textract Anda dapat mengekstrak teks dari berbagai jenis dokumen yang berbeda menggunakan pemrosesan dokumen sinkron dan asinkron. Teks yang diekstraksi kemudian dapat disimpan ke file atau database, atau dikirim ke AWS layanan lain untuk diproses lebih lanjut.
Dalam tutorial ini Anda melakukan alur kerja end-to-end yang umum. Alur kerja ini melibatkan:
-
Memproses banyak dokumen masukan dengan Amazon Texttract
-
Menyediakan teks yang diekstraksi ke Amazon Comprehend untuk analisis
-
Menyimpan teks yang dianalisis dan data analisis ke bucket Amazon Simple Storage Service (S3)
Anda menggunakan AWS SDK untuk Python untuk
Prasyarat
Sebelum Anda memulai tutorial ini, Anda harus menginstal Python dan menyelesaikan langkah-langkah yang diperlukan untuk mengatur SDK Python
-
Amazon Textract yang dikonfigurasi untuk pemrosesan Asinkron, menyalin Nomor Sumber Daya Amazon (ARN) dari peran IAM yang Anda konfigurasikan untuk digunakan dengan Amazon Textract
-
Memilih beberapa dokumen untuk keperluan teks extraction/analysis dan mengunggah dokumen ke Amazon S3. Pastikan file yang Anda pilih untuk analisis adalah format yang didukung oleh Amazon Ttract.
Memulai Deteksi Teks Dokumen Asinkron
Anda dapat mengekstrak teks dari dokumen Anda dan kemudian menganalisis teks yang diekstraksi dengan layanan seperti Amazon Comprehend. Textract mendukung ekstraksi teks dari dokumen multipage melalui operasi asinkron, yang untuk memproses dokumen multipage yang besar. Memproses file PDF secara asinkron memungkinkan aplikasi Anda menyelesaikan tugas lain sambil menunggu proses selesai. Bagian ini akan mendemonstrasikan cara mengimpor dokumen Anda dari bucket Amazon S3 dan menyediakannya ke operasi deteksi teks asinkron Texttract.
Tutorial ini mengasumsikan bahwa Anda akan menggunakan Amazon S3 untuk menyimpan file yang ingin Anda ekstrak teks. Anda akan mulai dengan membuat kelas dan fungsi yang mendeteksi teks dalam dokumen masukan Anda. Aplikasi Anda harus terhubung ke klien Textract, serta klien Amazon SQS dan Amazon SNS untuk tujuan memantau status penyelesaian pekerjaan asinkron.
-
Mulailah dengan menulis kode untuk membuat topik Amazon SNS dan antrian Amazon SQS.
Contoh kode berikut membuat
DocumentProcessorkelas yang terhubung ke tiga layanan yang diperlukan dan kemudian membuat antrean Amazon SQS dan topik Amazon SNS. Topik Amazon SNS digunakan untuk memberikan informasi tentang status penyelesaian pekerjaan ke antrian Amazon SQS, yang akan disurvei untuk mendapatkan status penyelesaian pekerjaan. Ada juga metode untuk menghapus antrian Amazon SQS dan topik Amazon SNS setelah pekerjaan selesai dan sumber daya tidak lagi diperlukan.import boto3 import json import sys import time class DocumentProcessor: jobId = '' region_name = '' roleArn = '' bucket = '' document = '' sqsQueueUrl = '' snsTopicArn = '' processType = '' def __init__(self, role, bucket, document, region): self.roleArn = role self.bucket = bucket self.document = document self.region_name = region # Instantiates necessary AWS clients session = boto3.Session(profile_name='profile-name', region_name='self.region_name') self.textract = session.client('textract', region_name=self.region_name) self.sqs = session.client('sqs', region_name=self.region_name) self.sns = session.client('sns', region_name=self.region_name) 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:SendMessage", "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) -
Tulis kode untuk memanggil
StartDocumentTextDetectionoperasi dan dapatkan hasil operasi.DocumentProcessorKelas juga akan membutuhkan metode untuk:-
Panggil
StartDocumentTextDetectionoperasi -
Polling Amazon SQS untuk status penyelesaian pekerjaan
-
Mengambil hasil pekerjaan setelah selesai diproses
Kode berikut menciptakan
ProcessDocumentdanGetResultsmetode yang memanggilStartDocumentTextDetectiondan mendapatkan teks diekstraksi, masing-masing.def ProcessDocument(self): # Checks if job found jobFound = False # Starts the text detection operation on the documents in the provided bucket # Sends status to supplied SNS topic arn response = self.textract.start_document_text_detection( DocumentLocation={'S3Object': {'Bucket': self.bucket, 'Name': self.document}}, NotificationChannel={'RoleArn': self.roleArn, 'SNSTopicArn': self.snsTopicArn}) print('Processing type: Detection') print('Start Job Id: ' + response['JobId']) dotLine = 0 while jobFound == False: sqsResponse = self.sqs.receive_message(QueueUrl=self.sqsQueueUrl, MessageAttributeNames=['ALL'], MaxNumberOfMessages=10) # Waits until messages are found in the SQS queue 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 # Checks for a completed job that matches the jobID in the response from # StartDocumentTextDetection for message in sqsResponse['Messages']: notification = json.loads(message['Body']) textMessage = json.loads(notification['Message']) if str(textMessage['JobId']) == response['JobId']: print('Matching Job Found:' + textMessage['JobId']) jobFound = True text_data = self.GetResults(textMessage['JobId']) self.sqs.delete_message(QueueUrl=self.sqsQueueUrl, ReceiptHandle=message['ReceiptHandle']) return text_data 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!') # gets the results of the completed text detection job # checks for pagination tokens to determine if there are multiple pages in the input doc def GetResults(self, jobId): maxResults = 1000 paginationToken = None finished = False while finished == False: response = None if paginationToken == None: response = self.textract.get_document_text_detection(JobId=jobId, MaxResults=maxResults) else: response = self.textract.get_document_text_detection(JobId=jobId, MaxResults=maxResults, NextToken=paginationToken) blocks = response['Blocks'] # List to hold detected text detected_text = [] # Display block information and add detected text to list for block in blocks: if 'Text' in block and block['BlockType'] == "LINE": detected_text.append(block['Text']) # If response contains a next token, update pagination token if 'NextToken' in response: paginationToken = response['NextToken'] else: finished = True return detected_text -
-
Simpan kode di atas dalam file bernama
detectFileAsync.py.Anda menggunakan file ini di bagian berikutnya untuk menangani deteksi teks dalam dokumen masukan Anda.
Memproses Dokumen Anda dan Mengirim Teks untuk Memahami
Aplikasi Anda akan menggunakan kelas yang Anda buat di bagian prosiding untuk:
-
baca dokumen dari bucket Amazon S3 Anda
-
ekstrak teks dalam dokumen-dokumen tersebut
-
kirim teks ke Amazon Comprehend untuk analisis
Anda mulai dengan membuat beberapa fitur yang menggunakan Amazon Comprehend untuk menganalisis teks yang terdeteksi dalam dokumen input Anda. Jenis analisis teks yang umum adalah analisis sentimen, yang bertujuan untuk menangkap pengaruh pernyataan (apakah itu positif, negatif, atau netral). Anda juga dapat melakukan deteksi entitas dan deteksi frasa kunci pada data.
Kode di bawah ini mengambil teks yang terdeteksi dan memanggil BatchDetectSentiment operasi dari Amazon Comprehend untuk melakukan analisis sentimen.
-
Tulis kode untuk melakukan analisis sentimen pada teks Anda yang terdeteksi.
from detectFileAsync import DocumentProcessor import boto3 import pandas as pd # Detect sentiment def sentiment_analysis(detected_text, lang): comprehend = boto3.client("comprehend") detect_sent_response = comprehend.batch_detect_sentiment( TextList=detected_text, LanguageCode=lang) # Lists to hold sentiment labels and sentiment scores sentiments = [] pos_score = [] neg_score = [] neutral_score = [] mixed_score = [] # for all results add the Sentiment label and sentiment scores to lists for res in detect_sent_response['ResultList']: sentiments.append(res['Sentiment']) print(res['SentimentScore']) print(type(res['SentimentScore'])) for key, val in res['SentimentScore'].items(): if key == "Positive": pos_score.append(val) if key == "Negative": neg_score.append(val) if key == "Neutral": neutral_score.append(val) if key == "Mixed": mixed_score.append(val) return sentiments, pos_score, neg_score, neutral_score, mixed_scoreAnda mungkin juga ingin melakukan operasi analisis lainnya, seperti deteksi entitas atau deteksi frasa kunci, pada teks yang terdeteksi. Anda dapat menulis fungsi untuk melakukan operasi analisis ini pada teks Anda, seperti yang Anda lakukan untuk operasi analisis sentimen yang sedang berlangsung.
-
Tulis kode untuk melakukan deteksi entitas pada teks Anda yang terdeteksi.
# detect entities def entity_detection(detected_text, lang): comprehend = boto3.client("comprehend") # convert and handle string here # do string handling detect_ent_response = comprehend.batch_detect_entities( TextList=detected_text, LanguageCode=lang) # To fold detected entities and entity types ents = [] types = [] # Get detected entities and types from the response returned by Comprehend for i in detect_ent_response['ResultList']: if len(i['Entities']) == 0: ents.append("N/A") types.append("N/A") else: sentence_ents = [] sentence_types = [] for entities in i['Entities']: sentence_ents.append(entities['Text']) sentence_types.append(entities['Type']) ents.append(sentence_ents) types.append(sentence_types) return ents, types -
Tulis kode untuk melakukan deteksi frasa kunci pada teks Anda yang terdeteksi.
# Detect key phrases def key_phrases_detection(detected_text, lang): comprehend = boto3.client("comprehend") key_phrases = [] detect_phrases_response = comprehend.batch_detect_key_phrases( TextList=detected_text, LanguageCode=lang) for i in detect_phrases_response['ResultList']: if len(i['KeyPhrases']) == 0: key_phrases.append("N/A") else: phrases = [] for phrase in i['KeyPhrases']: phrases.append(phrase['Text']) key_phrases.append(phrases) return key_phrasesAnda perlu membuat fungsi yang memanggil semua kode yang telah Anda buat sejauh ini. Fungsi ini akan menggunakan
DocumentProcessorkelas yang Anda buat diDetectAnalyzeFileAsync.pyfile Anda, dan kemudian menyimpan teks yang terdeteksi ke variabel untuk dimasukkan ke dalam tiga fungsi menggunakan Amazon Comprehend yang sebelumnya Anda tulis. Fungsi ini juga perlu membuat kerangka data Pandas, di mana teks yang terdeteksi dan data analisis akan dimasukkan. Terakhir, kerangka data Pandas akan disimpan sebagai file CSV. -
Tulis kode untuk memproses dokumen masukan Anda dengan Textract dan teruskan teks yang terdeteksi ke Comprehend.
def process_document(roleArn, bucket, document, region_name): # Create analyzer class from DocumentProcessor, create a topic and queue, use Textract to get text, # then delete topica and queue analyzer = DocumentProcessor(roleArn, bucket, document, region_name) analyzer.CreateTopicandQueue() extracted_text = analyzer.ProcessDocument() analyzer.DeleteTopicandQueue() # detect dominant language comprehend = boto3.client("comprehend") response = comprehend.detect_dominant_language(Text=str(extracted_text[:10])) print(response) print(type(response)) lang = "" for i in response['Languages']: lang = i['LanguageCode'] print(lang) # or you can enter language code below # lang = "en" print("Lines in detected text:" + str(len(extracted_text))) sliced_list = [] start = 0 end = 24 while end < len(extracted_text): sliced_list.append(extracted_text[start:end]) start += 25 end += 25 print(sliced_list) # Create lists to hold analytics data, these will be turned into columns all_sents = [] all_scores = [] all_ents = [] all_types = [] all_key_phrases = [] all_pos_ratings = [] all_neg_ratings = [] all_neutral_ratings = [] all_mixed_ratings = [] # For every slice, get sentiment analysis, entity detection and key phrases, append results to lists for slice in sliced_list: slice_labels, pos_ratings, neg_ratings, neutral_ratings, mixed_ratings = sentiment_analysis(slice, lang) all_sents.append(slice_labels) all_pos_ratings.append(pos_ratings) all_neg_ratings.append(neg_ratings) all_neutral_ratings.append(neutral_ratings) all_mixed_ratings.append(mixed_ratings) slice_ents, slice_types = entity_detection(slice, lang) all_ents.append(slice_ents) all_types.append(slice_types) key_phrases = key_phrases_detection(slice, lang) all_key_phrases.append(key_phrases) # List comprehension to flatten multiple lists into a single list extracted_text = [line for sublist in sliced_list for line in sublist] all_sents = [sent for sublist in all_sents for sent in sublist] all_scores = [score for sublist in all_scores for score in sublist] all_ents = [ents for sublist in all_ents for ents in sublist] all_types = [types for sublist in all_types for types in sublist] all_key_phrases = [kp for sublist in all_key_phrases for kp in sublist] all_mixed_ratings = [kp for sublist in all_mixed_ratings for kp in sublist] all_pos_ratings = [kp for sublist in all_pos_ratings for kp in sublist] all_neg_ratings = [kp for sublist in all_neg_ratings for kp in sublist] all_neutral_ratings = [kp for sublist in all_neutral_ratings for kp in sublist] print(len(extracted_text)) print(len(all_sents)) print(len(all_ents)) print(len(all_types)) print(len(all_key_phrases)) print("List of Recognized Entities:") # Create dataframe and save as CSV df = pd.DataFrame({'Sentences':extracted_text, 'Sentiment':all_sents, 'SentPosScore':all_pos_ratings, 'SentNegScore':all_neg_ratings, 'SentNeutralScore':all_neutral_ratings, 'SentMixedRatings':all_mixed_ratings, 'Entities':all_ents, 'EntityTypes':all_types,'KeyPhrases:':all_key_phrases}) analysis_results = str(document.replace(".","_") + "_" + "analysis" + ".csv") df.to_csv(analysis_results, index=False) print(df) print("Data written to file!") return extracted_text, analysis_results -
Tulis kode untuk memproses dokumen Anda dan unggah data yang dihasilkan ke S3. Dalam contoh kode di bawah ini, ganti nilai
roleArndengan ARN peran yang Anda konfigurasikan untuk digunakan dengan Amazon Textract. Ganti nilainyaregion_namedengan wilayah tempat akun Anda beroperasi. Terakhir, ganti nilainyabucket_namedengan nama bucket S3 yang berisi dokumen Anda.def main(): # Initialize S3 client and set RoleArn, region name, and bucket name s3 = boto3.client("s3") roleArn = '' region_name = '' bucket_name = '' # initialize global corpus full_corpus = [] # to hold all docs in bucket docs_list = [] # loop through docs in bucket, get names of all docs s3_resource = boto3.resource("s3") bucket = s3_resource.Bucket(bucket_name) for bucket_object in bucket.objects.all(): docs_list.append(bucket_object.key) print(docs_list) # For all the docs in the bucket, invoke document processing function, # add detected text to corpus of all text in batch docs, # and save CSV of comprehend analysis data and textract detected to S3 for i in docs_list: detected_text, analysis_results = process_document(roleArn, bucket_name, i, region_name) full_corpus.append(detected_text) print("Uploading file: {}".format(str(analysis_results))) name_of_file = str(analysis_results) s3.upload_file(name_of_file, bucket_name, name_of_file) # print the global corpus print(full_corpus) if __name__ == "__main__": main() -
Masukkan kode proses di bagian ke dalam file Python dan jalankan.
Anda telah berhasil mengekstrak teks menggunakan Amazon Ttract, mengirim teks ke Amazon Comprehend untuk analisis, dan kemudian menyimpan hasilnya dalam ember Amazon S3.