AWS Comprehend のリアル分析(Real-time analysis)と分析ジョブ(Analysis jobs)を試してみた

# はじめに
Amazon Comprehend で感情分析などが行えるということで試してみました。

# 料金
以下のページを参照してください。

https://aws.amazon.com/jp/comprehend/pricing/

無料利用枠もあるみたいです。

# 特徴
Amazon Comprehend でどういったことが行えるかは以下のページに記載されています。

https://aws.amazon.com/jp/comprehend/features/


# 分析手法
AWS マネジメントコンソールから行えるのは以下の２つになります。
- **リアルタイム分析 (Real-time analysis):** データを直接入力して分析する方法です。
- **分析ジョブ (Analysis jobs):** 事前に対象データを Amazon S3 へアップロードしておき、ジョブとして実行して分析する方法です。

![1-Comprehend02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/415a6ae8-bef8-df2d-ace1-df762541d925.png)


# 分析
それでは先ほど挙げた２つの分析を試したいと思います。

## リアルタイム分析
`AWS マネジメントコンソール > Amazon Comprehend > Launch Amazon Comprehend または Real-time analysis` をクリックします。

![1-Comprehend01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/c833d27a-42fa-f18e-7989-8ed300b7a45e.png)

![1-Comprehend03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/e9c73689-4464-522c-2f1e-a81a5ce48a85.png)

### Input data
*Analysis type* は **Built-in** を選択します。
もし、事前に *Customization* でオリジナルモデルを用意していた場合は **Custom** も選択できます。

また、今回は *Input text* に入力する内容はデフォルトで入力されている英文を Google 翻訳したものを利用します。

入力まで完了したら **[Analyze]** をクリックし分析します。

![1-Comprehend04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/ea3a5f35-85a6-2d40-7825-e549798e2ce9.png)

### Insight
分析が完了すると **Insight** に分析結果が表示されます。
Insight は以下の項目について分析を行います。

