90文字以上のつぶやきを抽出して長文ったー生活

私のTwitter史と、雑感、利用法を紹介してみる - 鍵壺のWeblogで書いたように、
私はTwitterを通じて、自分にない視点や価値観、考え方が知れることを一番の楽しみにしている。
そして今回、正規表現によるフィルタリングを行い、より質の高い*1postの割合を抽出する試みを行なった。


前置きが無駄に長いので、本題と関係ないところに興味がなければ、適当に読み飛ばしてほしい。

実は前から試そうとしていた

本格的にTwitterを使うようになってから2ヵ月、その頃の私はこんなことをつぶやいていた。

30文字未満/60文字未満/90文字未満/90文字以上 にpostを分類して、面白いと感じるpostが、それぞれの文字列ごとに、どれくらいの割合で出現するか考えてたんだけど、私にとって面白いpostは、文字数多いほうが出現率高いなあと感じる。正規表現使って長文タブでも作ろうかな。

2:19 AM Aug 21st YoruFukurouで

このように、長文タブの構想はあった。けれど、当時の私は、正規表現ってなあに、おいしいの?なんか便利そうだねという印象を持つ程度の知識しか持ち合わせておらず、思いたったら即実行!というわけには至らなかった。で、すぐに行動しなかったのだから、この日はおそらく、別の話題に食い付いて、そのまま忘れてしまった。私の悪い癖だ。


それからしばらくして。あるpostに反応し、こんなことをつぶやいた。

これを機に私も文字数によるタブ分けしてみよう。ただしRTとURLは抜くようにする。文字数によるS/N比の調査もやる。 略RT @ryoubi: 正規表現で「.{90,}」と書いて、Tweenで90文字以上の発言のみ表示されるタブを作った。

10:51 AM Sep 9th YoruFukurouで

しかし、やらなかった。やるやる詐欺。なんとしてでも撲滅すべき悪癖だが、まあそれはおいといて。
この時は、その正規表現を試せばできる、とはわかっていたんだけど、ただこのままでやっても、RTやURLを含んだpostが多く含まれたものが抽出され、質の高いTimeLineとはいえないものができそうだと思った。なので中途半端はよくないと保留とした。正規表現で文字列のフィルタリングを設定したかったのだけど、ちょっと考えたうちでは難しそうだな、また時間のある時にやろう、と判断したのだ。


そんなこんなで後回しにし続けた、長文タブの構想。
今回やってみるきっかけになったのは、前回書いたエントリだった。現状を文章にまとめて現状の理解がより深まったので、これを機に、もう一度、Twitterとの付き合い方を見直そうと思った。そして、しっかりと時間を確保できたので、設定について色々変更を加えてみたのだ。

正規表現のお勉強

私の使用するTwitterクライアントの夜フクロウは、正規表現によるタブ分けが可能だ。今回はこの機能を使って、文字数フィルタリング、および、RTやURLを省く。

ところで、私はほとんど正規表現を使ったことがない。mi*2でテキストファイルをいじる時、検索指定に使う程度だ。複雑な指定はしないし、PerlとかRubyとか文字列操作に強い言語は、全くといっていいほど触れない。けれど、正規表現自体への興味はある。なんとなく、法則性を見つけるパズルゲームのような感じがするので好みなのだ。使う機会がなかなかないので覚えなかったが、この機会にしっかり触れて、理解を深めたい。

正規表現が何のためのものか、というのは大学の講義で学んだ。何か決められた文字列を抽出するのは得意だが、NGワードを指定するような用途には向かない。なので、今回は、文字列RTをざっくり削ることを目指す。

さっそく直感で書いてみる。これでいけるかな? .*[^(RT)].* しかしこれは無理だった。.* という表記が、RTという文字列を含め、全ての表記を該当させてしまうからだ。

ではどうしよう。RTを含まないものを全て指定するしかないのか。
Rの次がTだと困るので、R[^T]。しかし、[^T]の中にはRも含まれるので、その後にTが来たら困るかもしれない。じゃあそれをどうやって書くか?と考えたところで、これと似たようなことが、大学の課題にあったことを思い出した。こういうのは後ろから確定していったらうまくいくんだっけ。
なので、仕切り直し。まずはTを禁止にしてみる。[^T]。これで、RTという文字列は完成しない。しかし、これではTという文字が全て弾かれてしまう。なので、Tの直前にR以外が来たら許可する。[^R]T 二つ合わせて、これらを繰り返しにすると([^T]|[^R]T)+。で、これだと文頭にTが来た場合も弾いてしまうので、^T?を追加して完成。
^T?([^T]|[^R]T)+$となる。
図にすると こんなかんじで、RTという文字列は通さなさそうだ。
よし、とりあえずこれでやってみよう。

しばらく使ってみたところ、RT含むpostを抽出することはなかった。しかし、この正規表現には問題がある。RTという文字列を問答無用で弾いてしまうので、RTという行為自体に言及しているpostが弾かれてしまうのだ。*3しかし、多少postが漏れたところで、大きく困るわけではない。全部、漏れなく目を通したいわけではないし、余計なRTを含むpostを省けるというだけで、目的は達成されている。


というわけで、正規表現をしっかり勉強したとは言い難いが、とりあえず目的とした設定はできた。

教えてTwitter

