Pythonで日本語の感情分析(Google Colab)

## 文章の感情分析を手軽にやりたい！

最近は**Twitter**や**note**などが浸透し、誰もが気軽に自分の言葉を世界中に発信できるようになりました。
今、この世の中にはあらゆる**文章があふれかえっています**。

文章には書き手の様々な『感情』が内在しているわけですが、その**感情を機械的に分析できたら便利**だと思いませんか？

例えば、ある商品に関するツイートを集め、それらの感情を分析することができれば、その商品に対して多くの人が好意的なのか否定的なのかわかるかもしれません。

文章(テキスト)の感情分析は、自然言語処理の一分野として現在進行系で研究が続けられています。
まだ発展途上でありますが、感情分析を行うツールがいくつも登場しています。

本記事ではその中でもPythonで手軽に試すことができる**「ML-Ask」**というライブラリについてご紹介します。
Googleアカウントさえ持っていれば、あなたも10分後には感情分析をすることが可能です:thumbsup:

## ML-Askとは何か

ML-Askとは、**とある日本語の文章にどのような感情が含まれているかを推定する**ライブラリです。
下記の10種類の感情を推定できます。


喜(yorokobi) :grin:：喜び
怒(ikari) :angry:：怒り
哀(aware) :cry:：哀しみ
怖(kowagari) :fearful:：怖れ
恥(haji) :flushed:：恥ずかしさ
好(suki) :heart_eyes:：好き
厭(iya) :unamused:：嫌い
昂(takaburi) :triumph:：興奮
安(yasuragi) :relieved:：やすらぎ
驚(odoroki) :dizzy_face:：驚き


### ML-Askの感情分析の仕組み

ML-Askは入力した文章から感情に関するキーワードを特定し、辞書によるパターンマッチングによって感情を推定しているようです。

具体的には、「間投詞(例.すごい)」「擬態語(例.わくわく)」「下品な言葉(例.やがる)」「感嘆符(例. !, ?)」、そして**「感情表現辞典(中村明 著)」**に基づいて独自のデータベースを作成し、それを元にして感情を推定しています。

「感情表現辞典(中村明 著)」では、言語で表現される感情を10種類に分類し、語句をそれぞれの感情に分類しており、ML-Askでもこの10種類の感情分類を採用しています。

この辞典ではおよそ2000語の感情を表す語句が載っていますが、その一部を例として抜粋しておきます。

喜:grin:：歓喜、愉快、ほくほく、満悦、うっとり、…
怒:angry:：立腹、むかっ腹、憤慨、かんかん、青筋、…
哀:cry:：物悲しい、沈痛、嘆く、貰い泣き、めそめそ、…
怖:fearful:：不気味、畏怖、冷や汗、ぞっと、ぶるぶる、戦慄、…
恥:flushed:：照れる、面映い、こそばゆい、赤っ恥、もじもじする、…
好:heart_eyes:：友情、慕う、相思相愛、恋、愛しい、惚れる、夢中になる、ぞっこん、…
厭:unamused:：嫌気、厭わしい、むかむか、不快、疎ましい、気に入らない、憂鬱、…
昂:triumph:：そわそわ、気忙しい、焦り、うずうず、ときめく、高鳴る、…
安:relieved:：ほっと、やれやれ、寛ぐ、安らぎ、冷静、気軽、すっきり、…
驚:dizzy_face:：肝を冷やす、ぎくり、どきっ、ショック、驚嘆、飛び上がる、ぽかんとする、…

## Pythonで感情分析を行う
ではML-Askの概要がわかったところで、早速Pythonを使って感情分析をしてみましょう！

### 1. Google Colaboで新しいブックを作成する

GoogleColabの使い方はこちらの記事をご覧ください。

https://qiita.com/konitech913/items/f5ec29392ed5bf933a52


### 2. 必要なパッケージをインストールする

pymlaskをpipコマンドでインストールします。

```
!pip install pymlask
```

pymlaskの中で**MeCab**という形態素解析エンジンが必要となります。
そのため、MeCabと、解析に使う日本語辞書を下記のコマンドでインストールしましょう。

```
!apt install aptitude
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3==0.7
```

### 3. 感情分析を行う
これで感情分析の準備が整いました:v:
早速、ML-Askを使ってテキストの感情分析を行ってみましょう。

といっても、超簡単。たった3行です。

```python:python
from mlask import MLAsk
emotion_analyzer = MLAsk()
emotion_analyzer.analyze('こんな朝にはただただ世界が好きでたまらないという気がしない？')
```


