モンテカルロ法を用いた円周率の近似値算出

標準

今日は先日暇つぶしでやってみた、モンテカルロ法を用いた円周率の近似値を求めるプログラムについて書いていきます。

モンテカルロ法とは

モンテカルロ法とは何かしらの数値計算を乱数を用いて近似値を得る手法の総称です。「モンテカルロ」という名前はカジノで有名な都市の名前からとられたそうです。このモンテカルロ法は円周率を求める以外にも「巡回セールスマン問題」などの数値計算も可能にする、使いによってはとても優れた計算手法です。ではまずはこれを使ってどう円周率の近似値を得るか考えていきます。

どうやって円周率を求めるか

まずは半径r=1、中心角θ=90°の扇形を描きます。この時の扇形の面積Sは、それをちょうど覆う正方形の面積 1×1=1 に対してS=pi/4になります。

上記の図の正方形の左下の頂点を座標平面の原点と定めて、点(x,y) (但し、0≦x≦1, 0≦y≦1をいずれも満たす)を乱数を用いて定めます。そうすると、試行回数Nに対して定めた点が扇形に含まれる回数Xの割合は、正方形に対する扇形の面積の割合に近似して、これを用いるとpiは以下のように近似させることが出来ます。

ちなみに、定めた点が扇形に含まれているかどうかは原点からの距離dが1以下であるか否かで判別することが出来ます。

実際に求める

今回は自分が一番得意なPHPを使って円周率の近似値を得ようと思います。

<?
//変数初期化
$count=0;
$start=1;
$max=100000000;
for($i=$start;$i<=$max;$i++) {
    //点を定める
    $x=(double)(mt_rand(0,1000000000)/1000000000);
    $y=(double)(mt_rand(0,1000000000)/1000000000);

    //距離を三平方の定理を用いて算出
    $d=$x*$x + $y*$y;

    //扇形に含まれる場合
    if($d <= 1.00000000) {
        $count++;
    }

    //結果出力
    print(sprintf("( %.9f , %.9f ) d = %.9f ( %d / %d ) pi = %.9f\n",$x,$y,$d,$count,$i,4.0*($count/$i)));
}
//最終結果出力
$pi=4.0*($count/$max);
print(sprintf("%.9f",$pi));
?>

PHPでは乱数(正確には「疑似乱数」)を生成する関数として、rand()mt_rand()random_int()などありますが、今回はより高速に、より良い(偏らない)乱数を生成出来るという特性をもつメルセンヌ・ツイスターを利用したmt_randを用いてみました。

早速これで1億回試行してみると以下のような値を取得することが出来ました。

pi = 3.141529200

(たまたま)小数点以下4桁まで正確に算出することが出来ました。この算出結果は、1億回の試行でも大きく外れてしまうこともありますし、精度良く求めることもあるという揺らめきの中での算出とはなりますが、いかにして精度良く算出できるか、極める価値がありそうですよね。

今回はこれで以上です。

Mastodonのカスタム方法

標準

Mastodonのインスタンスを構築する方法は検索すれば山ほどヒットするので、その分資料が少ないインスタンスのカスタム方法について今日は説明します。インスタンスの構築する方法についての記事はや「Mastodon(マストドン)のインスタンスをCentOS7で立ててみる」、「CentOS7でmastodonを建てる」辺りを見れば完璧ではないかなと思います。

追記:以下のサイトもとても参考になります。

ちなみに私が運営するmastodonのインスタンスは haruhi-mstdn.club ですので、よろしくお願いします。

表示される言葉のカスタム

config/locales に入っている大量の言語ファイルをカスタムしていくことで新たな言語(語録集)や表示される文言を簡単に変えることが出来ます。

---
ja:
  about:
    about_mastodon: Mastodon は&lt;em&gt;自由でオープンソース&lt;/em&gt;なソーシャルネットワークです。商用プラットフォームの代替となる&lt;em&gt;分散型&lt;/em&gt;を採用し、あなたのやりとりが一つの会社によって独占されるのを防ぎます。信頼できるインスタンスを選択してください &amp;mdash; どのインスタンスを選んでも、誰とでもやりとりすることができます。 だれでも自分の Mastodon インスタンスを作ることができ、シームレスに&lt;em&gt;ソーシャルネットワーク&lt;/em&gt;に参加できます。
    about_this: ご利用前にお読みください
    apps: アプリ
    business_email: 'メールアドレス:'
    closed_registrations: 現在このインスタンスでの新規登録は受け付けていません。
    contact: 連絡先
    description_headline: "%{domain} とは?"
    domain_count_after: 個のインスタンス
    domain_count_before: 接続中
    features:
      api: アプリやその他サービスにAPIを公開
      blocks: 豊富なブロックやミュート機能
      characters: 1つの投稿は500文字まで利用可能
      chronology: 時系列順のタイムライン
      ethics: 広告もトラッキングもありません
      gifv: GIFVや短い動画にも対応
      privacy: 投稿ごとに公開範囲を細かく設定可能
      public: 公開タイムライン
    features_headline: Mastodon の特徴
    get_started: 参加する
    links: リンク
    other_instances: 他のインスタンス
    source_code: ソースコード
    status_count_after: トゥート
    status_count_before: トゥート数
    terms: プライバシーポリシー
    user_count_after: 人
    user_count_before: ユーザー数
(以下略)

画像のカスタム

うちのインスタンスはアニメ愛好家向けだからゾウさんなんか表示しないで自分の推しキャラを出したい!という方におすすめです。Mastodonで使われる画像は app/assets/images app/javascript/images に格納されています。ここに代わりの画像を置いてあげることで任意の画像を背景やトップページのゾウさんの代わりに表示させることが出来ます。最終的には以下のような感じになれば正解です。

CSSとJavaScriptのカスタム

これも同じように app/assets/stylesheets app/javascript/stylesapp/assets/javascripts app/javascript/mastodon に格納されている.scssファイルと.jsファイルをを編集することで変更することが出来ます。私の場合、背景が左揃いになっているのが気に食わなかったので、中央揃い(background-position:50% 50%;)にするなどのカスタムをしました。

最後に反映させよう

画像、CSS、JavaScriptファイルは動的なサイトにするため(?)に圧縮されています。この圧縮過程を飛ばしてしまうと反映はいつまで経ってもされないので忘れないようにします。
まずは実際にMastodonで使えるようにメディアファイル集assetsを作成します。コマンドラインに以下のように打ち込みます。

//assetsフォルダを全消去したい場合。全てをやり直したい人向け。
# docker-compose run --rm web rails assets:clobber

//assetsフォルダにある昔のものを消去したい場合。普段はこっちで十分かな。
# docker-compose run --rm web rails assets:clean

//上の2つのコマンドのうちどちらかを実行したら、メディアファイル群を事前コンパイルする。
# docker-compose run --rm web rails assets:precompile

//mastodon全体を再ビルド
# docker-compose build

//mastodonを再起動
# docker-compose restart

