Try   HackMD

おしゃべりBotを作ろう

文責: MIS.W 51代 むさしん(プロ研・CG研・MIDI研) @musaprg

このように色付けされているのはすべて注釈です

講座概要

Microsoftが開発した「りんな」ちゃんをご存知でしょうか。あのようなBotは、難しそうに見えますが、意外と簡単に作れます。今回は、プログラミングの専門知識を必要としません。コピペを駆使してBotを作っていきます。

はじめに

わからないことがあったらすぐにGoogle先生に聞きましょう。

(Google) <ぼくに聞いてね!
/||\

「(わからないこと) やり方」とかいったふうに検索すれば必ず見つかります。検索する力はプログラミングにかぎらず必要です。Google先生と仲良くなりましょう。(例:「Twitter Bot 作り方」)

また、この講座はプログラミングの基礎知識を教えるということに関してはガン無視しています。プログラミングの難しい部分はとりあえず抜きにして、なるべくコピペでBotを作っていこうと思います。

最近は、プログラミングブーム(?)というのもあってなのでしょうか、とても素晴らしい入門サイトが世の中には大量に溢れています。そのため、プログラミングの文法について学びたい、という方は、以下参考サイトを頭からじっくりやっていただくことを強くおすすめします。

また注釈でこのようにいろいろ書いてあると思いますが「難しそう」「なにこれ気持ち悪い」「プロ研やめます」と思ったらすっ飛ばしてもらって構いません

Rubyもそうですが、大抵の言語は環境構築に一苦労します。環境構築で挫折してしまう人も少なくはありません。

しかし、環境構築さえ済んでしまえばあとはプログラミングし放題です。

一緒に頑張りましょう!

目次

  1. 環境構築編
  2. Twitterへの登録
  3. あらかじめ設定した文章をツイートするプログラム
  4. リプライに反応する機能の追加
  5. 【応用編】自動短文生成機能の追加

0. 環境構築編

Ruby+Gem(RubyGems)の環境がすでに構築済みの方は飛ばしてください

自分の環境に合わせた項目を参照してください。

今回は、Rubyと一緒にRubyGemsという便利なプログラムもインストールします。

RubyGemsは、Ruby言語用のパッケージ管理システムであり、Rubyのプログラムと("gem" と呼ばれる)ライブラリの配布用標準フォーマットを提供している。gemを容易に管理でき、gemを配布するサーバの機能も持つ。
RubyGems - Wikipedia

RubyGemsは、簡単にいうと、Rubyで使える便利な拡張機能(ライブラリといいます。ここではgemのことを指す。)を簡単にインストールするためのツールみたいなものです。

Windows

1. RubyInstallerを導入

Downloads - RubyInstallerから最新版(現時点では2.3.3)をダウンロードし、実行してください。

64bit版のWindowsの場合はx64と書いてあるものをインストールしてください。

インストール中に出る以下の画面では、Rubyの実行ファイルへ環境変数PATHを設定する.rbと.rbwファイルをRubyに関連づけるにチェックを入れてください。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

インストールが完了したら、コマンドプロンプトを開いて、ruby -vと打ち込んでください。以下のようにバージョンが出たらインストール完了です。(表示されている文字がだいたい同じなら大丈夫です。)

ruby 2.3.3p222 (2016-11-21 revision 56859) [i386-mingw32]

2. RubyGemsのインストール

先程のダウンロードページの下の方に、"DEVELOPMENT KIT"というものがあるはずです。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

上から二番目のDevKit-mingw64-32-4.7.2-20130224-1151-sfx.exeを選択しダウンロード、実行してください。

先程64bit版をインストールした人は、上から3番目のDevKit-mingw64-64-4.7.2-20130224-1432-sfx.exeをダウンロード、実行してください。

ダウンロードしたファイルを実行すると、以下のような画面が出ると思いテキストボックスに、以下の文字を入力してください。

C:¥Ruby23¥devkit

入力すると以下の画像のようになると思います。確認後、Extractボタンを押してください。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

完了後、コマンドプロンプトを開いて、以下のコマンドを一行ずつ入力、実行していってください。

コマンドプロンプトは、Windowsキー+Rで"プログラムの指定と実行"を起動し、cmdと入力しEnterを押すことでも起動できます

cd C:¥Ruby23¥devkit
ruby dk.rb init
ruby dk.rb install

以上でRubyGemsのインストールは完了です。

MacOSX

