December 25, 2003
文章要約プログラムを書いてみよう!
その4 〜実装、そしてより優れたシステムにするために〜
TF-IDFとChasen、この2つがあればなにも問題はない。好きな環境と好きな言語を選んで、レッツ・トライ。最後に、あなたの作る文章要約プログラムをより優れたものにするためのアイディアを箇条書きにして紹介し、僕の書いたコードを恥ずかしながら公開して、この文章を終わりにする。
・より優れたコーパスを使う(難易度C)
その2で書いたように、僕の作ったプログラムでは、『Yahoo! ニュース』に存在するHTMLをスパイダーでかき集め、コーパスとして使用した。正直、コーパスとしてのクオリティは高いとは言えない。
まず、コーパスとしては文章の総量が小さい。HTMLで50MB、日本語の文章を抜き出すと10MBあるかないかというところ。それに加えて、単語の偏りも大きい。たった一つのサイトから引っ張ってきた文章であることが問題なのはもちろんだが、さらに、ある時点での写像になってしまっているのがまずい。たとえば、「フセイン」が全体の8%もの文章に登場している。明らかに多すぎる。
もっと優れたコーパスを蒐集し、それをIDFの算出に使うことができれば、文章要約の精度を向上させることができる。というわけで、その気があるなら、がんばってHTMLをかき集めて、でかくて偏りのないコーパスを作ってみましょう。ちなみに、こんなレポートごときに使うことはあり得ないけど、お金を出してナイスなコーパスをゲットすることもできます。別にコードを書いたり頭を使ったりすることじゃないので、難易度はC。
・HTMLパーサを組み込む、または作る(難易度B)
コードを見てもらえばわかるのだが、ぼくの作ったプログラムでは、単語の出現頻度表をつくるときに、HTMLファイルをそのままChasenに喰わせている。そのため、できあがった出現頻度表では、数字("0"~"9")やら、「カスタマイズ」「ヘルプ」やらがほぼすべての文章に登場している。また、明らかに広告のものと分かる単語の出現頻度も高い。
HTMLをちゃんとパースし、日本語の文章部分のみを抜き出してやるのが望ましい。外部プログラムやライブラリを使っても良いし、自分で実装してもOK。また、非HTMLなコーパスを使うことによってもこの問題は回避できる。難易度はB。
・センテンス間の関連性を評価する(難易度S)
単純に個々のセンテンスを独立したものとして扱ってしまうと、要約された文章に不自然な箇所が発生することがある。たとえば、次のような。
a.代名詞が正しくつながっていない
b.「」のような記号の対応が正しくとれていない
c.接続詞の用法がおかしい
要約された文章のクオリティを上げるためには、センテンス間の関連性を評価することがどうしても必要になってくる。「この代名詞は何を指しているのか?」。「この接続詞の意味は?」。……でも、これをやるのはとっても難しい。セマンティックな領域に踏み込んでいなかくちゃならないからね。興味のあるひとはチャレンジしてみようって感じ。難易度はもちろんS。ちなみに、僕の書いたプログラムではこの部分はまったく考慮されていない。
・粒度を小さくする(難易度S)
僕の実装したプログラムでは、要約の単位をセンテンス(文)としている。これよりも粒度を小さくすると、つまり、センテンスのレベルで要約を行おうとすると、難易度は飛躍的にアップする。文法の領域に踏み込んで行かなくちゃならない。まあ、これもやってやろうと思う人は触ってみてもいいんじゃない、という感じ。これも難易度はS。
んで、僕の書いたコードは以下。言語はc#、開発環境はVS.NET2003。
開発環境を持っててC#が分かるひと、という時点で相当限定されてしまうが。
http://windy.ac/dat/SummaryMaker.lzh
Trackback
You can ping this entry by using http://windy.ac/MT/mt-tb.cgi/302 .
Comments
コーパスとして青空文庫を使うというのはどうか。
適当に wgetで zipだけ回収して頻度表を作成。
小説がベースになってしまうので、
これはこれで偏るかもしれぬ。
青空文庫は有りかと。
正確な量はわからないけど相当な文量があるし、テキストファイルとしてゲットできるから扱いやすい。
著作権の切れたものだけが対象になってるから、ネタの古さがすこし気になるけど。旧字体な文章すら相当数ある。
