| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
さてさて、それでは前回の続きを。
僕が書いた文章要約プログラム(前回しめしたこいつのことね)、この中核を担っているのが『TF/IDF』というアルゴリズムだ。今回はこれについて解説して行こう。こやつは名前こそ偉そうでなんだか小難しそうだと思ってしまうが、実際には簡潔で扱いやすくそのうえ直感的という、とっても素敵なアルゴリズムだ。数式を書くのが面倒なので、そこんところはURLをこぴぺしてお茶を濁させていただく。このあたりをちぇき。新しいウィンドウで開くとかして適宜参照してください。
TF/IDFは、文章から重要単語を選択する手法として、情報検索の分野でよく知られているアルゴリズム。まず、その意義を理解しておこう。TF/IDFを使うと、「ある単語の、その文章における相対的な重要性」を算出することができる。……イメージしづらいかしら。TF/IDFにある文章を喰わせて、その文章のなかに登場する単語の一つを指定し、「この単語の重要度はどれくらい?」って訪ねると、「その単語の重要度はこれくらいだよ」ってことを教えてくれるわけ。文章を要約するっていうのは、その文章の中でどこが重要な箇所であるかを判断するということだ。だから、文章要約という目的にTF/IDFはもってこいだといえる。
このTF/IDF、簡略して式を書くとこんなふうになる。
TF/IDF = TF × IDF
TF。その文章のなかでのその単語の出現率。その文章のなかで、その単語がいっぱい出てくれば出てくるほど大きな値になる。たくさん出てくる単語がその文章を特徴付ける(=重要な)単語である、という考え方に基づいている。
IDF。その単語がどれだけレアかを表す指標。その単語がたくさんの文書に登場すれば小さな値になり、逆に特定の文章に限定して現れれば大きな値となる。事象の確率が低いほど大きい情報とする、情報量の考え方に基づいている。
この2つの積を取ったものがTF/IDFとなる。上に貼ったリンクを見てもらえれば分かるとおり、簡潔な式になっているので、実装は容易だとおもう。
とりあえず、TF/IDFそれ自体についてはこれでお仕舞い。しかし、ここで扱うべき事柄がもう一つある。IDFを算出するには、「すべての文章のなかで、その単語が登場する文章の数」が明らかになっている必要がある。じゃあ、すべての文章っていうのはいったい何なんだろう、という疑問が当然でてくる。それをどうやって定義するのか。それに、定義したとして、実際にそれを蒐集することができなくちゃ意味がない。さて、いったいどうしたら良いんでしょう。
この、「すべての文章」に、当たるモノをコーパスと言います。今回のプログラムでいうなら、世界に存在するすべての日本語の文章を蒐集し、それを解析、データを作るっていうのがベスト・ソリューション。でも、そんなことは当然できないわけで、一定量の、それも電子化されたデータを蒐集し、それを使うというのが現実的な線になる。このデータがコーパス。適当なコーパスを古郡先生が提供してくれたって良いと思うんだけど、残念ながらそうしてはくれなかったので、自力で蒐集しなくちゃいけません。面倒くさいけど。
で。その使途にも依るけど、コーパスには求められる条件がある。一般に、おおむね次の2点。
・十分な量
・ドメインに(できるだけ)非依存であること
まず、統計的なデータを引っ張り出したいわけなので、統計的なゆらぎが無視できるほど小さくなるだけの総量が必要になる。加えて、ただ量が大きいだけではなく、ドメインに依存しないことが望ましい(たとえばだけど、2chから引っ張ってきた文章をコーパスとして使うことを考えてみましょう。最高に偏ったデータが得られることは想像に難くないでしょう)。
幸いにして、僕らにはWebがあり、Webからデータをゲットするための便利なツール(スパイダーなどと呼ばれる、自動的にリンクを辿ってデータをダウンロードしてくれるいかしたソフト)がある。適当なスパイダーを入手して、適当なサイトからHTMLをぶっこ抜いてコーパスとするのが手間の掛からないやり方だろう。僕の場合、「Yahoo! ニュース」をコーパスとして使った。また、スパイダーとしては、「インターネットNinja2001 for Windows」の体験版を使った。
最後に、僕が使ったコーパスと、それを解析して作った単語の出現頻度表を置いておく。自分でコーパスを集めたり、解析したりするのが面倒なひとはこれを使えば楽ができる。
・コーパス
http://www.seman.cs.uec.ac.jp/~shin/blog/corpus.lzh (14.5MB)
2003/12/06午前5時ごろの「Yahoo! ニュース」のデータ。
http://headlines.yahoo.co.jp/hl以下に存在するHTMLをすべてダウンロードしたもの。
・単語の出現頻度表
http://www.seman.cs.uec.ac.jp/~shin/blog/corpus.txt (228KB)
上のコーパスを解析したもの。
1行目に文章数。2行目以下は出現数、タブ、単語。
#なんだか、いまいちこなれてない説明になってしまった。なるべく数式や記号を使わないようにしてみたんだけど、そのせいで「ある文章」「その単語」みたいな言葉を多用することになり、逆に分かりにくくなっているという。使うべきところでは記号を使って説明したほうがわかりやすくなるんだなー、ということを学習しましたです。次からはそうします。