1. Command Line Tools for Xcodeのインストール

Homebrewのインストールに必要なのでまずはこれをインストールします。

インストールの際には、標準でインストールされているターミナルというソフトを使います。

ターミナルとは、コマンドと呼ばれる命令文を用いてMacの操作や設定をおこなうためのツールです。
通常は利用する必要はありませんが、高度な設定をする場合や、Macでプログラミングをおこなう場合には利用する必要があります。
Windowsにおけるコマンドプロンプトと呼ばれているものとほぼ同じものです。
【出典】今さら聞けない!ターミナルの使い方【初心者向け】

ここでは、詳しい使い方は省略しますので、気になる人は上記リンクを辿ってみてください。

まずは、ターミナルを起動してください。ターミナルは、「アプリケーション」フォルダの中の「ユーティリティ」フォルダ内にあります。
また、Control+SpaceでSpotlightを開いて、"Terminal"と打ち込み、Enterを押しても起動します。

ターミナルを起動すると、以下のような画面が出ると思います。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

引用: http://www.supportdoc.net/support-general/mac-terminal.html

hoge-no-MacBook-Pro:~ hoge$と出てる状態であれば、コマンドを入力することができます。(機種によってここに出る文字は違いますがだいたい同じです)

しばらく待ったのち、以下の文字列(コマンドと呼びます)を打ち込み、Enterを押し、コマンドを動かしてください。

xcode-select --install

コマンドを動かすことを"実行"といいます。コマンドが"動く"ことを"走る"ともいいます。

多くのサイトでは、上記コマンドを$ xcode-select --installと記載しているところが多いです。この時、頭についている"$"という文字は、この文字列がコマンドであることを示す記号なので、実際に打ち込むコマンドはこの記号を抜いた文字列です。

上記コマンドを実行すると、以下のような画面がでます。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Xcodeは、プログラミングを強力に手助けしてくれるIDE(統合開発環境)という種類のソフトです。

プログラミングをする上では欠かせないソフトであり、今後も使う機会が多いため、インストールしておくことを推奨します。

インストール推奨ですが、Xcodeのダウンロードにはそれなりに時間がかかります。「Xcodeいらないよ」っていう人は「インストール」を押してください。

Xcodeをインストールするには、この画面の「Xcodeを入手」を押してください。Mac App Storeが開くと思うので、左上の「入手」→「Appをインストール」をクリックし、インストールを開始してください。

Xcodeの詳細については、公式サイトをチェックしてください。
Xcode - Apple Developer

2. Homebrewのインストール

Homebrewは、Appleの提供していないさまざまなソフトをインストール・管理するためのパッケージマネージャーという種類のソフトです。

インストールするには、以下のコマンドを実行してください。

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrewの詳細については公式サイトをチェックしてください。Homebrew - macOS 用パッケージマネージャー

3. Rubyのインストール

実はMacにはRubyが標準で入ってます。ただ、バージョンがものすごく古いので、最新のバージョンをインストールして使います。

Rubyには様々なバージョンがあり、自分で管理するのは非常に面倒です。そこで、rbenvというツールを使います。

インストールするには、以下のコマンドを一行ずつ実行してください。

$ brew update
$ brew install rbenv ruby-build
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

これでrbenvのインストールは完了です。

では、実際にRubyをインストールします。(最新の安定版であるv4.0.0を使用します。)

インストールするには、以下のコマンドを実行してください。

$ rbenv install 2.4.0
$ rbenv global 2.4.0

これで、インストールは完了です。ruby -vと打ち込み、以下のような文字が出てきたらインストール完了です。

$ ruby -v
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16]

4. RubyGemsのインストール

RubyGemsはMacの場合Rubyのインストールと同時に導入されるので、特にやることはありません。

Linux

気になる人は調べてね。

だいたいMacと同じで、rbenvをインストールすれば大丈夫です。

1. Twitterへの登録

ここでは、プログラムからツイートするために必要なTwitterへの登録作業を行います。

1. Bot用アカウントの作成

Bot用アカウントが不要、自分のアカウントで試しても平気というかたはスキップしてください。

まずは、以下のリンクからBot用のアカウントを作成します。

https://twitter.com/signup

メールアドレスが別に必要なので、もし使ってないメールアドレス等がない場合は、Gmail等のフリーメールを新たに作成してください。

