みなさんは、今日何人の方と話されたましたでしょうか。
そして、話された一人一人に対して、”どのような自分”で接しましたでしょうか。

「コンビニ店員とのレジでの事務的なやりとり」
「会社のエレベーターで、さして仲良くない同期と2人きりになったときの苦々しい会釈」
「突然かかってきた親からの電話に対する無愛想な返事」
くらいしかないかもしれませんが、1日の中でも、社会生活を営むにあたり、
人間は、多面性(複数の顔)を持つことが、ままあるかと思います。


“日本の東京に住む自分”、
“ある企業の会社員としての自分”、
“親(あるいは子)としての自分”、など様々な自分の側面がいるかと思います。

そして同じ”会社員としての自分”の中でも、
“スプラトゥーンのオンライン対戦で、毎晩盛り上がる同僚A”
“顔は思い出せるが名前が出てこず、廊下ですれ違おうものなら、
思わずスマホ画面に目を落としてやり過ごしたくなる同僚B”
では、
また異なる自分が表れるかと思います。


自己理解とは、結局のところ、他人(社会)に相対する自己理解、でして、
どのようなTPO、立場、社会、心理的距離のときに、自分がどのように振る舞うか、を自覚することとなります。

そこで、今回は、
“多面的な自分と向き合うことができるチャットボット”を作成しようと思います。
自分のつぶやきに対して、”様々な人格の自分”が、AIにより自動で返事をくれるもの、でして、
最終成果は以下のようなものとなります。

multichatbot


作成手順は、下記の通りとなります。
(1) 様々な方とのチャット、メール履歴から自分の発言のみを抽出
(2) “それぞれの相手ごとに”自分の発言を機械学習
(3) 上記の学習モデルをもとにウェブアプリを実装


それでは順に記載していきます。

| (1) 様々な方とのチャット、メール履歴から自分の発言のみを抽出

まずは、チャットボット用に、学習データを収集していきます。
多面的な自分のログを収集するため、
様々な関係の人との対話ログを、各種SNSなどから収集していきます。
なお、Facebook、LINE、Gmail、などの具体的なログの収集方法については過去記事をご参照くださいませ。

「LINEのトーク履歴を取得する。」
「facebookのデータを取得する。」
「Gmailのデータを取得する。」
「SMSの履歴を取得する。」

今回、私の場合は、特に関係の濃い友人や会社の同僚など、4人の対話ログを選定しました。
※逆に言うとこの4人以外とは、チャット上ですら事務的な内容がほとんどとなります。(真顔)


| (2) “それぞれの相手ごとに”自分の発言を機械学習

次にそれぞれのSNSの各人との対話ログから“自分の発言”を抽出します。
今回は、“それぞれの友人が言いそうなこと”を学習するのではなく、
“それぞれの友人ごとに異なる自分が言いそうなこと”を学習するためです。

各SNSでフォーマットが異なりますが、どのログも発言者のセルがありますので、pythonなどで前処理しておきましょう。
得られたログを、下記のような形で、各人それぞれに分けて、.txt形式で保存しておきます。

text_log

こちらのログを、形態素解析し、マルコフ連鎖にかけます。
形態素解析で区切られた単語ごとに、
マルコフ連鎖を用いて、ある単語の次にどのような単語が来る確率が高いかを分析することになります。
これにより、ある単語をトリガーとして自動で文章を生成することが可能となります。
※下記は、会社の同僚とのチャットログを元に、
 jupyter notebook上で、ランダムに3つの文章を生成した様子。

markov_text


| (3) 上記の学習モデルをもとにウェブアプリを実装

それぞれの友人との対話ログごとに、上記までの学習結果によって、
各人に対して接するときの自分が言いそうな単語辞書(およびマルコフ連鎖的なつながり)を配列としてjsonで書き出しておきます。

あとはウェブアプリの実装です。
入力されたテキストに対して、このjsonを都度処理して、文章を自動生成することにします。
今回は学習をpythonでやったので、ウェブアプリもpythonで実装し、
aws上にアップロードして動作させました。


それでは結果を見てみましょう。
入力したテキストに対して、
友人に接するときの自分、会社での自分、家族と話すときの自分など、様々な私が返答をくれる、
世界で初めての(?)多面的な自分と向き合うためのチャットボットです。


まずは無難なところから。
「ご飯を会社付近で食べるか、帰ってから食べるか」
のような些細な話題をふってみましょう。

python_markov

上記のように、多面的な自己が、それぞれバリエーションある答えを返してくれます。

自己1、なぜ詰めてくる。
自己2、急に深刻。
自己3、インスタグラマー??
自己4、お腹減りすぎ、錯乱しすぎ。


「もうウンザリだよ」と病んでるセリフをつぶやいてみましょう。
自分はどのようになぐさめてくれるでしょうか。

python_markov

自己1、厳しすぎだろ!!
自己2、ちょっとイミフ。
自己3、なんだか焦ってる様子が伝わってきて愛おしい。
自己4、素直に優しいですね。


同じセリフをつぶやいても、
毎回異なるセリフが自動生成されます。
「資料作らなきゃ」と切羽詰まっているセリフを投げてみましょう。

python_markov

自己1、ヤバイ。出来るやつ。
自己2、なんか軽いし。
自己3、素直だ。
自己4、ハードなスケジュール!

もう一回同じセリフをつぶやいてみましょう。

python_markov

自己1、一転、完全にダメなやつ。いいのでは?じゃないし、よくないし。
自己2、なんか軽いし。
自己3、素直だ。
自己4、時間を区切ってきた!


その他、様々な問いかけに対して、自分が返答してくれます。

python_markov

念のため申し上げますが、上記の様々な自己が返答するセリフは、
私が過去に発言したログそのままをランダムに抽出しているのではなく、
形態素解析によって区切られた単語を
マルコフ連鎖に基づいて自動生成したものになります。

よって、上記のような発言を過去私がしたわけではございません。
一気に距離感を詰めませんし、
インターステラーを観る、をなんとか、ねじこみませんし、
旅行客向けのフリーペーパーをデザインしたこともありません。


完全に自分の意外な側面を突きつけられた気分です。
そういう意味では目的を達成し、かつウェブアプリとして完成しているのですが、
予期せぬ返答から思わぬプライバシーの流出につながることを懸念し、
一般公開は控えさせていただきます。


以上、多面的な自分と向き合うためのチャットボットでした。