|項目|内容|サポート言語|
|---|---|---|
|Entities（エンティティ）    |ドキュメントで特定されたエンティティ（人、位置、場所など）のリストを返します。|サポートされているすべての言語|
|Key phrases（キーフレーズ）|ドキュメントに含まれるキーフレーズを抽出します。|サポートされているすべての言語|
|Language（主要言語）|ドキュメント内の主要言語を特定します。100 の言語を識別できます。|[こちら](https://docs.aws.amazon.com/ja_jp/comprehend/latest/dg/how-languages.html) を参照|
|PII（個人識別情報）||英語とスペイン語|
|Sentiment（感情）|ドキュメントの主要センチメントを判断します。センチメントは、ポジティブのこともあれば、中立やネガティブ、あるいはそれらが混在することもあります。|サポートされているすべての言語|
|Targeted sentiment（ターゲット感情）|ドキュメントに記載されている特定のエンティティのセンチメントを特定します。センチメントは、ポジティブのこともあれば、中立やネガティブ、あるいはそれらが混在することもあります。|英語|
|Syntax（構文分析）|ドキュメント内の各単語を解析し、その単語の品詞を特定します。|ドイツ語 (de)、英語 (en)、スペイン語 (es)、フランス語 (fr)、イタリア語 (it)、ポルトガル語 (pt)|


#### Entities（エンティティ）
人や場所、商品などの固有な名前をテキストだけでなく、日付や数量などの値についても識別して表します。

![1-Comprehend05-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/794d80c7-594f-eb12-3f0e-8479e43a3d64.png)
![1-Comprehend05-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/dd0742fa-9eef-32c7-b894-ac9015d007c3.png)

各エンティティには、エンティティタイプが正しく検出されたという信頼レベルを示すスコアも含まれます。
以下はエンティティタイプ一覧です。

|型|説明|
|---|---|
|COMMERCIAL_ITEM |ブランド製品|
|DATE|日付 (11/25/2017 など)、曜日 (Tuesday)、月 (May)、または時刻 (8:30 a.m.)|
|EVENT|フェスティバル、コンサート、選挙などのイベント|
|LOCATION|国、都市、湖、建物などの特定の場所|
|ORGANIZATION|政府、企業、宗教、スポーツチームなどの大規模な組織|
|OTHER|他のどのエンティティカテゴリにも当てはまらないエンティティ|
|PERSON|個人、グループ、ニックネーム、架空の人物|
|QUANTITY|通貨、パーセント、数値、バイト数などの数量|
|TITLE|映画、本、歌など、あらゆる作品や創作作品に付けられた正式名称|


#### Key phrases（キーフレーズ）
特定のことを説明する名詞句を含む文字列です。
各キーフレーズには、文字列が名詞句であるという信頼度を示すスコアが含まれます。
また、キーフレーズの検出はサポートする言語が何であっても実行できますが、ドキュメントの言語は統一する必要があります。

![1-Comprehend06-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/e6746a79-d5e5-d4dd-5ddd-166bd787584e.png)
![1-Comprehend06-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/44291a17-0f21-40fb-9bbb-5293f5574f4d.png)


#### Language（主要言語）
入力したテキストで用いられている主要言語を RFC 5646 の識別子を使用して識別します。
本などの長い文書に複数の言語が含まれている場合は、細かく分割して個々の部分に対して識別します。
その結果を集計して長い文書に含まれる各言語の割合を判断できます。

![1-Comprehend07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/198efb45-95e0-85a1-b204-3410725fce03.png)


#### PII（個人識別情報）
住所や銀行口座、電話番号といった個人を特定するために使用できる個人データをテキストで参照したものです。

![1-Comprehend08-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/8e36363c-2958-0631-ba2e-164719b3eaaa.png)

この項目は、まだ(2024/7時点)日本語に対応していないため以下には英語での結果を載せておきます。

![1-Comprehend08-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/3b2e6477-9b98-b4ab-a702-16622db886d4.png)


#### Sentiment（感情）
UTF-8 エンコードしたテキストドキュメントの内容の感情を判定できます。

![1-Comprehend09-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/340b1b91-0143-d17f-0685-38a567dd645b.png)

テキストに対する感情判定は以下です。

* **Newtral（ニュートラル）**- 肯定的と否定的のどちらでもない
* **Positive（肯定的）**- 全体的に肯定的
* **Negative（否定的）**- 全体的に否定的
* **Mixed（混在）**- 肯定的と否定的の両方


#### Targeted sentiment（ターゲット感情）
入力ドキュメント内で特定のエンティティに関連付けられた感情を把握できます。
「感情」との違いは出力データの粒度レベルになり、「感情分析」は全体的な感情で「ターゲット感情分析」はより具体的なエンティティに対しての感情判断を行います。

![1-Comprehend10-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/1a84f637-a8db-582b-701d-39486d2bca3b.png)

この項目もまだ(2024/7時点)日本語には非対応のため英語の結果を載せておきます。

![1-Comprehend10-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/30b11b41-b872-7164-a2ff-8f8e784b3d55.png)


#### Syntax（構文分析）
ドキュメント内の各単語の品詞（名刺、動詞、形容詞など）または構文関数を返します。

![1-Comprehend11-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/65f5bf9c-6aa6-f592-7e7d-4b80015e7e32.png)

この項目もまだ(2024/7時点)日本語には非対応のため英語の結果を載せておきます。

![1-Comprehend11-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/82dc49c4-fc25-b6ef-7933-39d8f5cf4344.png)


## 分析ジョブ(Analysis jobs)
Amazon S3 に保存されているドキュメントに対し、AWS Comprehend をジョブとして実行し分析する方法です。

#### 事前準備
まずは事前にドキュメントを保存するS3バケットの作成します。
作成したら以下のようにディレクトリを作成します。

![2-Comprehend07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/4e11d128-13a3-a513-40c3-90ac9ff4b583.png)

作成したら先ほど「リアル分析」で入力した内容をテキストに保存しアップロードします。

![2-Comprehend-s3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/be7e882a-51c0-4eb4-6d91-9a9f8c0e1a55.png)

以上で準備は完了なのでジョブの実行へと移ります。

#### ジョブの実行
`AWS マネジメントコンソール > Amazon Comprehend > Launch Amazon Comprehend または Real-time analysis` をクリックします。

![2-Comprehend01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/941c600d-3cc9-860f-db34-e7449d69452d.png)

まず、*Job settings* の設定を行います。
ここでの *Name* はジョブ名にあたるので任意の値を入力してください。
*Analysis type* は **Sentiment** を選択し、*Language* は **Japanese** を選択します。

![2-Comprehend02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/7e2fc4c3-f1c2-8a4b-022e-f4ad8fa2c834.png)

次の *Input data* では分析したいデータの入力元の設定を行います。
*S3 location* に先ほどアップロードした分析対象のデータのパス(今回は `s3://comprehend-test20240707/input` )を指定します。
また、ファイルごとに分析したいため *Input format* は **One document per file** を指定します。

*Output data* では分析結果データの出力先を指定します。
今回は *S3 location* に `s3://comprehend-test20240707/output` を指定します。

![2-Comprehend03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/e222036b-b4a8-0e74-23b6-db5ab929b648.png)

*Access permissions* では実行するための IAM ロール の設定を行います。
今回は事前に IAM ロールの用意はしてないため、新規で作成します。
*IAM role* は **Create an IAM role** を選択し、**Permissions to access** で **Input and Output S3 buckets** を選択します。
また、*Name suffix* には **test** を入力します。

この設定内容で *Input Data* と *Output Data* で指定したバケットへのアクセス権を持った **AmazonComprehendServiceRole-test** という IAM ロールが作成されます。

![2-Comprehend-IAM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/f1a0ca23-03e3-98a6-6ad8-22ac6fa68ffd.png)

以上の入力が完了したら **[Create job]** をクリックして完了です。

![2-Comprehend04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/e1f59300-38b1-2a10-397b-5625c94fdb8d.png)

*Analysis jobs* の画面でステータスの確認ができます。
**In progress** が **Compreted** となれば分析完了です。

![2-Comprehend05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/715c6eec-ba6c-86c1-3c62-5d41f4b69c25.png)

ジョブをクリックして詳細を確認します。
*Start* と *End* を確認すると、今回のジョブの実行に約６分かかったということがわかります。

![2-Comprehend06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/6468bed3-09f9-9f2f-a69a-615b6dfee63d.png)

それでは分析結果を確認したいと思います。
バケットの `output` ディレクトリ配下を見ると `output.tar.gz` というのがありました。

![2-Comprehend08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/a6182354-0f8c-9d68-9114-36a4084e02d1.png)

これをダウンロードし、確認したところ以下の内容が記載されていました。

```json:output
{"File": "sample.txt", "Sentiment": "NEUTRAL", "SentimentScore": {"Mixed": 8.555363820050843e-06, "Negative": 0.00015624803199898452, "Neutral": 0.9996223449707031, "Positive": 0.00021284697868395597}}
```

内容は **リアル分析** と同じですが、こっちの方が小数点以下の桁が多いためより詳細な値が確認できそうです。

## 片付け
今回は Amazon Comprehend で利用したジョブに対しては削除などはできませんでした。
おそらくジョブが存在していても課金対象ではないからだと思います。
そのため、S3バケットのみ削除すれば完了です。


# おわりに
今回はコンソールから操作できる **リアルタイム分析** と **分析ジョブ** を試してみました。
他にも *AWS CLI* や *AWS SDK* で利用できる **毒性検出** などもあるので試してみたいと思います。

#### 参考

https://docs.aws.amazon.com/ja_jp/comprehend/latest/dg/analysis-jobs.html

https://docs.aws.amazon.com/ja_jp/comprehend/latest/dg/realtime-console-analysis.html#realtime-analysis-console-sentiment

https://docs.aws.amazon.com/ja_jp/comprehend/latest/dg/how-entities.html

https://docs.aws.amazon.com/ja_jp/comprehend/latest/dg/detecting-cer-real-time.html

https://docs.aws.amazon.com/ja_jp/comprehend/latest/dg/supported-languages.html

https://docs.aws.amazon.com/ja_jp/comprehend/latest/dg/how-sentiment.html

https://aws.amazon.com/jp/blogs/news/amazon-comprehend-japanese/

https://aws.amazon.com/jp/about-aws/whats-new/2022/03/amazon-comprehend-entity-sentiment-analysis/

https://aws.amazon.com/jp/blogs/news/new-for-amazon-comprehend-toxicity-detection/