Azure AI Languageでテキストから感情を分析してみよう

Azure AI Languageでテキストから感情を分析してみよう

今回は、Azure AI Languageの強力な機能の一つである「感情分析」を使って、テキストに込められた感情を簡単に分析する方法をご紹介します。
顧客のレビュー分析やSNSのモニタリングなど、様々なビジネスシーンで活用できるこの技術。
Pythonを使って、実際にどのように動くのかを見ていきましょう!

Azure AI Languageとは?

Azure AI Languageは、Microsoftが提供するクラウドベースの自然言語処理(NLP)サービスです。
テキストからキーフレーズを抽出したり、固有表現(人名、地名など)を認識したり、そして今回ご紹介する感情分析など、多岐にわたる機能を提供しています。
事前にトレーニングされたモデルが用意されているため、専門的な知識がなくても、APIを呼び出すだけで高度なテキスト分析が可能なため、スピーディにAIソリューションを導入したい方にオススメのサービスです。


準備:Azureでのリソース作成

まずはAzure上で準備をします。
感情分析を利用するには、Languageリソースを作成し、APIキーとエンドポイントを取得する必要があります。

  1. Azureポータルにサインイン: まずはAzureポータルにアクセスし、ご自身のアカウントでサインインします。
  2. リソースの作成: 検索バーで「Language」と入力し、「Language」を選択します。「作成」をクリックして、新しいリソースを作成します。
  3. リソース情報の設定: サブスクリプションやリソースグループ、リージョン、価格レベル(Free F0プランでも試せます)などを設定し、リソースを作成します。
  4. キーとエンドポイントの取得: 作成したリソースのページに移動し、「キーとエンドポイント」のメニューを開きます。ここに表示されるキー(KEY 1またはKEY 2)とエンドポイントを後ほどコードで使用しますので、控えておきましょう。

実装:Pythonで感情を分析してみよう

準備が整ったら、いよいよPythonでコードを書いていきます。
今回はazure-ai-textanalyticsというライブラリを使用します。

1. ライブラリのインストール

まずは、必要なライブラリをpipでインストールします。
バージョンは今は特に指定していませんが、必要に応じて指定してください。

pip install azure-ai-textanalytics

2. サンプルコード

以下のコードは、テキスト全体の感情と、文ごとの感情を分析する簡単なサンプルです。
先ほど取得したキーとエンドポイントを、ご自身のものに書き換えてください。

# 必要なライブラリをインポート
from azure.ai.textanalytics import TextAnalyticsClient
from azure.core.credentials import AzureKeyCredential

# 自身のキーとエンドポイントを設定
key = "YOUR_LANGUAGE_KEY"
endpoint = "YOUR_LANGUAGE_ENDPOINT"

# 認証クライアントの作成
def authenticate_client():
    ta_credential = AzureKeyCredential(key)
    text_analytics_client = TextAnalyticsClient(
            endpoint=endpoint,
            credential=ta_credential)
    return text_analytics_client

client = authenticate_client()

# 分析したいテキスト
documents = [
    "このレストランは最高だ!料理も美味しく、サービスも素晴らしかった。",
    "映画は面白かったけど、ポップコーンは少し冷めていた。",
    "今日は特に何もなかった。普通の1日だった。"
]

# 感情分析の実行
def sentiment_analysis_with_opinion_mining(client, documents):
    result = client.analyze_sentiment(documents, show_opinion_mining=True)
    docs_with_results = [doc for doc in result if not doc.is_error]

    for doc in docs_with_results:
        print(f"ドキュメント全体: \"{doc.sentences[0].text[:20]}...\"")
        print(f"  感情: {doc.sentiment}")
        print(f"  スコア: ポジティブ={doc.confidence_scores.positive:.2f}, "
              f"ニュートラル={doc.confidence_scores.neutral:.2f}, "
              f"ネガティブ={doc.confidence_scores.negative:.2f}")

        # 文ごとの分析結果
        for sentence in doc.sentences:
            print(f"    文: \"{sentence.text}\"")
            print(f"    文の感情: {sentence.sentiment}")
            print(f"    文のスコア: ポジティブ={sentence.confidence_scores.positive:.2f}, "
                  f"ニュートラル={sentence.confidence_scores.neutral:.2f}, "
                  f"ネガティブ={sentence.confidence_scores.negative:.2f}")

            # 意見マイニングの結果(どの単語が感情に影響したか)
            for mined_opinion in sentence.mined_opinions:
                target = mined_opinion.target
                print(f"      - ターゲット: \"{target.text}\" ({target.sentiment})")
                for assessment in mined_opinion.assessments:
                    print(f"        - 評価: \"{assessment.text}\" ({assessment.sentiment})")
        print("-" * 30)

