趣味のページ

随筆「騒動ありて年を越し」

新年明けましておめでとうございます。今年もどうぞよろしくお願いいたします。


年末は追い込みのコーディングをしていました。文解析のプログラムです。辞書も幾種類か作りました。もちろん、研究のためだけなので、エントリーはごくわずかです。でも、曖昧性とまともに向き合うものです。つまり、同じキーに複数の文法規則を割り当てるわけです。PostgreSQLで辞書は作りました。PostgresSQLは簡易のビジュアルデータベースメンテナンス機能を提供してくれていて、ものすごく重宝していて、ついに、MySQLからPostgresSQLに移ってしまったのです。

分かち書きプログラムは最長一致法で実現しています。複数の分かち書き候補を出力して、その内の文法的に正しいものを、文解析でフィルタリングして抽出するようにしています。

同じ助詞でも、動詞やBE動詞(日本語では明記されませんが)に掛かるとか、複数の節からなる文ではどちらに掛かるのかといった曖昧性があります。並列語があれば更に大変です。そんなとき、キーとしてXX(は)なんて(助詞「は」を意味する)のを起こして、複数のエントリーで係り受け文法を記述するわけです。

で、騒動はここで起きました。SQL文を実行して文法レコードを取り出すわけですが、つまり次のようです。

 ResultSet rs=stmt.executeQuery();

複数あるはずのレコードが一つしか取り出されないのです。これはこれは、SQLコマンドを発行してみますと、ちゃんとレコードが複数取り出されて、コンソールに表示される。何が悪いのだろう。win32版のバグだろうか。はてさて、考えて寝込んでしまいました。次の日、気を取り直して、バージョンアップ版のPostgreSQLをインストールして、JDBCを最新版に置き換えてみました。駄目だったのです。これは、MySQLの出番かなと思いましたが、CSV形式のデータを出す機能がPostgreSQLには無いのです。これはプログラム書かねばだめか・・・。SELECT * FROM table;にすれば幾ら何でも、全レコードを取り出せるだろう・・・・。

で、参考のために、もう一度クエリーを発行しているコードを見ました。そうしたら、突然、if(rs.next(){・・・・・}となっているところが変に感じました。"if"?えっ、これじゃ一回しか聞きにいかないじゃないか・・・。

そうです、while(rs.next()){・・・・・}でなくてはいけないのです。早速直しました。そしたら曖昧性処理は見事に動いたのです。今までのことが地獄を見た思いで、また寝込んでしまいました。if(rs.next())なんてコードは絶対に書いてはいけません。


ところで、年末に「XMLデータベース入門(山田祥寛著 翔泳社)」を本屋さんで見つけて、衝動買いしてしまいました。なんとフリーのデータベースソフト付き。工夫すればオブジェクトデータベースになりそうです。BPELとクラスプールを巧く使うのですね。それにしても、私のレベルを超えて技術は遙かに進歩しているんですね。図書館と本屋さんを利用して勉強して、はやく追いつきたいものです。論文読みもさらに力入れねば。


そして、今年は、意味処理に何処まで迫れるか・・・力量が問われます。それでは、良いお年でありますように。


元旦

大晦日 正月イブと 言う子かな