Amazon Comprehendで分析にかける3つの方法

記事タイトルとURLをコピーする

こんにちは、技術3課の峯です。

今回はAmazon Comrehendで分析を実行する3つの方法についてご紹介します。

Amazon Comprehendとは

そもそもAmazon Comprehendとはどういったサービスでしょうか?Amazon ComprehendはAWSが提供する自然言語処理サービスです。APIを叩くだけで簡単に言語・エンティティ・キーフレーズ・感情・構文を分析でき、またTopic Modelingを行うこともできます。分析にかけらる言語は、「言語」の分析を除いて、英語とスペイン語のみです(2018年8月現在)。ドキュメントを見ると、分析を行う処理の方法が3つ用意されています。

  • 1つの文章を分析する
  • 複数の文章をまとめて分析する
  • S3に保存した文章を分析する

用途・目的によりその3つの方法を使い分けます。今回は出力が少なくわかりやすい「言語」の分析を例とし、実際にPythonで分析を実行しながら、これら3つの分析方法について説明します。

1つの文章を分析する

1つの文章のみを分析する方法です。アプリケーションからインタラクティブに分析したい時などにこの方法を使います。単にDetect~というのを実行すればOKです。

実際にやってみる

Pythonでは以下のように実行します。


import boto3


comprehend = boto3.client("comprehend")

response = comprehend.detect_dominant_language(
    Text="This sentence is English"
)

ちなみに今回のレスポンスはこんな感じ。もちろん分析によってレスポンスの内容は異なります。


{
    'Languages': [
        {
            'LanguageCode': 'en', 
            'Score': 0.9878036379814148
            
        }
    ], 
    'ResponseMetadata': {略}
    
}

複数の文章をまとめて分析する

複数の文章をいっぺんに分析にかけることができます。いっぺんといっても文章ごとにDetect~が実行されており、結果をまとめたものがレスポンスで帰ってきているだけです。BatchDetect~というのを実行すればOKです。

実際にやってみる

Pythonではこのように実行します。


import boto3


comprehend = boto3.client("comprehend")

response = comprehend.batch_detect_dominant_language(
    TextList=[
        'This sentence is Engilish',
        'Esta oracion es espanola',
        'この文章は日本語です'
    ]
)

レスポンスはこんな感じ。ResultListにそれぞれの分析結果が入ります。今回はありませんがエラーが出た場合は、ErrorListに結果が入ります。


{
    'ResultList': [
        {
            'Languages': [
                {
                    'LanguageCode': 'en', 
                    'Score': 0.9865556955337524
                    
                }
            ], 
            'Index': 0
        
        }, 
        {
            'Languages': [
                {
                    'LanguageCode': 'es', 
                    'Score': 0.9486181735992432
                    
                }
            ], 
            'Index': 1
            
        }, 
        {
            'Languages': [
                {
                    'LanguageCode': 'ja', 
                    'Score': 1.0000483989715576
                    
                }
            ], 
            'Index': 2
        }
    ], 
    'ResponseMetadata': {略}, 
    'ErrorList': []
}

S3に保存した文章を分析する

テキストファイルをいくつもS3に保存している場合、この方法をつかいます。この方法で分析を行う場合、分析は「ジョブ」という形で実行されます。結果はジョブ作成時に指定するS3バケットへ保存されます。ちなみTopic Modelingはこの方法でしか実行できません。

実際にやってみる

Pythonで実行すると以下のようになります。


import boto3


comprehend = boto3.client("comprehend")

start_response = comprehend.start_dominant_language_detection_job(
    InputDataConfig={
        'S3Uri': 's3://text-bucket/text/',
        'InputFormat': 'ONE_DOC_PER_FILE'
    },
    OutputDataConfig={
        'S3Uri': 's3://result-bucket/result/'
    },
    DataAccessRoleArn='arn:aws:iam::xxxxxxxxxxxx:role/SampleRole',
    JobName='example-job01'
)

InputDataConfigで分析にかけたいテキストの場所とフォーマットを指定します。S3UriでS3バケットとプレフィックスを指定します。ココで指定したプレフィックスが付いているファイルはすべて分析にかけられます。InputFormatにはONE_DOC_PER_FILE(1つのファイルに1つの文章)かONE_DOC_PER_LINE(1行に1つの文章)かを指定します。OutputDataConfigS3Uriで結果ファイルを出力するS3バケットとプレフィックスを指定します。DataAccessRoleArnではジョブが利用するIAMロールのARNを指定します。このIAMロールにはインプットとなるS3バケットへのGetObject権限とListBucket権限、アウトプットするS3バケットのPutObject権限が必要となります。JobNameは指定しなくてもよいです。

ちなみにレスポンスはこんな感じ。ジョブステータスとジョブIDが返ってきます。ステータスはSUBMITTED|IN_PROGRESS|COMPLETED|FAILED|STOP_REQUESTED|STOPPEDがあります。STOP_REQUESTEDSTOPPEDがあることからもわかるようにジョブは止めることができますが、詳しい説明は今回は割愛します。


{
    'ResponseMetadata': {略}, 
    'JobStatus': 'SUBMITTED', 
    'JobId': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
}

このジョブIDからジョブの詳細・ステータスを確認することができます


describe_response = comprehend.describe_dominant_language_detection_job(
    JobId='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
)

レスポンスはこんな感じ


{
    'DominantLanguageDetectionJobProperties': {
        'InputDataConfig': {
            'S3Uri': 's3://text-bucket/text/', 
            'InputFormat': 'ONE_DOC_PER_FILE'
        }, 
        'DataAccessRoleArn': 'arn:aws:iam::xxxxxxxxxxxx:role/SampleRole', 
        'JobId': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 
        'JobStatus': 'COMPLETED', 
        'JobName': 'example-job01', 
        'SubmitTime': datetime.datetime(2018, 8, 3, 8, 59, 0, 318000, tzinfo=tzlocal()), 
        'OutputDataConfig': {
            'S3Uri': 's3://result-bucket/result/XXXXXXXXXXXX-LANGUAGE-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/output/output.tar.gz'
        }, 
        'EndTime': datetime.datetime(2018, 8, 3, 9, 7, 8, 515000, tzinfo=tzlocal())
    }, 
    'ResponseMetadata': {略}
}

結果のtar.gzをダウンロード&解凍し、中身を見るとこんな感じ。ファイルに結果が出力されます。今回は言語の分析でしたのでこのような分析結果の内容になっています。あたりまえですが分析によって、出力結果が異なります。


{"File": "sample02.txt", "Languages": [{"LanguageCode": "es", "Score": 0.8467387557029724}, {"LanguageCode": "en", "Score": 0.1470765918493271}, {"LanguageCode": "pt", "Score": 0.002519829897210002}]}
{"File": "sample01.txt", "Languages": [{"LanguageCode": "en", "Score": 0.9844604730606079}, {"LanguageCode": "de", "Score": 0.004355866927653551}, {"LanguageCode": "fr", "Score": 0.002686671447008848}]}

まとめ

このようにAmazon Transcribeではアプリケーションでインタラクティブに分析したいか、S3に保存されたものをバッチ処理のように分析したいかによって、実行方法を選ぶことができます。適切な実行方法を選ぶことでより便利にAmazon Comprehendを利用することができます。それではよいComprehendライフを。