読者です 読者をやめる 読者になる 読者になる

にほんごのれんしゅう

日本語として伝えるための訓練を兼ねたテクログ

emotion2vec

emotion2vec

テキスト感情ベクタライザの提案 〜 doc2vec, fasttext, skipthoughtに続く第四のテキストベクタライザ 〜
ジョーク投稿です。正確なリプレゼンテーションかどうか、十分な検証をする必要があります)

感情は難しい

 コミュ症の人が何らか相手の感情を察しようとした場合、既存の知識や経験に基づいて相手が何を意図しているのか、把握することが難しいという悲しい事実があります。
 ディープラーニングってやつでなんとかして!案件ですね。

f:id:catindog:20170322223403p:plain
ここでは、感情を定量的に解析して確認する手法を提案します。

リプレゼンテーション(表象)の選択

 最も端的に感情を示している素性は何でしょうか。映像ではその人の行動であったり、表情であったりします。
 テキストの世界では、最近の若い人たちは、絵文字というものを使うことがあります。絵文字はその文脈では伝えきれてない感情を絵文字の表現力を借りて表現する場合で有効であります。

例) 
💢 -> ムカつく
❤ -> 好き好き
♪ -> 気分が上昇している

 なるほど。漫画はよく読むのでよくわかりますね。なんで漢字の書き取りがあって、絵文字の書き取りは小学校ではやらないんですかね。
 テキストにおいては、絵文字がそのテキストの秘められたリプレテーション(表象)になっているように仮説が立てられそうです。

手法

 Word Level CNNを用いて、テキストをベクトル化します。ベクトル次元数は2014次元で大きいです。
 Twitterのフリープランで400万ツイートものツイートを頑張って集めました。これを分かち書きして、fasttextで分散表現に置き直します。
 分散表現で記された文章をCNNにかけて、そのツイートに内在されていたはずの絵文字を予想するタスクを与えます。複数の絵文字がある場合、複数予想させます。
 結果として、感情を示すベクトルが獲得できるようになります。

  (epochは前回CNNでのテキスト認識で用いたoverfitにならない25epochを適応)
 optimizer:adam
  window size:1,2,3,4,5
  input-vector:256dim * 30dim
  output-vector:2048dim
 その他諸々はコードを参照ください

f:id:catindog:20170322230510p:plain

イメージ図。Ubuntuのimpressで作ったが見切れてる

コード

(商用利用する際には一声くださると助かります)
github.com

結果

 今回のemotion2vecは極端な不均衡データでありました。そもそも感情は自然に分布しないと思うので、それはいいのですが、特定の♪などの絵文字リプレゼンテーションになりがちになりました。
(テキストは小説家になろうの「蜘蛛ですが何か」からお借りしました)

text.ないわー。 
 😭 87 😂 5 💢 4 😳 32 💓 2 🙄 2 💗 22 😑 222 😊 2 👍 1 😢 1 💕 11 😇 1 💩 1
(悲しくて起こっている感情のベクタ) 
text.これで私は自由だー!
 ♡ 765 💕 5 😭 4 😂 4 😊 4 💓 3 👍 3 💗 3 🏻 2 😆 2 😍 22 🙌 2 😳 1 🙏 111 😌 1 
(自由の感情のベクタ)
text.《熟練度が一定に達しました。スキル『蜘蛛糸LV3』が『蜘蛛糸LV4』になりました》 
★ 945843 
(なんか事務口調のテキストには星がいっぱいつきます)
text.あ、でも蜘蛛猛毒だと大抵の相手は即死しちゃうな。
😱 8 💢 8 😭 7 😨 7 😡 6 💥 6 😇 55 💦 5 😂 4 😅 4 🏻 4 🙏 43
(ムンクっぽい何か)
text.マジかー。
😭 16 😂 6 😇 3 😳 3 😍 2 😢 2 😱 2 💕 22 🙄 1 💗 1 💓 1 💢 11 🙏 1 💦 1 🙈 1 😌 1 😅 1 
(マジかー)
text.「クソッ!?」
♡ 17 💢 10 💩 921111
(うんちのお気持ち)
text. うるせぇ、てめえ、ぶっ殺すぞ 
💢 99
(わかる) 
text. あのあの、エッチなのはダメなのです
♡ 257 💕 3 💦 3 😭 322 😂 2 😢 2 😊 11 😅 1 😇 1 😑 1 😌 1 
(ちゃんとハートと汗があるよ、電ちゃんっぽい発言を意図しました)

考察

Word LevelじゃなくてChar Levelのほうがよかった気がする。
強い感情に引っ張られて大きなウェイトがつくので、感情の起伏を定量的に記すのもいいかもしれない

まとめ

 じつはこれはText GAN(SeqGAN)の副産物だったりします。SeqGANにはとにかく前処理が山ほどあって、なんとなく学習までのイメージがあるのですが、遠いです💦