追記(2017/07/06):Mastodonをスタートアップスクリプトで立ち上げた場合はdockerを使わないのでこちらのご指摘の通りやってみてください。

これで色々とカスタムの幅が広がったので、自分だけのインスタンスを発展させていってください。それでは。

追記(2017/04/28):当ブログの記事を見て、「出来なかった!」「困った!」といった問題があればコメントをお願いします。

追記(2017/06/18):Mastodon 1.4.1からディレクトリ構造に色々と変更が加わった、という旨のご報告をいただきましたので最新の情報に更新しました。ご報告ありがとうございました。

Mastodonをはじめよう

標準

1週間ほど前から日本国内でアツくなり始めたMastodon(マストドン)。このページでは始め方や仕組み、各プラットフォーム(iOS, Android, Windows, Linux, MacOS…)でのクライアントなどを紹介、説明していきます。

Mastodonとは?

Mastodonは他のSNSでは見られない「分散型」という仕組みを採用しています。個人でも企業でも誰でも簡単にそれぞれの拠点となる「インスタンス」を立ち上げることが出来て、それぞれのインスタンスがそれぞれのサービスとして機能します。それぞれが独立して機能していますので、それぞれのインスタンスが各管理者の意向で動きます。意向というのは例えば運営方針や、メンテナンスのタイミング、話題などです。

と言っても、各インスタンスが独立しているからと言ってそれぞれのインスタンス同士でコミュニケーションがとれないというわけではありません。多くのインスタンスは数百ものインスタンスと「連合」を組んでおり、その連合を組んでいるインスタンス同士であれば普段からフォローをしていなくても「トゥート」をお互いに見ることも可能ですし、連合を組んでいないインスタンス同士でも、「リモートフォロー」をすることで新たにそのインスタンス同士で連合を組むことが出来ます。

このようにオープンソースであることを最大限まで活用して運営されているMastodon。これからも目が離せない新サービスになりそうです。

インスタンスを選ぶ

次は自分が登録するインスタンスを選びましょう。単純にSNSとしてのMastodonを楽しみたいのであれば日本人の多いインスタンスの方がきっと楽しいでしょうし、専門の分野について話したいのであればそれに適したインスタンスを選ぶと良いでしょう。そんな感じにインスタンスを決めるためにインスタンス一覧がいくつか用意されています。ぜひ活用してください。

日本だけでも結構ジャンル別のインスタンスに別れてるんですね。私は「mstdn.jp」と「x0r.be」と「pawoo.net」の3つのインスタンスに登録しています。なお、現段階ではアカウント削除については対応していないので、くれぐれも注意してください。また、無名の海外のインスタンスに登録したりすると凄くアウェー感あふれることになるかもしれない点も注意が必要です。

クライアントを使おう

いざMastodonを頻繁に使おうとしても、いちいちブラウザからインスタンスにアクセスしているようでは通信容量も多くなりますし、なにより面倒です。そこで使うのが専用クライアント。これを使うことでより一層便利にMastodonを使うことが出来ますので、ぜひ利用してみては。

対応 クライアント名 備考
Android Tusky Androidでは見た感じ最もポピュラーなクライアント。
11t
TootyFruity リリース前なので不安定。
iOS Amaroq 現在はこれしかiOSはありません。
Windows Capella 開発途上なので私の環境では結構不安定でした。
Mastodon UWP app UWP版です。他に比べるとまだほとんど機能はありません。
Windows/Linux/Mac Web-based Desktop Client デスクトップで単独アプリとして楽しめます。結構安定しています。

ブラウザ拡張でより賢く

この章はChromeユーザー対象の文になってしまいますが、ご容赦ください。Chromeには拡張機能が用意されていて、それを使うことでMastodonをより便利に、賢く使うことが出来ます。

とりあえずTooterです。この拡張機能は普段Twitterを使っている方は簡単にTwitterとMastodonの両方に同じ内容を投稿することが出来ます。いちいち画面を切り替えて投稿していて、煩わしい思いをしている方には嬉しい機能です。公式ページ(twitter.comの一部)でのツイート、tweetdeckの両方で使うことが出来ます。



最後に

Mastodonの成長は1週間でmstdn.jpのユーザー数が7万人を超えるほど、めまぐるしい成長を遂げました。これからも暫くはその成長は衰えることは無いでしょう。初期の方はあまりの急成長さで新規会員の登録を中止したり、サーバーを急遽補強したり色々と大変でした。今では7万人を越すユーザー数を獲得している過去にも、途中で全ユーザーのデータが吹っ飛んで0からのスタートを2回していますが、これだけユーザー数が集まるってのは相当ですよね。それだけの魅力があるのだから、これから先もサービスも含めて更に成長していくことを心から願っています。

WordPressを軽量化する

標準

はじめに

ウェブページのロード時間が訪問者のその後の行動に大きく影響を与えることは広く知られていますし、日々のネットサーフィンを思い返してみてもそれは自明です。こちらのマーケティングなどの解析をテーマにしているブログでは

  • 47%の利用者が2秒以内のロード時間を望んでいる
  • 40%の利用者が3秒以上のロード時間では閲覧を諦める

と記述されている程です。

当サイトの実情

P3 (Plugin Performance Profiler)というロードに必要な時間などを計測する専用のプラグインで計測してみたところ、以下のような結果が出ました。


計測結果によるとロード完了までに3.42秒かかっています。これでは遅すぎます。せめて2秒台に収めたいですね。ということで対策を講じていきます。

具体的な対策

今回はWP Super Cacheというプラグインを利用していきます。画像の方の対策はあまりロード時間には一般的には影響を及ぼさなさそうなのでしません。

基本的には設定画面にあるものを推奨に持っていくだけで大丈夫です。これだけでも凄く効果があります。

効果はいかほど?

これらの設定を施した後に再びロード時間を計測してみます。

効果は絶大ですね!なんとロード時間は1.50秒まで短縮されました。これでロード時間の長さによる直帰率は大分下げられたはず・・・閲覧数が増えると良いな。

最後に

慣れていれば5分位で軽量化出来るので世の中はとても便利ですね。ロード時間の長さで悩んでいるサイト管理者の方はぜひ試してみてください。

Nevermindを購入しました

標準

少し前の話になりますが、Nevermindという精神恐怖系のホラゲーを購入しました。購入動機は友人の家に遊びに行ったりする時に何かゲームが欲しいので目についた短編物がNevermindだったという訳です。Steamから1980円で購入することが出来ます。(2017年2月12日現在)

Nevermind
Nevermind
Developer: Flying Mollusk
Price: 19,99 €

コンセプト

このゲームのコンセプトは、精神科医が患者の脳内に潜入して患者の持つ過去のトラウマを探し当て、治療するというものです。トラウマに見ていて心地よいものなんて存在する訳無いですから、当然プレーしているうちに精神が蝕まれていきます…。他のホラーゲームに比べては驚かす系のイベントは少ない方ですが、少ない分違う面でプレーヤーを恐怖に陥れてくれます。

