Streaming APIで大量のつぶやきをリアルタイムに保存する方法(cURL編)

つぶやきを大量に取得したいときには、TwitterのふつうのAPIではなく、Streaming APIを使います。ふつうのAPIは1時間あたり350回しか使えないので、対象となるつぶやきが、APIを目一杯使って取得できる数を超えるとどうしようもありません。Streaming APIならこのような心配は無用で、条件を設定して一度接続すれば、設定した条件に合うつぶやきを大量に取得できます。厳密に言えば、これは程度の問題でしかなく、Streaming APIでも、すべてのつぶやきを取得できるわけではないのですが、ここでは、「ふつうのAPIに比べれば遙かにたくさん取得できる」と考えてください。

cURLを使うのが簡単です。次のようなシェルスクリプト(stream.sh)を作成し、「bash stream.sh >> result.dat」などとして実行すれば、指定したキーワードを持つつぶやきを、result.datに保存できます(「sudo apt-get install curl」などとしてcURLをインストールする必要があるかもしれません)。

キーワードはURLエンコーディングが必要です(ハッシュは「%23」、OR検索のためのカンマは「%2C」、AND検索のためのスペースは「%20」とすればいいのですが、日本語は現時点では難しそうです)。#iwakamiyasumiと#iwakamiyasumi2のどちらかを含むつぶやきを取得したいときは「%23iwakamiyasumi%2C%23iwakamiyasumi2」となります。

#!/usr/bin/env bash

username=Twitterのユーザ名
password=Twitterのパスワード
keyword=つぶやきをしぼりこむためのキーワード(URLエンコーディングが必要)

url=https://stream.twitter.com/1/statuses/filter.json
while :
do
  curl -d track=$keyword -m 240 -u $username:$password $url
done

240秒ごとにcURLの接続をリセットしています。この方法には、途中で接続が切れても最大240秒待てば自動的に再接続されるというメリットがありますが、リセット時につぶやきを取りこぼす危険や、つぶやきを重複して取得する可能性があります。この間隔(240)を小さくすると、Twitterから接続を断られるかもしれないので注意して下さい。この数字は再接続の最大待ち時間です(参考:Streaming API Concepts)。つぶやきがないときは、30秒ごとに「CR LF」が送信されてくるので、これをチェックすれば切断を検出できるのですが、自分で実装するのは大変なので、あとで別の方法を紹介しましょう。(30秒で2バイトなので、cURLの「-y」や「-Y」では対応できないのが残念です。)

取りこぼしを少なくするためにこのスクリプトは、インターネット環境が不安定な出先ではなく、インターネット環境が安定したサーバで動かしたままにしておくといいでしょう。とりあえず全部取っておいて、あとで必要な部分だけ抜き出すというわけです(抜き出し方はあとで紹介しましょう)。

以下の2点については後で書きます。

  • 接続が切れたときにスマートに再接続する方法Python編で紹介しました)
  • 保存したデータから必要な部分だけを取り出す方法書きました

なぜこういう技術が必要なのでしょう。

Ustreamのような動画配信サービスが登場し、それを活用するジャーナリストの活躍を見ると、「記者クラブメディアが諸悪の根源だ」という状況も少しずつ改善するのではないか、と期待してしまいます(最近の面白かった映像は「読売新聞記者vs上杉隆氏と岩上安身さん」)。たとえば、岩上安身(@iwakamiyasumi)さんが率いるIndependent Web Journal (IWJ)のおかげで私たちは、これまでなら記者クラブメディアの能力不足とフィルタリングのせいで人目に触れずに消えていたであろう映像を見ることができます。

しかし、IWJのUstreamスケジュールを見てもわかるように、その量は膨大で、全部見るのはほとんど不可能です。自分にとって重要な映像がすぐに見つかるようになっていればいいのですが、現在の映像検索技術では難しいでしょう。よくやられるのは映像に付与されたメタ情報(タイトルやタグ)などを使って検索することですが、タイトルはともかく、タグを適切に付けるのもかなりの労力だと思います(Togetterもしかり)。ソーシャルメディア上で推薦システムを動かして・・・ということも考えられますが、自分が見た映像の記録がすべて保存され、活用されるのをいやがる人もいるかもしれません(話がそれました)。

