Amazon Comprehendを活用した自然言語解析

# はじめに
データ分析技術を学習する中で、自然言語解析（NLP）がさまざまな分野や現場で幅広く活用されていることを知りました。
顧客のフィードバック分析、ソーシャルメディアのトレンド調査、カスタマーサポートの自動化など、自然言語解析が持つ可能性は広い分野で活用され、業務効率化や意思決定の支援に大きく寄与しています。
AWSの数あるサービスの中でも自然言語処理で使用されているサービスがAmazon Comprehendです。
これは、AWSが提供する自然言語処理サービスで、キーフレーズ抽出や感情分析、エンティティ認識など、多様な解析機能を備えています。
今回の記事では、このAmazon Comprehendを用いて、基本的な特徴や使い方の理解を深めたいと思います。

# Amazon Comprehendとは
Amazon Comprehendは、AWSが提供するフルマネージドの自然言語処理（NLP）サービスです。
このサービスは、テキストデータから有益な情報を自動的に抽出し、顧客対応の改善やコンテンツの分類など、様々な場面で活用できます。

以下に、主要な機能とその料金体系について詳しく説明します。

## 自然言語処理
### 機能
- **キーフレーズ抽出**
 テキストから重要なフレーズや単語を自動的に抽出し、文章の主なトピックを特定します。

- **感情分析**
テキストがポジティブ、ネガティブ、ニュートラルのどの感情を表しているかを解析します。

- **エンティティ認識**
テキスト中の固有名詞（例えば、人物名、場所、組織名など）を特定し、これらを分類します。

- **言語識別**
複数の言語で書かれたテキストの言語を自動的に判別します。

- **文書分類**
テキストをあらかじめ定義されたカテゴリに分類します。

### 料金
- **料金**
 100文字を1ユニットとして計算、各リクエストにつき3ユニット (300文字) からの料金が発生し、以降は使用量に応じて課金されます。

## 個人識別情報 (PII)

### 機能
- **Detect PII API**
  ドキュメント内の個人識別情報 (PII) エンティティの位置を特定し、PIIが除去されたドキュメントを生成するために使用されます。

### 料金
- **料金**
100文字を1ユニットとして計算、各リクエストにつき3ユニット (300文字) からの料金が発生し、以降は使用量に応じて課金されます。

## カスタム Comprehend

### 機能
- **カスタム分類とエンティティ API**
カスタマイズした自然言語処理モデルをトレーニングすることで、特定のビジネスニーズに応じたテキストの分類やカスタムエンティティの抽出が可能です。

### 料金
- **非同期推論リクエスト**
100文字を1ユニットとして計算、各リクエストにつき3ユニット (300文字) からの料金が発生し、以降は使用量に応じて課金されます。
- **モデルトレーニング**
1時間に3 USD (秒単位で請求)
- **カスタムモデル管理**
1か月に0.50 USD
- **同期推論リクエスト**
エンドポイントのスループットに基づき課金

## トピックモデリング

### 機能
- **トピックモデリング**
  Amazon S3に保存された複数のドキュメントから、関連するトピックを抽出し、グループ化します。
  各ドキュメントがどのトピックに属するかを整理して表示します。

### 料金
- **料金**
最初の100 MBは均一料金、100 MBを超える部分は1 MBごとに課金されます。

## 信頼と安全 (新規)

### 機能
- **毒性検出 API**
  テキスト内の有害なコンテンツを検出します。
- **プロンプト安全性分類機能**
  大規模な言語モデルやアプリケーションに対して、安全でない入力プロンプトを検出します。

### 料金
- **料金**
100文字を1ユニットとして計算、各リクエストにつき3ユニット (300文字) からの料金が発生し、以降は使用量に応じて課金されます。

# 実際にやってみる
簡単に実行ができる「Real-time Analysis」と「Analysis job（job形式での分析）」を用いて分析を行い、使用方法を学んでいきたいと思います。

「Launch Amazon Comprehend」を押して、始めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/932dcab1-db9f-7f6d-f0e4-cf8fcbbf1f64.png)

### 1. Real-time Analysis
最初は、「Real-time Analysis」を使用し、分析を行います。

「Real-time Analysis」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/b546dfa8-7f20-b615-1116-a43718747c85.png)

「Analysis type」は、Built-inを選択します。
「Input text」にデフォルトの文字が入っているので、削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/5a8e0271-a7a5-4746-ade2-46a160b9b734.png)

削除したら、分析したいテキストを入力します。
今回は、オリンピックのインタビュー記事の一部を使用します。

