Amazon Comprehend(Entity recognition)を試してみた

# 背景・目的
最近、ドキュメントからテキストマイニングからインサイトを得る事に興味があります。
そこで、Amazon Comprehend（以降、Comprehendと言います。）を使用して実践してみようと思います。

# まとめ
- Comprehendは、自然言語処理を使用してドキュメントの内容に関するインサイトを抽出することが可能です。
    - エンティティ、キーフレーズ、言語、感情、その他の共通要素を認識することでインサイトを得ることが可能です。
- 2023/11/04時点でComprehendが提供されているリージョンは下記のとおりです。
    - アジアパシフィック (ムンバイ)
    - 欧州 (ロンドン)
    - 欧州 (アイルランド)
    - アジアパシフィック (ソウル)
    - アジアパシフィック (東京)
    - カナダ (中部)
    - アジアパシフィック (シンガポール)
    - アジアパシフィック (シドニー)
    - 欧州 (フランクフルト)
    - 米国東部 (バージニア北部)
    - 米国東部 (オハイオ)
    - 米国西部 (オレゴン)

# 概要
まずは、Comprehendが、どのようなものかを調べます。
## Amazon Comprehend とは何ですか?
[Amazon Comprehend とは何ですか?](https://docs.aws.amazon.com/ja_jp/comprehend/latest/dg/what-is.html)をもとに調べてみます。

>Amazon Comprehend は自然言語処理 (NLP) を使用してドキュメントの内容に関する洞察を抽出します。ドキュメント内のエンティティ、キーフレーズ、言語、感情、その他の共通要素を認識することでインサイトを作り上げます。Amazon Comprehend を使用すると、ドキュメントの構造を理解した上で新しい製品を作成できます。たとえば、Amazon Comprehend を使用すると、ソーシャルネットワーキングフィードで製品に関する言及を検索したり、ドキュメントリポジトリ全体をスキャンしてキーフレーズを探したりできます。

- 自然言語処理を使用してドキュメントの内容に関するインサイトを抽出することが可能です。
    - エンティティ、キーフレーズ、言語、感情、その他の共通要素を認識することでインサイトを作る

> Amazon Comprehend のドキュメント分析機能には、Amazon Comprehend コンソールまたは Amazon Comprehend API を使用してアクセスできます。小さなワークロードではリアルタイム分析を実行することも、大きなドキュメントセットの非同期分析ジョブを開始することもできます。Amazon Comprehend が提供するトレーニング済みのモデルを使用することも、独自のカスタムモデルをトレーニングして分類やエンティティ認識を行うこともできます。

- リアルタイム分析、非同期分析ジョブにも利用できます。

> Amazon Comprehend は、トレーニング済みのモデルの品質を継続的に改善するために、お客様のコンテンツを保存する場合があります。詳細については、Amazon Comprehend のよくある質問をご覧ください。

- Comprehendは、利用者のコンテンツを保存する場合があります。
- どうやら、オプトアウトも可能なようです。下記に記載します。

> Amazon Comprehend のすべての機能では、UTF-8 テキストドキュメントを入力として受け入れます。さらに、カスタム分類とカスタムエンティティ認識では、画像ファイル、PDF ファイル、Word ファイルを入力として受け入れます。

- UTF-8で扱います。
- カスタム分類とカスタムエンティティ分類では、画像、PDF、Wordを入力で受けることが可能とのことです。

> Amazon Comprehend は、特定の機能に応じて、さまざまな言語のドキュメントを調べて分析できます。詳細については、「Amazon Comprehend でサポートされている言語」を参照してください。Amazon Comprehend 主要言語 の機能では、ドキュメントを調べ、はるかに幅広い言語の主要言語を特定できます。


- 2023/11/4時点でサポートされる言語は、13の言語に対応しています。詳細は、[Amazon Comprehend でサポートされている言語](https://docs.aws.amazon.com/ja_jp/comprehend/latest/dg/supported-languages.html)をご確認ください

## データプライバシー
上記にも記載しましたが、Comprehendは利用者のコンテンツを保存する場合があるとの事でした。詳細を確認してみます。
[データプライバシー](https://aws.amazon.com/jp/comprehend/faqs/)を元に整理します。

> Q: Amazon Comprehend で処理されたテキスト入力は保存されますか ? また、AWS でどのように使用されますか?

> Amazon Comprehend では、サービスの提供と保守、および Amazon Comprehend やその他の Amazon 機械学習/人工知能技術の品質向上のためにのみ、サービスにより処理されたテキスト入力を保存して使用することがあります。Amazon Comprehend Medical についてはこの対象外です。お客様のコンテンツを使用することは、関連テクノロジーの開発やトレーニングなど、Amazon Comprehend のお客様のエクスペリエンスを継続的に改善するために必要です。AWS では、お客様のコンテンツに含まれる個人情報を使用して、お客様やお客様のエンドユーザーを製品、サービス、またはマーケティングのターゲットにすることはありません。AWS の最優先事項は、お客様からの信頼、プライバシー、およびお客様のコンテンツのセキュリティです。また、AWS では、転送中や保管時の暗号化など、お客様のコンテンツへの不正アクセスやお客様のコンテンツの公開を防ぐように設計された、高度で信頼できる技術的および物理的な規制を行っています。さらに、AWS がデータを使用する場合はお客様との契約を確実に遵守します。詳細については、https://aws.amazon.com/compliance/data-privacy-faq/ をご参照ください。AWS Organizations オプトアウトポリシーを使うことで、Amazon Comprehend や他の Amazon 機械学習/人工知能技術の品質の向上を目的として、お客様のコンテンツが保存されないようにオプトアウトすることができます。オプトアウトする方法の詳細については、Managing AI services opt-out policy をご参照ください。

- Comprehendは、下記のためにサービスにより処されたテキスト入力を保存して使用することがあります。
    - サービスの提供
    - 保守
    - 機械学習/人工知能技術の品質向上
- Comprehend Mediacal は対象外とのことです。


## Managing AI services opt-out policy
- [AI services opt-out policies](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_ai-opt-out.html)を元に整理します。
- AIサービスでは、サービス改善のためのコンテンツが保存、使用されることをオプトアウトできる
    - AWS artificial intelligence (AI) services
    - Amazon Rekognition
    - Amazon CodeWhisperer
    - Amazon Transcribe
    - Contact Lens for Amazon Connect


## Amazon Comprehend insights
> Amazon Comprehend は、事前にトレーニングされたモデルを使用して 1 つまたは複数のドキュメントを検査および分析し、それに関する洞察を収集します。このモデルは大量のテキストで継続的にトレーニングされるため、トレーニングデータを提供する必要はありません。

- 事前にトレーニングされたモデルを使用して、1つor 複数のドキュメントを検査しインサイトを収集します。
- 以下のタイプのインサイトタイプは下記のとおりです。

|タイプ|説明
|:--|:--|
|エンティティ| ドキュメントに含まれる人物、場所、アイテム、場所の名前を指します。|
|キーフレーズ| 文書に表示されるフレーズ。たとえば、バスケットボールの試合に関するドキュメントでは、チームの名前、会場の名前、最終スコアが返される場合があります。|
| 個人識別情報 (PII) |住所、銀行口座番号、電話番号など、個人を特定できる個人データ。|
|言語|  文書の主要言語|
|センチメント|  文書の主要なセンチメント。肯定的、中立的、否定的、または混合的である可能性があります。|
|ターゲットセンチメント| 文書内の特定のエンティティに関連するセンチメント.各エンティティの感情は、ポジティブ、ネガティブ、ニュートラル、または混合のどちらでもかまいません。|
|構文|文書内の各単語の品詞|

## Amazon Comprehend Custom
> Amazon Comprehend を特定の要件に合わせてカスタマイズできます。Amazon Comprehend Custom は、自動機械学習 (AutoML) を使用して、既存のデータを使用して、お客様に代わってカスタマイズされた NLP モデルを構築します。

- Comprehendはカスタムが可能です。
- AutoMLを使用して、既存データを使用してカスタムされたNLPモデルを構築する。

## Flywheels
>フライホイールを使用すると、時間の経過に伴うカスタムモデルバージョンのトレーニングと管理のプロセスを簡素化できます。フライホイールは、モデルの新しいバージョンのトレーニングと評価に関連するタスクを調整するのに役立ちます。フライホイールは、カスタム分類とカスタムエンティティ認識のためのプレーンテキストのカスタムモデルをサポートします。詳細については、「フライホイール」を参照してください。

- Flywheelsにより、カスタムモデルバージョンのトレーニングと管理プロセスをシンプルに出来ます。

## Document clustering (topic modeling)
> Amazon Comprehend を使用して大量のドキュメントを調べ、その中の類似キーワードに基づいて整理することもできます。ドキュメントクラスタリング (トピックモデリング) は、大量のドキュメントを単語の出現頻度に基づいて類似したトピックまたはクラスターに整理するのに便利です。詳細については、「トピックのモデリング」を参照してください。


- 大量ドキュメントを探索し、類似キーワードに基づいて整理することができる。
### トピックのモデリング
[トピックのモデリング](https://docs.aws.amazon.com/ja_jp/comprehend/latest/dg/topic-modeling.html)を元に整理します。

- [Latent Dirichlet Allocation(LDA)](https://www.jmlr.org/papers/volume3/blei03a/blei03a.pdf)を使用して、一連のドキュメント内のトピックを決めます。
- 各ドキュメントを調べて、単語の文脈と意味を判断します。文書セット全体で同じ文脈に属することが多い単語の集合がトピックを構成します。


## Benefits
> 強力な自然言語処理をアプリに統合 — Amazon Comprehend は、強力で正確な自然言語処理をシンプルな API で利用できるようにすることで、アプリケーションにテキスト分析機能を組み込む際の複雑さを解消します。Amazon Comprehend が生成するインサイトを活用するのに、テキスト分析の専門知識は必要ありません。

- テキスト分析は不要

> ディープラーニングベースの自然言語処理 — Amazon Comprehend はディープラーニングテクノロジーを使用してテキストを正確に分析します。精度を向上させるために、複数のドメインにわたって新しいデータを使用して常にモデルがトレーニングされます。

- Deep Learningを使用して分析する
- 精度を向上させるため、常にモデルがトレーニングされる

> スケーラブルな自然言語処理 — Amazon Comprehend では、何百万ものドキュメントを分析して、そこに含まれるインサイトを発見できます。

- 何百万ものドキュメントを分析する。

> AWS他のサービスとの統合 — Amazon Comprehend は、Amazon S3、、AWSAWS KMSなどの他のサービスとシームレスに連携するように設計されています。AWS LambdaAmazon S3 にドキュメントを保存したり、Kinesis Data Firehose を使用してリアルタイムデータを分析したりできます。AWS Identity and Access Management(IAM) Support により、Amazon Comprehend オペレーションへのアクセスを簡単に安全に制御できます。IAM を使用すると、ユーザーとグループを作成して管理し、開発者とエンドユーザーに適切なアクセス権を付与できます。

- S3、KMS、Lambda、KDFなどとシーレスに連携できる。

> 出力結果とボリュームデータの暗号化 — Amazon S3 ではすでに入力ドキュメントを暗号化できますが、Amazon Comprehend ではこれをさらに拡張しています。独自の KMS キーを使用することで、ジョブの出力結果と、分析ジョブを処理するコンピュートインスタンスにアタッチされたストレージボリューム上のデータを暗号化できます。その結果、セキュリティが大幅に強化されます。

- KMSキーを使用して暗号化できる。

> 低コスト — Amazon Comprehend では、最低料金や前払いの義務はありません。分析したドキュメントとトレーニングしたカスタムモデルに対して料金を支払います。

- 安価

## Entity
実践で、使用するentity recognitionの結果で返される属性の意味を下記に貼り付けます。
詳細は、[AWSのドキュメント](https://docs.aws.amazon.com/ja_jp/comprehend/latest/APIReference/API_Entity.html)をご確認ください。

|属性|説明|型|
|:--|:--|:--|
| BeginOffset |ソース テキストの先頭からエンティティの最初の文字までの 0 から始まるオフセット。テキスト以外の入力の場合、このフィールドは空です。|Integer|
|BlockReferences|このエンティティの各ブロックへの参照。プレーンテキスト入力の場合、このフィールドは空です。|
|EndOffset|ソース テキストの先頭からエンティティ内の最後の文字までの 0 から始まるオフセット。テキスト以外の入力の場合、このフィールドは空です。|Integer|
|Score|Amazon Comprehend が検出の精度に対して持つ信頼のレベル。|Float|
|Text|エンティティのテキスト。<BR>長さの制約として最小値は1である。|String|
|Type|エンティティのタイプ。組み込みモデルを使用したエンティティ検出の場合、このフィールドには、以下にリストされている標準エンティティ タイプのいずれかが含まれます。カスタム エンティティ検出の場合、このフィールドには、カスタム モデルのトレーニング時に指定したエンティティ タイプの 1 つが含まれます。<BR><BR>・PERSON<BR>・LOCATION<BR>・ORGANIZATION<BR>・COMMERCIAL_ITEM<BR>・EVENT<BR>・DATE<BR>・QUANTITY<BR>・TITLE<BR>・OTHER|String|


# 実践
## 事前準備
### S3バケットの作成
1. 事前に出力の用のS3バケットを用意します。

## Getting started with Amazon Comprehend （Entity recognition）
[Getting started with Amazon Comprehend](https://docs.aws.amazon.com/comprehend/latest/dg/getting-started.html)を元に試します。


### インプット用のデータを確認
1. 今回サンプルで利用するインプットのデータセットは、AWSで予め用意されているものを利用します。中身を確認してみます。物理学の説明のようです。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/eb3121c1-eae9-c34b-b6ab-3e2c230ae885.png)


    ```
    Physics (from Ancient Greek: φυσική (ἐπιστήμη), translit. phusikḗ (epistḗmē), lit. 'knowledge of nature', from φύσις phúsis "nature") is the natural science that involves the study of matter and its motion and behavior through space and time, along with related concepts such as energy and force. One of the most fundamental scientific disciplines, the main goal of physics is to understand how the universe behaves.Physics is one of the oldest academic disciplines, perhaps the oldest through its inclusion of astronomy. Over the last two millennia, physics was a part of natural philosophy along with chemistry, biology, and certain branches of mathematics, but during the scientific revolution in the 17th century, the natural sciences emerged as unique research programs in their own right. Physics intersects with many interdisciplinary areas of research, such as biophysics and quantum chemistry, and the boundaries of physics are not rigidly defined. New ideas in physics often explain the fundamental mechanisms of other sciences while opening new avenues of research in areas such as mathematics and philosophy.Physics also makes significant contributions through advances in new technologies that arise from theoretical breakthroughs. For example, advances in the understanding of electromagnetism or nuclear physics led directly to the development of new products that have dramatically transformed modern-day society, such as television, computers, domestic appliances, and nuclear weapons; advances in thermodynamics led to the development of industrialization, and advances in mechanics inspired the development of calculus.
    ```

### チュートリアル

1. ナビゲーションペインで「Analytics jobs」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/945dc1e2-6848-e199-a895-bf30031aa949.png" width=250>
1. 「Create job」をクリックします。
1. 下記を入力し、「Create job」をクリックします。
    - Job settings
        - Name:任意（ここではexample-comprehend-jobとしました。）
        - Analytics type:Entity recognition
        - Language:English（※サンプルは、Englishのみ提供されているため選択しています。）
    - Input data
        - Data Source:Example documents
    - Output data
        - S3 location:任意のバケットを選択します。
    - Access permissions
        - IAM role ： Create an IAM roleを選択
        - Name suffix:任意になにか埋めます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8049715e-0397-874d-6dd8-57249a7838fd.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ee78176e-15b0-c323-327b-d6c0ab3ff9b2.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/dbeefe40-00fb-21bf-180e-8ff80475aaf0.png)

1. 作成されました。ステータスは「In progress」になっています。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b493ce2b-9946-4b5b-5407-05c04774936b.png)
1. 「Compreted」に変わりました。おおよそ10分弱程度でした。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9c82464a-cad6-baca-886b-d2b3901f53e7.png)

1. ジョブ名をクリックしてみます。
1. Outputの「Output data location」のS3に出力されたgzをダウンロードしてみます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/770839d7-f203-8019-8386-08443e35bd35.png)

1. 最初の1行を確認してみます。
    - last two millenniaと17th centuryは、DATEとして認識されていました。
        - この内、last two millenniaは信頼スコアは0.59、17th centuryは、0.99と違いがあることがわかります。 
    ```
    $ cat output | jq | head -41
    {
      "Entities": [
        {
          "BeginOffset": 14,
          "EndOffset": 27,
          "Score": 0.5008566995469727,
          "Text": "Ancient Greek",
          "Type": "OTHER"
        },
        {
          "BeginOffset": 297,
          "EndOffset": 300,
          "Score": 0.9807694033373449,
          "Text": "One",
          "Type": "QUANTITY"
        },
        {
          "BeginOffset": 427,
          "EndOffset": 430,
          "Score": 0.9462010642298533,
          "Text": "one",
          "Type": "QUANTITY"
        },
        {
          "BeginOffset": 531,
          "EndOffset": 549,
          "Score": 0.5929219888919132,
          "Text": "last two millennia",
          "Type": "DATE"
        },
        {
          "BeginOffset": 704,
          "EndOffset": 716,
          "Score": 0.9922381958073946,
          "Text": "17th century",
          "Type": "DATE"
        }
      ],
      "File": "Sample.txt",
      "Line": 0
    }
    $
    ```

# 考察
今回は、ComprehendのEntity recognitionを使用して文章内のエンティティを検出してみました。
この他に、感情分析や、PIIの検出などもできるので試してみたいと思います。

# 参考
https://docs.aws.amazon.com/ja_jp/comprehend/latest/dg/what-is.html

https://docs.aws.amazon.com/ja_jp/comprehend/latest/dg/getting-started.html

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

https://docs.aws.amazon.com/ja_jp/comprehend/latest/APIReference/API_Entity.html