業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【AI・機械学習】
AI

執筆者:Handbook編集部

Natural Language API 「感情分析」の概要と使い方

はじめに

本記事では、Natural Language API 感情分析の概要と使い方について解説します。

感情分析は、指定されたテキストの背景にある感情的な考え方を分析します。「文章」をINPUTとして「score」、「magnitude」等の値を取得できます。 この「score」、「magnitude」の2つの値を利用して文章が「ポジティブ」なのか「ネガティブ」なのか「ニュートラル」なのかを判断します。

概要

Natural Language APIの感情分析では、ドキュメント内のポジティブな感情とネガティブな感情の違いを示しますが、具体的なポジティブな感情とネガティブな感情を特定するものではありません。たとえば、「怒っている(angry)」と「悲しい(sad)」は両方ともネガティブな感情とみなされます。

APIレスポンスの例

リクエストが成功すると、サーバーは 200 OK HTTPステータスコードと以下のようなJSON形式のレスポンスを返します。 入力した文章全体に対する感情(documentSentiment)と1文ずつの感情(sentences)を取得できます。

{
  "documentSentiment": {
    "magnitude": 0.8,
    "score": 0.8
  },
  "language": "en",
  "sentences": [
    {
      "text": {
        "content": "Enjoy your vacation!",
        "beginOffset": 0
      },
      "sentiment": {
        "magnitude": 0.8,
        "score": 0.8
      }
    }
  ]
}

APIレスポンス(感情分析の値)の解釈

感情分析結果のレスポンス(sentiment)には score および magnitude の2つの値が含まれます。

scoreは、テキストの全体的な感情の傾向を表します。 -1.0(ネガティブ)~1.0(ポジティブ)のスコアで感情が表されます。

magnitudeは、 指定したテキストの全体的な感情の強度(ポジティブとネガティブの両方)が 0.0~+inf の値で示されます。score と違って、magnitude は正規化されていないため、テキスト内で感情(ポジティブとネガティブの両方)が表現されるたびにテキストの magnitude の値が増加します。そのため、長いテキスト ブロックで値が高くなる傾向があります。

score の値がニュートラル(≒0.0)なドキュメントは、感情的でない場合もあれば、ポジティブとネガティブの両方の値が高いために互いに相殺されている混合的なドキュメントである場合もあります。通常、これらの場合に曖昧さを取り除くために、magnitude の値が使用できます。本当にニュートラルなドキュメントの magnitude の値は低くなりますが、混在的なドキュメントの magnitude の値は大きくなります。

以下の表は、感情の解釈とAPIレスポンスのサンプル値の例になります。

感情 | サンプル値 -- | -- 明らかにポジティブ | "score": 0.8, "magnitude": 3.0 明らかにネガティブ | "score": -0.6, "magnitude": 4.0 ニュートラル | "score": 0.1, "magnitude": 0.0 混合 | "score": 0.0, "magnitude": 4.0

使い方

Natural Language API に直接送信されたテキスト文字列に対して感情分析を行う例を次に示します。

感情分析を行う関数の定義

入力した文章全体に対する感情と1文ずつの感情を取得して、それぞれ表示するプログラムを作成します。


from google.cloud import language_v1
from google.cloud.language_v1 import enums
from google.cloud.language_v1 import types

def sample_analyze_sentiment(text_content):
    """
    Analyzing Sentiment in a String

    Args:
      text_content The text content to analyze
    """

    client = language_v1.LanguageServiceClient()

    type_ = language_v1.types.Document.Type.PLAIN_TEXT

    document = types.Document(
      content=text_content,
      type=enums.Document.Type.PLAIN_TEXT)

    response = client.analyze_sentiment(document=document)

    # Get overall sentiment of the input document
    print(u"Document sentiment score: {}".format(response.document_sentiment.score))
    print(
        u"Document sentiment magnitude: {}".format(
            response.document_sentiment.magnitude
        )
    )
    # Get sentiment for all sentences in the document
    for sentence in response.sentences:
        print(u"Sentence text: {}".format(sentence.text.content))
        print(u"Sentence sentiment score: {}".format(sentence.sentiment.score))
        print(u"Sentence sentiment magnitude: {}".format(sentence.sentiment.magnitude))

    # the automatically-detected language.
    print(u"Language of the text: {}".format(response.language))

感情分析の実行

text_content = 'この人は、この世の中で、いちばんしあわせな人にちがいありません。芝居小屋もすばらしいし、お客さんもすばらしい人たちでした。もし中世の時代だったら、おそらく、火あぶりにされたでしょうよ。みんなのうるさいことといったら、まるで、ハエがびんの中で、ブンブンいっているようでした。われわれ人間が、こういうことを考えだすことができるとすれば、われわれは、地の中にうめられるまでに、もっと長生きできてもいいはずだが'

sample_analyze_sentiment(text_content)

実行結果

Document sentiment score: 0.10000000149011612
Document sentiment magnitude: 1.5
Sentence text: この人は、この世の中で、いちばんしあわせな人にちがいありません。
Sentence sentiment score: 0.10000000149011612
Sentence sentiment magnitude: 0.10000000149011612
Sentence text: 芝居小屋もすばらしいし、お客さんもすばらしい人たちでした。
Sentence sentiment score: 0.8999999761581421
Sentence sentiment magnitude: 0.8999999761581421
Sentence text: もし中世の時代だったら、おそらく、火あぶりにされたでしょうよ。
Sentence sentiment score: -0.10000000149011612
Sentence sentiment magnitude: 0.10000000149011612
Sentence text: みんなのうるさいことといったら、まるで、ハエがびんの中で、ブンブンいっているようでした。
Sentence sentiment score: -0.10000000149011612
Sentence sentiment magnitude: 0.10000000149011612
Sentence text: われわれ人間が、こういうことを考えだすことができるとすれば、われわれは、地の中にうめられるまでに、もっと 長生きできてもいいはずだが Sentence sentiment score: 0.0
Sentence sentiment magnitude: 0.0
Language of the text: ja

info
〜ウェビナー告知【2025/06/19】〜

「データ・AI駆動で開発するプロダクト組織のあり方」をテーマに、理想のプロダクト組織のあり方、形成の勘所、そしてAI/データ駆動型組織への具体的な転換ステップをご紹介します。競争力のあるプロダクト開発を目指すなら、ぜひご参加ください!

  • ウェビナーテーマ:『データ・AI駆動で開発するプロダクト組織のあり方』
  • 開催日時:2025年6月19日(木) 10:00~20:00
  • 会場:オンライン開催(Zoom)

お問い合わせはこちらまで

おわりに

本記事では、Natural Language APIの感情分析についての概要とpythonを用いた使用方法について解説しました。

参考資料

2025年06月15日に最終更新
読み込み中...