さて、今回の取り組みは正規表現の勉強も兼ねている。だから、動いているとはいえ、やっぱり美しいものを書きたい。けれど、このペースでは日が暮れてしまう。*4なので、検索で過去に同じような正規表現を書いたような人がいないか探した。そして、一つのpostに行き当たった。

夜フクロウ向けRT抽出用正規表現(暫定版!) RT(?:[:\s]*@[A-Za-z0-9_]|\(via[:\s]*@[A-Za-z0-9_]) *5

http://favstar.fm/users/mickey24/status/2907768851

これは役に立つ情報だった!というわけで、早速、「正規表現とても参考になります」と感謝のRTを送った。そして、ちょっと厚かましいかなと思いつつも、「今こんなことやってるんですけどアドバイス下さいますか」と申し入れした。すると、「私のほうでも考えてみます」との返事が。おお、ありがたい!そして、このようなpostをいただいた。

できたっぽい.RT以外の発現にマッチする正規表現 (?=^(?:(?!RT(?:[:\s]*@[A-Za-z0-9_]|.*\(via[:\s]*@[A-Za-z0-9_])).)*$)

これはたいへんよい精度だった。ただ一つ問題があるとすれば、先程、自分で用意したものと比べると、改行を含むpostを漏らしてしまうのだけれど、それは自分でなんとかしよう。勉強だ。

長文TimeLineなう

長文postの定義は適当だが、とりあえず90文字としてみた。で、これを正規表現であらわすと、{90,}となる。
というわけで、とりあえず
(?=^(?:(?!RT(?:[:\s]*@[A-Za-z0-9_]|.*\(via[:\s]*@[A-Za-z0-9_])).){90,}$)
で運用開始をしてみる。


うん、目論み通り、質の高いつぶやきが揃った。どれも長文なので、postを読むスピードは遅くなる。が、ノイズの割合が少ないので苦にならない。
そして更に良かったのは、普段あまり目にすることのないTwitter-erのpostの割合が増えたことだった。正直なところ、私のTwitterライフは、お気に入りのTwitter-erの未読を消化するのがほとんどで、新たな開拓をする余裕がほとんどなかった。これはとてももったいないことだ。面白いpostに出会う確率を増やすためにお気に入りのTwitter-erを追いかけていたのに、逆に限られたTwitter-er以外のpostは捨てることを同時に行なっていた。今回の手法は発想の転換だったのだけれど、結果としては、面白いであろうpostをたくさん抽出できた。


私は、色々なTwitter-erのpostが入り乱れる、この長文TimeLineがとても気に入った。結局その日は5時間くらい、長文TimeLineに張り付きっぱなしだった。ちょっとやり過ぎたかも。反省。

更なる改良点

とりあえずは、長文を集めたタブを作ることができたが、更に質が高くなるように考えられる改良点をいくつか挙げておく。


・URL含みのpost

長文TimeLineは面白いのだが、やはりURL含みのpost*6が多くなった。なので、今後はURLを省く正規表現を書きたい。3文字以上の文字列を含まない正規表現を、?!(先読み否定)無しで書くのは骨が折れること間違いなしなので、?!をしっかり理解せねばならない。これが出来たらまた追記する。


・各種HashTag

ツールなどを使って自動的にpostするようなものがあるが、そういうのも弾きたい。が、しかし、今回の変更で、急激に観測範囲が拡がって、どれが自分にとってノイズとなるのか、まだ判断がつかない状態なので、今の長文TimeLineに慣れ次第、やってみるつもりだ。


・ユーザー指定との併用

こういう時のこのTwitter-erの発言はとても興味深い、というのがある。なので、それを抽出できたら、時間あたりの観測可能範囲が更に拡がるかもしれない。タブ分け時にTwitter-er指定と、正規表現を、∩(かつ)、で結びつけられたら幸せになれそうだ。
しかし、夜フクロウのタブ分けは、フィルタリングというより抽出というような感じなので、特定のTwitter-erの特定の発言だけ欲しい、と設定するのが困難かもしれない。これについては今のところ良い案がないので、保留としている。

マイブームでTwitter再燃、だが……。

長文TimeLineが面白すぎて、各方面に支障をきたしそうになったので、未読管理をオフにすることにした。これで、その時流れている話題についていくというのがメインの使いかたになるだろう。これなら、さっとTimeLineに参加することができるし、未読を消化する、なんて、あまり楽しくなさそうなタスクを捨てることができる。今もまだ思考錯誤は続いているので、気付いた点があれば、また追記する。

*1:自分にない視点や価値観、考え方を提供してくれそうな

*2:MacOSX用エディタ:ミミカキエディタ http://mimikaki.net/

*3:RTはこれこれだと語っているpostとか。あとSTARTのようなRTを含む単語が含まれてても弾いてしまう。

*4:昼から始めたこの取り組みも、これに行き着く頃には日が暮れてしまったし、この記事を書くのは、最初に始めてから3日後だったりするのだが

*5:あとで指摘いただきました。 RT @mickey24: あー,実はこれちょっと間違ってるんです.私が実際に使っているのは RT(?:[:\s]*@[A-Za-z0-9_]|.*\(via[:\s]*@[A-Za-z0-9_]) です.

*6:ニュース系bot発のものも多く含む