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

Tumble Tumble

shichiのプログラミング雑記です。プログラミング関連のことはここに書き留めていこうと思います。嘘ですなんでも書きます。イラストなどが掲載してあるページはこちら→http://shichichaos.tumblr.com/

【理論編】 簡易な環境でできるR言語による人工無能TweetBot

R言語 人工知能 機械学習

はじめに

R言語(Ross Ihaka氏とRobert Clifford Gentleman氏により作られた統計処理言語)を用いてどのように人工知能(無能)TweetBotを実装するのか学ぶと共に、その実装理論を理解する手助けとして作成しました。皆様の人工無能ライフの第一歩を踏みだす手助けと慣れれば幸いです。また、今回実装するにあたってtwitter、R、またそれに付随するライブラリの仕様は更新日時点の最新仕様です。 

簡易な環境とは?

Rさえインストールすれば他には何もいりません。通常機械学習などをさせるにはデータベースなどの知識が必要になるのですが、それもいりません。なぜなら私が知らないからです。この記事にしたがって完成するのは、プログラミング初心者が自分の持ち合わせている知識で何とか動くに至った人工クソ無能botであるということをご了承下さい。

どんな感じの人工無能が作れるの?

私の作成したspica (@spica_egg) | Twitterというbotを見ていただけるとすんなりと理解していただけるでしょう。

f:id:pandorina463:20170121003540p:plain


spicaはR言語によって実装されたTweetBotで、SampleStreamや各種sns、小説、ウェブサイトなどを形態素解析し、マルコフ連鎖を用いることによって色々な文章を生成しています。これより先は公式HP:http://pandorina463.wixsite.com/spica とTwitterspica (@spica_egg) | Twitter を見ていただき、どんなもんかなんとなく理解していただいた前提で執筆させていただきます。ご了承ください。

理論編 (1/4) - 序論

「俺はさっさと人工無能が作りたいんじゃボケ!」って人は飛ばしてください。しかしながら理論をなんとなく分かっていると改造したり修正したりする際に楽になるかと思われます。

まずTweetBotを作る際に大事なことは「喋ること」ですよね。

例えば喋るにしても色々あるわけで、沢山の文章を入力しておいて、その中からランダムで引っ張ってきても「喋る」botは出来るわけです。

現に用途の限られたbot(歌詞をツイートしたりアニメキャラのセリフを言ったりするようなbot等)に関しては喋る文字列をあらかじめセットしておき、ランダムである時間につぶやくといった仕様になっているはずです。これを最も基礎的なbotと位置づけましょう。
しかしながら、今回我々が作りたいのはこの最も基礎的なbotではありません。人間のように自由に喋る感情豊なbotを作りたいのです。そこでそのためにどのような概念が必要になるのかを見ていきましょう。

理論編 (2/4) - 機械学習の基本的学習法

教師つき学習と教師なし学習

教師つき学習というのは出力と正答がセットになっている学習方法です。今回のように文章生成するような場合には、各単語や文章の結びつきを何らかのベクトルなどとして処理し、数値処理ができるようにしてやる必要があるかもしれませんね。(そこら辺は実装にお任せしますが。)
過去のデータから将来を予想したりするのにも使われたりします。
逆に教師なし学習というのは出力に対して正答がセットできないような曖昧な場合について用いられます。
何らかの基準を設け、データセットを分類して記憶したりするのに使います。分類の仕方は色々なやり方がありますが、ユーザー側からいくつか条件を付与することによって最適な分類をすることができます。
今回の人工知能TweetBotではこの二つの学習法のミックスで実装していきたいと思います。

理論編 (3/4) - マルコフ連鎖

マルコフ連鎖の詳細な定義については数学が苦手なので省かせていただきます。
マルコフ性が存在する状態とは、
状態が {q0, q1, q2, q3, ……, qn-1} のn通りを取るような状態遷移において、現在の状態が qi であった時に次の状態 qj に遷移する確率は純粋に次の状態と現在の状態のみで記述され、 P(qj | qi) で決定される。
状態です。めちゃくちゃ簡単に言うと次の状態が過去ではなく、現在(n=1)の状態にのみ依存するという性質。
文章生成におけるマルコフ連鎖ではこのマルコフ性を仮定した上で話を進めることとします。

n階層マルコフ連鎖

マルコフ性でいう「現在の状態」が「現在からn-1過去の状態の範囲」にまで拡張されたものです。このn階層マルコフ連鎖がTweetBot実装に大きな役割を果たします。
実際に実装する際には、まだ学習語数が少ないうちは低階層のマルコフ連鎖を、多くなるに従って中階層、高階層のマルコフ連鎖を実装するとより人間らしいTweetBotになるかと思われます。ちなみに語数が少ないうちに高階層のマルコフ連鎖を実装すると、原文そのままを吐き続ける無断転載botが誕生します。

理論編 (4/4) - 形態素解析

形態素解析とは、文章を意味のある最小単位に分類していくことです。
例えば、私はパンを食べましたという文章を形態素解析してみましょう。すると、私/は/パン/を/食べ /まし/た というように分類されるのです。本来ならこれに名詞、形容詞等の情報も付加されるのですが、今回は使用しないので省かせていただきます。

終わりに

次回は実際の実装の様子をコードも踏まえて解説したいと思います。

実践編です。よろしくお願いしますね。以上です。