ゲームの流れ

ゲームはまず患者の脳内に入るところから始めます。タイムマシンのようなカプセルに入れられて間もなくすると、患者の脳内に入ることが出来ます。トラウマは患者自身も思い出したくはないものなので、基本的に記憶の奥底にあるため、そこまで潜入していく必要があります。ところどころ問題を解かねば進めないチェックポイントや、少し頭を使わないと進めないところなどもあり、一筋縄ではいかないのが面白いです。また、道端にところどころ挿絵のようなものが落ちていて、それを最終的に10枚集めるのがゲーム進行部分の目標です。その後、その集めた10枚の中から本当にトラウマに関与する5枚を選び実際のストーリー通りに並び替えるまでがゲームの流れです。また、全編で日本語の字幕が付いているので、英語が分からない!という方でも安心してプレーすることが出来ます。

バイオフィードバック

このゲームではバイオフィードバックという独自のシステムを導入しています。どういうものなのかというと、プレーヤー自身の心拍数・顔の表情の変化をゲームが監視することで、常にゲーム内の恐怖度が変化するというのです。プレーヤーが恐怖や焦りなどを感じれば感じるほどゲームは恐怖の強い方向へ進んでいきます。いかに精神科医として冷静に進められるか試されるわけです。このバイオフィードバックを利用するためには、対応している心拍センサー(Apple Watchなど)や対応した3Dウェブカメラなどが必要で敷居は高いですが、もし揃っているならとてもゲームを面白くしてくれるでしょう。もしこれらの機器が無かったとしても、ゲーム内の恐怖レベルは常に最高になってくれるらしいので安心です。←

総括

精神恐怖系のタグがつけられるのがよく分かるくらいにプレーしていて精神が削られます。しかしながら、プレーしても損することはないし、一人でプレーするのに勇気が必要なほどでも無いのである意味気軽にプレーできるのでおすすめです。割引の時は結構安くなるので、この機会に是非。(最安値396円)

AMDのCrossFire構成の方法(更新版)

標準

まずはじめに

大分前に投稿しましたCrossFire構成の記事の直後、OSが吹き飛んだり色々と不安定になり解体していたのですが、今日復活させてみたところ普通に安定してCrossFireの構成が出来たのでここにその記録を残しておきます。

大まかな手順は前回と変わりありませんが、今回はブリッジケーブルを接続して構成したところ驚くほどに安定するようになりました。前回とは大違いです。

3Dmarkでベンチマーク

次に3Dmarkの記録です。
3DmarkのAdvanced Editionを購入したのでより細かい測定が可能になりましたが、ここでは概要だけを紹介していきます。

▼▼▼ Radeon R7 260X x1の時 ▼▼▼

FireStrike:3800点

TimeSpy:1441点

▼▼▼ Radeon R7 260X x2の時 ▼▼▼

FireStrike:4871点(1.3倍)

TimeSpy:2268点(1.6倍)

重ければ重いほどその効果が一層出てくるようで最大1.6倍のスコア向上を記録しました。まぁ、1回しか測定していないのでなんとも言えませんが、少なくともCrossFireは成功しているようで一安心です。

では昔の不安定さは何だったのか

前回CrossFireを構成した時も今回もブリッジケーブルの有無やビデオカードの順番を入れ替えたり色々とやった結果最適なものを見つけたつもりだったのですが、今回はなぜか問題を起こすことも無く正常に動いてくれました。ドライバの更新なのか何なのか…

ともあれビデオカードを一つ冬眠させたまま過ごすという生活も終わりましたし、正しい方法も見出だせたので良かったです。近々ゲームのレビューの連投大会を行いますのでお楽しみに!

Twitter上のツイートを利用した日本語学習(第二弾)

標準

前回1000万ツイート程を収集した上での日本語学習を実施しましたが、今回は更に倍にして2000万ツイートにしてみましたので、それを詳しくまとめていきます。

準備段階

今回は自作のPHPプログラムを使いまして、2062万4138ツイートを収集しました。前回は1161万2661ツイートでしたので、約2倍です。
これで日本語学習の精度は上がるのだろうか、精度は別問題にしてもどれくらい学習が変わるのか、これを今回は調べていきます。
準備段階は前回までの記事に全て纏まっていますので、そちらを参考にしていただくとして先に進んでいきます。また、このページの最後に実際に使った学習ファイルをダウンロード出来るようにしましたので、ご活用ください。(結構重いです)

ベクトル演算の結果

今回も例のごとく単語のベクトル演算をしてもらいました。参考とするために、前回と同じ演算です。早速見ていきましょう。

yoshipc@ubuntu:~/twitter/word2vec$ ./word-analogy tweets-train.bin
Enter three words (EXIT to break): 現在 地球 未来

Word: 現在  Position in vocabulary: 674

Word: 地球  Position in vocabulary: 3337

Word: 未来  Position in vocabulary: 1570

                                              Word              Distance
------------------------------------------------------------------------
                                            世界		0.603715
                                            人類		0.578384
                                            宇宙		0.550593
                                            現実		0.538544
                                            運命		0.516235
                                   明るい未来		0.514421
                                               空		0.510775
                                         この世		0.501839
                                            僕ら		0.501282
                                      希望の光		0.499918
                                         この街		0.493066
                                               夢		0.492678
                                            人間		0.489397
                                               道		0.489035
                                            太陽		0.487439
                                         きっと		0.486102
                                            永劫		0.480969
                                         セカイ		0.477885
                                         未来へ		0.475911
                                            生命		0.470979
                                            大地		0.469094
                                         生き方		0.466944
                                            叡智		0.463096
                                            きみ		0.462352
                                         侵略者		0.461892
                                            人生		0.459877
                                      君の笑顔		0.453077
                                            虚像		0.451170
                                               心		0.450787
                                            こと		0.447146
                                   大切なもの		0.447091
                                            道標		0.446497
                                         この国		0.446489
                                            遠く		0.445713
                                         大海原		0.445700
                                         地平線		0.445120
                                   ひとりでに		0.444735
                                            キミ		0.444560
                                         未来を		0.444312
                                      彼方から		0.444180


Enter three words (EXIT to break): 恐竜 噴火 人類

Word: 恐竜  Position in vocabulary: 14523

Word: 噴火  Position in vocabulary: 25009

Word: 人類  Position in vocabulary: 4424

                                              Word              Distance
