PythonからGoogle Cloud Natural Language APIを使って感情分析

Google Cloud Natural Language APIを使って、Pythonで日本語文章の感情分析 (ポジティブ/ネガティブの判定) を行います。

このAPIは自然言語処理のためのGCPサービスで、感情分析以外にも、構文解析やエンティティ解析が提供されています。

cloud.google.com

準備

Google Cloud Natural Language APIを使い始めるには以下作業が必要です。

  • Google Cloud Natural Language APIの有効化
  • サービスアカウントのアクセスキーを取得

環境変数GOOGLE_APPLICATION_CREDENTIALSにアクセスキーのパスを設定しておきます。

$ env GOOGLE_APPLICATION_CREDENTIALS=~/.gcp/credential.json

実装

Pythonでの実装に入っていきます。

まずはパッケージをインストールします。

pip install --upgrade google-cloud-language

Pythonでの実装は以下のとおりです。

  • LanguageServiceClientを使ってAPIにリクエストする
    • analyze_sentimentメソッドで感情分析を行う
  • リクエストにDocumentオブジェクトを詰めることで文書を渡します
    • PLAIN_TEXT以外にはTYPE_UNSPECIFIEDHTMLがあります
  • レスポンスのscoreにポジティブ/ネガティブの度合い、magnitudeに文章内でのポジティブ/ネガティブの振れ幅がそれぞれ格納されている
    • scoreは-1.0〜1.0で、値が大きいほどポジティブ

今日は天気が良かったので散歩しにでかけた。はscoreが0.6なので、ポジティブ寄りの文章と判定されます。

from google.cloud import language
from google.cloud.language import enums
from google.cloud.language import types

# クライアントの作成
client = language.LanguageServiceClient()

# リクエスト (解析する文書) の作成
text = """
今日は天気が良かったので散歩しにでかけた。
"""
document = types.Document(
    content=text,
    type=enums.Document.Type.PLAIN_TEXT)

# APIをコールして結果を得る
result = client.analyze_sentiment(document=document)

print('score: {}, magnitude: {}'.format(result.document_sentiment.score, result.document_sentiment.magnitude))
# score: 0.6000000238418579, magnitude: 0.6000000238418579

試しに、自分のツイートからいくつか文章を拾ってscoreを見てみます。
下の文章だとscoreは-0.5で、ネガティブ寄りの判定。

ここ数日、起床時間がガチャガチャしてて、調子が良くない。
数日ならまだ良いけど、夜中に起こされることが常態化すると、不眠になったり、逆にまともに時間に起きられなくなったりするので、注意しないと。

下はscoreが0.3で、ややポジティブ寄りです。

頭の片隅でグズグズ渦巻いている悩みの一つを、消し去れた。
少し身が軽くなった気がする。

レスポンスのsentencesに文 (sentence) ごとのscoreが入っています。

for sentence in result.sentences:
    print(sentence.text.content, sentence.sentiment.score)
# 頭の片隅でグズグズ渦巻いている悩みの一つを、消し去れた。 0.10000000149011612
# 少し身が軽くなった気がする。 0.6000000238418579