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 Dokumententexten 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 Ende-zu-Ende-Arbeitsablauf durch. Dieser Arbeitsablauf beinhaltet:
-
Verarbeitung zahlreicher Eingabedokumente mit Amazon Textract
-
Bereitstellung des extrahierten Textes an Amazon Comprehend zur Analyse
-
Speichern sowohl des analysierten Textes als auch der Analysedaten in einem Amazon Simple Storage Service (S3) -Bucket
Für dieses Tutorial verwenden Sie das AWS SDK
Voraussetzungen
Bevor Sie mit diesem Tutorial beginnen, müssen Sie Python installieren und die zum Einrichten des AWS Python-SDK
-
Amazon Textract für die asynchrone Verarbeitung konfiguriert. Dabei wurde die Amazon-Ressourcennummer (ARN) der IAM-Rolle, die Sie für die Verwendung mit Amazon Textract konfiguriert haben, herunterkopiert
-
Sie haben Ihrer IAM-Rolle Zugriff auf Amazon Comprehend gewährt
-
Wir haben einige Dokumente für Textzwecke ausgewählt extraction/analysis und das Dokument auf Amazon S3 hochgeladen. Stellen Sie sicher, dass die Dateien, die Sie für die Analyse auswählen, den von Amazon Textract unterstützten Formaten entsprechen.
Starten der asynchronen Dokumenttexterkennung
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 erledigen, während sie auf den Abschluss des Vorgangs wartet. In diesem Abschnitt wird gezeigt, wie Sie Ihre Dokumente aus einem Amazon S3-Bucket importieren und sie für den asynchronen Texterkennungsvorgang von Textract bereitstellen.
In diesem Tutorial wird davon ausgegangen, dass Sie Amazon S3 zum Speichern der Dateien verwenden, 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-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-Warteschlange zu erstellen.
Das folgende Codebeispiel erstellt eine
DocumentProcessorKlasse, die eine Verbindung zu den drei erforderlichen Diensten herstellt, und erstellt dann sowohl eine Amazon SQS-Warteschlange als auch ein Amazon SNS-Thema. Das Amazon SNS-Thema wird verwendet, um Informationen über den Auftragsabschlussstatus an eine Amazon SQS-Warteschlange weiterzugeben, die dann abgefragt wird, um den Abschlussstatus eines Auftrags abzurufen. Es gibt auch Methoden, um die Amazon SQS-Warteschlange und das Amazon SNS-Thema zu löschen, sobald der Auftrag 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 einen Amazon SQS nach dem Abschlussstatus des Auftrags
-
Rufen Sie die Ergebnisse des Auftrags ab, sobald die Verarbeitung abgeschlossen ist
Der folgende Code erstellt die
GetResultsMethodenProcessDocumentund, die den jeweils extrahierten Text aufrufenStartDocumentTextDetectionund abrufen.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 mit dem Namen
detectFileAsync.py.Sie verwenden diese Datei im nächsten Abschnitt, um die Erkennung von Text in Ihren Eingabedokumenten zu verwalten.
Bearbeitung Ihrer Dokumente und Senden des Textes an Comprehend
Ihre Anwendung verwendet die Klasse, die Sie im folgenden Abschnitt erstellt haben, um:
-
Dokumente aus Ihrem Amazon S3-Bucket lesen
-
Extrahieren Sie den Text in diesen Dokumenten
-
senden Sie den Text zur Analyse an Amazon Comprehend
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 auch eine Entitäts- und Schlüsselworterkennung für die Daten durchführen.
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 Analysevorgänge durchführen, z. B. die Erkennung von Entitäten oder Schlüsselphrasen. Sie können die Funktionen schreiben, um diese Analyseoperationen für Ihren Text durchzuführen, genau wie Sie es für die nachfolgende 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, um die Schlüsselworterkennung für Ihren erkannten Text durchzuführen.
# 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 zur Eingabe in die drei Funktionen mithilfe von Amazon Comprehend, 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 geben Sie den erkannten Text an Comprehend weiter.
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 betrieben wird. 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 Prozedurcode in dem Abschnitt in eine Python-Datei ein und führen Sie sie aus.
Sie haben erfolgreich Text mit Amazon Textract extrahiert, den Text zur Analyse an Amazon Comprehend gesendet und die Ergebnisse dann in einem Amazon S3-Bucket gespeichert.