題名:Java Diary-42章

五郎の入り口に戻る

日付:2003/12/14

目次に戻る


GLBrowser-Part3(VerX)

ここから書くことは私が仕事でやっていることとかなり関係を持つ内容になる、、、細かい事を言えばいろいろあるのだろうが、まあ仕事関係の人がこんなところを読むわけもないから気にしないことにしよう。

9月の17日私はある研究会に出席していた。その席上発表されたのが「眺めるインタフェース」Memoliumである。画面の上をメモがゆっくりと動いている。そしてメモ同士がぶつかったとき、その内容に従ってGoogle検索を行い新しい内容が産まれる。

それ自体は以前にも観たことがあったから私は半分眠りながら聞いていた。確かに面白い構想だけど何かが足りない。私にとって重要だったのは発表が終わった後に行われた質問であった。ある人が

「メモ同士がぶつかると新しい検索結果が表示されるという機能をブレーンストーミングの道具として使えないでしょうか?」

それを聞いて「がびん」と思う。世の中ではGoogleなる検索エンジンが広く使用されており、そこにプログラム的にアクセスする手段が公開されたのは少し前のことであった。さて、これを使ってなにやら面白いことができぬか、とは世界中で多くの人が考えたことである。しかしその成果はなかなか面白い形となって現れてこない。(GLBrowserも「面白くない」例として位置づけられるだろうが)もちろん私もトライしたのだが「わーい、検索結果が帰ってきたぞ」とよろこんだところでほったらかしになっている。何故かと言えば結局「面白い形」を考えることができなかったからだ。

そこにこの言葉である。ひょっとするとこれは何かができるのではないだろうか。言葉と言葉がぶつかりあう。するとそこから新しい言葉が産まれる。それは興味を引くものだったりそうでなかったりするだろう。そうした「交配」を数世代繰り返すといつのまにかシェークスピアの文章が生み出されるのであった。。。。

などと頭の中で妄想がふくらんでいる時は自分が何かとても面白いことを考えているような気がして「ひょっとすると自分は天才ではなかろうか」と考え出す。そして勇躍コードを書き出し、その妄想が形になり出すと「俺は阿呆だということだけはよくわかった」と泣きたくなる。そうした繰り返しは今まで何度もやっているから多少なれてはいるが、それでも同じ事は繰り返される。

とにかく私はしばらくその構想というか妄想にとりつかれていた。電車に乗っている時もぼんやり視線を宙に漂わせながらあれこれ考えているから端から見れば危ない中年以外の何者でもない。ではコードを書こうと思うが、はてどこから書いた物やら。今回のはいつもにもまして雲をつかむような話なのである。単語を入力し、その検索結果に含まれる単語をとりあえず列挙してみよう。本当だったら検索結果のURLを全部ダウンロードして中を解析して、とやるんだろうけど、それをやると時間がかかる(実行の)そもそも一ページの中で検索語に関連する部分ばかりではないだろうし。するとゴミが増えてしまう。

というわけでGoogleの検索結果に含まれる「要約文」だけを対象とすることにした。「要約」ってくらいだからGoogleの最新技術をもって検索語に関連する部分だけを抜き出してくれているのだろう。そこから「特徴のある単語」を抜き出してみればどうか。

そう思いごりごりプログラムを書き出す。最初はPure javaの環境で作ろうと思っていた。もしそれが実現できれば異なるプラットフォームに移植するのが「少しは」簡単になるからだ。となるとまず最初にぶつかる壁は「Javaで使える形態素解析」である。

形態素解析とは何か?細かい定義は知らないのだけど、「日本語の文章を入力すると単語ごとに区切っておまけに品詞まで教えてくれる」処理だと思っている。英語とかそういう空白で単語間が区切られている言語なら文章にどんな単語が含まれているか明白なのだけど、日本語のように空白なくずらずらと続いていく言語だとまず単語に区切るところから一苦労である。さて、問題です。フリーで使える形態素解析プログラムというのは存在するでしょうか。