幸運なことに、著名なジャーナリストが配信する映像は、一般的な映像とは違います。特に記者会見の映像には、「tsudaる」というボランティア行為による膨大な文字情報が付随します。これを活用するために、まずはその文字情報を保存しよう、というのが今日のお話。

Ustreamには、動画に対する複数のソーシャルメディアからのコメントをまとめて表示する「ソーシャルコメント」という機能があるのですが、とりあえず、Twitterのつぶやきだけを保存することにします。こういうことの大切さが理解され、Ustreamが保存してあるソーシャルコメント()を使いやすい形で提供してくれることを願います。

恩師の条件—魚偏の漢字

中学3年間、中勘助『銀の匙』1冊だけを教科書に行われたの国語の授業を紹介した『奇跡の教室』。この本に出てくる「魚偏の漢字は678字ある」という話を確かめられなかった、ということを以前書きました

4576050516予想はしていたのですが、「諸橋大漢和だと『恩師の条件』書いてある」と教えてもらったので、さっそくチェックしてみました。

恩師の条件自体は私にはあまり関係がないのですが、「私は高校生の勉強を“孤独な戦い”に終わらせたくなかった(p.170)」というのに、我が意を得たりなどと思いながら見ていくと、次のような記述がありました。

漢字を知らなければその魚が口にはいらぬわけでもないが、魚の漢字を見てどんな魚かわかるというのも日本人的教養というものであろう。

どんな字があるか、辞書を写せば簡単だがそれでは面白くない。趣味と教養を両立させたいものである。すし屋で出すマッチ、箸ぶくろ、茶呑みなどに、魚つくしを使っているのがある。ちょっと気をつけていると何種類も集まってくる。その読解をやってみるとなかなか面白い。大漢和辞典の六七八字の中にさえ含まれていないで、いくら考えても読めないものもあり、まるで難しいクイズを解くようなおもしろさが味わえる。「銀の匙研究ノート」

「魚偏」とは書いていませんが、諸橋大漢和であることは確認できました。重くてちょっとあれなのですが、引っ張り出して確認してみると、魚部の漢字が679字あるので、おそらくこれのことだったのだろうと思います(魚偏だけに限定すると625字)。補巻で追加された魚部が23字(うち魚偏は20字)などを考えるとまたよくわからなくなるので、「魚部は約700字」ということにするのがいいかと思います。

諸橋大漢和の情報ならUnicodeのデータベースに入っているじゃん」と思って、いつものようにUnihan.zipを漁(≠魚偏)ってみしたが、

grep kMorohashi Unihan_DictionaryIndices.txt | cut -f 1 | sort > morohashi.txt
grep "\\s195'\{0,1\}\." Unihan_RadicalStrokeCounts.txt | cut -f 1 | sort | uniq > 195.txt
join morohashi.txt 195.txt | wc -l

284

このように、284字しか出てきませんでした。CJK統合漢字拡張漢字に関しては、諸橋大漢和との対応はとられていないようですね。

