2013年7月24日水曜日

インターネットと世間のズレを垣間みる

Twitter分析でのノイズ対応の検討の打ち合わせで、
「橋下市長がプリキュアとツイッターでつぶやいた」
という事例を紹介したところ
「橋本聖子が鰤をついた?」
という反応が帰ってきました。
取り敢えず、その場では簡単に説明したのですが、未だに冗談だったのか本気だったのか分かりません。

2013年7月13日土曜日

次のTwitter分析ターゲット(予定)は…8月2日、バルスの日

 本来は、参議院選挙に向けていろいろと考えていたのですが(各党and/or候補者のTweet数と当選の相関関係の抽出など)、大人の事情で本件をレポートすることはできなくなりました。

 その代わりに、
『天空の城ラピュタ』
2013.8.2(Fri) 21:00-23:34 O.A. (金曜ロードSHOW!|日本テレビ)
をTwitter分析ターゲットとします。(これなら大人の事情が絡んでくることは、まずないはず!)

 基本的には「バルス」Tweetによるバースト観測ですが、その他に何ができるかをいろいろと模索中です。
 検討しているのは、
  • 前回放映時との比較(過去データを捜索中…確かあったはず…
  • 人名Tweet数の比較
  • 注目セリフTweetの比較(表現揺らぎ「目が目が」「目が、目がぁ~」などの扱いが難しい
といったところですが、現時点では未確定です。もしかすると「バルス」観測だけになるかもしれません。

 表現揺らぎの問題は(注目セリフだけではなく)常につきまといます。そもそも音声表現されているものを文字表現に変換しているから仕方がないのですが…

 パロディ表現の扱いも困りものです。前回放映時は「バルス五段活用」らしきものが観測されました。また、某声優がらみで「海賊にならない/海賊王になる」の突っ込みとか、某公共放送さんアカウントが「ニルス!」とつぶやいていたりとか…

 今回は何が起こるのか、楽しみでもあり、分析しきれるのか不安でもあります。

--
 ところで、ガミラス語で「点火」らしき表現が「バルス」に聞こえるのは気のせいでしょうか?

--
※リンク先修正しました


2013年7月4日木曜日

Ruby2.0でTwitterStreamingAPI (1.1) を使う

2014/11/21 追記
Ruby2.0でTwitterStreamingAPI (1.1) を使う(改)」にtweetstreamを使う方法を書きました。
下記でも動作しますが、より効率の良いこちらもご覧ください。


これまで、PerlでStreamingデータを収集していたのですが、API1.1になったのを機会にRubyに移行しました。以下、動作までの覚え書きです。

投稿や検索は、gem で Twitterライブラリをインストールすれば、簡単に使えます。

ところが、このライブラリでは StreamingAPIには対応していないようです。
To access the Twitter Streaming API, we recommend TweetStream.
とのことだったので、TweetStreamを見てみました

ところがこちらにも
Note: TweetStream does not currently work with Ruby 2.0, this is a known issue.
という記載があります。
そこで、さらに内部で使用しているらしいEM-Twitterを使ってみました

ところが、これは実行時にライブラリが足りないらしく、なにやらDevelopperKitうんぬんとメッセージが表示されます。gemだけで使いたいので、これも不採用としました。


 上記の調査から既存ライブラリの使用は断念し、TwitterStreamingAPI を直接http接続から使用する方法をとることにしました。
 探してみると、以下のようなものがありました。3つのプログラムコードはほとんど同じです。



上記のページを参考にしながら、次のような変更を施しました。
1.CONSUMER_KEY、ACCESS_TOKENなど
 自分で用意したものに変更しました。

2.request["User-Agent"]
 自分の都合に合わせて変更しました

3.接続先
 「GET statuses/sample
を使いたかったので、接続先を
  https://stream.twitter.com/1.1/statuses/sample.json
に変更しました

4.サーバ証明書
 これは、本来は必要なんでしょうが、実験で使用するプログラムであることから、証明書なしで動作させるために
  https.verify_mode = OpenSSL::SSL::VERIFY_NONE
としました
(将来的な動作を保証するものではありません)

※必要なライブラリは、適宜gemからインストールしました

以上で、基本動作の確認が出来ました。あとは、それぞれの都合に合わせて修正して使います。

※2013/07/04時点の調査です。

2013年7月3日水曜日

日付の明記されてないブログ記事や文書に振り回され

 ある情報を検索していたときのこと、問題解決法が書かれたブログ記事を見つけて喜んでいたら、実はそれは古い情報で使い物にならなかったという事がありました。日付が書いてなかったので最新の情報だと思い込んで読んでしまったのです。もし日付があったら、古い情報だという前提でその内容を確認するのでショックは少なかったはずです。

 同じことが、社内文書なんかでも良くあるから困ってしまいます。
 調査レポートや仕様検討の資料が、時系列無視してあちこちのサーバに格納されているという現状に直面し、ため息をついています。

 IT系サービスに関する情報は特に鮮度が重要な場合が多いように感じます。少し前の情報があっという間に役に立たなくなるということがこれまでにも何度もありました。
 そしてまた今回も同じ轍を踏んでしまいました。

 本来エネルギーを割かなければならないところに力を注げないのは困りものです。

2013年7月2日火曜日

選ばれたのは…SuffixArrayでした…

最終製品版ではなく、短期に確実に動作するプロトタイプを作成する必要性から、今回は(とりあえず) SuffixArray を採用しました。
それでも、さすがにSAISを実装しました。MultikeyQuicksortでは、ある特定の条件下で致命的な遅さが観測されたので却下です。

実際問題としては、様々なしがらみとの調整の上で、ベストな選択を行うことになると思います。
たとえば、実際に実用的な速度で動いているものを改良するための工数を確保できるのか、というような問題があります。
研究室とは異なって、開発の現場では必ずしもベストな性能のものが選択されるわけではありません。良い悪いという話ではなく、プロジェクト全体がベスト(ベター)になるような選択がなされます。納期までに所定の製品ができなければ、それは何もないのと同じだからです。

良い技術であることと、それが製品/プロジェクトにとってベストの選択であるかどうかは、必ずしも一致しないということです。

(とはいえ、技術者としてはベストの技術を使えないのは悔しいので、いつかどこかで何とかならないか画策するつもりではいるのですが。)

2013年6月30日日曜日

「高速文字列解析の世界」を読むのに参考にした資料


 現時点では、ビッグデータではなく、サンプリングされたデータを扱っているのですが、「大規模」データであることには違いなく、それらを如何に高速に処理するかに頭を悩ませています。

 この本は、その悩みを解決する助けになりました。
 実際には、いくらかの前提知識が必要ですし、対象とする問題や開発環境も考慮しなければなりませんでした。

 部分的な調整しかできていませんが、それでも、当初は致命的とも思われた実行速度を、何とか現実的な速度まで持てくることができました。


 以下に、この本を読む際に参考にしたページ、各種実装関連のページなどへのリンクを(備忘録も兼ねて)記しておきます。
 なお、「参考にした」ページですので、必ずしも本書にて解説されている項目とは限りません。

 ※実装コードの項目に記載したライセンスは調査時のものですし、未確認・未記載のものもあります。利用に際しては、それぞれ確認が必要です。



■全般

『大規模文字列解析の理論と実際』(pdf) [岡野原大輔]
2010/06/14 情報論的学習理論と機械学習研究会 (IBISML) @東京大学

■ウェーブレット行列



■FM-INDEX

FM-index++を公開しました [tb_yasuの日記]
2010-12-30

fmindex-plus-plus
旧バージョン
新バージョン
C++による実装
最終更新:2013/04/03

FM-Index [気ままなブログ]
Javaによる実装
2013-02-24

■SA-IS(Suffix Array - Induced Sorting)




SAIS
C/C++、Java、C# による実装
MIT/X11 license.
最終更新:2010/09/17

Suffix Array を作る - SA-IS の実装 [ビームの報告書]
C++による実装
MIT LICENSE
最終更新:2011/08/19


■SuffixArray:Multikey Quicksort
接尾辞配列 (suffix array) [Algorithms with Python]
Larsson Sadakane 法 / マルチキークイックソート
Pythonによる実装&解説
最終更新:2007

Suffix Array (Larsson-Sadakane) [Spaghetti Source]
Suffix Array を O(n (log n)^2) 時間で構成するアルゴリズム
multikey quicksort ではなく,ただの quicksort を用いている
C++による実装
最終更新:2007/12/11

String Sort Library
Multikey Quicksort
C/C++による実装
利用や再配布などに関する制限はありません.
最終更新:2007/12/20


Bloggerからトラックバックが飛ばせないということを今回知りました。
リンク先の皆様、ご容赦ください。

2013年6月25日火曜日

Twitter分析:2013年コンフェデ杯での選手別Tweet計測

2013年コンフェデ杯での出場選手別のTweet数を計測しました。
例によってTwitterStreamingAPIでの1%Tweetを用いています。
検索条件は、検索文字列は名字のみ、期間はキックオフの1.5時間前から5時間分です。



■予選3試合での出場選手ごとTweet合計
 予選3試合のTweet数を合計して順位付けしました。
 上位3名(本田香川岡崎)が飛び抜けています。
 以下、3試合前出場した選手が横並びで、1~2試合出場の選手が続きます。


■2013年6月16日(日) 対ブラジル戦(4:00キックオフ) 2:30-7:30
 3:00に全体的なピークがあります。おそらくスタメン発表がらみだと思われます。

■2013年6月20日(木) 対イタリア戦(7:00キックオフ)  5:30-10:30
 この試合だけ時間帯が違います。
 平日にも関わらず昼間の時間だったため、Tweet数の目盛りが6倍程度になっています。

■2013年6月23日(日) 対メキシコ戦(4:00キックオフ) 2:30-7:30
 深夜帯の試合に加えて、既に予選敗退が決まっていたこともあり、結果のみを確認した人が多かったようです。


第1試合と第3試合は時間が深夜帯だったため、全体のTweet数が少ないので、全数調査との乖離があるかもしれません。
第2試合は、妥当な結果が出ていると思います。


2013年6月22日土曜日

ビッグデータとサンプリングデータ:『ワールドカップアジア最終予選 日本×オーストラリア』での比較調査

 「ビッグデータ」という言葉は世間に定着してきていると言っていいでしょう。バズワードと呼ぶかどうかはここでは言及しませんし、重要ではありません。
 その一方、統計との関係性から、「ビッグデータありき」という姿勢に疑問を呈している記事もあります。

そこで、自然言語処理(というか文字列検索)での「全数データ」と「サンプリングデータ」の結果を比較して、どのような違いが出てくるかを調査してみました。

対象データとして次を見つけたので、これを全数データと見なします。
(最新の試合でないのが残念ですがご容赦ください)
サンプリングデータは過去と同様にTwitterAPIのストリーミングデータ(全Tweetの1%)を使います。
集計期間および検索条件は、元記事に記載されているものを原則そのまま使用します。(#fjaという記載がありますが、これは#jfaのタイポと思われるので、これだけは「#jfa」を使用)
細部については元記事を参照して下さい。

結果を以下に掲載します



1.出場した全14選手の名字検索でのランキング
 ほとんど同じですが、本調査では5位の長友と8位の内田がより上位になる結果となりました。
 (下記表は元記事の順位のままに、投稿件数のみを本調査のものを記載しました)


2.本田選手、香川選手、川島選手の投稿数推移
 元記事同様、本田選手のみ右側の目盛りを参照してください。
 本調査では18時~19時台で多めの数値が出ていますが、それ以降は同じ傾向が確認できます。


3.オーストラリア戦での投稿数の推移
 同じ傾向が見られます。

4.松木氏、ゴン中山氏、セルジオ越後氏の投稿数グラフ
 同じ傾向が見られます。(ゴン中山が多めに取られてる?)

5.松木氏の投稿数推移グラフ
 全体の傾向(ピーク位置)が同じことが確認できます。


6.「渋谷」「道頓堀」の投稿数推移
 渋谷のピーク位置がずれましたが、全体の傾向はほぼとれています。



元記事で示したかった情報とほとんど同様の結果がサンプリングデータでも示すことができたと思いますがいかがでしょうか。

「定性的な傾向はサンプリングデータ(今回は1%)でもほぼ取得できる。ただし、精度的には劣る場合がある」と言うことを認識した上で使用するのであれば、十分役に立つのではないでしょうか。


(2013/6/26)タイトルを変更しました

2013年6月18日火曜日

クラウドソーシング(クローズアップ現代)を見て

番組サイト:クローズアップ現代「企業も働き方も激変~クラウドソーシング」

自然言語処理の様な仕事にクラウドソーシングを適用をできるか考えながら見ていました。
番組中で紹介されていたのは、予想していた通り、企画やデザインなどでした。また、おそらくは仕様の確定したプログラミングの下請けなどの仕事もあるかもしれません。

現実のプログラミングの現場では、
  「限られた条件の中で如何にして要求仕様を実現するか」
という問題が大きく、これを解決するために利用できる可能性もあります。

しかし、自然言語処理の製品を作る場合には、それに加えて、より深刻な問題として
  「実現方法が分からない」
あるいは
  「実現可能であるかどうか分からない」
  「解決不能な問題かもしれない」
というような局面に遭遇することがあります。単純な時間やマンパワーの投入では解決しません。

これらに対応可能な人材が、クラウドソーシングに登録する状況は考えにくいですし、もしいたとしても直面している問題に対応できる人材かどうかを判断することができないような気がします。

でも、クラウドソーシング自体が広く普及し、普通の働き方になっていく未来も考えられないわけではありません。その場合にはまた違った判断になるでしょう。

日本で今後どのようにクラウドソーシングが広まっていくか、興味深く見守っていきたいと思います。


P.S.
上記の問題の対策は、簡単に言えば、近似値に落とし込む、別手法を試してみるなどしますが、個別の製品ごとにアプローチは異なるので、様々な知識・経験が必要です。さらにその対策すらも同じ問題に陥る場合があります。そして、繰り返しながら、現実的な解決策を探っていきます。


2013年6月17日月曜日

ブログ再開します

本業との兼ね合いがあり、大人の事情でブログの更新を停止していました。(ブログを続けて食えなくなったら本末転倒なので)

状況が落ち着いてきたこともあり、大人の事情に抵触しない範囲でブログの更新を再開したいと思います。

今週は準備期間として、来週くらいから本格的に再開する予定です。

なお、ブログ更新を停止していた2年間について言えば、とりあえず、自然言語処理で食っていけていました。