------------------------------------------------------------------------
                                      日本国民		0.504782
                                      国際社会		0.498614
                                   放射能漏れ		0.486438
                                            瓦解		0.485425
                                            収束		0.477185
                                            国民		0.472936
                                      電源喪失		0.471543
                                            人民		0.465190
                                      政権交代		0.464547
                                         未曾有		0.464171
                                      日本民族		0.462117
                                            国家		0.450937
                                            滅亡		0.450119
                                            事象		0.449914
                                メルトダウン		0.447464
                                      われわれ		0.444761
                                            地球		0.444433
                                               瀕		0.441625
                                      日本政府		0.440596
                                            過ち		0.440204
                                   大東亜戦争		0.439783
                                            履行		0.437771
                                      原発事故		0.435660
                                            停戦		0.432246
                                            是認		0.431025
                                      敵国条項		0.430867
                                            直面		0.428798
                                            行使		0.427611
                                         中国軍		0.426728
                                            失政		0.426705
                                      武力行使		0.426567
                                         我が国		0.424916
                                      安倍政権		0.424625
                                      巨大地震		0.423229
                                            暴落		0.422987
                                            存在		0.422820
                                      金融危機		0.421636
                                            戦後		0.420972
                                            事態		0.419899
                                            戦没		0.419073

Enter three words (EXIT to break): 過去 戦争 未来

Word: 過去  Position in vocabulary: 1033

Word: 戦争  Position in vocabulary: 2559

Word: 未来  Position in vocabulary: 1570

                                              Word              Distance
------------------------------------------------------------------------
                                            平和		0.522789
                                            侵略		0.517995
                                            国家		0.517953
                                      民主主義		0.513909
                                            争い		0.508577
                                            独裁		0.508006
                                            恐慌		0.491936
                                            戦い		0.487261
                                            破滅		0.485378
                                      侵略戦争		0.484970
                                            革命		0.484187
                                            秩序		0.481204
                                            滅ぶ		0.479859
                                      日本侵略		0.476639
                                            圧政		0.475845
                                      世界平和		0.475404
                                      資本主義		0.475313
                             第三次世界大戦		0.475173
                                      社会主義		0.474103
                                            支配		0.473573
                                            中露		0.472770
                                            僕ら		0.472601
                                            我々		0.472268
                                   日本の農業		0.472103
                                         私たち		0.470849
                                      共産主義		0.468439
                                   新自由主義		0.466063
                                   ニヒリズム		0.465786
                                               国		0.465224
                                         核戦争		0.465120
                                            滅亡		0.464730
                                            闘い		0.464701
                                   明るい未来		0.464211
                                      保護主義		0.462045
                                            紛争		0.459765
                                            滅び		0.458792
                                            鎖国		0.456679
                                         為政者		0.455943
                                      全体主義		0.455139
                                            反乱		0.454954


Enter three words (EXIT to break): 現在 核戦争 未来 

Word: 現在  Position in vocabulary: 674

Word: 核戦争  Position in vocabulary: 69314

Word: 未来  Position in vocabulary: 1570

                                              Word              Distance
------------------------------------------------------------------------
                                            戦争		0.569488
                                            現実		0.550737
                                      人類滅亡		0.528336
                                            破滅		0.518106
                                      保護主義		0.512427
                                            滅ぶ		0.503720
                                      全体主義		0.494948
                                            運命		0.493296
                                            滅び		0.492078
                                      世界平和		0.489570
                             第三次世界大戦		0.489473
                                      民主主義		0.488292
                                            平和		0.487700
                                      共産主義		0.483427
                             ナショナリズム		0.482726
                                   明るい未来		0.482302
                                      社会主義		0.481790
                                            独裁		0.479569
                                            人類		0.475583
                                      世界恐慌		0.469627
                                            恐慌		0.469290
                                   ファシズム		0.469131
                                ポピュリズム		0.467034
                                            中露		0.466852
                                            侵略		0.466768
                                         未来を		0.466476
                                      独裁国家		0.466271
                                            災い		0.465553
                                            専制		0.464848
                                            滅亡		0.464760
                                            永劫		0.462897
                                            こと		0.462651
                                            無力		0.461402
                                         権力者		0.459051
                                            災厄		0.459035
                                            虚像		0.457459
                                トランプ政権		0.457113
                                      侵略戦争		0.454696
                                            政権		0.454047
                                            それ		0.453413


Enter three words (EXIT to break): 女性 かわいい 男性

Word: 女性  Position in vocabulary: 492

Word: かわいい  Position in vocabulary: 275

Word: 男性  Position in vocabulary: 841

                                              Word              Distance
------------------------------------------------------------------------
                                         可愛い		0.888274
                                      カワイイ		0.761770
                                   かっこいい		0.757136
                                      かわゆい		0.748681
                                   かわいいよ		0.730760
                                      かわいー		0.703242
                                      可愛い〜		0.691793
                                   カッコイイ		0.671846
                                   かわいかっ		0.653079
                                      可愛かっ		0.652575
                                            すき		0.645260
                                   かわいい〜		0.639327
                                      可愛いい		0.631806
                                      可愛いー		0.631314
                                         萌える		0.616470
                                         似合う		0.616324
                                      格好いい		0.607348
                                      かわいく		0.593961
                                   可愛らしい		0.580756
                                   かわいい~		0.576812
                                         可愛く		0.575392
                                      あざとい		0.572130
                                      めんこい		0.571543
                                   かわいいー		0.571391
                                かわいらしい		0.566938
                                         ずるい		0.565993
                                   かわいいっ		0.565969
                                      かわいっ		0.565026
                                   愛くるしい		0.558229
                                      かわいぃ		0.557168
                                   ちっちゃい		0.549026
                                      可愛いっ		0.547052
                                         かわい		0.545649
                                      色っぽい		0.545449
                                   おもしろい		0.543379
                                            可愛		0.543249
                                      かわゆし		0.543152
                                      かわい〜		0.538648
                                      可愛いぃ		0.537529
                                      可愛い~		0.536874

ちょっと良くわからないので、前回の結果と比較してみます。

着色は両方の演算結果に登場した単語です。一見すると1000万ツイート分の結果を濃縮したのが2000万ツイート分の結果という感じな気がします。これを何か数字で傾向を算出出来れば良いのですが、このような分野には疎いものでよくわかりません。何か良い手段が有りましたら、コメントなどでお知らせください。

また、「恐竜 噴火 人類」の演算結果ではなぜか原発系の用語が殆どなくなりました。他にも色々な変化が見られました。やっぱり日本語モデルを2倍にするだけでも変化はあるんですね。次は関連語出力です。

関連語出力

早速見ていきます。

yoshipc@ubuntu:~/twitter/word2vec$ ./distance tweets-train.bin
Enter word or sentence (EXIT to break): トランプ

Word: トランプ  Position in vocabulary: 661

                                              Word       Cosine distance
