Splunk と Google Natural Language を組み合わせて感情分析をしてみた


はじめに

Splunk の機械学習機能で NLP(Natural Language Processing) Text AnalyticsというApp があり、感情分析できるのですが、残念ながら日本語対応していない・・・

また、DLTK (Deep Learning Toolkit)を使うと自然言語処理などができるので、LSTMなどを使って感情分析などの機能実装も可能なのですが、大量のデータを集めたり、Deep Learningのコード実装が必要だったりしてハードルが高い・・・

感情辞書を用いた方法も精度を高めるには苦労しそうだなー・・・ 

と思っていたところ、Google Natural Language を使うとできるよという話を教えてもらいました。

すでに日本語での大量の学習済みモデルを使えるので、精度も高そうだし、APIで提供されているので実装も簡単そう。

ということで、Splunkにあるデータを使って、Google Natrual Language APIで感情分析させて、Splunkのダッシュボードで結果を表示させてみました。

実装概要イメージ

今回実装した方法は以下のようなイメージです。
将来的にはAppを作成するのも面白そうですが、一旦以下のように実装しました。

Step 1. データ読み込み

PythonでのSplunkデータの取り込み方法については、以前記事を書いているので、ここでは詳細は割愛させていただきます。

Pyhton コードで Splunk サーチ結果を読み込む (RestAPI編)
https://qiita.com/maroon/items/178a0c1263575597eea8

今回は、以下のように取得したデータを DataFrame形式にしております。こちらの comment 列の内容をGoogle NL APIを使って感情分析をさせたいと思います。

Step 2. Google NLP API による感情分析

この機能を利用するためには、いくつか準備が必要です。

Google Cloud Natural Language APIのクイックガイドがあるので、こちらに従って設定するのがいいかと思いますが、Cloud SDKを入れるため、Google Collaboratory などのWeb上の開発ツールだとうまく実行できなかったため、今回はこちらのDeveloper's Blog様の記事にあるAPI token実装による方法を採用しました。

Google Cloud 側の設定は途中までクイックガイドにある方法と同じですGoogle Cloud設定

設定手順
1. プロジェクト作成
2. 課金の有効化 (5000件/月までは無料枠あり)
3. Google Natural Language APIの有効化
4. サービスアカウント作成
5. APIキーの発行

上記のAPIが利用できるようになったら、次にコード実装をします。
取得したAPIキーを以下の access_token の箇所に入力ください。

# 感情分析の関数設定
import sys
import requests

def check_sentiment(content):
    access_token = "<<API Key>>"   # API key 
    url = 'https://language.googleapis.com/v1/documents:analyzeSentiment?key={}'.format(access_token)
    header = {'Content-Type': 'application/json'}
    body = {
        "document": {
            "type": "PLAIN_TEXT",
            "language": "JA",
            "content": content
        },
        "encodingType": "UTF8"
    }
    response = requests.post(url, headers=header, json=body).json()
    return response 

Splunkから取得したデータを データフレームとして格納したため、以下のように、一件ごとループで上記の check_sentimentを実行していきます。

# 感情分析を実行する
magnitude = pd.Series(name='magnitude')
score = pd.Series(name='score')
gcp_output = pd.DataFrame()

for j in range(len(df)):
  output = check_sentiment(df['comment'][j])

  magnitude.loc[j] = output['documentSentiment']['magnitude']
  score.loc[j] = output['documentSentiment']['score']

gcp_output = pd.concat([df,magnitude,score],axis=1)

これで、それぞれのコメント毎に score と magnitude という結果が返ってきました。それぞれの意味についてはこちらをご覧ください。感情分析結果の値の解釈

Score : -1 から 1までの範囲で、1 に近いとポジティブ。 -1 に近いとネガティブとなります。 0に近いのはニュートラルもしくは、混在しているケースで、その場合 magnitudeを見て 0に近いとニュートラルだけど、数字が大きいと混在している可能性が高い。とのことです。

Step 3. Splunk に結果を返す。

RestAPIと HECを使って、Splunkにデータを取り込ませる方法については、こちらに別途記事が書いてありますので、ここでは割愛させていただきます。

pythonでデータを Splunkに取り込む ( RestAPI + HECの組み合わせ)

Step 4. Splunk上で分析・可視化する

従来のデータに感情分析結果が付与されたため、今まで出来なかったような分析ができるようになりました。これはデータ分析を進めていく上で非常にありがたい情報ですね。

最後に

日本語の自然言語処理って1から作ると大変ですが、このようなサービスを利用できるのは本当にありがたいですね。また、このGoogle Natural Languageのすごいところは、文章のままで感情分析をしてくれるというところです。単語ではないので、日本語の難しい言い回しや、最後に否定がきてもちゃんと意味理解をしてくれるし、かなり精度も高いように感じました。

ちなみに、5000件/月までは無料枠なので、感情分析はこの機能を利用して、他の自然言語処理(構文解析,エンティティ分析、形態素解析)などはSplunk のDLTKにある spacy (ginza) を使うといいのかなと思います。