メリークリスマス!emokoです。突然ですがみなさん、聖なる夜はだれと一緒に過ごしますか?
まだ相手が見つからないみなさん、今から好みのイケメンにアタックしてみるのもいいでしょう。ですがここはオタサーです。いい男なんて希有な上に、いたとしても大抵すでに相手がいます。
ではどうすればいいのでしょうか? ……彼氏を作ってしまえばいいのです。
1. 彼氏を作る前に準備すべきもの
1. 愛
一番重要なものです。愛に対する理解がないと彼氏を作ることは出来ません。昨日のむさしん氏執筆の「愛について」を読むといいでしょう。
2. R
R言語は、オープンソースの統計解析向けプログラミング言語です。特に機械学習の分野での利用頻度は、Pythonと双璧をなしています。
15年前、モーニング娘。はこう歌いました。
これほど表計算が発育したコンピュータでも女の子のニュアンスは割り出せない! Say Yeah!~もっとミラクルナイト~ より引用(Amazon)
ですが男心は単純なのでRを使えば一瞬で割り出せます。とりあえず統計数理学研究所のミラーから、自身の環境にあった実行環境をダウンロードしインストールしておきましょう。
3. R Studio
こちらのダウンロードページから、自身の環境に合ったものをインストールしておくと便利です。
2. おしゃべり彼氏をつくる
それでは彼氏を作ります。今回は、TwitterのSampleStream(世界中でつぶやかれたTweetの1%をダウンロードできるすごいAPI)を元にコーパス(辞書)を構築し、それを利用してべらべら喋らせることにします。
1. 必要なパッケージをインストールする
今回は、
- rjson(Twitterから取得したjson形式のデータを整形するために使用する)
- streamR(RからTwitterのAPIにアクセスするために使用する)
- ROAuth(Twitterの認証に使用する)
- RSQLite(データベースの構築に使用する)
の4つのパッケージを使用します。今回はお手軽がモットーなのでMeCabとかは使いません。
RStudioを起動し、右下のコンソールに以下の通り入力すればインストール完了です。
>install.packages("rjson") >install.packages("streamR") >install.packages("ROAuth") >install.packages("RSQLite")
2. TwitterのAPIキーを取得する
今回は、Twitterのツイートからコーパスを生成します。TwitterのAPIを利用しているため、まずはTwitter側にアプリケーションの登録作業が必要になります。
こちらから、Create New Appを選択し、画面の指示に従い連携アプリを生成します。
すると以下のような画面が表示されるので、「Key and Access Tokens」のページの情報を元にRでTwitterにログインします。
3. RでTwitterにログインする
生成したアプリケーションのページの「Key and Access Tokens」のページの情報を元に、Rのコンソールに次のように入力します。
#必要なパッケージを読み込む library(streamR) library(ROAuth) #おまじない requestURL <- "https://api.twitter.com/oauth/request_token" accessURL <- "http://api.twitter.com/oauth/access_token" authURL <- "http://api.twitter.com/oauth/authorize" consumerKey <- "アプリ情報ページのConsumer Keyをコピペする" consumerSecret <- "アプリ情報ページのConsumer Secretをコピペする" #ログイン情報をtwitter_oauthに格納する twitter_oauth <- OAuthFactory$new(consumerKey=consumerKey, consumerSecret=consumerSecret, requestURL=requestURL, accessURL=accessURL, authURL=authURL) #twitter_oauthをファイルに出力する save(twitter_oauth, file = "oauth.RData")
これで準備は出来ました。あとは、ひたすらコーパスとなるツイートをダウンロードし続けるだけです。
4. SampleStreamに接続しツイートをダウンロードする
左上のスクリプトエディタに、次のコードを打ち込みます。ファイル名は何でも大丈夫ですが、ここでは仮にgetTweet.Rとします。
getTweet.R
#必要なライブラリを読み込む library(streamR) #先ほど生成したログイン情報を読み込む load("oauth.Rdata") #以下無限ループ while(T){ file.remove("temp.json") starttime <- format(Sys.time(), "%Y年%b%d日%X") #SampleStreamを600秒間取得し、temp.jsonに保存する sampleStream(file.name ="temp.json", oauth = twitter_oauth, timeout = 600) #temp.jsonを./json/フォルダの%Y年%b%d日%X.jsonにコピーする file.copy("temp.json",paste0("./json/",starttime,".json")) }
以上のスクリプトを実行すると、./json/フォルダの中に以下のようなファイルが溜まっていきます。(10分間で約130MB!)
ちなみに、ダウンロードしたjsonファイルの中身を覗いてみると以下のようになっています。
library("streamR") View(parseTweets("./json/2016年12月25日23時13分40秒.json"))
たったの10分間でツイートが3万件……
最後に、これらのjsonファイルから必要な部分のみをsqliteのデータベースに抽出格納するとコーパスは完成します。
5. jsonファイルの中身を抽出しsqliteのデータベースに格納する
R言語において、jsonファイルは若干扱いにくいです。R言語では一般的にデータフレームが利用されますが、こちらもデータの永続化には向いていません。そこで今回は、sqliteによるデータベースを利用します。
makeDB.R
library("streamR") library("RSQLite") #SQLの接続を確立する con <- dbConnect(SQLite(), "tweets.db") #jsonフォルダ内の各ファイルについてループ for(i in dir("./json")){ cat(i,"\n") df <- parseTweets(paste0("./json/",i)) #日本語のツイートのみ抽出 df <- df[df$lang == "ja",] #以下スパムよけ df <- df[is.na(df$url),] df <- df[grep("twitter.com",df$source),] df <- df[df$retweet_count == 0,] df <- data.frame("id_str" =as.character(df$id_str),"screen_name" = as.character(df$screen_name),"text" = as.character(df$text),"in_reply_to_status_id_str" = as.character(df$in_reply_to_status_id_str),"created_at" = as.character(df$created_at)) #データベースに書き込む dbWriteTable(con,"tweets",df, append = TRUE) file.remove(paste0("./json/",i)) } dbDisconnect(con)
以上のコードを実行すると、./json/フォルダ内のjsonファイル達がデータベースに変換されていきます。これでコーパスは完成です。
7. どうやって喋らせる?
あとは彼氏に喋らせるだけです。
原始的な方法としては以下のようなものがあります。
- 適当なツイートの適当な文字を一文字選択し、バッファに格納する
- その文字が含まれるツイートをリストアップし、その中からツイートを一つ選択し次に続く文字を選択する
- 選択した文字をバッファに格納し、2繰り返し
ただこの方法では支離滅裂な文章が生まれてしまいがちなため、実際には複数の文字を同時に選択します。(いわゆるn階マルコフ)
(ここから先は読者のみなさんの創意工夫に丸投げしますここから先は12/25に間に合わなかったので近日中に加筆修正しますごめんなさいごめんなさい)