------------------------------------------------------------------------
                                   トランプ氏		0.843974
                                      ヒラリー		0.814557
                                   クリントン		0.773175
                       ドナルド・トランプ		0.709894
                             トランプ大統領		0.706651
                    ヒラリー・クリントン		0.685431
                       トランプ次期大統領		0.674865
                                         民主党		0.671567
                                   次期大統領		0.660402
                    バーニー・サンダース		0.657438
                                      対立候補		0.646014
                                      アメリカ		0.640917
                          ドゥテルテ大統領		0.636720
                          リベラルメディア		0.635047
                                      極右政党		0.634951
                                      ネオコン		0.632521
                                   アメリカ人		0.632108
                                         共和党		0.631699
                                      副大統領		0.631480
                                            選挙		0.628310
                 エスタブリッシュメント		0.627984
                                      リベラル		0.626295
                          ドナルドトランプ		0.625530
                                         選挙後		0.624006
                                   ウォール街		0.622957
                                クリントン氏		0.621994
                                      選挙結果		0.615811
                                   オハイオ州		0.615090
                                            米国		0.614540
                                         大統領		0.613802
                                         アサド		0.610111
                                   大統領選挙		0.608435
                                         オバマ		0.607592
                                         安倍氏		0.604816
                          反グローバリズム		0.604310
                                   ネタニヤフ		0.602129
                                ポピュリスト		0.601324
                                         選挙戦		0.601310
                                   ドゥテルテ		0.600674
                                         ルペン		0.599487

Enter word or sentence (EXIT to break): ハルヒ

Word: ハルヒ  Position in vocabulary: 23003

                                              Word       Cosine distance
------------------------------------------------------------------------
                                      ストパン		0.645798
                                      けいおん		0.638650
                                      とらドラ		0.636988
                                花咲くいろは		0.632872
                                   らき☆すた		0.628135
                                      シュタゲ		0.627787
                                      ギルクラ		0.617519
                                          TARITARI		0.612508
                                グレンラガン		0.612221
                                      まどマギ		0.610592
                                シンフォギア		0.608070
                                      らきすた		0.606560
                             のんのんびより		0.602893
                                      バカテス		0.602474
                                         SHIROBAKO		0.601572
                                         ギアス		0.596853
                                         化物語		0.596690
                                   けいおん!		0.589731
                             ハヤテのごとく		0.586546
                             リリカルなのは		0.584632
              ウィッチクラフトワークス		0.584533
                                         結界師		0.584402
                                      かんなぎ		0.579284
                                   キルラキル		0.578478
                                      リトバス		0.577740
                          ブラックラグーン		0.577532
                                      ひぐらし		0.572559
                                      バクマン		0.568581
                          エルフェンリート		0.567559
                                      クラナド		0.566878
                          涼宮ハルヒの憂鬱		0.566182
                          アクセルワールド		0.565847
                                      きんモザ		0.565820
                                カブトボーグ		0.563231
                          アルスラーン戦記		0.561105
                                      プリリズ		0.559184
                 ストライクウィッチーズ		0.558513
                     対魔導学園35試験小隊		0.558363
                                      これゾン		0.558080
                                生徒会の一存		0.557798

Enter word or sentence (EXIT to break): Twitter

Word: Twitter  Position in vocabulary: 583

                                              Word       Cosine distance
------------------------------------------------------------------------
                                   ツイッター		0.869226
                                           twitter		0.845602
                                タイムライン		0.690816
                                   ついったー		0.646548
                                          Facebook		0.642719
                                      インスタ		0.632823
                                               SNS		0.613419
                             フェイスブック		0.602303
                             Twitter		0.578967
                             インスタグラム		0.563292
                                          facebook		0.560759
                                              LINE		0.552092
                                   ツィッター		0.539288
                                         Instagram		0.533319
                                      ツイート		0.524300
                                         SNS		0.520925
                                                TL		0.514066
                                         ニコ動		0.505256
                                      ツイッタ		0.496323
                                カカオトーク		0.491717
                                         ネット		0.490409
                                      ネット上		0.486285
                                             Slack		0.485163
                                               sns		0.479989
                                   アカウント		0.478253
                                         カイブ		0.477760
                                プッシュ通知		0.473205
                                         スパム		0.464073
                                            TL		0.459924
                                            GitHub		0.458841
                                            reddit		0.458549
                                            通知		0.456949
                                ツイッター上		0.456893
                                            携帯		0.456676
                                         プロフ		0.454460
                                      スカイプ		0.454132
                                      ブラウザ		0.454094
                                   コメント欄		0.453342
                                            safari		0.452758
                                            Flickr		0.450859

こちらも、結果を見ただけではよく分かりませんので、別にまとめてみます。

サンプル数が2つしか無いのではっきりとしたことは言えませんが、終わった話題(=安定した話題)は1000万と2000万では入れ替わりがそう激しくありませんが、常に変動し続ける話題(=不安定な話題)は変化が大きいです。この不安定な話題の代表が「アニメ」であって、比較を見てからも分かるように安定した話題と比較すれば大きく結果が異なっているのが分かります。

考察

Twitterという常に変動する言葉の辞書を活用することで今回一番良くわかったのは「何の話題がHOTなのか」です。例えば、関連語出力でも顕著に出ましたが、大統領選挙は現在さほど話題にはなっていませんが、アニメは1年中放送しているものなので常に話題が変動していきます。このような変化を大きく影響を受けることがよく分かりました。これからは更に日本語を収集する手段を考えながら精度の高い日本語のモデルを作っていけたらと思います。続編をお楽しみに!(ちなみに1000万ツイート収集するのに低スペックのパソコンでは16日かかりました。2000万で1ヶ月ちょいです。)

日本語モデル(?)の頒布

“tweets-train.zip” をダウンロード tweets-train.zip – 175 回のダウンロード – 462 MB


こちらが2000万ツイート分の日本語モデルです。著作権等は放棄しますが、自作発言、二次配布、商用利用はお控えください。また、予期せぬタイミングで削除に至る可能性も有りますので、その点もご承知おきください。ご利用時になにかコメントいただけると励みになります。よろしくお願いします。

追記(2017/08/11):今日の出来事に触発されたので、もう一回、ツイート長期収集を再開します。

HTML5.1勧告での変更点の紹介

標準

先月始めの11月1日、W3C(World Wide Web Consortium;ワールド・ワイド・ウェブ・コンソーシアム)からHTML5.1を勧告する文書が公開されました。今回はHTML5.1に搭載された新機能がとても便利なものが多かったと個人的に思ったので、まとめていきます。また、利用できるブラウザについてはCan I use…?で調べて、一般的なPC用のブラウザについての情報についてのみ紹介しています。(※編集当時の情報です。)

picture要素

img要素にpictureやsource属性が追加されました。これを使うことで、低解像度環境で画像を表示させたい時、例えばトリミングなどして見やすくした画像を表示させることが出来ます。実際にChromeで試してみました。

しっかりと分岐されているのが分かります。以下のようにHTMLを記述すると実装できます。

<picture>
   <source media="screen and (max-width: 980px)" srcset="small.png">
   <img src="large.png" alt="#">
</picture>

source要素のmedia属性で指定しているmax-widthはメディアクエリで解像度の指定ができるので便利です。メディアクエリと同様、source要素は複数追加することが出来ます。この機能はIE以外の全てのブラウザで利用できます。

sizes属性とsrcset属性

sizes属性とsrcset属性はimg要素に対して追加されたもので、組み合わせて使うことで閲覧環境によってブラウザが判断した上で、最適な画像を読み込んでくれるように切り替えることが出来ます。