ワンタイムメールというものを使用する手もあります。ワンタイムメールは、指定時間のみ有効のメールアドレスです。そのため、指定時間が経つとメールアドレスが使えなくなってしまいます。注意しましょう。特段の理由がない限りはGmail等で新たにメールアドレスを作るほうが安全です

2. アカウントの電話番号認証

アカウントを作成したら、アカウントに電話番号を紐付けます。

TwitterでBotを作るには、アカウントへの電話番号登録が必須条件になっています。

twitterのトップ画面の右上にあるアイコンをクリックし、設定とプライバシーをクリックします。

モバイルをクリックし、自分のスマホの番号を入力してください。

入力する際に、必ず頭の0を取って入力してください。

例:080-1234-5678 → 80-1234-5678

理由はわかりませんが国際的にはこのように入力しないとダメみたいです。よくわかりませんね…

入力ができたら続けるを押してください。間もなくしてSMS(メッセージ)がTwitterから届くと思うので、そこに書かれている番号を入力し、携帯電話を認証するを押してください。

もし、正常に完了しなかったり、メッセージがいつまでたっても来なかった場合は、新しい確認コードをリクエストするを押してください。間もなくして新しい番号が届きます。

これにて電話番号の登録は完了です。

2. Twitter Appの登録

Botも一つのアプリです。プログラムからTwitterにツイートするためには、このBotをTwitter Appとして登録しなければなりません。

まずは、以下サイトにアクセスしてください。

https://apps.twitter.com

アクセスすると以下のような画面になると思います。右上にSign inと表示されている方は、Sign inをクリックした上で、先程作成したBot用アカウントでサインインしてください。

サインインすると、右上にアイコンが表示されます。

Create New Appをクリックしてください。すると、以下のような画面になります。

ここは、Twitterの連携アプリの登録画面です。今回は、プログラムを通じてツイートをするため、連携アプリの登録が必要となります

各項目は以下のようになっています。

項目名 内容 記入例
Name アプリの名前です。Botの名前などを入れてください。 クソリプちゃん
Description アプリの説明欄です。Botの説明をいれてください。 自動でクソリプを送りつけます
Website アプリの公式サイトへのアドレスをいれます。公式サイトなんて存在しないので、ここではとりあえずhttps://twitter.com/[Botのアカウント名]という形式で登録します。 https://twitter.com/kusorep_chan
Callback URL コールバックアドレスの入力欄です。必須ではないのでここでの説明は省きます。 (空欄)

Callback URLは、OAuth認証完了後のリダイレクト先です。

上記事項の入力が完了したら、下のDeveloper Agreementのチェックボックスにチェックを入れた上で、Create your Twitter applicationをクリックしてください。

これにて、登録は完了です。

3. ツイートをするための鍵を取得

プログラムからツイートができることはいいのですが、誰でも好き勝手に投稿できては困ります。

そのため、Twitterには、Appごとに”鍵”が用意されています。プログラムを使ってツイートするときは、その”鍵”を使わないとツイートができないようになっています。

この鍵にあたるのが、以下の4つのキーワードです。

  • Consumer Key (API Key)
  • Consumer Secret (API Secret)
  • Access Token
  • Access Token Secret

この4つの鍵は、とても重要なものです。決して他人に伝えたりしないようにしましょう。
この鍵さえあれば、あなたのBotアカウントを乗っ取ることは容易いものです。
絶対に他人に教えたりしないようにしてください。

この4つの鍵は、先程作成したアプリの詳細ページにて確認することができます。

もう一度以下アドレスにアクセスすると、先程作成したアプリが追加されていると思います。

https://apps.twitter.com

アプリの名前をクリックすると、詳細ページにとぶことができます。

Keys and Access Tokensというところをクリックしてください。名前的にいかにもここにありそうですね。

クリックすると以下のようなページに移ります。

Application Settingsという文字の下にConsumer KeyConsumer Secretが表示されています。

また、Access TokenAccess Token Secretは、下のほうのCreate my access tokenというボタンをクリックすることで生成、表示されます。

この4つの値は後で使うので、このページは開いたままでお願いします。

2. あらかじめ設定した文章をツイートするプログラム

1. プログラムをつかってツイートをしてみる

…さて、おまたせしました。やっとこ本題です。設定が恐ろしく面倒だったと思いますが、ここまで読み進められる根気さえあれば、もう怖いものなんてありません。一緒に頑張りましょう!

ここからは、適宜コマンドを使っていきます。Windowsの方はコマンドプロンプトを、Macの方はターミナルを起動しておいてください。