> 男子66キロ級 阿部一二三選手 2大会連続金
柔道の男子66キロ級で2大会連続で金メダルを獲得した阿部一二三選手は「無事に2連覇を達成できてうれしく思う。
次は3連覇を目指してやっていくのでよろしくお願いします」と話しました。
そのうえで「日本選手団で戦えたことを誇りに思う。チームジャパンで日本を盛り上げて勇気を与えられたのではないかと思う。また4年後頑張りたい」と話しました。[1]

「Analyze」を押して、分析を開始します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/70a297e4-76b8-0089-e011-77c754d106bf.png)

「Entities」を押し、Entityの結果を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/dae8103e-302d-2438-e23d-a5e7a63c6a7d.png)

各単語のTypeとConfidenceの分析結果が確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/3110562d-f890-3750-e68c-e76798f21e4a.png)

「Sentiment」を押し、Sentimentの結果を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/33223d35-a233-f11b-7190-9c6548895093.png)

テキストのSentimentの分析結果が確認でき、テキストの内容がポジティブであることがわかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/32c71caf-0cfa-9bb9-976e-1f089c88ad26.png)

続いて、他のテキストだと結果に違いが出るのかを確認します。
比較対象として、台風に関する記事の一部を使用し、同様の手順で分析します。

>今日18日は関東甲信から九州は大気の状態が非常に不安定です。
関東甲信や九州を中心に発雷確率が高く、所々で雨や雷雨になりそうです。
局地的には滝のような非常に激しい雨が降るでしょう。
天気の急変にご注意ください。[2]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/80111ec4-7a2b-c298-c033-952d55771551.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/4a7de8c5-9561-53b6-287f-56bd8d7dd3b6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/79d05fe1-2722-d19e-eb1a-11b7e57f90de.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/fb2525e0-d46e-877e-4096-475ac6418587.png)

こちらの分析結果では、先ほどの結果とは異なり、テキスト内容に少しネガティブな要素があることを示しています。

このように「Real-time Analysis」を使用すると、コンソール上に分析したいテキストを入力するだけで簡単に分析することができます。

### 2. Analysis job（job形式での分析）
次に、「Analysis job」を使用し、分析を行います

テキストは、先程使用したオリンピックインタビュー記事を使用します。

最初にS3でバケットを作成します。（リージョンは任意の場所を選択してください）
「バケットを作成」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/89498235-2516-3a7c-e705-b3fd7b964910.png)


バケットタイプは、デフォルトで選択されている「汎用」を選択してください。
バケット名は任意のものを入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/9f607652-5590-e7f8-3201-2eb9954b2807.png)

その他の設定は、全てデフォルトで選択されているものを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/35860e68-05be-97c3-4d29-d1d61d5f2e4c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/e86b0a21-e1aa-8621-4f15-e55d85154413.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/1defb68f-74e5-8120-ab81-711acd57b5b1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/e4497b90-1c91-82d9-ada6-4843604da286.png)

「バケットを作成」を押して、バケットを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/5b68901b-6275-d371-6efa-e40e18c952e5.png)

バケットの作成が完了したら、分析したいテキストファイルをアップロードします。
今回は、先ほど使用したインタビュー記事を使用します。

> 男子66キロ級 阿部一二三選手 2大会連続金
柔道の男子66キロ級で2大会連続で金メダルを獲得した阿部一二三選手は「無事に2連覇を達成できてうれしく思う。
次は3連覇を目指してやっていくのでよろしくお願いします」と話しました。
そのうえで「日本選手団で戦えたことを誇りに思う。チームジャパンで日本を盛り上げて勇気を与えられたのではないかと思う。また4年後頑張りたい」と話しました。[1]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/8b1f5d97-36c9-7a5b-fa9c-6301c18f5ed1.png)

「アップロード」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/7f653886-7fe8-e0a2-88f3-16b27d5b21fb.png)

ComprehendのAnalys jobsの画面へ戻り「create job」をクリックし、jobを作成

![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/966bd8ec-6802-d695-089d-430f0aafa9cb.png)

「Name」に任意の文字を入力します。
感情分析を行うので、「Analysis type」は、Sentimentを選択します。
日本語のテキストを分析するので、「Language」は、Japaneseを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/4b3697b2-36bd-d7e8-9816-6c04858a1dce.png)

「Input data」は、先ほどアップロードしたバケットのファイルを選択します。
一行ごとの分析を行いたいので、「One document per line」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/f6234bb3-21e1-6ce9-da36-35798ffaa2b3.png)

「Output data」も先程作成したS3バケットを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/5034f932-3007-4a53-fc33-f9c3ee44c9a9.png)

