GCPのNatural Language APIで感情分析を行う

GCPのNatural Language APIで感情分析

GCP(Google Cloud Platform)では、Natural Language(自然言語解析)に関するAPIを提供しています。このAPIを活用することでテキストの感情分析を行うこともできます。例えばそのテキストがポジティブな話題であるのがネガティブな話題であるのかなどが推定できます。この記事では、GCPのNatural Language APIを使った感情分析の基本について解説していきます。

GCPでプロジェクトを作成する

GCP(Google Cloud Platform)で感情分析を行う方法を解説していきます。まずGCPでプロジェクトを作成します。

今回はPythonで感情分析を実装していきます。続いてGoogle Cloud AIと機械学習プロダクトのクイックスタートを開きます。

「始める前に」の「プロジェクトの設定」ボタンをクリックします。

ポップアップが開いたら先ほど作成したプロジェクトを選択して「NEXT」を選びます。

秘密鍵のJSONファイルがダウンロードできるようになります。ダウンロードボタンを押して秘密鍵をローカルに保存します。

続いて.bashrcまたは.zshrcに、ダウンロードしたJSONのパスをGOOGLE_APPLICATION_CREDENTIALSという環境変数としてセットします。

export GOOGLE_APPLICATION_CREDENTIALS="/ダウンロードしたJSONのパス/*********.json"

pipまたはpip3コマンドを使ってGCPのクラウドストレージ関連ライブラリをインストールします。

$ pip3 install --upgrade google-cloud-storage

これでGoogle Cloud Platformの感情分析が使えるようになりました。さっそく感情分析してみましょう。ここでは「メロスは激怒した」というテキストの感情分析を行います。

# Imports the Google Cloud client library
from google.cloud import language
from google.cloud.language import enums
from google.cloud.language import types

# Instantiates a client
client = language.LanguageServiceClient()

# The text to analyze
text = u"メロスは激怒した。"
document = types.Document(
    content=text,
    type=enums.Document.Type.PLAIN_TEXT)

# Detects the sentiment of the text
sentiment = client.analyze_sentiment(document=document).document_sentiment

print('Text: {}'.format(text))
print('Sentiment: {}, {}'.format(sentiment.score, sentiment.magnitude))

このコードを実行した結果は以下の通りとなりました。

Text: メロスは激怒した。
Sentiment: -0.30000001192092896, 0.30000001192092896

出力されたSentimentの2種類の値は、それぞれscore(+1.0〜-1.0の間の値を取る。+1.0近いほどポジティブな感情で、-1.0に近いほどネガティブな感情)とmagnitude(テキストの感情の強度を示す)です。

ドキュメントの感情分析の score は、ドキュメントの全体的な感情を示します。ドキュメントの感情分析の magnitude は、そのドキュメントに感情的な内容がどのくらい含まれているかを示します。この値は、ドキュメントの長さに比例する傾向があります。
…score の値がニュートラル(ほぼ 0.0)なドキュメントは、感情的でない場合もあれば、ポジティブとネガティブの両方の値が高いために互いに相殺されている混合的なドキュメントである場合もあります。通常は、magnitude の値を使用してこの曖昧さを取り除くことができます。本当にニュートラルなドキュメントは magnitude の値が低くなりますが、混合的なドキュメントは高くなります。

今回の出力結果はscoreが-0.3になっておりmagnitudeは0.3です。ネガティブな文章であると判定できています。

複数行にわたる感情分析を行いたいときは以下のように記述すると良いでしょう。

# -*- coding: utf-8 -*-
# Imports the Google Cloud client library
from google.cloud import language
from google.cloud.language import enums
from google.cloud.language import types

# Instantiates a client
client = language.LanguageServiceClient()

# The text to analyze
 text = u"""
聞いて、メロスは激怒した。
「あきれた王だ。生かしておけぬ。」"""
document = types.Document(
    content=text,
    type=enums.Document.Type.PLAIN_TEXT)

# Detects the sentiment of the text
sentiment = client.analyze_sentiment(document=document).document_sentiment

print('Text: {}'.format(text))
print('Sentiment: {}, {}'.format(sentiment.score, sentiment.magnitude))

出力結果は以下のようになります。

Text:
聞いて、メロスは激怒した。
「あきれた王だ。生かしておけぬ。」

Sentiment: -0.20000000298023224, 2.0

GCPのストレージから感情分析を行う

GCPのストレージにアップロードしたファイルからテキストを抽出して感情分析を行うこともできます。バケットを作成してテキストファイルをアップロードしてみましょう。

「GCP」→「Storage」→「ブラウザ」と開き、バケット作成画面を開きます。

バケットに名前をつけ、リージョンを選択します。今回はテストですので単一リージョンで良いでしょう。

続いてバケットにファイルをアップロードします。今回は青空文庫からダウンロードした太宰治『人間失格』のテキストファイルをningen_shikkaku.txtとしてアップロードしました。

続いて以下のコードを記述して実行します。

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

gcs_uri = 'gs://バケット名/アップロードしたファイル名.txt'

client = language.LanguageServiceClient()

# Instantiates a plain text document.
document = types.Document(
    gcs_content_uri=gcs_uri,
    type=enums.Document.Type.PLAIN_TEXT)

# Detects sentiment in the document. You can also analyze HTML with:
#   document.type == enums.Document.Type.HTML
sentiment = client.analyze_sentiment(document).document_sentiment

print('Score: {}'.format(sentiment.score))
print('Magnitude: {}'.format(sentiment.magnitude))

30分ほどテキストの感情分析が行われた後、以下の結果が出力されました。

Score: 0.0
Magnitude: 84.9000015258789

Scoreはプラスマイナス0。長い文章から感情のスコアを読み取ると中立的になるのかもしれません。ただMagnitudeは84で『人間失格』がかなり感情の起伏が激しい文章であると読み取っています。

トラブルシューティング1

google.api_core.exceptions.Unauthenticated: 401 Permission to access the GCS address is denied.

このようなエラーが出る場合は、バケットの閲覧権限が付与されていません。以下のコマンドでアクティベートしましょう。

$ gcloud auth activate-service-account --key-file=最初にダウンロードしたプロジェクトの秘密鍵JSONファイルのパス

正常に実行されると以下のような出力が返ってきます。

Activated service account credentials for: [starting-account-***********@プロジェクトID.iam.gserviceaccount.com]

このアカウントIDをGCPのStoregeで閲覧権限のあるユーザーとして追加すれば正常に実行できるようになります。

トラブルシューティング2

Cannot move files across regions. Please use a regional bucket in the same location and with same storage class as AutoML. Required Location: us-central1, required location type: Region, required storage class: Standard.

上記のようなエラーが出力された場合は、バケットのリージョンとAutoMLのリージョンが合っていない可能性が高いです。バケットのリージョンを確認しましょう。