『入門ソーシャルデータ』で文書クラスタリングと文書要約を学ぶ

先日献本いただいた「入門ソーシャルデータ データマイニング、分析、可視化のテクニック」

入門 ソーシャルデータ ―データマイニング、分析、可視化のテクニック

入門 ソーシャルデータ ―データマイニング、分析、可視化のテクニック

を読了 (多謝!)。tkng さんも書評を書かれているechizen_tm さんも書評を書かれているので、いまさら感は否めないが、別の観点から少し寸評。本書は、データを抽出してからの可視化の方法が全体の半分以上を占めていて、そういう方法を知らない人には参考になると思う。

研究のための実験をしていても、実は地味に重要なのは機械学習が判別したエラーの事例を一覧できるように (たとえば間違いの重み順に) 表示したりだとか、IBM の Watson も同様に徹底的なエラー解析と可視化をしていたことが、Jeopardy! での勝利につながったことを聞いたことがあるが、そういう細かい視覚化方法が豊富なコードとともに載っているところが特筆に値する。8月に ryu-i さんが NAIST に来ていたときも、実験のコードを回したあとの結果を HTML で吐き出してブラウザで見せてもらったが、エラーの部分の色を変えたりだとか、どのような素性がどういう重みになって間違えと分類したかとか、そういうのを一目で見られるように出力しておくことが、(行き当たりばったりではない) 優れた研究をするために必要なテクニックなのである。

また、この本を通して Python で書かれているサンプルコードも (リスト内包表記を多様しているので、Python になじみのない人は面食らうかもしれないが) コンパクトで必要十分に書かれており、こういう本にありがちな「文章は分かりやすいがコードが分かりにくい」といったような問題はなく、コードだけを (本文を手がかりに) 読んでもすんなり読める、という点ではかなり丁寧な仕事をされているなと思う。

テーマとしては mbox 形式のデータ (自然言語処理機械学習に関わりがある人なら Enron データをご存知だろう) を可視化するところから、Twitter、LinkedIn、Google Buzz、ブログ、Facebook といった「ソーシャルメディア」を次々に分析・可視化する手法を紹介している。こういう「流行もの」を扱っている本の宿命で、そのとき使われている技術に特化して書かれてしまうのが少し残念。たとえば Google Buzz は、この本では1章が割かれているが、監訳者の註にもあるように廃止されることが決まっているし、本書の中でそれぞれのサービスの API に依存したコードがたくさん登場するが、これらもいつまで使えるのか分からない (突然 API のリクエスト回数のポリシーが変わることも頻繁にある)。とはいえ、「実際に動くコード」を提供する、ということと、いつまでも使えるテクニックを紹介する、という方向性は相容れないので、この本の「賞味期限」とコードの明快さを考えると、2011年現在でちゃんと動くコードを提供していることの利点が勝るだろう。

自然言語処理の研究の立場から見ると、本書の分析に関する部分はあっさりしていると感じるだろうが、そもそも自然言語処理に関する本ではないので、それを求めるのは酷だろう。ちなみに、ツールとしては NLTK が使われており、「入門 自然言語処理」に関する言及が少なくとも5回はあった。自然言語処理部分に興味のある人は、「入門 自然言語処理」を片手に読んだほうがいいと思う。

自然言語処理データマイニングに興味のある人が楽しめるのは、第7章の Google Buzz の文書クラスタリングと、第8章のブログの文書要約をするプログラムを作成するところだろう。特に第8章は、分量こそ短いものの、現実的に文書を要約してくれる (そして可視化してくれる) コードが説明されていて、1958年の IBM Journal に載っている Luhn のアルゴリズムというアルゴリズムを実装したものである。繰り返しになるが、この本のよいところは、入力を入れたらちゃんと出力が出る実際に動くコードが書かれていることであり、この章は論文に書かれているアルゴリズムをコードに落とし込んだらどうなるか、ということが書かれており、「自然言語処理のプログラムってどう書いたらいいんだろう」と思う学生の人なんかは、この章だけでも読んでみるとよい。自然言語処理の研究を始めたばかりの修士の人の FAQ は、「論文を読んだらなにをすればよいかは分かるのだけど、どのようにプログラムを書いたらいいのか分からない」ということなのだが、論より証拠、コードを読んで書いてみることだ。

一つ苦言を呈すると、(誰がどこをどう訳しているのかは知らないが) 翻訳があまりよくない。特に、第3章までの翻訳はよいが、第4章以降の実際にソーシャルメディアを使うところからの翻訳が、(一文一文の翻訳が間違っているというわけではないのだが) 直訳に毛の生えたくらいの文が書かれていたりして、本文を読むより (翻訳されていない) ソースコードを読んだほうが分かりやすい、ということが往々にしてある。第7章と第8章はまだましだが、不自然な日本語が散見されて、内容はよいのにいささか興ざめである。たとえば

NLTKを極限まで使い込み、パフォーマンスや品質をもう少し上げたいと思うときには、本気になって学術的文献をいくつか熟読することを考えるとよい。確かに威圧されてしまいそうになる仕事だが、本気でNLPを学びたいときには、ぜひやってみるべきだ。(p.290)

などと書かれているが、「確かに威圧されてしまいそうになる」というような恐らく英語の部分に副詞があるようなところの翻訳がぎこちない。あるいは、非常に大事なことを言っているのだが、

 これよりもずっと複雑なアプローチを実装する長所、短所を秤にかけるときには、Luhn のアルゴリズムによって得られる要約よりも優れたものを作るためにどれだけの労力が必要なのかをよく考えた方がよい。乱暴な当て推量で目標を達成できることもある。しかし、最新の技術が必要になることもあるだろう。難しいのは、当て推量から最新のソリューションに移行するための費用効果分析である。私たちは、とかく相対的な労力を過度に楽観的に考えがちだ。(p.277)

というように、読めば分かるのだがなんだか翻訳調で不自然なのである。(いや、不自然言語処理をしたいのかもしれないが……)

ともあれ、この本の優れたところは文章ではなく、テーマの選定と動作するコードにあり、その部分は入門書としてはかなりクオリティが高いので、一度本屋で手に取ってパラパラと眺めてみるとよいかと思う。特に学生でまだ自然言語処理のコードを書いたことがないような人は、一冊手元に置いて動かしてみるとよいと思う (Windows ではなく LinuxMac でないと、中に書かれているツールで簡単に使えないものがあったりするが……)。「賞味期限」の切れる前に、お早めに :)