「IAM role」は、Create an IAM roleを選択し、新規でIAMロールを作成します。
同じS3バケットに結果を保存したいので、「Permissions to access」は、Input and Output S3 bucketsを選択します。
「Name suffix」は、任意のものを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/5253ccc1-8fa1-0a4e-f9e0-f961c8cfc8b4.png)

「VPC settings」と「Tag」は、デフォルトで設定されているものを選択します。
「Create job」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/64b6e5f8-b0ed-b286-90f4-dba6d88ee26f.png)

実行が完了したら、S3のバケット画面に戻り、分析結果のフォルダを選択します。

![d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/f0e5e275-213b-3605-7d8e-6976f6710cce.jpeg)

「output/」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/503c340c-bddf-53ae-1ac1-34876b0c57bd.png)

「output_tar.gz」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/6ff78885-61da-f41a-6ec6-4cdd13243d20.png)

「ダウンロード」を選択して、分析結果のファイルをダウンロードします。

![c.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/e935005e-7d1b-99fc-7d93-98245c97cb52.jpeg)

ダウンロードしたファイルをテキストエディタで確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834207/72021346-2d2d-2e48-b463-f1900b07b355.png)

テキストの各行に対する、感情分析結果を確認できました。
1・4行目はニュートラル、2・3行目はポジティブであることを示しています。

このようにS3上のデータを取り扱うことで、他のサービスに渡しやすい形式で結果を出力することができます。

# 考察
「Real-time Analysis」と「Analysis Job」が、他のAWSサービスとどのように連携できるか考察します。
- **Real-time AnalysisとLambdaの連携**
今回の記事では、Amazon Comprehendの「Real-time Analysis」機能をコンソール上で実行しました。
しかし、コンソール上で実行する場合、テキストを手動で入力する必要があり、また出力された分析結果もコンソール上に表示されるため、分析結果を他のシステムやプロセスで活用することは難しいと思われます。
そのため、実際にサービスとして利用する場合には、APIを使用することが多くなると考えられます。
利用方法としては、AWS Lambdaと組み合わせることでのリアルタイム解析の提供が考えられます。
これにより、手動入力の手間を省き、分析結果を他のシステムやプロセスで即座に活用することが容易になります。

- **Analysis JobとAmazon S3の連携**
Real-time Analysisでは、データが入力されるたびに即座に解析結果が出力されますが、AnalysisJobはS3に解析結果を保存することができるため、大量のテキストデータの解析を行い、解析結果を集積するような用途に向いていると感じました。
利用方法としては、S3へのアップロードをトリガーに、LambdaからAnalysisJobのAPIを実行し、解析結果をS3に集積するようなシステムの構築が考えられます。
これにより、後から解析結果を再利用したり、長期間にわたってデータを保存・管理することが容易になります。

このように、他のAWSサービスと連携することで、さまざまなビジネスニーズに対応する柔軟なテキスト解析が可能になると考えられます。

# まとめ
今回の記事では、Amazon Comprehendを利用した自然言語解析の基本的な知識や使い方を学習しました。
Amazon Comprehendを使用することで、感情分析などを簡単に実行できることを実感しました。
今後は、Amazon Comprehendを他のAWSサービスと組み合わせることで、より一層効果的なデータ分析環境を構築し、業務における自然言語解析の活用の理解をさらに深めていきたいと考えています。
この記事が、自然言語解析に興味を持つ方にとって、Amazon Comprehendを使った自然言語解析（NLP）の入門として役立つと幸いです。

# 備考
「Analysis job」で作成したジョブを削除できないため、AWSカスタマーサポートに問い合わせたところ、現時点では削除機能が実装されていないとの回答を受けました。
（2024年8月21日）

# 引用
[1]"パリオリンピック 日本選手団が会見【詳しく】選手たちの声は　【柔道】", NHK NEWSWEB , 2024年8月14日,
https://www3.nhk.or.jp/news/html/20240814/k10014548571000.html ,(アクセス日：2024年8月29日)

[2]吉田友海 ,  "関東甲信や九州を中心に急な雷雨や滝のような雨に注意　明日も大気の状態が不安定" , 日本気象協会 tenki.jp , 2024年8月18日,
https://tenki.jp/forecaster/t_yoshida/2024/08/18/30142.html ,(アクセス日：2024年8月29日)

# 参考サイト
・Amazon Comprehend公式チュートリアル

https://docs.aws.amazon.com/comprehend/latest/dg/getting-started.html
 
・Amazon Comprehend の特徴

https://aws.amazon.com/jp/comprehend/features/
 
・Amazon Comprehend の料金

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