魚​魛​魜​魝​魞​魟​魠​魡​魢​魣​魤​魥​魦​魧​魨​魩​魪​魫​魬​魭​魮​魯​魰​魱​魲​魳​魴​魵​魶​魷​魸​魺​魻​魼​魽​魾​魿​鮀​鮁​鮂​鮃​鮄​鮅​鮆​鮇​鮈​鮉​鮊​鮋​鮌​鮍​鮎​鮏​鮐​鮑​鮒​鮓​鮔​鮕​鮖​鮗​鮙​鮚​鮛​鮜​鮝​鮞​鮟​鮠​鮡​鮢​鮣​鮤​鮥​鮦​鮧​鮨​鮩​鮪​鮫​鮬​鮭​鮮​鮯​鮰​鮱​鮲​鮵​鮶​鮷​鮸​鮹​鮺​鮻​鮼​鮽​鮾​鮿​鯀​鯁​鯂​鯃​鯄​鯅​鯆​鯇​鯈​鯉​鯊​鯋​鯌​鯍​鯎​鯏​鯐​鯑​鯒​鯔​鯕​鯖​鯗​鯘​鯙​鯚​鯛​鯜​鯝​鯞​鯟​鯠​鯡​鯢​鯣​鯤​鯥​鯦​鯧​鯨​鯩​鯪​鯫​鯬​鯭​鯮​鯯​鯰​鯱​鯲​鯶​鯷​鯸​鯹​鯺​鯻​鯼​鯽​鯾​鯿​鰀​鰁​鰂​鰃​鰄​鰅​鰆​鰇​鰈​鰉​鰊​鰋​鰌​鰍​鰎​鰏​鰐​鰑​鰒​鰓​鰔​鰕​鰖​鰗​鰘​鰙​鰚​鰜​鰝​鰞​鰟​鰠​鰡​鰢​鰣​鰤​鰥​鰦​鰧​鰨​鰩​鰪​鰫​鰬​鰭​鰮​鰯​鰰​鰱​鰲​鰳​鰴​鰵​鰶​鰷​鰸​鰹​鰺​鰻​鰼​鰽​鰾​鰿​鱀​鱁​鱂​鱃​鱄​鱅​鱆​鱇​鱈​鱉​鱊​鱋​鱌​鱍​鱎​鱏​鱐​鱑​鱒​鱓​鱔​鱕​鱖​鱗​鱘​鱙​鱚​鱛​鱜​鱝​鱞​鱟​鱠​鱡​鱢​鱣​鱤​鱥​鱦​鱧​鱨​鱩​鱪​鱫​鱬​鱭​鱮​鱯​鱰​鱱​鱲​鱳​鱴​鱵​鱶​鱷​鱸​鱹​鱺​鱻​鷠​魯​鱗

4582128041ちなみに、一家に一冊『字通』には、魚部の漢字は48字あるようで、このくらいが平和でいいなあと思いました。さらにちなみに、.NET版『字通』はすてに古くなっていて、残念ながらWindows 7にはインストールできません。紙の『字通』はこの先もずーと読めるでしょうから、改めて「紙は強い」と思いました。とはいえ、諸橋大漢和は重くて場所取ってあれなので、早く電子化してほしいのですが、