<img src="large.png"
     sizes="50vw"
     srcset="small.png 320w, smaller.png 640w">

sizes属性ではビューポート(≒ブラウザの横幅)の何%で画像を表示させたいかを指定します。単位のvwは「Viewport Width」の略です。また、srcset属性では「画像のパス 表示させたい解像度(単位:w)」をコンマ繋ぎで記述します。利用例1では採寸基準がブラウザ幅の50%になるので、620pxの時に320wの画像、1280pxの時に640wの画像を表示するように出来ます。また、sizes属性にはメディアクエリを使うことが出来、以下のように更に細かい分岐が可能になります。

<img src="large.png"
     sizes="(max-width: 640px) 100vw, 50vw"
     srcset="smaller.png 320w, small.png 640w">

利用例2ではsizes属性にメディアクエリを加えました。これをすることで、640px以下の環境では採寸基準はブラウザ幅の100%、それ以上では50%になり、これによってスマホ版とデスクトップ版とでカラム数を異なるものにしたいという望みをより簡単に、より最適に実現させることが出来るようになりました。しかしながら、この属性はIEには対応していません。そんな時はpicturefillというライブラリを使うことで解決することが出来ます。

また、srcset属性には相対的な比率を「*.png 1x, *.png 2x」という感じで記述する方法がありますが、この記述を採用した場合はsizes属性を使用することは出来ません。今回は詳しい説明を省きます。

details要素とsummary要素

details要素とsummary要素が追加されたことで、難解な用語を簡単にHTMLだけを使って表示させることが出来るようになりました。

<details>
   <summary>詳細見出し</summary>
   <p>簡単にHTMLだけを使って詳しい説明ができます。</p>
</details>

記述法は至って簡単で、上記の通りです。この記述だけで以下のサンプルのように簡単に説明するための展開タブが実装できます。※IE、Edgeは利用できません。


 

詳細見出し

簡単にHTMLだけを使って詳しい説明ができます。

 


sortable属性

table要素にsortable属性を追加することが出来るようになりました。これによって、テーブルの中でもその列のものがソート出来るのか出来ないのかをブラウザー側に示すことが出来ますが、現段階ではどのブラウザでもソートするまでの機能を実装しているものはありません。しかし、将来的にはソート出来るブラウザが登場するものと見られ、これからの発展が期待されます。ここでは、実際のソースを掲載します。

<table sortable="sortable">
   <thead>
     <tr>
       <th sorted="1">名前</th>
       <th sorted="2">数学Ⅲ</th>
       <th>物理</th>
     </tr>
   </thead>
   <tbody>
     <tr>
       <td>Aくん</td>
       <td>73</td>
       <td>83</td>
     </tr>
     <tr>
       <td>Bくん</td>
       <td>52</td>
       <td>43</td>
     </tr>
   </tbody>
</table>

menu要素とmenuitem要素

これらを使うことで、JavaScriptなどを一切利用せずにHTMLのみでコンテクストメニュー(右クリックメニュー)を展開させることが出来ます。この要素は現在はFirefoxしか対応していませんが、順次Chromeなどのブラウザでも利用できるようになる予定です。また、対応していないブラウザが殆どの為、現在実装するとそのまま出てきてしまいますので、CSSなどで隠すようにしてください。

<p contextmenu="context-menu">
   ここを右クリック<!--// 反応する領域を定義 //-->
</p>

<menu type="context" id="context-menu">
   <menuitem type="checkbox" checked="true">チェック1</menuitem>
   <menuitem type="checkbox">チェック2</menuitem>
   <menuitem type="checkbox" disabled>無効化</menuitem>
   <menuitem type="command" onclick="alert('押されました。')">コマンド</menuitem>
   <menuitem type="radio" name="radio" checked="true">ラジオ1</menuitem>
   <menuitem type="radio" name="radio">ラジオ2</menuitem>
</menu>

サンプルを実装すると以下のようになります。Firefoxで見てみてください。


ここを右クリック


最後に/補足

ここまでHTML5.1での追加要素を説明してきましたが、一部に過ぎません。この他にもAPI関連やイベント関連などたくさんあります。また、追加ではなく変更されたものや、廃止されたものもあります。これからHTML5.2や5.3がリリースされるのではないかというのが世間一般の予測ですが、これから更にHTMLが便利になっていくことを考えるととても楽しみです。

Twitter上のツイートを利用した日本語学習

標準

現状

前回作成したプログラムで1000万(正確には1161万2661)ツイートを収集し、人工知能の元になる日本語学習のモデルを作成しました。それを、前々回の手順に基づき、色々と加工して語彙の塊を作ったところまで話は進みます。過去の記事にそこら辺の工程は記してあるので、今回はその結果について考察していきます。

ベクトル演算の結果

前々回の手順と同じ演算をしてみました。結構結果が違うところからかなりの語彙の差が見られます。

yoshipc@ubuntu:~/twitter/word2vec$ ./word-analogy tweets-train.bin											
											
Enter three words (EXIT to break): 現在 地球 未来											
											
Word: 現在 Position in vocabulary: 646											
											
Word: 地球 Position in vocabulary: 3132											
											
Word: 未来 Position in vocabulary: 1494											
											
	Word			Distance							
------------------------------------------------------------------------											
	世界			0.602624							
	人類			0.543273							
	現実			0.514047							
	宇宙			0.512201							
	道標			0.508042							
	この世			0.50619							
	この街			0.491833							
	セカイ			0.489193							
	人生			0.477655							
	人間			0.476668							
	希望の光		0.473739							
	道			0.473478							
	真理			0.469095							
	明るい未来		0.468303							
	素晴らしい世界		0.466917							
	空			0.466508							
	僕ら			0.461174							
	世界平和		0.459152							
	新しい世界		0.455947							
	夢			0.454776							
	彼方			0.453812							
	海へ			0.451184							
	生き物			0.451023							
	この国			0.450765							
	運命			0.449973							
	きっと			0.448351							
	生き方			0.446492							
	叡智			0.445666							
	キミ			0.444632							
	恒星			0.443009							
	海の底			0.442617							
	命			0.441733							
	輪廻転生		0.44141							
	侵略者			0.441408							
	死地			0.44047							
	旅路			0.440278							
	きみ			0.439143							
	公転			0.437911							
	夜空			0.437558							
	君の笑顔		0.434687							
											
Enter three words (EXIT to break): 恐竜 噴火 人類											
											
Word: 恐竜 Position in vocabulary: 15061											
											
Word: 噴火 Position in vocabulary: 22118											
											
Word: 人類 Position in vocabulary: 4781											
											
	Word			Distance							