最初に、プログラムからTwitterの機能を使うためのgemをインストールします。コマンドプロンプト(ターミナル)に、以下のコマンドを打ち込んで実行してください。

gem install twitter

これで、RubyからTwitterの機能を使うことができます。

それでは、プログラムを書いていきましょう!

まずは、メモ帳(あるいはテキストエディット)を開いて、以下のコードをコピペしてください。

(1)~(4)の部分は、適宜前項でメモした4つの鍵をそのままコピペしてください。

require 'twitter'

client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "(1)"
  config.consumer_secret     = "(2)"
  config.access_token        = "(3)"
  config.access_token_secret = "(4)"
end

client.update("はじめてのツイート! from Tweet Bot")

このファイルを、botscript.rbという名前で、デスクトップ等に保存してください。

.rbという部分は”拡張子”と呼ばれる文字で、ファイルの種類を表しています。普通のテキストファイルは、.txtという拡張子を持っています

保存ができたら、コマンドプロンプト(ターミナル)に目を移してください。

コマンドプロンプト(ターミナル)に、rubyと打ち込み、半角スペースを一つあけた上で、先程保存したファイルをコマンドプロンプト(ターミナル)の画面上にドラッグ&ドロップしてください。

結果的に以下のようなコマンドになれば大丈夫です。

<Windowsの人>
ruby C:¥Users¥Hoge¥Desktop¥botscript.rb
<Macの人>
ruby /Users/Hoge/Desktop/botscript.rb

確認ができたら、Enterを押して実行してください。

何もエラーがでなかったら成功です。

Macの方へ。/Users/Hoge/Desktop/botscript.rb:8:in `<main>': undefined local variable or method `“はじめてのツイート! from Tweet Bot”' for main:Object (NameError)というエラーが出る場合、テキストエディットの「編集」→「自動置換」→「スマート引用符」がオフになっていることを確認してください。オフになってない場合はオフにしてください。

タイムラインを確認してみましょう。

「はじめてのツイート! from Tweet Bot」とツイートされているはずです。

試しに文章などをいろいろ変えて実行してみてください。

エラーが出る場合、正常にツイートされない場合は、同じ文章を二回投稿しようとしていないか確認してくださいね!

さて、リプライを送るにはどうすればよいでしょうか?

以降は、先程作成したbotscript.rbというファイルを書き換えて改良していきます。実行手順はすべて同じです。

2. 定型文ツイーターをつくろう

いちいち文章を書き換えるのは面倒ですね?面倒ですね??(面倒ですね!)

そこで、あらかじめ用意した定型文の中から選んで投稿できるように改良したいとおもいます。

先程のコードに少し手を加えたものが以下のコードです。

require 'twitter'

client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "(1)"
  config.consumer_secret     = "(2)"
  config.access_token        = "(3)"
  config.access_token_secret = "(4)"
end

num = 1
if num == 1 then
  client.update("おはよう")
elsif num == 2 then
  client.update("こんにちは")
elsif num == 3 then
  client.update("こんばんは")
else
  print("その番号の定型文は登録されてないよ")
end

numという文字は、”変数”と呼ばれています。変数は、あらゆる値を格納できる箱のようなものです。num = 1は、numという名前の変数に1を入れる(代入といいます)、という動作を指します。

新たに追加されたif-then-elsif-else-endという文は、”条件分岐”と呼ばれる処理です。一番上から、numの中身が1だったときの場合、numの中身が2だったときの場合、numの中身が3だったときの場合、それ以外の場合といった順番に処理が並んでいます。

この状態で実行すると、一番上の「おはよう」が投稿されると思います。

さて…

このコードのある値を2にすると、「こんにちは」と投稿されるようになります。どこでしょうか…?

また、定型文を増やしたいときはどうすればいいでしょうか…?

正解は…

require 'twitter'

client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "(1)"
  config.consumer_secret     = "(2)"
  config.access_token        = "(3)"
  config.access_token_secret = "(4)"
end

num = 4
if num == 1 then
  client.update("おはよう")
elsif num == 2 then
  client.update("こんにちは")
elsif num == 3 then
  client.update("こんばんは")
elsif num == 4 then
  client.update("新しい定型文だよ!")
else
  print("その番号の定型文は登録されてないよ")
end

おわかりいただけただろうか。

このコードの場合は、4つ目の「新しい定型文だよ!」がツイートされます。

