AWSでAIサービスを使ってみる〜第8回comprehend編〜

##Comprehendとは
>自然言語処理を行うAIサービスです。主に①言語検出、②感情分析、③キーフレーズ抽出、④エンティティ認識、⑤構文解析の処理を行い情報を取得することができます。

今回は①の言語検出と②の感情分析を紹介させていただきます。


##言語の検出
初めに言語の検出を実行して行きます。

以下の文章の言語を検出します。


>私はこれから起こる出来事を楽しみにしています。


この文章の言語を検出して行きましょう。

検出するpythonファイルの概要
①ライブラリのインポート
②comprehend作成
③言語検出と表示

```comp_japanese.py
import boto3
import json

comprehend = boto3.client('comprehend', 'ap-northeast-1')
text = "私はこれから起こる出来事を楽しみにしています。"
result = comprehend.detect_dominant_language(Text=text)
print(json.dumps(result, indent=4))

```

comp_japanese.pyを実行します。

```
python comp_japanese.py
```

###実行結果

```json
{
    "Languages": [
        {
            "LanguageCode": "ja",
            "Score": 1.0
        }
    ],
    "ResponseMetadata": {
```

文章が日本語であるということを検出しています。

##感情の分析
次にconprehendを用いて感情の分析を行なって行きましょう。
文章は先ほどの文章で分析を行なって行きます。

感情分析を行うpythonファイルの概要
①ライブラリのインポート
②comprehend作成
③感情分析と表示

```comp_sentiment.py
import boto3
import json

comprehend = boto3.client('comprehend','ap-northeast-1')
text = "私はこれから起こる出来事を楽しみにしています。"
result = comprehend.detect_sentiment(Text=text, LanguageCode='ja')
print(json.dumps(result, indent=4))
```
comp_sentiment.pyを実行

```
python comp_sentiment.py
```

###実行結果

```json
{
    "Sentiment": "POSITIVE",
    "SentimentScore": {
        "Positive": 0.9983951449394226,
        "Negative": 0.0002934910589829087,
        "Neutral": 0.0013023141073063016,
        "Mixed": 9.037842573889066e-06
    },
```

文章が肯定的であるという結果になりました。
他にも文章によっては否定的(Negative),中立的(Neutral),混じった感情(Mixed)というスコアが与えられています。
この文章は肯定的というのは正しい結論と言える。

##CSVファイルの感情を分析してみる
最後にcsvファイルの文章の感情分析を行なって行きましょう。

以下のcsvファイルの感情分析を行なって行きます。

```sentiment.csv
その結果は素晴らしいですね。
その料金は高いです。
今回ご契約いただくのはお得ですね。
料金は高いですが、サービスが素晴らしいのですね。
```



csvファイルの感情分析を行うpythonファイルの概要
①ライブラリのインポート
②comprehendの作成
③csvファイルを開きfor文で1行ずつ分析
④原文と分析結果、スコアの表示


```comp_sentiment_csv.py
import boto3
import csv

comprehend = boto3.client('comprehend', 'ap-northeast-1')
with open('sentiment.csv', 'r', encoding='utf-8') as file:
  for row in csv.reader(file):
    result_comp = comprehend.detect_sentiment(
    Text=row[0], LanguageCode='ja')

    print(row[0])
    print(result_comp['Sentiment'])
    for key, value in result_comp['SentimentScore'].items():
      print(' {:10} {}'.format(key, value))
   print()
``` 

comp_sentiment_csv.pyを実行

```
python comp_sentiment_csv.py
```

###実行結果

```csv
その結果は素晴らしいですね。
POSITIVE
 Positive   0.9997738003730774
 Negative   3.3891989005496725e-05
 Neutral    0.0001706768525764346
 Mixed      2.1686157197109424e-05

その料金は高いです。
NEGATIVE
 Positive   0.11720975488424301
 Negative   0.8386894464492798
 Neutral    0.04406021162867546
 Mixed      4.061001163790934e-05

今回ご契約いただくのはお得ですね。
POSITIVE
 Positive   0.989083468914032
 Negative   0.002980673685669899
 Neutral    0.007930162362754345
 Mixed      5.5876575970614795e-06

料金は高いですが、品質が素晴らしいのですね。
MIXED
 Positive   0.20779219269752502
 Negative   8.993058872874826e-05
 Neutral    8.160676225088537e-05
 Mixed      0.7920363545417786

```

実行結果をみると各文章の肯定か否定かそれとも混じった感情かが結果として表示されてます。また各感情のスコアも表示されています。
(eは自然対数のため、3.3891989005496725e-05はpythonで0.0000338920となります)

自然対数の解説はこちら
[Pythonで数字がおかしくなる 3.209e-05って何？ 浮動小数点と解決方法](https://jibundex.com/python/okasii-suji)


##まとめ
今回はcomprehendを用いて文章から感情を分析してみました。comprehendは大手のtranscribeと組み合わせてコールセンターの顧客分析に用いられているようです。

##引用
[Pythonで数字がおかしくなる 3.209e-05って何？ 浮動小数点と解決方法](https://jibundex.com/python/okasii-suji)

##参考文献
この記事は以下の情報を参考にして執筆しました
[AWSでつくるAIプログラミング入門](https://www.amazon.co.jp/AWS%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B-AI%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E6%9D%BE%E6%B5%A6-%E5%81%A5%E4%B8%80%E9%83%8E/dp/4798059056)