世の中には奇特な人が私が思っているよりもずいぶんたくさんいて、何種類かそうしたフリーソフトが存在しているのである。一番有名なのは茶筅(ちゃせん、と発音する)である。大変広く使われているソフトなのだが、それ自体はCでかかれている。Cでのプログラミングなどここ数年やったこともない。私が使うのはJavaだから形態素解析もやはり元からJavaでかかれているものがよかろう、と思いあれこれ探す。そのうちSENというものが見つかった。茶筅を参考に開発されていたChasen TNG(今はMecabになっている)をJavaに移植したプログラムである。これは以前にも使おうとしたことがあったのだが、途中で放り出していた。今こそこれを使うべき時ではないか。

それでは、と思いなんとかやってみるがどうにも一筋縄ではいかない。ドキュメントは極端に制限されており「わかんないことがあればソースを参照」という古き時代のUNIX文化をそこに観るような気がする。しかしこれが使えなければ先はないのだ。あれこれやったあげくソースを一部書き換えなんとか使えるようになる。「私は大坪五郎です」とかいう文章を放り込んでは「私 は 大坪 五郎 です 。」などと分割されるのを観てしばらく悦にいるがもちろんこれは一歩目の足をあげたあたりに相当する。先はまだまだ長いのであった。

これまた以前作ったことがあるGoogle API関連のプログラムと組み合わせGoogleの検索結果-これはページの題名とGoogleが作成した要約-を単語に区切り出現頻度を調べる。最初は

「同じ単語でも題名の中にでてくるのと本文中に出てくるのでは重みが違うから、それを出現頻度評価のときに考慮しよう」

と考えていたのだが面倒なのでやめてしまう。また「単なる頻度では芸がないからTF/IDFとか難しいことをしよう」と考えたが、理由はしらねど単に頻度を数えたのと結果が大差ない。一番ありそうな理由は私が間違った計算をしていることだが、これも面倒なので忘れてしまうことにした。

もう一つ没にしたアイディアは

「検索結果の上位にランクされるサイトと下位にランクされるサイトではでてくる単語の傾向が違うはずだ。であれば、検索結果1番から数十個とるのではなく、後ろからとってはどうだろう」

というものである。考えたときは「これはすばらしい」と思う。しかし作ってみるとそれほど面白い結果がでてこないことに気がつく。それだけならまだいいが「検索結果の一番最後から数十件」結果をとるのは結構難しい。Googleに検索要求を投げると

「全部でこれくらい件数あるかもしれないっす」

という値は返ってくるのだが、これが全然あてにならない。最初に一回検索し、推定検索件数の値を得る。そこから律儀に検索をすると

「結果ないっす」

と答えが返ってくる。そこから少し前、とやってみるがやはり結果が帰ってこない。以下同文で結局結果の数は「推定」の半分くらいだったりする。いや、Googleの推定結果があてにならない可能性より、私が何か間違った事をやっている可能性が高いのはもちろんだが、とにかく面倒だし、それよりなにより時間がかかかる。というわけでこの構想をゴミ箱に放り込む。

かくして最終的には考え得る中で一番単純な方法をとることにした。結果中で出現頻度の高い順に単語を並べ、上位10個位を表示してみる。次には元の単語と二つ単語を並べて検索し、、、ということをやると結構面白い結果がでることがわかった。たとえば「恐竜」という言葉を起点とし、3回か4回サイクル検索サイクルをまわすと人名がでてくる。どうやら恐竜業界(そんなものがあるかどうか知らないが)で有名な人らしい。

なんだかわからない結果に私はご機嫌になる。調子にのってもう一回サイクルを回そうとするとGoogleから

「一日の検索回数は1000回に制限してます。でもってあんたはリミットこえちゃいました」

と言われる。確かにサイクルを回すごとに単語数は10倍に増えるのだからそうも言われるわな。まあいいや。さて、これをGUIつきのアプリケーションに仕立てあげなければならない。なんだか面白い結果がでた、とご機嫌になっているが一番根元にある

「そもそも何をしようとしているのか」

という問いには大きな疑問符がついたまま私は前進を試み始める。

前の章 | 次の章


注釈