定型文を増やしてみたり、いろいろといじってみてください!

3. おみくじを作ろう

さて、値によって投稿する文章を変える、つまりBotの動作を変えられることがわかりました。

ここでは更に、乱数を使ってランダムに投稿文章を変えたいと思います。

乱数、とは、その字のとおり「乱れた数」、つまり、ランダムな数です。

プログラム上で用いられる乱数は厳密には乱数ではなく、微量ながら規則性が存在しています。しかし、完全な乱数を作り出すことはコンピュータ上では不可能なため、擬似的な乱数、”擬似乱数”を用いています。気になる方は調べてネ

先程のコードに少し手を加えます。

require 'twitter'

client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "(1)"
  config.consumer_secret     = "(2)"
  config.access_token        = "(3)"
  config.access_token_secret = "(4)"
end

num = rand(6) + 1
if num == 1 then
  client.update("大吉")
elsif num == 2 then
  client.update("中吉")
elsif num == 3 then
  client.update("小吉")
elsif num == 4 then
  client.update("吉")
elsif num == 5 then
  client.update("凶")
elsif num == 6 then
  client.update("大凶")
else
  print("なにかがちがうよ")
end

妙な文字が追加されましたね?

rand(6)

実は、これが乱数なんです。

rand(n)は、0〜n-1の値をランダムに選んでくれます。

このような文字のあとにカッコがついたものを”関数”といいます。nをこの関数randの”引数(ひきすう)”といいます。関数は、引数として受け取った値に処理を加えて返してくれます。関数が返す値のことを”返り値”と呼びます。

例えば、実行したタイミングでたまたまrand(6)が1を選んだときは、

num = 1 + 1

というコードに置き換わります。つまり、

num = 2

というわけです。そのため、この場合は「中吉」とツイートされます。

厳密には置き換わる、という表現には語弊があります。気になる方は「プログラミング 関数」で調べてね

3. リプライに反応する機能の追加

1. 自動的に新着ツイートを受け取って出力する

さて、Botたるもの会話できなければ話になりませんね。

そこで、さらに賢いBotにするために、リプライに反応する機能を追加してみましょう。

リプライに反応

先程のコードにさらに修正を加えます。

require 'twitter'

client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "(1)"
  config.consumer_secret     = "(2)"
  config.access_token        = "(3)"
  config.access_token_secret = "(4)"
end
stream = Twitter::Streaming::Client.new do |config|
  config.consumer_key        = "(1)"
  config.consumer_secret     = "(2)"
  config.access_token        = "(3)"
  config.access_token_secret = "(4)"
end

stream.user do |status|
  if status.is_a?(Twitter::Tweet)
    puts status.user.screen_name #ツイートした人のid(screen_nameのこと)
    puts status.user.name #ツイートした人の名前
    puts status.text #ツイート本文
  end
end

突然現れた#なんとかかんとかという文は、コメントという文です。

'#'のあとに続く文字は、プログラムからは見えなくなるので、実行されなくなります。

そのため、コードの中にメモを残したいときは、#こんな感じに書いてください。

新しく追加したstreamは、Streaming APIというものを使うためのものです。対して、先程から使っていたclientは、REST APIというものを使うためのものです。

API(Application Programming Interface)とは、サービスの機能の一部を解放し、自由に使えるようにするためのものです。TwitterのAPIは、本来公式サイトからでないとできない「ツイート」という機能を、自分でつくったプログラムで行うことができるようにしています。詳しいことについてはこちら→いまさら聞けない!APIとは何か?〜基礎の基礎を学ぼう〜

REST APIのRESTは「休む」という意味の英単語です。つまり、REST APIは通常は休んでいる状態です。そのため、呼び出す度に立ち上がり、決められた機能を実行してくれます。Twitterの公式アプリを思い浮かべてみてください。新しいツイートを見るために、皆さんはどうしてますか?ツイートを取得するために、毎回毎回上から下にスライドしてタイムラインを更新しているとおもいます。

Streaming APIのStreamは「流れ」という意味の英単語です。何の流れかというと、今回の場合はツイートの流れです。Streaming APIは、流れてくるツイートを扱うためのAPIです。人によっては公式のTwitterアプリではないものを使ってる人もいると思います。非公式アプリ(クライアントともいいます)の中には、タイムラインの更新をしなくても、自動でツイートがどんどん流れてくる機能を備えているものがあります。その機能がStreaming APIです。

