AzureでTextの感情分析（日本語）

# 概要
Azure Cognitive Service for Language の感情分析を日本語でやってみたい。

# 前提条件
- Azure サブスクリプション 
- Python 3.x

# 準備
Azure サブスクリプションを用意したら、Azure portal で言語リソースを作成して、キーとエンドポイントを取得します。 デプロイされたら、 [リソースに移動] をクリックします。対象のアプリケーションを API に接続するには、作成したリソースのキーとエンドポイントが必要です。 以下で示すコードに、自分のキーとエンドポイントを貼り付けます。※分析機能を使うには、Standard (S) 価格レベルの言語リソースが必要らしいです。

# 日本語の準備
```
今日は人生で一番の日でした。君も僕と一緒に入れたらよかったのに。
飯とサービスがダメダメでした。でも、コンシェルジュは良かった。
```

# Azure ML Notebook
ライブラリを2つほどインストールします。
```python
pip install azure-ai-textanalytics==5.1.0
```

```python
pip install azure-identity
```

ほしたら、あとは以下を使ってくださいませ。

:::note info
ミソ：Responseの中に、language="ja"を書いておくことで日本語対応！
:::

```python
key = "YOURKEY"
endpoint = "YOURENDPOINT"

# key = "paste-your-key-here"
# endpoint = "paste-your-endpoint-here"

from azure.ai.textanalytics import TextAnalyticsClient
from azure.core.credentials import AzureKeyCredential

# Authenticate the client using your key and endpoint 
def authenticate_client():
    ta_credential = AzureKeyCredential(key)
    text_analytics_client = TextAnalyticsClient(
            endpoint=endpoint, 
            credential=ta_credential)
    return text_analytics_client

client = authenticate_client()

# Example function for detecting sentiment in text
def sentiment_analysis_example(client):

    documents = ["今日は人生で一番の日でした。君も僕と一緒に入れたらよかったのに。"]
    response = client.analyze_sentiment(documents=documents, language="ja")[0]
    print("Document Sentiment: {}".format(response.sentiment))
    print("Overall scores: positive={0:.2f}; neutral={1:.2f}; negative={2:.2f} \n".format(
        response.confidence_scores.positive,
        response.confidence_scores.neutral,
        response.confidence_scores.negative,
    ))
    for idx, sentence in enumerate(response.sentences):
        print("Sentence: {}".format(sentence.text))
        print("Sentence {} sentiment: {}".format(idx+1, sentence.sentiment))
        print("Sentence score:\nPositive={0:.2f}\nNeutral={1:.2f}\nNegative={2:.2f}\n".format(
            sentence.confidence_scores.positive,
            sentence.confidence_scores.neutral,
            sentence.confidence_scores.negative,
        ))
          
sentiment_analysis_example(client)

# Example method for detecting opinions in text 
def sentiment_analysis_with_opinion_mining_example(client):

    documents = [
        "飯とサービスがダメダメでした。でも、コンシェルジュは良かった。"
    ]

    result = client.analyze_sentiment(documents, show_opinion_mining=True, language="ja")
    doc_result = [doc for doc in result if not doc.is_error]

    positive_reviews = [doc for doc in doc_result if doc.sentiment == "positive"]
    negative_reviews = [doc for doc in doc_result if doc.sentiment == "negative"]

    positive_mined_opinions = []
    mixed_mined_opinions = []
    negative_mined_opinions = []

    for document in doc_result:
        print("Document Sentiment: {}".format(document.sentiment))
        print("Overall scores: positive={0:.2f}; neutral={1:.2f}; negative={2:.2f} \n".format(
            document.confidence_scores.positive,
            document.confidence_scores.neutral,
            document.confidence_scores.negative,
        ))
        for sentence in document.sentences:
            print("Sentence: {}".format(sentence.text))
            print("Sentence sentiment: {}".format(sentence.sentiment))
            print("Sentence score:\nPositive={0:.2f}\nNeutral={1:.2f}\nNegative={2:.2f}\n".format(
                sentence.confidence_scores.positive,
                sentence.confidence_scores.neutral,
                sentence.confidence_scores.negative,
            ))
            for mined_opinion in sentence.mined_opinions:
                target = mined_opinion.target
                print("......'{}' target '{}'".format(target.sentiment, target.text))
                print("......Target score:\n......Positive={0:.2f}\n......Negative={1:.2f}\n".format(
                    target.confidence_scores.positive,
                    target.confidence_scores.negative,
                ))
                for assessment in mined_opinion.assessments:
                    print("......'{}' assessment '{}'".format(assessment.sentiment, assessment.text))
                    print("......Assessment score:\n......Positive={0:.2f}\n......Negative={1:.2f}\n".format(
                        assessment.confidence_scores.positive,
                        assessment.confidence_scores.negative,
                    ))
            print("\n")
        print("\n")
          
sentiment_analysis_with_opinion_mining_example(client)
```

# 結果
Document Sentiment: positive
Overall scores: positive=0.77; neutral=0.22; negative=0.01 

Sentence: `今日は人生で一番の日でした。`
Sentence 1 sentiment: positive
Sentence score:
`Positive=0.94`
Neutral=0.05
Negative=0.01

Sentence: `君も僕と一緒に入れたらよかったのに。`
Sentence 2 sentiment: positive
Sentence score:
Positive=0.60
Neutral=0.39
Negative=0.02

---
Document Sentiment: mixed
Overall scores: positive=0.49; neutral=0.00; negative=0.50 

Sentence: `飯とサービスがダメダメでした。`
Sentence sentiment: negative
Sentence score:
Positive=0.00
Neutral=0.00
`Negative=1.00`

--


Sentence: `でも、コンシェルジュは良かった。`
Sentence sentiment: positive
Sentence score:
`Positive=0.99`
Neutral=0.01
Negative=0.01