```:実行結果
{'activation': 'NEUTRAL',
 'emoticon': None,
 'emotion': defaultdict(list, {'suki': ['好き']}),
 'intensifier': {},
 'intension': 0,
 'orientation': 'POSITIVE',
 'representative': ('suki', ['好き']),
 'text': 'こんな朝にはただただ世界が好きでたまらないという気がしない？'}
```
ML-Askのドキュメントには実行結果の見方が見つからなかったので、以下は私が色々試してみた推測です。
もし間違っていたらコメントお願いします。

'activation': 活性的かどうか
'emoticon': 絵文字
'emotion': 感情・その感情を表す語句
'intensifier': 強い感情を表す語句
'intension': 感情の強さ
'orientation': ネガポジ分類
'representative': 文を代表する感情
'text': 文章


感情表現が豊かといえば個人的には「赤毛のアン」だと思うので、「赤毛のアン」からいくつかセリフや描写を感情分析してみます。
※都合上、多少セリフを省略したり表記を変えているところもあります。

## 「赤毛のアン」の感情分析

### 我が家に帰るシーン

```python:python
emotion_analyzer.analyze('ああ、生きているってありがたいこと。家へ帰るってうれしいものね')
```

```:実行結果
{'activation': 'NEUTRAL',
 'emoticon': None,
 'emotion': defaultdict(list, {'yorokobi': ['ありがたい', 'うれしい']}),
 'intensifier': {'interjections': ['ああ']},
 'intension': 1,
 'orientation': 'POSITIVE',
 'representative': ('yorokobi', ['ありがたい', 'うれしい']),
 'text': 'ああ、生きているってありがたいこと。家へ帰るってうれしいものね'}
```

我が家であるグリーンゲイブルスに帰ることができる「喜:grin:」に満ちているようですね。
「ありがたい」「うれしい」という語句が、喜びの感情を表しています。

### 激怒するシーン

```python:python
emotion_analyzer.analyze('あんたなんか大嫌いだわ！あんたみたいに下品で、失礼で、心無しの人、見たこともないわ！')
```

```:実行結果
{'activation': 'NEUTRAL',
 'emoticon': None,
 'emotion': defaultdict(list, {'iya': ['下品', '大嫌い']}),
 'intensifier': {'exclamation': ['！'], 'interjections': ['なんか']},
 'intension': 2,
 'orientation': 'NEGATIVE',
 'representative': ('iya', ['下品', '大嫌い']),
 'text': 'あんたなんか大嫌いだわ！あんたみたいに下品で、失礼で、心無しの人、見たこともないわ！'}
```

初対面でいきなり自分をディスったレイチェル夫人にアンが激怒したシーンです。
場面的にアンは**作中1,2を争うほどブチギレ**ているので「怒:angry:」のような気がしますが、分析結果は「厭:unamused:」となりました。
intensionが2なので、強い感情であることがわかりますね。

### マリラが母性愛に目覚めたシーン

```python:python
emotion_analyzer.analyze('その細い小さな手が自分の手にふれたとき、なにか、身内のあたたまるような快いものがマリラの胸にわきあがった―たぶん、これまで味わわなかった、母性愛であろう。こんなことは初めてなのと、心をとろかすようなその甘さに、マリラは気分をかきみだされた。')
```


```:実行結果
{'activation': 'NEUTRAL',
 'emoticon': None,
 'emotion': defaultdict(list, {'suki': ['母性愛'], 'yorokobi': ['快い']}),
 'intensifier': {},
 'intension': 0,
 'orientation': 'POSITIVE',
 'representative': ('suki', ['母性愛']),
 'text': 'その細い小さな手が自分の手にふれたとき、なにか、身内のあたたまるような快いものがマリラの胸にわきあがった―たぶん、これまで味わわなかった、母性愛であろう。こんなことは初めてなのと、心をとろかすようなその甘さに、マリラは気分をかきみだされた。'}
```

自分の中にいつの間にか芽生えていたアンへの母性愛にマリラ自身が気付かされたシーンです。
いつもツンのマリラが心の中でデレっている感動的な場面。
「好:heart_eyes:」や「喜:grin:」の感情がうかがえます。

## 感情分析のこれからに注目

いかがでしたでしょうか？
意外と簡単に感情分析ができてしまうことに驚きましたね。

感情分析はまだ発展途中で伸びしろがある分野です。これからの研究開発に注目ですね:eyes:

## 参考

私の書いた他のPythonシリーズはこちらです。ご興味があればどうぞ！

https://qiita.com/konitech913/items/61dc715ddaad54505a29

https://qiita.com/konitech913/items/4ef70e1f7753c824b40f

https://qiita.com/konitech913/items/6259f13e057bc25ebc23

https://qiita.com/konitech913/items/c30236bdf47775535e2f

https://qiita.com/konitech913/items/51867dbe24a2a4272bb6

https://qiita.com/konitech913/items/8a285522b0c118d5f905