今回は、リプライに反応するbotを作ります。

リプライは突然やって来ます。そのため、常にツイートの流れ(Stream)、つまりタイムラインを監視しなければなりません。

そんなときに使うのがStreaming APIです。

先程載せたコードの下の部分(↓)が、Streamに関する処理です。

stream.user do |status|
  if status.is_a?(Twitter::Tweet)
    puts status.user.screen_name # ツイートした人のid(screen_nameのこと)
    puts status.user.name #ツイートした人の名前
    puts status.text #ツイート本文
  end
end

stream.user do |status|endまでがStreaming APIの処理です。流れてきたツイートに関する動作は、この間に書きます。

流れてきたツイートは、statusという変数に入ります。statusの中にはさらにたくさんの情報が入ってます。それらは、status.userなどとすることによって取り出すことができます。

ただ、流れてくるものはツイートだけではありません。「誰が誰かをフォローしました」とか「誰が誰かをふぁぼしました」みたいな通知も送られてきます。この通知のことをイベント(Event)といいます。

if status.is_a?(Twitter::Tweet)endという部分は、「もしstatusがツイート(Twitter::Tweet)だったら、間に書いてあるコードを実行しなさい」という命令を指します。

statusの中に入ってる情報にはそれぞれ名前が決まっています。

例えば、ツイート本文は、status.textと書くことで取り出せます。

今回使うのは、このくらい情報で十分です。もっとたくさんありますが、気になる人は調べてね

  1. リプライに反応させる

さて、ついにリプライに反応させます。

先程の修正でタイムラインの新着ツイートを自動取得することはできました。

あとは、流れてきたツイートがリプライかどうかを判断して、そのツイートに対する返信をツイートすればいいですね。

その機能を実装したものが以下になります。

require 'twitter'

client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "(1)"
  config.consumer_secret     = "(2)"
  config.access_token        = "(3)"
  config.access_token_secret = "(4)"
end
stream = Twitter::Streaming::Client.new do |config|
  config.consumer_key        = "(1)"
  config.consumer_secret     = "(2)"
  config.access_token        = "(3)"
  config.access_token_secret = "(4)"
end

botinfo = client.user(client.verify_credentials.id) #botのアカウント情報の取得(screen_nameとか)

