AWS Comprehendを触ってみる

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回はAWSのComprehendを使ってみたので備忘録的に雑にまとめていきたいと思います。
Comprehendはコンソールから分析したい文章を直接入れることで分析することも出来ますし、テキストファイルを用意してそれを分析させる方法の2通りがあるようで、それぞれを試してみたいと思います。

# AWS Comprehendとは？

> 機械学習を使用して、テキストからインサイトや関係性を発見するための自然言語処理 (NLP) サービスです。

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

以下のような情報を取得することが出来ます。
※日本語は一部非対応となっているっぽいので、Comprehendで処理を回す前に日本語→英語にしてからの方がよさそうですね。
　そういう意味ではAWS Translateというサービスもありますし、それを使えばいいんだろうなと思います。こちらのサービスに関しては今後触れていきたいと思います。

 1. **Entities**
    - テキストから人名、組織、場所、日付などの固有表現を抽出します。
2. **Key Phrases**
    - テキストから重要なフレーズや単語を抽出します。
3. **Language**
    - テキストの言語を自動的に識別します。
4. **PII (Personally Identifiable Information)**
    - テキスト中の個人を特定できる情報（例: 名前、住所、電話番号）を検出します。
5. **Sentiment**
    - テキストの感情（ポジティブ、ネガティブ、中立、混在）を分析します。
6. **Targeted Sentiment**
    - 特定のエンティティに関連する感情を抽出します。
7. **Syntax**
    - テキストの文法構造を解析し、単語の品詞（名詞、動詞など）を特定します。

# 触ってみる
## Webコンソール上で分析する
コンソールでComprehendと検索して、以下の管理画面に遷移します。
左タブにあるReal-time analysisを選択します。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/2ba7189c-b781-fea5-f472-c757c6244000.png)
以下のような画面が表示されます。
![screencapture-ap-northeast-1-console-aws-amazon-comprehend-home-2024-07-22-07_51_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/505cdfa8-2994-ce47-510c-144b9620a1c6.png)
Input data欄に以下のような文章が挿入されていますが、ここに分析したいデータをコピペすることで文章を美分析することが出来ます。