sentiment_analysis_with_opinion_mining(client, documents)

3. 実行結果と解説

上記のコードを実行すると、以下のような結果が得られます。

ドキュメント全体: "このレストランは最高だ!料理も美味しく、..."
  感情: positive
  スコア: ポジティブ=1.00, ニュートラル=0.00, ネガティブ=0.00
    文: "このレストランは最高だ!"
    文の感情: positive
    文のスコア: ポジティブ=1.00, ニュートラル=0.00, ネガティブ=0.00
    文: "料理も美味しく、サービスも素晴らしかった。"
    文の感情: positive
    文のスコア: ポジティブ=1.00, ニュートラル=0.00, ネガティブ=0.00
      - ターゲット: "料理" (positive)
        - 評価: "美味しい" (positive)
      - ターゲット: "サービス" (positive)
        - 評価: "素晴らしい" (positive)
------------------------------
ドキュメント全体: "映画は面白かったけど、ポップコーンは少し冷めて..."
  感情: mixed
  スコア: ポジティブ=0.53, ニュートラル=0.00, ネガティブ=0.47
    文: "映画は面白かったけど、ポップコーンは少し冷めていた。"
    文の感情: mixed
    文のスコア: ポジティブ=0.53, ニュートラル=0.00, ネガティブ=0.47
      - ターゲット: "映画" (positive)
        - 評価: "面白い" (positive)
      - ターゲット: "ポップコーン" (negative)
        - 評価: "冷めている" (negative)
------------------------------
ドキュメント全体: "今日は特に何もなかった。普通の1日だった。..."
  感情: neutral
  スコア: ポジティブ=0.01, ニュートラル=0.98, ネガティブ=0.01
    文: "今日は特に何もなかった。"
    文の感情: neutral
    文のスコア: ポジティブ=0.01, ニュートラル=0.98, ネガティブ=0.01
    文: "普通の1日だった。"
    文の感情: neutral
    文のスコア: ポジティブ=0.01, ニュートラル=0.98, ネガティブ=0.01
------------------------------

結果を見ると、各テキストがポジティブ (positive), ネガティブ (negative), ニュートラル (neutral)、そして両方が混在する混合 (mixed) のいずれかに分類され、それぞれの信頼度スコアが出力されているのが分かります。

さらに、show_opinion_mining=True オプションを有効にすることで、意見マイニング(Aspect-Based Sentiment Analysis)が実行されます。
これにより、「映画は面白かったけど、ポップコーンは冷めていた」という文から、「映画」に対する「面白い(ポジティブ)」という意見と、「ポップコーン」に対する「冷めている(ネガティブ)」という意見を個別に抽出できています。


ユースケース

この感情分析機能は、様々な場面で役立ちます。

  • 顧客の声の分析: ECサイトのレビューやアンケートの自由回答欄を分析し、製品やサービスのどの点が高く評価され、どこに不満があるのかを自動で可視化する。
  • SNSモニタリング: X (旧Twitter)などで自社ブランドや商品に関する投稿を収集し、世間の評判をリアルタイムで把握する。
  • コールセンターの品質向上: 通話内容をテキスト化し、顧客の満足度やオペレーターの対応に関する感情を分析して、応対品質の改善に繋げる。

補足

注意点

サンプルコードではキーを直接記述していますが、実際の運用では環境変数などを利用して安全に管理しましょう。

多言語対応

今回は日本語のテキストを分析しましたが、Azure AI Languageは多言語に対応しており、同様の手順で英語や他の言語のテキストも分析可能です。

感情分析の限界?

AIによる感情分析は万能ではなく、特に人間が使う「皮肉」や「嫌味」といった文脈依存の強い表現の解釈は苦手な場合があります。
例えば、「素晴らしいサービスのおかげで、サポートセンターに1時間も電話する羽目になりました」といったアイロニーたっぷりの文章をポジティブと誤判定する可能性もゼロではありません。

処理するテキストの量

感情分析は、キーフレーズ抽出などとは異なり、比較的小さなテキストブロック(文や短い段落)で分析する方が高品質な結果を得やすいとされています。
Microsoft Learn:方法: 感情分析とオピニオン マイニングを使用する


まとめ

今回は、Azure AI Languageの感情分析機能を使って、Pythonで簡単にテキストの感情を分析する方法をご紹介しました。
ほんの数行のコードで簡単に分析ができるのは便利ですね。

皆さんもぜひ、テキストデータから新たなインサイトを発見してみてください!

Last modified: 2025-06-10

Author