------------------------------------------------------------------------											
	原発事故		0.532098							
	電源喪失		0.513952							
	福島原発事故		0.464274							
	太平洋戦争		0.46328							
	ラニーニャ現象		0.462596							
	人民			0.4581							
	日本国民		0.45673							
	巨大地震		0.456336							
	金融危機		0.456008							
	国民			0.448911							
	それら			0.446807							
	政権交代		0.445388							
	立証			0.443767							
	滅亡			0.442781							
	放射能漏れ		0.442724							
	災害			0.44182							
	政府			0.440498							
	我が国			0.43956							
	収束			0.438271							
	先の大戦		0.435819							
	大地震			0.435565							
	原子力発電所		0.433285							
	核戦争			0.433225							
	日本国			0.432804							
	暴風			0.430495							
	われわれ		0.429471							
	事象			0.427713							
	内部被曝		0.427674							
	日本軍			0.427604							
	金融経済		0.427537							
	暴落			0.427348							
	領海			0.426493							
	経済成長		0.426488							
	死			0.426103							
	自然災害		0.425942							
	中性子			0.424873							
	植民地支配		0.424667							
	トリチウム		0.421269							
	空爆			0.419897							
	福島第一原発事故	0.419747							
											
Enter three words (EXIT to break): 過去 戦争 未来											
											
Word: 過去 Position in vocabulary: 993											
											
Word: 戦争 Position in vocabulary: 2402											
											
Word: 未来 Position in vocabulary: 1494											
											
	Word			Distance							
------------------------------------------------------------------------											
	国家			0.549469							
	世界平和		0.526436							
	侵略			0.501115							
	アメリカ		0.501084							
	滅亡			0.500169							
	平和			0.493855							
	国			0.493639							
	私たち			0.492099							
	社会主義		0.4897							
	徴兵制			0.487121							
	平和憲法		0.486578							
	繁栄			0.484626							
	徴兵			0.473956							
	自主防衛		0.473593							
	多国籍企業		0.472732							
	軍事力			0.470309							
	この国			0.469006							
	秩序			0.468887							
	変革			0.468756							
	独裁			0.468424							
	軍隊			0.467761							
	民主主義		0.467356							
	滅び			0.466891							
	戦い			0.466708							
	祖国			0.463552							
	抑止力			0.463028							
	将来			0.460826							
	主権			0.457991							
	争い			0.457877							
	滅びる			0.457405							
	現実			0.455699							
	侵略戦争		0.453849							
	超大国			0.453782							
	建国			0.451772							
	紛争			0.450906							
	核戦争			0.450699							
	世界の終わり		0.450622							
	存亡			0.449972							
	社会			0.449561							
	滅ぶ			0.448486							
											
Enter three words (EXIT to break): 現在 核戦争 未来											
											
Word: 現在 Position in vocabulary: 646											
											
Word: 核戦争 Position in vocabulary: 64386											
											
Word: 未来 Position in vocabulary: 1494											
											
	Word			Distance							
------------------------------------------------------------------------											
	現実			0.550296							
	戦争			0.54772							
	滅亡			0.523266							
	それ			0.496773							
	滅びる			0.496528							
	滅ぶ			0.494136							
	ナショナリズム		0.491946							
	第三次世界大戦		0.488057							
	人類			0.484206							
	ヒトラー		0.483821							
	世界平和		0.472263							
	トランプ政権		0.468622							
	抑止力			0.4675							
	グローバル化		0.466767							
	破滅			0.466432							
	戦後日本		0.466088							
	こと			0.465714							
	民主主義		0.45992							
	世界の終わり		0.45799							
	保護主義		0.457665							
	平和			0.454754							
	アメリカ		0.454483							
	社会主義		0.453954							
	この国			0.453771							
	大統領			0.453712							
	存亡			0.452943							
	属国			0.449028							
	変革			0.448101							
	滅び			0.447887							
	死			0.447346							
	人類滅亡		0.446758							
	民衆			0.445977							
	徴兵制			0.445856							
	道義			0.445382							
	祖国			0.444785							
	軍事力			0.444622							
	日米安保		0.443597							
	米軍撤退		0.443395							
	政権			0.443134							
	将来			0.442936							
											
Enter three words (EXIT to break): 女性 かわいい 男性											
											
Word: 女性 Position in vocabulary: 473											
											
Word: かわいい Position in vocabulary: 275											
											
Word: 男性 Position in vocabulary: 791											
											
	Word			Distance							
------------------------------------------------------------------------											
	可愛い			0.87939							
	かっこいい		0.749638							
	かわいいよ		0.717992							
	かわゆい		0.717315							
	カワイイ		0.703926							
	かわいー		0.67568							
	すき			0.639878							
	カッコイイ		0.637353							
	可愛いい		0.635035							
	可愛い〜		0.626606							
	かわいかっ		0.626206							
	可愛かっ		0.622716							
	似合う			0.614752							
	格好いい		0.614094							
	萌える			0.606998							
	可愛らしい		0.588543							
	かわいいっ		0.578027							
	めんこい		0.577494							
	かわいぃ		0.576739							
	かわいい〜		0.569993							
	色っぽい		0.566761							
	かわいく		0.564131							
	大人っぽい		0.562167							
	可愛く			0.560525							
	カワユイ		0.559427							
	可愛いっ		0.558375							
	可愛いー		0.554952							
	おもしろい		0.553673							
	かわいいー		0.55007							
	愛くるしい		0.550066							
	かわいい~		0.54409							
	かわい			0.538456							
	ずるい			0.537333							
	可愛			0.53668							
	可愛い~		0.532784							
	かっこいー		0.5314							
	だいすき		0.527381							
	推せる			0.527268							
	お似合い		0.522254							
	あざとい		0.520163

これが演算結果です。本当にTwitterの語彙を吸い取ったっていう感じの結果ですね。ただ、まだまだ的をいていないと判断できる単語がたくさん有ります。1000万ツイートでも全然足りないんですね。また、大分内容が傾いてしまっているのでこれもなんとか是正したいところです。

関連語出力

次に「○○といえば?」という問いかけに対する答えを見てみます。今回は独自調査です。

										
yoshipc@ubuntu:~/twitter/word2vec$ ./distance tweets-train.bin											
											
Enter word or sentence (EXIT to break): トランプ											
											
Word: トランプ Position in vocablary: 370											
											
	Word			distance							
------------------------------------------------------------------------											
	トランプ氏		0.835056							
	ヒラリー		0.796449							
	クリントン		0.76346							
	ドナルド・トランプ	0.692498							
	トランプ大統領		0.668313							
	民主党			0.654428							
	アメリカ		0.648574							
	選挙			0.626273							
	トランプ次期大統領	0.625419							
	ドナルドトランプ	0.620136							
	共和党			0.616822							
	安倍さん		0.612783							
	エスタブリッシュメント	0.612736							
	バーニー・サンダース	0.60968							
	ヒラリー・クリントン	0.608063							
	対立候補		0.60636							
	アメリカ人		0.60183							
	ネオコン		0.596834							
	リベラル		0.595705							
	クリントン氏		0.595669							
	野沢直子		0.592253							
	副大統領		0.589429							
	上院議員		0.58592							
	ヒトラー		0.584391							
	大統領			0.582424							
	木村太郎		0.581774							
	橋下徹			0.579314							
	選挙結果		0.579113							
	オバマ			0.576084							
	選挙戦			0.57552							
	朴槿恵			0.571346							
	次期大統領		0.570646							
	ドゥテルテ		0.567364							
	政治家			0.567204							
	安倍内閣		0.566789							
	副大統領候補		0.566509							
	米国			0.564193							
	ジュリアーニ		0.563054							
	極右			0.562501							
	ウォール街		0.562185							
											