CD-ROM化に関しては、コンピュータで扱える漢字の数の問題や、『大漢和辞典』そのものの巨大さがネックとなって、一朝一夕には実現できない状況です。(「大漢和辞典 よくある質問」のQ13

4469800007などと言うなら、とりあえず画像で、番号での検索のみ可能にしたバージョンを、DVDやiPad版で出せばいいんじゃないかと思います。ポスターならできるくせに。自炊している人とかいるんですかねえ。

4121503945『灘中 奇跡の国語教室 – 橋本武の超スロー・リーディング』というタイトルで新書化されました。

奇跡の教室—エチ先生と『銀の匙』の子どもたち

進学校として有名な灘高にはかつて、中学3年間をかけてたった一冊の薄い岩波文庫、中勘助『銀の匙』を読む国語の先生がいたという。

岩波文庫の『銀の匙』は、本文だけでなくその解説もけっこうすごいことになっている。解説を書いているのは和辻哲郎だし、そこで紹介されるのは、漱石がいかにこの作品を賞賛したかということなのだ。

漱石はこの作品が子供の世界の描写として未曾有のものであること、またその描写がきれいで細かいこと、文章に非常な彫琢があるにかかわらず不思議なほど事実を傷つけていないこと、文章の響きがよいこと、などを指摘して賞賛した。(p.224)

400339481Xそうは言ってもたった一冊の文庫本で3年も授業ができるか、と思う人もいるかもしれないが、関連する話題を丁寧に扱えば、3年くらいはすぐに経つものだろう。「文庫本1冊に3年」を私が大学で試すとしたら、ウィーナー『サイバネティックス』(岩波文庫, 2011)が有力候補だが、それについてはまた別の機会に書く。

3年間『銀の匙』の先生の名は橋本武。彼の授業の様子、教え子たちのその後を追ったノンフィクション、伊藤氏貴「奇跡の教室 エチ先生と『銀の匙』の子どもたち」(小学館, 2010)を読んだ。

「教え子に聞く」というコラムの中で、海渡雄一さんが思い出を語っている。

『銀の匙』の中に、お寿司屋のシーンが出てくるんだけど、そこで橋本先生が『魚偏の漢字は全部で678あります。集めてみましょう』という課題を与えたんですね。(中略)『魚偏』、500以上集めたかな。でも全部は集められなかったですね。(p.188)

このエピソードに関連して、以下のような話をするだけで、あっという間に数時間は経つはずだ。こういうことを「くだらない脱線」で終わらせないための技を(私は)持っているだろうか。

  • 文字コード・Unicode(2時間)
  • 正規表現(1時間)
  • シェルスクリプト(1時間)
  • ウェブブラウザ上で表示される文字の振る舞い(0.5時間)
  • 四角号碼の練習(0.5時間)

Unihanデータベースで魚部の漢字を調べると、本エントリ執筆時点で1191文字あることがわかる。

確認のために、Unihan.zipのUnihan_RadicalStrokeCounts.txtを使って、次のようなスクリプトを実行してみる。

grep "\\s195'\{0,1\}\." Unihan_RadicalStrokeCounts.txt | cut -f 1 | sed -e 's/U+//g' | uniq

結果は1198文字で、さっきより7文字多い(下に赤で示す)。その内訳は、Unicode 6.0で追加された6文字(U+2B80DからU+2B812)と、康煕字典とUnicodeで部首が違うU+7A23だが、Unicode 6.0の6文字についてはいずれ更新されるだろう。下の画像にすべて挙げるが、高解像で見たい場合はPDFHTML文書(Webフォント使用)を参照してほしい。

魚部の漢字1198文字

最後の文字(U+2FA0B)はCJK互換漢字補助で、U+9C40と同字(のはず)だから除外してもいいだろう。というわけで、魚部の漢字は1197字ということになる。この時点では橋本先生の言う678文字よりはるかに多い。その原因は、橋本先生が言ったのが「魚偏の漢字」だったのに対して、ここで数えたのは「魚部の漢字」だからということだろう。困ったことに、Unihanデータベースには、偏は直接は登録されていないため、「魚偏の漢字」は簡単には数えられない。約1200個の中から、魚偏のものだけ目視で選ぶのも大変だ。

そこで試しに、四角号碼で検索してみる。魚偏の漢字の四角号碼は正規表現を使って「2.3.」と書けるから、次のようなスクリプトで探せるはずだ。

grep "kFourCornerCode\\s2.3." Unihan_DictionaryLikeData.txt | cut -f 1

結果は期待はずれ。Unihanデータベースのすべての文字の四角号碼が登録されているわけではないし、「2.3.」にマッチする文字は魚偏のものだけではないため、この方法ではうまくいかない。

乏​冬​劁​勲​勳​勺​崽​嶌​嶺​巛​忐​忝​忽​怠​怤​急​怨​怱​怹​恁​息​恷​悉​悠​您​惄​惣​惩​惫​愁​愆​態​慫​憇​憊​憩​懇​懲​懸​戀​歍​毖​炰​点​烋​烏​焦​然​煞​熈​熊​熏​穌​虢​鄎​鄔​鄩​鄬​駌​魚​魛​魟​魠​魡​魤​魦​魧​魨​魬​魰​魱​魴​魵​魶​魷​魺​魻​魼​魽​魾​鮀​鮂​鮃​鮅​鮆​鮇​鮈​鮎​鮐​鮑​鮒​鮓​鮕​鮖​鮗​鮚​鮛​鮞​鮟​鮠​鮡​鮢​鮥​鮦​鮨​鮪​鮫​鮭​鮮​鮯​鮴​鮵​鮶​鮸​鮹​鮽​鮿​鯀​鯁​鯃​鯄​鯆​鯇​鯉​鯏​鯑​鯒​鯓​鯔​鯕​鯖​鯙​鯚​鯛​鯜​鯞​鯠​鯡​鯢​鯣​鯤​鯥​鯦​鯧​鯨​鯪​鯫​鯬​鯰​鯱​鯲​鯵​鯷​鯸​鯽​鰄​鰅​鰆​鰇​鰈​鰉​鰊​鰋​鰌​鰍​鰎​鰐​鰒​鰓​鰔​鰕​鰗​鰛​鰜​鰝​鰡​鰣​鰤​鰥​鰨​鰩​鰫​鰬​鰭​鰮​鰯​鰰​鰱​鰳​鰶​鰷​鰹​鰺​鰻​鰼​鰽​鰾​鰿​鱁​鱄​鱆​鱇​鱈​鱊​鱋​鱌​鱍​鱎​鱐​鱒​鱔​鱕​鱖​鱗​鱘​鱙​鱚​鱞​鱠​鱢​鱣​鱦​鱧​鱨​鱮​鱱​鱳​鱴​鱵​鱶​鱷​鱸​鱹​鱺​鳥​鳦​鴃​鴕​鴛​鵀​鵆​鵌​鵔​鵞​鵹​鵻​鵿​鶀​鶖​鶭​鶳​鷈​鷌​鷥​鷦​鷻​鸃​鸄​鸑​鸔​鸞​鹪​黛​黧

(いろいろ省略)

いろいろ試してみると、Unihanデータベースには魚偏の漢字は少なくとも903文字はあることがわかる。下の画像にすべて挙げるが、高解像で見たい場合はPDFHTML文書(Webフォント使用)を参照してほしい。「魚」は日本の字体だけに限定。フォントが変われば字形も変わるかもしれないが、ここでは追求しない。

魚偏の漢字903文字

「少なくとも903文字」と書いたのは、魚部の検索結果から文字を絞り込んでいるから。もしかしたら、魚部とはみなされていなくても、魚偏の漢字はあるかもしれない。たとえばUnihanデータベースでは、禾部で検索した結果に「稣」が含まれている。この文字は魚部で検索しても出てくるから問題ないが、もっと悪い例はあるかもしれない。漢字はたくさんあってよくわからない。

橋本先生はどういう根拠で「魚偏の漢字は全部で678あります」などと言っただろう。諸橋轍次のアシスタントをしたことがあるらしいから、諸橋大漢和にあたればわかるかもしれないが、とりあえずはこのくらいにしておこう。

追記:恩師の条件—魚偏の漢字

お約束ですが、文字コードや字体、字形について知りたい人は、拙著『Webアプリケーション構築入門』を参照してください。情報系の大学の授業なら、この本1冊でも1年くらいはもつでしょう。

加納喜光『魚偏漢字の話』(中央公論新社, 2011) 根本浩『根本式 語呂あわせでおぼえる難読漢字〈1巻〉魚編 』(汐文社, 2006) 江戸家魚八『魚へん漢字講座』(新潮社, 2004)

ベンチマークに迷う

カジュアルなO記法の続き。

Fibonacci数の計算時間は入力が大きくなるとどうなるのだろう。

今ふつうに使える計算機でFibonacci数を計算するのにかかる時間は、70程度までならほぼ一定」というのはまあいいとして(よっぽどナイーブな実装でなければ一瞬だし)。

迷ったらbenchmark」という教えがあったから、Mathematicaで試してみた。

Mathematicaは約5.2e-646456888から1.9e646456887までの数ならいろいろ難しいことを考えずに使えて便利なんだけど(Windows, 32bit版)、中がどうなっているかわからなくて気持ち悪い。マニュアルにはこれだけ。

Fibonacci[n]はn の2進数列に基づく反復法を使用する.

同じ計算を何度もやらせて総時間を回数で割る、というのは怪しそう。Mathematicaの動作がまず不明だし、どこのキャッシュにどういうデータが入るのかなんて、考えてもよくわからない。

賢い処理系はf(100)のあとにf(101)を計算するとき前の結果を使ったり、「なんだよ、同じ事の繰り返しじゃねえか、じゃあ、さっきの答えでいいよな」ってなったりするかなあ(もっと賢い処理系は「ああ、時間を計りたいのね、じゃあ素直にやってあげるよ」なんてことに)。

というわけで、1回のセッションで1つの値を1回だけ計算するということにした(それでも入力が大きくなれば計れるくらいに時間がかかる)。

rm -f tmp.txt
for (( p=1 ; $p < 31 ; p=$(($p+1)) ))
do
echo "{2^$p,CForm[Timing[Fibonacci[2^$p];][[1,1]]]}" | math >> tmp.txt
done
grep Out tmp.txt | sed 's/Out\[1\]= {\|,\|}//g' > result.txt

結果(Athlon X2 4400+, メモリ2Gbで2^30まで)

結果

Fibonacci[2^31]はオーバーフロー。ディスクを使うようなコードを書けばかなり先まで続けられるだろうけれど、傾向はかなり変わるだろうね。

小さいときだけ見て、一定だと誤解してしまうのもしかたないか。

結果

実機で試すのも楽じゃないな。

関連:フィボナッチ数, PHP, 多倍長整数