こんにちは、技術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つの文章)かを指定します。OutputDataConfig
のS3Uri
で結果ファイルを出力するS3バケットとプレフィックスを指定します。DataAccessRoleArn
ではジョブが利用するIAMロールのARNを指定します。このIAMロールにはインプットとなるS3バケットへのGetObject権限とListBucket権限、アウトプットするS3バケットのPutObject権限が必要となります。JobName
は指定しなくてもよいです。
ちなみにレスポンスはこんな感じ。ジョブステータスとジョブIDが返ってきます。ステータスはSUBMITTED
|IN_PROGRESS
|COMPLETED
|FAILED
|STOP_REQUESTED
|STOPPED
があります。STOP_REQUESTED
とSTOPPED
があることからもわかるようにジョブは止めることができますが、詳しい説明は今回は割愛します。
{
'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ライフを。