Enter word or sentence (EXIT to break): ハルヒ											
											
Word: ハルヒ Position in vocablary: 29688											
											
	Word			distance							
------------------------------------------------------------------------											
	らき☆すた		0.654328							
	CLANNAD			0.651727							
	キルラキル		0.649461							
	生徒会の一存		0.643134							
	化物語			0.626379							
	男子高校生の日常	0.624848							
	とらドラ		0.621756							
	シャーマンキング	0.620102							
	ストパン		0.613385							
	シュタゲ		0.610245							
	ギルクラ		0.607969							
	バカテス		0.607291							
	けいおん!		0.604257							
	はがない		0.598865							
	禁書			0.597113							
	ノゲノラ		0.597092							
	生徒会役員共		0.59606							
	リリカルなのは		0.595046							
	あの花			0.59435							
	俺の妹がこんなに可愛いわけがない	0.593053							
	のんのんびより		0.592703							
	ヒカルの碁		0.590836							
	クラナド		0.589519							
	けいおん		0.586876							
	青エク			0.586024							
	らきすた		0.584302							
	ガンダム00		0.583822							
	スケダン		0.581918							
	絶園のテンペスト	0.578972							
	うまるちゃん		0.576911							
	俺妹			0.57667							
	物語シリーズ		0.575383							
	とらドラ!		0.569344							
	寄生獣			0.568773							
	スラダン		0.56851							
	るろ剣			0.568442							
	ゼロの使い魔		0.566373							
	バクマン		0.565495							
	監獄学園		0.564057							
	俺ガイル		0.563473							

ハルヒの結果に一切キャラクターの出力がなく、延々と他のアニメのタイトルを出力しています。うーん、といった感じです。また、アメリカ大統領選挙の時期にツイートを収集したので結構そこら辺の語彙に豊富に見えます。まだまだ語彙に偏りがあることがこちらでも分かりますね。

今後の展望

現在1000万ツイートでもこの語彙力の偏り様なので、現在更に1000万ツイートを収集し、合計で2000万ツイートにしようと再び収集をはじめました。近い内にまた続編を更新するのでお楽しみに。

Twitter上のツイートをランダムに抽出する

標準

前回のword2vec特集で最後にちらっと紹介したTwitter上からランダムにツイートを抽出し、それをテキストに貯めていく方法について書いていきます。

利用するAPI

今回利用するAPIはTwitter社が公開するStreamingAPIの内、2番目くらいに需要がありそうな「statuses/sample」です。これと合わせて公開されているStreamingAPIは以下の3つあり、それぞれのAPIで全然使用用途が変わってきます。

API 説明 制限
POST statuses/filter フィルターを掛けて投稿を取得。地理的、アカウント別など様々な種類がある。ここでは扱わない。 特に制限なし
GET statuses/sample Twitterで投稿されているツイートをランダムに取得。少しくらいならフィルター掛けられる。 特に制限なし
GET statuses/firehose Twitterで投稿されている全てのツイートを取得。膨大なものになる。 Twitter社への特別な申請が必要。企業向け。

以上です。この内のstatuses/sampleを使って、ツイート収集プログラムを作っていきます。

利用するライブラリ

今回はGitHubから以下のライブラリを引っ張ってきました。
fennb/phirehose
このライブラリを使用することで、StreamingAPIへの認証・接続を行うことが出来ます。

プログラム

上記のGitHubプロジェクトからsampleのサンプルソースを引っこ抜いて来て、それを改造するだけで簡単に出来ます。ただ、今回は人工知能への学習用のモデルになるので、極力無駄な記号などが入らないように色々と頑張ります。

<?php
$api_key = '***************************' ;
$api_secret = '***************************************************' ;
$access_token='*************************************************';
$access_token_secret='********************************************';
require_once(dirname(__FILE__) . '/lib/Phirehose.php');
require_once(dirname(__FILE__) . '/lib/OauthPhirehose.php');
class SampleConsumer extends OauthPhirehose
{
  public function enqueueStatus($status)
  {
    $data=json_decode($status,true);
    $replaced=preg_replace('/(\n|\r)/','',$data['text']);
    $replaced=preg_replace('/@(?:\d|[a-z]|_)*\w+/','',$replaced);
    $replaced=preg_replace('/RT : /','',$replaced);
    $replaced=preg_replace('#https://[^¥s]*#','',$replaced);
    $replaced=preg_replace('/#[^\s]*/','',$replaced);
    $replaced.=PHP_EOL;
    if(mb_strlen($replaced,'UTF-8')>10) {
      print $replaced;
      error_log($replaced,3,dirname(__FILE__) . '/tweets.txt');
    } else {
      print "/////===============UNCOUNTED===============/////" . PHP_EOL;
    }
  }
}
define("TWITTER_CONSUMER_KEY", $api_key);
define("TWITTER_CONSUMER_SECRET", $api_secret);
define("OAUTH_TOKEN", $access_token);
define("OAUTH_SECRET", $access_token_secret);
$sc = new SampleConsumer(OAUTH_TOKEN, OAUTH_SECRET, Phirehose::METHOD_SAMPLE);
$sc->setLang('ja');
$sc->consume();

追記(2017/08/11):正規表現をちょっと変えました。

取得したツイートを以下の順番で正規表現による置換で無駄な記号などを置き換えていきます。

  1. ツイート内の改行を全て削除
  2. @に続くアルファベット・数字・記号(=@リプライ)を削除
  3. リツイートの接頭辞を削除
  4. リンクを削除
  5. ハッシュタグ・リツイート時の記号・空白文字(スペース・タブなど)を削除

置換されたツイート内容は10文字以下であると、文脈判定の条件上、ただの意味狂わせになりかねないので削除します。それで10文字より多いツイートはerror_logを乱用してテキストに記録していくといったものです。
ちなみにプログラム中に登場する「PHP_EOL」はPHP専用の改行コードです。

性能

色々なプログラムを試してみたところ、これが最速だったのですが、パソコンのスペックにもよると思いますが大体1時間に1万以上は収集できるようです。また、

cat tweets.txt | wc -l

とパイプで繋いだコマンドを打つことで、テキストの行数を数えて収集したツイートの数を数えることが出来ます。便利です。あと、収集したツイートでテキスト検索したい時は、

cat tweets.txt | grep "hoge"

とこれまたパイプで繋いだコマンドを打つことで色々と見れます。パイプって便利。

10万ツイート程収集しただけでも結構な語彙力になっていて、日本語モデルとして期待できそうです。