Emotion 分析 (ML-Ask, IBM Watson)

自然言語処理の一つのタスクとして感情分析があります。人間同士であっても相手の感情を理解することは難しいですし、状況によっても受け取り方が異なります。

なお、言葉の定義として当サイトでは、ポジティブ、ネガティブ、ニュートラルといった「感情の極性」を推定する事を”sentiment分析”、喜怒哀楽といった「感情の種類」を推定する事をemotion分析としています。

今回は、テキスト(字面)のみを用いる既存のEmotion 分析でどのような結果が得られるのかを試してみたいと思います。

ML -Ask

昔からあるemotion分析としては、「ML -Ask」があります。ML-Askは、「喜・怒・昂・哀・好・怖・安・厭・驚・恥」の10種類の感情を抽出するというモデルということです。pythonのライブラリとして提供されているために、非常に簡単に分析することが可能です。ただ、感情表現辞書をベースに判定をしているために、かなり直接的な単語がないとうまく判定できないことがあります。つまり、一つ一つのセンテンスを判定するというよりは、大量のデータの特性を見るのに適していると言えるかと思います。例えば、大量のSNSの投稿に含まれる感情を、傾向分析する時などは有効であると言えます。

使い方は、ライブラリと辞書とをインストールして、以下の3行のコードを実行するだけです。Google Colabなどで、気軽に試すことができます。

#ライブラリのインストール
!pip install pymlask
#辞書のインストール
!apt install aptitude
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3==0.7

#textに分析対象を入れて実行
from mlask import MLAsk
emotion_analyzer = MLAsk()
emotion_analyzer.analyze("text")

例文

以下、5つの例文を試してみました。

1)emotion_analyzer.analyze("彼のことはあまり好きじゃないな")

{'text': '彼のことはあまり好きじゃないな',
 'emotion': defaultdict(list, {'iya': ['好き*CVS']}),
 'orientation': 'NEGATIVE',
 'activation': 'NEUTRAL',
 'emoticon': None,
 'intension': 1,
 'intensifier': {'interjections': ['じゃ']},
 'representative': ('iya', ['好き*CVS'])}

2)emotion_analyzer.analyze("彼のことは苦々しく思ってますよ ")

{'text': '彼のことは苦々しく思ってますよ  ',
 'emotion': defaultdict(list, {'iya': ['苦々しい']}),
 'orientation': 'NEGATIVE',
 'activation': 'NEUTRAL',
 'emoticon': None,
 'intension': 0,
 'intensifier': {},
 'representative': ('iya', ['苦々しい'])}

3)emotion_analyzer.analyze("彼のことは弟のように思っています")

{'text': '彼のことは弟のように思っています', 'emotion': None}

4)emotion_analyzer.analyze("彼のことは弟の様に可愛がっています")

{'text': '彼のことは弟の様に可愛がっています',
 'emotion': defaultdict(list, {'suki': ['可愛い', '可愛いがる']}),
 'orientation': 'POSITIVE',
 'activation': 'NEUTRAL',
 'emoticon': None,
 'intension': 0,
 'intensifier': {},
 'representative': ('suki', ['可愛い', '可愛いがる'])}

5)emotion_analyzer.analyze("彼のことは弟の様に可愛がっていたのに")


emotion_analyzer.analyze("彼のことは弟の様に可愛がっていたのに")
{'text': '彼のことは弟の様に可愛がっていたのに、、、',
 'emotion': defaultdict(list, {'suki': ['可愛い', '可愛いがる']}),
 'orientation': 'POSITIVE',
 'activation': 'NEUTRAL',
 'emoticon': None,
 'intension': 0,
 'intensifier': {},
 'representative': ('suki', ['可愛い', '可愛いがる'])}

如何でしょうか。直接的な感情表現がない3)や、文章が省略されている5)は難しかった様です。確かにこれらの文章は、人間でも人によって取り方が変わるかと思います。

IBM Watson Natural language Understanding

クラウドサービスで感情分析というと、Sentiment分析を指すことが多いようです。私が調べた範囲では、一般的なクラウドサービスでemotion分析を提供しているのは、IBMだけでした。IBMのサイトにもオンラインデモがあるのですが、残念ながら日本語には対応していません。(IBM Watson Natural Language Understanding Text Analysis)

そこで、Googleの機械翻訳と組み合わせたEmotion分析を作ってみました。日本語を入力したのち、一旦翻訳ボタンで翻訳してから、分析実行ボタンを押してください。

うまく表示できない時のDemoサイトはこちら

このサービスでは、Emotionを「Sadness, Joy, Fear, Disgust, Anger」の5種類の感情で表します。正直なところ、ネガティブな感情が4つに対してポジティブな感情が一つしかないことは疑問です。(もしかしたら、ビジネスのフィールドにおいてはネガティブな感情を分析することが重要なのでしょうか。)

emotion分析のベースとなる感情モデルとしては、ラッセルの2次元感情モデルとかプルチックの感情の輪などがあるようです。専門外なので個別の解説はできませんが、そもそも人間の感情を分類して数値化する事が難しいということなのかもしれません。

それでも、利用者の感情を推測するということは、今後の対話型のソフトウエアには必要になってくることでしょう。