彼氏の浮気が心配な工学部女子大生ライターのranranがニューラルネットワークを使って、LINEの相手が「おじさん」か「女の子」かを見破れるかどうかを検証していこうと思います。今回使うRCNNというニューラルネットワークは、文字単位で特徴を抽出することができるディープラーニングの手法です。彼氏・旦那さん、彼女・奥さんのLINEの相手が気になるという方の参考になれば嬉しいです!
別に覗こうと思ったわけではない・・・
でも、カフェで不意に彼氏のスマホの画面が目に入ることだってあるだろう。
LINEの内容が目に入ってしまうこともあるだろう。
もちろん、彼氏のことを疑っているわけではないのだ。
しかし、たまたま目に入ったLINEが微妙な内容だった場合、どうしてもその相手が気になってしまう。そのLINEの相手が「おじさん」であれば全く問題ないのだが、もし「女の子」だったら…と考え出すと夜も眠れなくなる。
そこで、眠れない夜を回避すべく、LINEの相手が「おじさん」であるか「女の子」であるかを見破るための分類器を作成することにしました。
ニューラルネットワークとは?
今回は、LINEの内容から「おじさん」か「女の子」かを見破るためにニューラルネットワークを使おうと思います。
ニューラルネットワークは人間の脳を真似して作られています。脳の神経細胞であるニューロンの仕組みをニューラルネットワークでは下記の図のように再現しています。(ニューラルネットワークでもこの部分のことを「ニューロン」と呼んでいます。)
Xという値が入力されると、重みWが掛けられ、バイアスbが足し合わされます。その値が関数fでごにょごにょっと計算され、Yという値が出力されます。このようなニューロンを組み合わせて、下記の図のようにニューラルネットワークは構成されています。
また、ニューラルネットワークには「教師あり学習」と「教師なし学習」というものがあります。今回使ったのは、予め人間が用意した正解付きのデータ(教師データ)を訓練データとしてニューラルネットワークに与える教師あり学習です。教師あり学習では、上記の図のように出力された値と教師データを比較し、正解に近づくように重みWとバイアスbの値を調整していくこと(誤差逆伝播法)で、より正解に近い値を出力できるようにします。
超ざっくりとした説明でしたが、なんとなくニューラルネットワークのイメージを掴んでいただけたら幸いです。ここまでは、シンプルなニューラルネットワーク(上の図は2層ニューラルネットワーク)を例に説明をしてきましたが、この層の数が多いニューラルネットワークを用いた手法のことをディープラーニング(深層学習)と言います。
「おじさん」か「女の子」かを見破るプログラムの作成にも、このディープラーニングの手法の1つである「Recurrent Convolutional Neural Network(RCNN)」を使います。これは、「Recurrent Neural Network(再帰型ニューラルネットワーク)」と「Convolutional Neural Network(畳み込みニューラルネットワーク)」を良いところを組み合わせたニューラルネットワークなのですが、上のニューラルネットワークの調子でRCNNまでを説明しようとすると記事10本くらいは書けちゃいそうなので、またの機会とします。
ニューラルネットワークやディープラーニングについて、もっと詳しくてちゃんと勉強したいという方は、オライリーの「ゼロから作るDeep Learning ――Pythonで学ぶディープラーニングの理論と実装」をぜひ読んでみてください。
「おじさん」と「女の子」のLINEのデータを集める
先ほどのニューラルネットワークの説明にあった教師データを作成するために、まずは「おじさん」と「女の子」のLINEデータを集める必要があります。今回は私の周りのおじさん4名と女の子5名に協力してもらい、おじさんのLINEデータ5,300件、女の子のLINEデータ13,500件を集めました。
このようなデータを「おじさん」と「女の子」に分け、[写真]や[スタンプ]などのノイズを取り除き、教師データとしました。また、データ数に偏りがあると…めっちゃ女の子は見破れるけど、おじさんのLINEはわかんない! などあまり良い分類器を作ることができない可能性があります。なので、今回は女の子のデータからランダムにおじさんと同じ件数のデータを抽出して使いました。
ちなみに、おじさん同士のLINEの入手がめちゃくちゃ難しかった…。今回入手できたのも、おじさん同士のLINEグループのデータでした。そもそも、おじさん同士はあまりLINEをしないのでしょうか? 今後さらに良いデータで分類器を作成するために、おじさん同士のLINEデータを提供してくださる方がいましたら、ご連絡お待ちしております。
ニューラルネットワークに「おじさん」と「女の子」を学習させる
集めたLINEデータをニューラルネットワークに学習させていきます。RCNNは、Pythonのニューラルネットワーク実装用ライブラリの「Chainer」を用いて書かれた下記の「Recurrent Convolutional Neural Networks for Text Classification」のコードを参考に実装しました。
「GitHub – knok/rcnn-text-classification: Recurrent Conventinal NN Text Classification for chainer」
教師データは下記のように作成しました。
おじさんには「0」、女の子には「1」とラベルをつけて、ランダムに並び替えました。
今回はepoch数(学習を繰り返す回数)を100に設定し、教師データを投入し…学習開始!!!
そして、3日経過…(もっと処理速度が早いPCが欲しい)
ようやく100epochに突入し…学習終了。
100epoch終了時での教師データに対する正解率は85.4%でした。
ニューラルネットワークは「おじさん」か「女の子」かを見破れるのか?
協力者のおじさん1名、女の子1名に次の2つのシチュエーションで送るLINEの文章を考えてもらいました。また、協力者の2人にはこの実験の意図を伝えていない状態でお願いしました。
(1) 男性に対して来週の日曜日に遊びに誘うLINE
(2) 女性に対して暇つぶしで相手が何をしているかを尋ねるLINE
まずは、おじさんに考えてもらったLINEから試していきます!
ニューラルネットワークに見破ってもらうLINEがこちらです。
・・・なんか長いっ! とゆうか、「まなちゃん」って誰?!(特にそんな指定していない)
という感想は置いておき、これらの結果を見てみます。おじさんだったら「0」、女の子だったら「1」が推定結果として表示されます。
どちらもおじさあああああん!!!
続いて、女の子に考えてもらったLINEがこちらです。
という感想は置いておき、これらの結果を見てみます。おじさんだったら「0」、女の子だったら「1」が推定結果として表示されます。
シチュエーション(2)については女の子であると見破れたものの、シチュエーション(1)は推定結果がおじさんとなってしまいました。
“かわいいい!!!”
“いま電話だいじょーぶ?”
“ごめんなさい!忘れてきちゃいました!”
ちなみに、私の女友達からのLINEで試して見たところ、上記の3つの文章は女の子であると見破ることができました。
まとめ
今回の結果について私の研究を指導してくれている神奈川大学工学部の佐々木先生に聞いてみました。
「おじさんか女の子かを見破るのって意外と難しいと思うよ。逆に若い男の子とおじさんとか、男の子と女の子のほうが簡単かもしれないね。
女の子のほうが成熟するのが早いし、男はいつになってもガキだから…そういう視点から考えると今回の「おじさん」と「女の子」ってあんまり精神年齢的には変わらないかもしれない。だから、言葉遣いの違いくらいでしか判別できないのだろうと思った。」
今回はおじさんっぽいキーワードや女の子っぽい言葉遣いがあれば、見破ることができるという程度の分類器を作ることには成功したと言えそうです。しかし、この分類器を作る動機となった彼氏のLINEの相手がおじさんであるか女の子であるかを見破りたいときに頼れるレベルへ至るにはもう少し時間がかかりそうです。
今後はもっとたくさんのおじさんや女の子からLINEのデータを集め、より高精度な「おじさん」or「女の子」見破りマシーンを開発に向けて頑張っていきたいと思います。
参考文献
・「ゼロから作るDeep Learning ――Pythonで学ぶディープラーニングの理論と実装」
(https://www.oreilly.co.jp/books/9784873117584/)
・Recurrent convolutional neural networks for text classification
(https://dl.acm.org/citation.cfm?id=2886636)
工学部女子大生とライターをしています。卒業研究で彼氏の浮気を防ぐためにSNS上で彼氏と彼氏のフォロワーの親密度推定に挑戦中。大学院では計量言語学を専攻予定。