微笑がえし

今回は「何億光年輝く星にも寿命があると教えてくれたのはあなたでした」というお話。

以前、ゼロ年代の情報技術を「情報技術」で振り返ると題した記事で、本コラムが辿ってきた話題の傾向を分析した結果を報告した。
今回はスコープをやや変えて、本コラムの発足メンバとして参加した私が今まで執筆した67本の記事を対象に、この十数年、自分がどのような事項に興味を抱いてきたかを振り返ってみた。
本稿では、その手順と結果を紹介しよう。
テキストデータとして参照可能な記事やブログをお持ちの読者は、以下を参考にして、自分の過去を分析してみてはいかがだろうか?
なお、処理のプラットフォームはLinux、ツールは標準的なものだけで対応できるよう、留意した。

テキストデータの収集と前処理

まず、分析対象とするテキストデータを収集する。
今回の場合は、著者別バックナンバーからテキストをダウンロードすることにしよう。
バックナンバーのページから、リンクを取り出しそれぞれの記事をダウンロードする。
その作業はシェルスクリプトとwgetコマンドで自動化できる。

ダウンロードした記事には、過去記事へのリンクやタイトルバナーなど余計な箇所も含まれている。
必要な箇所は<div class=”post” …>〜</div>で囲まれた部分なので、これもスクリプトで取り除くことにしよう。
今回は簡単なperlスクリプトで抜き出すようにした。

HTMLファイルから必要な箇所を抜き出したら、それをベタ書きのテキストにする。
この作業も、シェルスクリプトとw3mコマンドを使えば簡単だ。
ところで、以上の作業において、テキストデータの収集は様々な方法が考えられるだろう。
ブログ記事を格納しているデータベースに直接アクセスできる場合は、SQLコマンドを直接叩いてデータベースから本文をぶっこ抜いてくる方法もあろう。
また、スクリプトとw3mの組み合わせ以外にも、DOM(Document Object Model、HTML要素のツリー構造を操作できるようにしたモデル)を使ってテキスト化する方法も考えられる。

ひとつ気をつけなければならないことは、分析に際して異常データが含まれているケースにしばしば当たること。
今回の例でいえば、2012年7月17日の記事には、付録として長いCのコードが添付されていた。
このような特殊なデータは手作業で取り除いておくことが望ましい。

単語の切り出し

日本語テキストデータを分析するには、形態素解析が必要となる。
英語であれば「A quick brown fox jumps over the lazy dog.」のように、スペースで単語が区切られているので扱いが易しい。
しかし、日本語を処理する際には、「庭には二羽、鶏がいます。」という文を、「庭 に は 二羽 、 鶏 が い ます 。」というように分割する処理を施さねばならない。これを形態素解析という。

形態素解析にはchasenmecabなど素晴らしいツールが開発されており、自由に利用することができる。
日本語のテキストはchasenコマンドで切り出した単語をシェルスクリプトやPerlスクリプトを駆使して、単語の羅列に加工しよう。
なお、chasenを使う際には英単語がアルファベットに分割されてしまうので、日本語の処理と並行して英単語の処理も施さねばならない。
この処理は、形態素解析ツールを持ち出さずともsedコマンドを活用した簡単なシェルスクリプトで処理可能である。

以上の手順で、これまでどのような単語をどれだけの頻度で、どの記事のなかで使ってきたかを示すデータが取得できる。
次は、そのデータに基づいた分析方法を考えていこう。

ワードクラウドによる可視化

まずは傾向をざっくりつかむために、データを可視化、ヴィジュアライズしてみよう。
簡単に分かった気分になるためには、タグクラウドやワードクラウドというツールが最適だ。
探してみると、ネット上で公開されているワードクラウド作成のためのWebアプリが山のように見つかる。
日本語に対応しているか否か、文字の中まで稠密に埋めることができるか否か、形の自由度や並べ方、色使いのカスタマイズ方法など、実装によって様々な違いがあるので、好きなツールを選んで試してみるとよいだろう。

ここでは、例として、tagxedoというサービスで可視化してみた。

頻出語の可視化
頻出語の可視化

蛇足ながら、残念なことに本ツールはWindows上のInternet Explorerでしか動作しなかったので、やむを得ず文字コードを変換してWindows上で作業を進めたことを補足しておく。

この結果から、私の15年はソフトウェアや情報についての話題が主だったな、ということがよくわかる。
システムや技術開発も主要な話題だ。
オープンソースやユーザインタフェースなど、私の専門性に関わる話題も多かった。
まあ、当たり前といえば当たり前の結果である。
自分が拘ってきた道筋をこのように可視化して俯瞰してみると、これはこれで、なかなか感慨深い。

話題に基づく記事のクラスタリング

次に、もう少し高度な分析に移ろう。

sortコマンドやuniqコマンドを活用すると、単語の頻度を数え上げることができる。
その中で、n回以上使われている単語を抽出し、それをもって各記事の特性を表現することを考えよう(今回の処理ではn=5とした)。
すなわち、単語の出現頻度でベクトル空間を構成し、その空間上でクラスタリングを行なってみることを考えるわけである。
各回でいつも同じ分野の話題に触れているわけではないので、構成される出現頻度行列はほとんどが0の疎行列となる。
しかし、理論的には、各記事はその空間上の1点として表現され、それぞれの記事間には距離を定義することができる。
この距離に基づいて、距離の近い記事がそれぞれのクラスにまとめられるように、クラスタリングを行う。

クラスタリングの処理は、統計処理パッケージのRを使えば簡単だ。
実際に処理してみた結果を次に示す。
しきい値をどこに設定するかでクラスタの数と内容は変わってくるが、今回は、8つのクラスタに分類した。

クラスタリング結果
クラスタリング結果

クラスタリングの結果を眺めてみると、それぞれのクラスタは、Cプログラミングにまつわる話題、ソースコードの意義、OSS関連、CGMやSNSなど、インターネットと集合知、PC一般や情報社会について、システムと使い勝手、マルチモーダルやユーザインタフェースという8つのラベルが付けられることがわかる。
多くのブログやCMSでは、それぞれの記事にタグを付けられるので、個別に付けたタグで記事を分類されている方も多いことだろう。
あるいは、フォークソノミーと呼ばれる集合知の応用による分類も流行っている。
ここで紹介したようなテキストの内容に基づく分析結果と、タグやフォークソノミーによる分類を比べてみるのも面白いのではなかろうか。

おわりに

年度末ということもあり、忙しい毎日、過去を振り返る暇もないという方も多かろう。
しかし、未来は過去の延長線にある。
将来の行方を占う最も簡単な方法は、過去の延長線から外挿して未来を描くことである。
そのためにも、たまには一息ついて、来し方を振り返ってみてはいかがだろうか。

さて、私ごとながら、本稿をもって、執筆陣から卒業することになりました。
というわけで、これからの糧ともすべく、この15年近くを振り返ってみた次第です。
本稿で紹介したスクリプトや手順の詳細は、別途、資料がありますので、興味のある読者の皆様はぜひ、ご参照ください。

本コラム、1998年末に始めたので、今年の12月には15年になるということにあらためて気付き、驚きました。
まさに、継続は力なりを実感しています。
私は卒業しますが、本コラムはまだまだ続きます。
ご愛顧のほどよろしくお願いいたします。今後の記事をお楽しみに。

※ 本稿の冒頭において、阿木燿子作詞「さよならの向こう側」の一節を引用しました。