Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Extrahieren und Senden von Text zur Analyse an AWS Comprehend
Mit Amazon Textract können Sie die Erkennung und Analyse von Dokumententext in Ihre Anwendungen integrieren. Mit Amazon Textract können Sie Text aus einer Vielzahl verschiedener Dokumenttypen extrahieren, indem Sie sowohl synchrone als auch asynchrone Dokumentenverarbeitung verwenden. Der extrahierte Text kann dann in einer Datei oder Datenbank gespeichert oder zur weiteren Verarbeitung an einen anderen AWS Dienst gesendet werden.
In diesem Tutorial führen Sie einen gemeinsamen End-to-End-Workflow durch. Dieser Arbeitsablauf beinhaltet:
-
Verarbeitung zahlreicher Eingabedokumente mit Amazon Textract
-
Bereitstellung des extrahierten Textes für Amazon Comprehend zur Analyse
-
Speichern sowohl des analysierten Textes als auch der Analysedaten in einem Amazon Simple Storage Service (S3) -Bucket
Sie verwenden das AWS SDK für Python
Voraussetzungen
Bevor Sie mit diesem Tutorial beginnen, müssen Sie Python installieren und die zur Einrichtung des AWS Python-SDK
-
Amazon Textract für asynchrone Verarbeitung konfiguriert, wobei die Amazon-Ressourcennummer (ARN) der IAM-Rolle, die Sie für die Verwendung mit Amazon Textract konfiguriert haben, kopiert wurde
-
Wählte einige Dokumente für Textzwecke aus extraction/analysis und lud das Dokument auf Amazon S3 hoch. Stellen Sie sicher, dass die Dateien, die Sie für die Analyse auswählen, den von Amazon Textract unterstützten Formaten entsprechen.
Die asynchrone Texterkennung für Dokumente starten
Sie können den Text aus Ihren Dokumenten extrahieren und den extrahierten Text dann mit einem Dienst wie Amazon Comprehend analysieren. Textract unterstützt die Extraktion von Text aus mehrseitigen Dokumenten durch asynchrone Operationen, die für die Verarbeitung großer, mehrseitiger Dokumente vorgesehen sind. Durch die asynchrone Verarbeitung einer PDF-Datei kann Ihre Anwendung andere Aufgaben ausführen, während sie auf den Abschluss des Vorgangs wartet. In diesem Abschnitt wird gezeigt, wie Sie Ihre Dokumente aus einem Amazon S3 S3-Bucket importieren und sie für die asynchrone Texterkennung von Textract bereitstellen.
In diesem Tutorial wird davon ausgegangen, dass Sie Amazon S3 verwenden, um die Dateien zu speichern, aus denen Sie Text extrahieren möchten. Sie beginnen mit der Erstellung einer Klasse und Funktionen, die den Text in Ihren Eingabedokumenten erkennen. Ihre Anwendung muss eine Verbindung zum Textract-Client sowie zu den Amazon SQS- und Amazon SNS SNS-Clients herstellen, um den Abschlussstatus des asynchronen Jobs zu überwachen.
-
Schreiben Sie zunächst den Code, um ein Amazon SNS-Thema und eine Amazon SQS SQS-Warteschlange zu erstellen.
Das folgende Codebeispiel erstellt eine
DocumentProcessorKlasse, die eine Verbindung zu den drei erforderlichen Diensten herstellt und dann sowohl eine Amazon SQS SQS-Warteschlange als auch ein Amazon SNS SNS-Thema erstellt. Das Amazon SNS SNS-Thema wird verwendet, um Informationen über den Status der Auftragsabwicklung an eine Amazon SQS SQS-Warteschlange weiterzugeben, die dann abgefragt wird, um den Abschlussstatus eines Auftrags zu ermitteln. Es gibt auch Methoden, um die Amazon SQS SQS-Warteschlange und das Amazon SNS SNS-Thema zu löschen, sobald der Job abgeschlossen ist und die Ressourcen nicht mehr benötigt werden.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) -
Schreiben Sie den Code, um den
StartDocumentTextDetectionVorgang aufzurufen und die Ergebnisse des Vorgangs abzurufen.Die
DocumentProcessorKlasse benötigt außerdem Methoden für:-
Rufen Sie die
StartDocumentTextDetectionOperation auf -
Fragen Sie ein Amazon SQS nach dem Status der Auftragsabwicklung ab
-
Rufen Sie die Ergebnisse des Jobs ab, sobald die Verarbeitung abgeschlossen ist
Der folgende Code erstellt die
GetResultsMethodenProcessDocumentund, die den extrahierten Text aufrufenStartDocumentTextDetection, bzw. ruft ab.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 -
-
Speichern Sie den obigen Code in einer Datei namens
detectFileAsync.py.Sie verwenden diese Datei im nächsten Abschnitt, um die Erkennung von Text in Ihren Eingabedokumenten zu handhaben.
Bearbeitung Ihrer Dokumente und Versand des Textes zum Comprehend
Ihre Anwendung verwendet die Klasse, die Sie im nächsten Abschnitt erstellt haben, um:
-
Dokumente aus Ihrem Amazon S3 S3-Bucket lesen
-
extrahieren Sie den Text in diesen Dokumenten
-
den Text zur Analyse an Amazon Comprehend senden
Sie erstellen zunächst einige Funktionen, die Amazon Comprehend verwenden, um den in Ihren Eingabedokumenten erkannten Text zu analysieren. Eine gängige Art der Textanalyse ist die Stimmungsanalyse, die darauf abzielt, die Wirkung einer Aussage zu erfassen (unabhängig davon, ob sie positiv, negativ oder neutral ist). Sie können die Daten auch zur Erkennung von Entitäten und Schlüsselwörtern verwenden.
Der folgende Code nimmt den erkannten Text auf und ruft den BatchDetectSentiment Vorgang von Amazon Comprehend auf, um eine Stimmungsanalyse durchzuführen.
-
Schreiben Sie den Code, um eine Stimmungsanalyse für Ihren erkannten Text durchzuführen.
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_scoreMöglicherweise möchten Sie für Ihren erkannten Text auch andere Analyseoperationen durchführen, z. B. die Erkennung von Entitäten oder Schlüsselphrasen. Sie können die Funktionen schreiben, mit denen Sie diese Analyseoperationen an Ihrem Text ausführen, genau wie Sie es bei der nachfolgenden Stimmungsanalyse getan haben.
-
Schreiben Sie den Code, um die Entitätserkennung für Ihren erkannten Text durchzuführen.
# 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 -
Schreiben Sie den Code zur Erkennung von Schlüsselwörtern für Ihren erkannten Text.
# 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_phrasesSie müssen eine Funktion erstellen, die den gesamten Code aufruft, den Sie bisher erstellt haben. Die Funktion verwendet die
DocumentProcessorKlasse, die Sie in IhrerDetectAnalyzeFileAsync.pyDatei erstellt haben, und speichert dann den erkannten Text in einer Variablen für die Eingabe in die drei Funktionen, die Amazon Comprehend verwenden, die Sie zuvor geschrieben haben. Die Funktion muss außerdem einen Pandas-Datenrahmen erstellen, in den der erkannte Text und die Analysedaten eingefügt werden. Schließlich wird der Pandas-Datenrahmen als CSV-Datei gespeichert. -
Schreiben Sie den Code, um Ihre Eingabedokumente mit Textract zu verarbeiten, und übergeben Sie den erkannten Text an 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 -
Schreiben Sie den Code, um Ihre Dokumente zu verarbeiten, und laden Sie die resultierenden Daten auf S3 hoch. Ersetzen Sie im folgenden Codebeispiel den Wert von
roleArndurch den ARN der Rolle, die Sie für die Verwendung mit Amazon Textract konfiguriert haben. Ersetzen Sie den Wert vonregion_namedurch die Region, in der Ihr Konto tätig ist. Ersetzen Sie abschließend den Wertbucket_namedurch den Namen des S3-Buckets, der Ihre Dokumente enthält.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() -
Fügen Sie den weiteren Code in dem Abschnitt in eine Python-Datei ein und führen Sie ihn aus.
Sie haben erfolgreich Text mit Amazon Textract extrahiert, den Text zur Analyse an Amazon Comprehend gesendet und die Ergebnisse anschließend in einem Amazon S3 S3-Bucket gespeichert.