# 以下がストリームに関する処理
stream.user do |status|
  if status.is_a?(Twitter::Tweet)
    # @(自分のbotのscreen_name)という文字が含まれてたらリプライとみなす。 例: @musaprg ぽきた!w
    if (status.text.match(/^@#{botinfo.screen_name}\s/))
      client.update("@#{status.user.screen_name} すごーい!君はリプライができるフレンズなんだね!", in_reply_to_status: status)
    end
  end
end

これでとりあえず投げたリプライに反応するbotが作れました。わーい!すごーい!

さて、このままだと二回目以降実行したときにツイート文が重複して投稿ができないことがあります。また、単調なリプライは面白くありません。もう少し遊んでみたい人は、先のおみくじbotみたいにリプライ内容を適宜変えるように書き換えてみましょう。

4. 【応用編】自動短文生成機能の追加

ここまでのBotは、ただ決められた文章を吐くだけの、いわゆる”人工無能”でした。

「もっとIntelligenceなBotがほしい…はやりの人工知能を作りたい…」

そんな貴方に、更にAI(っぽい)機能を追加していただきます。


さて、ここからはかなり高度になってきます。

初心者の方はここまでやらなくても大丈夫だと思います。

というより…

Rubyをはじめ、プログラミングの基礎知識を踏まえた上でやったほうが知識定着の観点としてはとてもいいと思います。

ぜひ、一度「はじめに」のセクションでお伝えした参考サイトを一通り修了してもらうことをおすすめします。

そして、腕試しという意味をこめて、この機能を一から実装してもらうと、力をものにできると思います。

1. 理論

ここから先は、自動短文生成機能を支える理論と、それに付随した機械学習にまつわる基礎知識をお伝えします。

実装に関していえばこの講座の趣旨からはずれてしまうので、”わたしはコピペプログラミングしに来たんだぞ!!”っていう方はどんどん実装のほうに進んでもらって構いません!

新歓ブログリレーで51代しくがわ機械学習概論という記事を書いています。数式に触れないようにざっくり、かつ丁寧にわかりやすく機械学習について触れられているとてもよい記事です。正直ここから書く理論の項目は、機械学習を全く知らない素人が書いてるため、あまり参考にはならないと思います。もし理論に興味がある方がいましたら、新歓ブログリレーの方の記事を参照していただくといいかもしれません。

1. 機械学習の考え方

執筆中だよ!

2. 教師あり学習と教師なし学習

執筆中だよ!

3. 隠れマルコフモデル

執筆中だよ!

4. マルコフ連鎖

執筆中だよ!

2. 実装

さて、理論はともかくとして、早速実装していきます。

ここで作ったbotを長く動かしていくと、かの有名なしゅまいくん(@shuumai)のようなものが作れます。

処理の流れは、大まかに以下のとおりです。

  1. 直近100件のツイートを取得し、単語に分解してデータベースにためる
  2. データベースからマルコフ連鎖を用いて短文を生成、ツイート。

ストリームから常にツイートを取得してデータベースにためていく方法もあります。これは、常時稼働させておくbotなどに向いています。

とにかく、今回は手っ取り早くやりたいので、直近100件のツイートでデータベースを作ります。

1. データベースの作成

データベースを扱うためには、SQLというクエリ言語を本来は使用します。しかし、SQLはとても煩雑です。そのため、今回はActiveRecordというGemを使います。

ActiveRecordは、ORマッパーと呼ばれるライブラリの一種です。ORマッパーとは、オブジェクト(Object)とリレーショナルデータベース(Relational Database)を関連付けて扱いやすくするためのライブラリです。ActiveRecord自体は、Railsと呼ばれるWebフレームワークに包含されていますが、今回の場合のように単体でも使用することができます。詳しくは→ActiveRecordの基礎

まずは、ActiveRecordのGemをインストールします。同時にSQLiteというGemも必要なのでインストールします。

$ gem install activerecord sqlite3

SQLiteは、リレーショナルデータベース管理システム(RDBMS)と呼ばれるものの一つです。RDBMSは、他にもMySQL、PostgreSQL、SQL Serverなどがあり、それぞれ無料だったり有料だったりします。SQLiteは無料かつとても動作が軽量なRDBMSなので、小規模なデータベースで十分という場合には最適です。よく使います。

インストールが完了したら、データベースを作成するコードを書いていきます。

新しくフォルダを作って、その中で作業していただくことをオススメします。

エディタ等で新規ファイルを作成し、以下のコードを貼り付けた上で、dbinit.rbという名前で保存してください。

require 'active_record'

ActiveRecord::Base.establish_connection(
  :adapter => 'sqlite3',
  :database => 'db.sqlite3'
)

ActiveRecord::Migration.create_table :corpus do |t|
  t.string :word1
  t.string :word2
  t.string :word3
  t.timestamps
end

ちなみに、SQLで書くと以下のようになります。

create table corpus(
    id integer primary key,
    word1 text,
    word2 text, 
    word3 text,
    create_at,
    updated_at
);

書けて保存ができたら、実行しましょう。

$ cd <スクリプトがあるディレクトリ(フォルダ)>
$ ruby dbinit.rb
-- create_table(:corpus)
   -> 0.0183s

こんな感じに表示されると思います。

実行が完了したとき、スクリプトがあるフォルダにdb.sqlite3というファイルが作成されていたら成功です。

2. タイムラインから流れてきたツイートを形態素解析しよう

さて、マルコフ連鎖を使って短文を生成するには、文を単語ごとに分解(分かち書き)しなければなりません。

英語の場合は、単語と単語がスペースでわかれているので、半角スペースごとに分解すれば簡単です。

しかし、日本語の場合はどう切り分ければいいのでしょうか…?

実は、日本語の場合は、形態素解析というものを用いて単語に分解します。

形態素解析のライブラリは色々種類がありますが、今回はMeCabと呼ばれる形態素解析ライブラリを使います。

Rubyには、MeCabを使うためのnattoと呼ばれるGemがあるので、今回はそれを活用します。

詳しい説明は→ natto - GitHub

とりあえずはnattoをインストールしましょう。

$ gem install natto

参考サイト

http://qiita.com/shimoju/items/41035b213ad0ac3a979e
https://tsuchikazu.net/mac_rail_setup/
http://qiita.com/ringo/items/4351c6aee70ed6f346c8
http://qiita.com/kimioka0/items/8c10e01def23fdbf3aa6
http://qiita.com/foloinfo/items/6ecfe3c5fd1b56f1dceb
http://tondol.hatenablog.jp/entry/20120311/1331470586