```
Hello Zhang Wei, I am John. Your AnyCompany Financial Services, LLC credit card account 1111-0000-1111-0008 has a minimum payment of $24.53 that is due by July 31st. Based on your autopay settings, we will withdraw your payment on the due date from your bank account number XXXXXX1111 with the routing number XXXXX0000. 
Customer feedback for Sunshine Spa, 123 Main St, Anywhere. Send comments to Alice at sunspa@mail.com. 
I enjoyed visiting the spa. It was very comfortable but it was also very expensive. The amenities were ok but the service made the spa a great experience.

日本語訳
こんにちは、チャン・ウェイ、ジョンです。お客様のAnyCompany Financial Services, LLCクレジットカードアカウント1111-0000-1111-0008の最低支払額は24.53ドルで、支払期限は7月31日です。自動支払い設定に基づき、お客様の銀行口座番号XXXXXX1111、ルーティング番号XXXXX0000から支払期日にお支払いを引き落とさせていただきます。
サンシャイン・スパ（123 Main St, Anywhere）に対するお客様のご意見・ご感想。コメントはAlice（sunspa@mail.com）までお送りください。
スパに行くのが楽しかったです。とても快適でしたが、値段も高かったです。アメニティはまあまあでしたが、サービスがスパを素晴らしいものにしてくれました。
```
Insightの欄にInput dataを分析した結果が表示されます。
ここで先ほど示した情報を取得することが可能です。今回はスクショとしてKey phraseを貼っておきます。
ここを見てみるだけで、金融系・支払い関係の文章なのかな？という事がわかりますね。
![Untitled (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/2e8dd7cc-310e-fc46-ad7a-53356132fc7c.png)

## テキストファイルで分析する
S3を使いますので適当にS3バケットを作成します。
今回は以下のように設定して作成しました。特に専用の設定はしていません。デフォルトで問題ないかと思います。
![screencapture-ap-northeast-1-console-aws-amazon-s3-bucket-create-2024-07-22-07_27_51 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/a3f3b319-6567-053e-054d-de89a14110c1.png)
今回はqiita-ml-testというバケットを用意しました。
またここにanalysisというフォルダを切りました。
![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/d6479c0f-146e-6f82-3208-8ceb4b23aed6.png)

先程切ったフォルダにCNNから引用してきたテキストファイルを突っ込みます。実データは以下から文章を手入力で一生懸命コピペしました。
（ニュースの選定基準として、最近日本でもオーバーツーリズムが騒がれているので、です。）

https://edition.cnn.com/2024/07/27/travel/why-europe-has-become-an-epicenter-for-anti-tourism-protests-this-summer/index.html

![Untitled (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/da53c6d5-1aae-5657-3faf-0793eb580c86.png)

S3上で準備が完了しましたので、Comprehend側でジョブを作成していきます。
Comprehendの管理画面を開き、Analysis jobsタブを押下します。この画面でCreate jobボタンを押下します。
![Untitled (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/796ad02a-cb51-6636-3918-3a2cda5f8416.png)
以下のように設定を入れました。
ジョブの名前はtest-analysisとしました。
Analysis typeは先ほどと同様Key phraseを選択します。LanguageはEnglishとしています（CNNから引用している文章が英語の為）。
Input dataでS3に格納しているテキストデータを選択。Output dataで分析結果を出力してほしい場所を選択します。こちらは先ほど切ったS3バケット内のフォルダを選択しています。
Access Permissionsに関しては、ComprehendからS3に対してのアクセス設定が必要になるので、その関係の設定になります。今回は新規作成をしました。Name suffixはスクショでは空白となっていますが、この状態ではエラーではじかれてしまいましたので"AmazonComprehendServiceRole"と入力しています。
この状態でCreateを押下します。
![screencapture-ap-northeast-1-console-aws-amazon-comprehend-home-2024-07-28-08_55_59 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/ca34f134-e8af-c9a6-b986-86e45f722f4e.png)
作成が開始されると以下のような画面が表示されます。
StatusがIn progressとなっていることを確認します。
![Untitled (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/1be925e1-007f-2c36-2e48-42d23f0331ac.png)
ジョブが完了するまでしばらく時間がかかるので、このタイミングでIAM Roleが作成されていることを確認します。
以下が作成されていることを示すスクショと、アタッチされているポリシの名前となります。
ポリシのところに今回対象となっているS3バケットの名前が記載されていることが確認できますね。
![Untitled (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/c6cdef50-aada-4044-05fe-b378c097b8f6.png)
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::qiita-ml-test/*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": "s3:ListBucket",
            "Resource": [
                "arn:aws:s3:::qiita-ml-test"
            ],
            "Effect": "Allow"
        },
        {
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::qiita-ml-test/*",
            "Effect": "Allow"
        }
    ]
}
```
Comprehendのジョブ実行結果を改めて確認してみます。
StatusがCompleteとなっていれば正常終了したことを示します。
![Untitled (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/1314ce8e-3ac0-35f3-8b12-fe69a04e4506.png)
Completeとなっていることを確認した後S3バケットを見てみるとすると、先ほど指定したフォルダにデータが格納されいるフォルダが自動生成されています。
※access_checkというtempファイルはComprehendがS3にアクセスできるかを確認するために作成するテストファイルかと思います。

作成された.tar.gzファイルをPCにダウンロードします。
![Untitled (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/022cf094-46e8-26ea-fca9-6597cea76310.png)
![Untitled (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/23833bdb-7e01-1573-9889-5b55de24e15c.png)

outputというファイルがあり、これをテキストで開いてみると以下のようにデータが入っていることが確認出来ます。
JSON形式の様です。分析結果がここに表示されているのですね。恐らく文章の中でカギとなるフレーズがリストアップされているのかと思います。
![Untitled (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/3a0dd6f6-5cfc-aacc-e362-44089057ce59.png)

どういう分析結果なのかを確認するため、ChatGPTに雑にぶん投げてみます。
以下が返答結果なのですが、人工知能凄いですね。。。
もう人間は要らない気がしていきました。

以下回答
---

このJSON形式の結果は、AWS Comprehendが提供するキー・フレーズ抽出機能を使用して生成されたものです。このデータから得られる情報は以下の通りです：

### テキストの概要

テキストのタイトルは「Why Europe has become an epicenter for anti-tourism protests this summer」で、ヨーロッパが今夏反観光抗議の中心地になった理由について述べています。

### 抽出されたキー・フレーズ

AWS Comprehendはテキスト内の重要なフレーズを抽出し、それぞれのフレーズについて以下の情報を提供しています：

1. **BeginOffset**と**EndOffset**: フレーズの開始位置と終了位置
2. **Score**: フレーズの重要度を示すスコア（0から1の範囲）
3. **Text**: 抽出されたフレーズのテキスト

### 主な内容

以下は、抽出されたキー・フレーズから推測される主要な内容です：

1. **反観光抗議**:
    - 抗議活動が「CNN」、「Anti-tourism protests」、「demonstrations」などのキーワードで強調されています。
2. **地理的な場所**:
    - 抗議活動が行われている場所として「Europe」、「the Netherlands」、「Greece」、「Spain」、「Barcelona」、「Mallorca」などが挙げられています。
3. **社会的・経済的問題**:
    - 抗議の原因として「rising rents and house prices」、「home ownership」、「mass tourism」、「increasing costs」などのキーワードが示されています。
4. **個人名と役職**:
    - 特定の人物として「Carlos Ramirez」、「Jaume Collboni」、「Eduardo Santander」、「Sebastian Zenker」などの名前が挙げられています。
5. **観光客と地元住民の対立**:
    - 観光客の行動が「disrespectful behavior」、「bad tourist behavior」、「the resentment」などのキーワードで表現され、地元住民との対立が強調されています。
6. **対策と提案**:
    - 抗議活動に対する対策として「temporary entrance fee」、「tourist tax」、「de-marketing campaigns」などのキーワードが挙げられています。

### 分析結果から得られるインサイト

- **抗議活動の背景**: テキストは、観光客の急増が地元の住宅市場に悪影響を及ぼし、家賃の上昇や地元住民の生活費の増加につながっていることを示唆しています。
- **地域の焦点**: 抗議活動が特に強い地域として、バルセロナやマヨルカなどの観光地が挙げられています。
- **解決策の議論**: 一部の都市では、観光客に対する課税や入場料の導入を検討しており、それが観光客数の抑制に役立つかどうかが議論されています。

このデータは、観光業が地元のコミュニティに与える影響を理解し、それに対する対策を検討するための重要な情報を提供しています。