感情分析 Python 連携

## はじめに
利用者や顧客からの問い合わせを受ける際、クレームを言われているのか、あるいは単なる問い合わせなのか、文面だけでは判断がつかないことも多いと思います。そんな時、問い合わせの文面を分析して、前向き(ポジティブ)な発言なのか、あるいは後ろ向き(ネガティブ)な発言なのかを自動で判断できたら便利ですよね。
そこで、Python のライブラリを活用して、日本語の文面を読み込んで感情分析し、結果を Yellowfin で可視化するまでの手順を紹介したいと思います。

## 環境準備
Python に以下のパッケージをインストールします。
|パッケージ|用途|インストールコマンド|
|---|---|---|
|psycog2|PostgreSql 接続|pip install psycopg2|
|pandas|データフレームの扱い|pip install pandas|
|numpy|配列の扱い|pip install numpy|
|asari|感情分析|pip install asari|

PostgreSql 上のテーブルに、以下のような感じで問い合わせの文面が格納されているとします。それぞれの文面に対して、感情分析してみようと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/74a06e64-bfef-4ebe-5934-34e909f37aa4.png)

## コードの記述
Postgresqlでデータベース上のテーブルに接続して、取得したデータをpandasのデータフレームに格納します。

```python:データの取得と格納
import psycopg2
import pandas as pd

conn = psycopg2.connect("dbname=demo user=postgres password=password host=localhost port=5432")
query = """SELECT sentence FROM senti_analysis"""
df = pd.read_sql(query, con=conn)
conn.close()
```

データフレームから分析対象の列を抽出して、numpy のリストに変換します。

```python:リスト変換
import numpy as np
arr_list = np.array(df['sentence'].tolist())
```

asari の Sonar インスタンス関数を呼び出し、ping メソッドで感情分析を実行します。

```python:感情分析
sonar = Sonar()
outcome = list(map(sonar.ping,arr_list))
```

取り急ぎ、データを取り扱い易いように CSV ファイルに出力します。

```python:ファイル出力
outcome _norm = pd.json_normalize(outcome)
outcome _norm.to_csv("outcome.csv", encoding='utf-8')
```

コード全体では以下のような感じです。
```python:全容
import psycopg2
import pandas as pd
import numpy as np
from asari.api import Sonar

#Postgresqlのテーブルに接続して、取得したデータをpandasのデータフレームに格納
conn = psycopg2.connect("dbname=demo user=postgres password=password host=localhost port=5432")
query = """SELECT sentence FROM senti_analysis"""
df = pd.read_sql(query, con=conn)
conn.close()

#データフレームから分析対象の列を抽出して、numpyのリストに変換
arr_list = np.array(df['sentence'].tolist())

#Sonarインスタンス関数の呼び出し、pingメソッドで分析
sonar = Sonar()
outcome = list(map(sonar.ping,arr_list))

#取り急ぎCSV出力
outcome_norm = pd.json_normalize(outcome)
outcome_norm.to_csv("C:\\Users\\JunyaFujiyoshi\\Desktop\\out.csv", encoding='utf-8')
```

各行に対して、以下のような結果を得ることができました。2 列目と 3 列目の情報で、各文面に対する感情 (ポジティブなのかネガティブなのか) が判断できます。
`0,業務システムにログインできなくなってしまい、業務が継続できません。,negative,"[{'class_name': 'negative', 'confidence': 0.989399254322052}, {'class_name': 'positive', 'confidence': 0.01060077827423811}]"`


## Yellowfin を使って分析結果を含むデータを可視化
出力結果をデータベースのテーブルに取り込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/e7b54a82-3959-4b14-6f69-81566a50f91c.png)

## Yellowfin コンテンツの作成
上記手順で作成したデータベースのテーブルを参照して、Yellowfin 上にダッシュボードを作成します。
ダッシュボード作成までの手順は、以下を参考にしてください。
1. [ビューの作成](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=2293852)
2. [レポートの作成](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=2293995)
3. [ダッシュボードの作成](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=2293823)

ということで、3 分間クッキング方式で出来上がったものがこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/6d2bbddd-f387-3600-3d07-b92a89835c81.png)

## 最後に
今回、asari を使って感情分析を行ってみました。asari 以外にも、日本語の感情分析を行うためのライブラリはいくつか存在しますが、asari の分析結果は、比較的一般的な結果を得やすいかなと感じています。
Python で活用できる優れたライブラリが、世の中には山ほどで出回っています。しかも、機械学習した結果も活用できたりします。Yellowfin と Python の連携で、ますますデータ分析の幅が広がりますね。
皆様良いデータ分析を! そして Joyeux noël! Bonne année!