gemini チュートリアル

mail address
Copyright (C) 2001-2002, SATO Lab.


0. はじめに

 このチュートリアルは、

gemini 2.0

を対象にしたドキュメントです。
 他のバージョンでは使用できないので、注意してください。

 また、ドキュメントなどが充実していない現状では、利用対象者を

UNIX を自由に扱える技量を持った方々

としています。このチュートリアルを読めば、とりあえずの事はできると思いますが、それ以上のことができるかは、保証できません。gemini のインターフェイスは GNU のソフトウェアを参考にしているので、その辺りを手がかりに、自分で利用方法を探していってください。

1. Cygwin のインストール

 UNIX 環境 (Linux や FreeBSD) をお使いの方は、ここをスキップして次の「Rubyのインストール」に進んでください。ここで説明されていることは Windows を使っている方にのみ関係があります。
 gemini は基本的に UNIX 環境を前提としていますので、Microsoft Windows で gemini を扱う際は Windows 上に UNIX 環境を作り上げなければなりません。そのためのソフトウェアが Cygwin です。

 Cygwin は Cygwin のサイトからダウンロードすることができます。(参考: Cygwin)
 しかし、Cygwin のサイトからダウンロードされるセットアッププログラムは、日本語環境において正しく動作してくれません。そこで、こちらのページ から、日本語版の setup.exe をダウンロードしてください。ファイル名は「setup-(バージョン番号)-jp.exe」です。

 ダウンロードした setup.exe を実行します。すると、右の図のようなインストーラが起動します。インターネットに接続されている場合、順に「次へ(N)」をクリックしていれば、普通はまったく問題ありません。
 ただし、インストール先のディレクトリなどは必要に応じて変更するようにしてください。
 うまくいけば、インストール後、スタートメニューに「Cygnus Solutions」というグループが作成され、その中に bash へのショートカットが入っているのを確認できるはずです。
 これで Cygwin のセットアップは完了です。
 以下では、この bash を使って作業を進めていってください。

2. Ruby のインストール

 gemini を扱うためには、オブジェクト指向スクリプト言語 Ruby をインストールしなければなりません。ここではソースコードからコンパイルしてインストールする、という方法を示しますが、Linux を使っているのならば RPM で、FreeBSD ならば package を使うという方法もあります。(参考: Ruby Home Page)
 しかし、それらの方法は最新版が提供されているとは限りませんので、以下に示すソースコードからのコンパイルの方をお勧めします。

 まず、Ruby のソースコード (1.6.8) をダウンロードします。
 ftp コマンドや、ブラウザなどからダウンロードしてください。ここでは、/usr/local/src にアーカイブをダウンロードしたと仮定します。

$ cd /usr/local/src
$ ftp ftp.ruby-lang.org
Connected to helium.ruby-lang.org.
220 ProFTPD 1.2.0pre10 Server (Debian) [helium.ruby-lang.org]
Name (ftp.ruby-lang.org:user): anonymous
331 Anonymous login ok, send your complete e-mail address as password.
Password:***@***.***
230 Anonymous access granted, restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /pub/ruby
250 CWD command successful.
ftp> get ruby-1.6.8.tar.gz
local: ruby-1.6.8.tar.gz remote: ruby-1.6.8.tar.gz
150 Opening BINARY mode data connection for ruby-1.6.8.tar.gz (998151 bytes).
...
226 Transfer complete.
998151 bytes received in 17.09 seconds (57.05 KB/s)
ftp> quit
221 Goodbye.
$ ls
ruby-1.6.8.tar.gz

ftp のメッセージは、お使いの ftp クライアントソフトによって異なるかもしれません。このダウンロードしたアーカイブ ruby-1.6.8.tar.gz を展開すると、ソースコードが展開されます。
(gunzip が必要です。インストールされていない場合はコンピュータの管理者に相談してください。)

$ gunzip --stdout ruby-1.6.8.tar.gz | tar -xvf -
ruby-1.6.8/
ruby-1.6.8/COPYING
ruby-1.6.8/COPYING.ja
...

展開されたソースコードをコンパイルします。

$ cd ruby-1.6.8
$ ./configure
creating cache ./config.cache
...
creating ./config.status
creating Makefile
creating ext/extmk.rb
$ make
gcc -g -O2 -I. -I. -I/usr/local/include -c array.c
...

root になり、make install でインストールします。configure 時に指定しなければ、/usr/local 以下にインストールされます。(/usr/local/bin/ruby など)

$ su
Password:
# make install
./miniruby ./instruby.rb
...

これで Ruby がインストールされました。念のため、動作していることを確認しておきましょう。

$ hash
$ ruby --version
ruby 1.6.8 (2002-12-24) [i686-cygwin]

時期と環境により、アーキテクチャ名や日付が変わるかもしれません。また、hash コマンドは bash を使っているときのコマンドです。tcsh では rehash になります。適宜、使っているシェルに合わせたコマンドを入力してください。

3. gemini のインストール

 Ruby のインストールが終わったならば、次は本題の gemini をインストールします。
 まず、gemini のアーカイブをダウンロードします。

 ここでは、/usr/local/src にアーカイブをダウンロードし、/usr/local/gemini にインストールすると仮定します。

$ cd /usr/local/src
$ ls
gemini-2.0.tar.gz

まずはアーカイブを展開します。

$ cd /usr/local
$ tar -xzvf gemini-2.0.tar.gz
gemini/
gemini/INSTALL
...

 より高圧縮な bzip2 を使ったアーカイブも用意してあります。こちらは、各自で使ってください。
 必要なファイルをコンパイルします。このとき、Ruby がインストールされていなければなりません。

$ make
creating Makefile
...

これですべてのセットアップが完了しました。

4. PCFG のパラメータ推定を行う

 PCFG のパラメータ推定を行う場合、次のデータが必要になります。
  1. 文法 (CFG)
  2. 訓練文 (コーパス)
ここでは、これらを記述するときの書式と、これらを使った gemini の操作方法について説明します。

 まず、以下のような文法を使用するとします。

文 → 名詞句 動詞句
動詞句 → 自動詞
動詞句 → 名詞句 他動詞
名詞句 → 名詞
名詞句 → 連体修飾子句 名詞句
連体修飾子句 → 連体修飾子
連体修飾子句 → 名詞句 連体修飾子

なお、終端記号 (末端記号) として「自動詞」「他動詞」「名詞」「連体修飾子」を使うとします。

 gemini では、SGML 風の形式でデータを記述します。文法は pGrammar ブロックの dRules ブロックに記述します。その文法は、非終端記号を < と > で囲って表現します。逆に、終端記号は < と > で囲まれていないものになります。また、生成規則の左辺と右辺を --> で区切ります。
 上の文法を書けば、以下のようなテキストファイルになります。

<pGrammar>
<dRule>
<start> --> <文>
<文> --> <名詞句> <動詞句>
<動詞句> --> 自動詞
<動詞句> --> <名詞句> 他動詞
<名詞句> --> 名詞
<名詞句> --> <連体修飾子句> <名詞句>
<連体修飾子句> --> 連体修飾子
<連体修飾子句> --> <名詞句> 連体修飾子
</dRule>
</pGrammar>

デフォルトでは開始記号が <start> になっていますので、<start> を導入するか、元の文法における開始記号 (この例では <文>) を <start> に置き換えるか、コマンドラインオプションを指定するか、という方法で対処します。ここでは <start> を導入しました。
 このファイルを sample.grm とします。作成は emacs やメモ帳など、どんなエディタでも構いません。
(gemini アーカイブに含まれた sample.grm と異なりますので注意!)

 次に、訓練文となるデータを作成します。
 以下のような訓練文があるとします。

名詞 連体修飾子 名詞 他動詞
連体修飾子 連体修飾子 名詞 自動詞
名詞 自動詞

この訓練文も、文法と同様な形式で次のように記述します。

<pCorpus>
<pSentence>
<dPoS>
名詞 連体修飾子 名詞 他動詞
</dPoS>
</pSentence>
<pSentence>
<dPoS>
連体修飾子 連体修飾子 名詞 自動詞
</dPoS>
</pSentence>
<pSentence>
<dPoS>
名詞 自動詞
</dPoS>
</pSentence>
</pCorpus>

このファイルを sample.corpus とします。
(こちらも gemini アーカイブに含まれた sample.corpus と異なります!)

 では、sample.corpus を構文解析してみましょう。
 先に紹介したインストール手順を進めたとして、gemini が /usr/local/gemini にインストールされている状況であるとします。もし可能であれば、環境変数の PATH に /usr/local/gemini を加えておくと便利でしょう。ここでは、パスを通していないとして話を進めます。

$ cd
$ ls
sample.corpus  sample.grm
$ /usr/local/gemini/eparser.rb -g sample.grm sample.corpus > sample.items

構文解析には eparser.rb を使用します。-g オプションで文法を指定し、一般の引数としてコーパスファイルを指定します。すると、構文解析の結果が標準出力に書き出されますので、適当なファイルにリダイレクトします。

 gemini ではグラフィカル EM を用いて PCFG のパラメータ推定を行っています。そのため、この構文解析結果を支持グラフという形式に変換しなければなりません。これには mksg.rb を使用します。

$ ls
sample.corpus  sample.grm  sample.items
$ /usr/local/gemini/mksg.rb -g sample.grm sample.items > sample.sg

 また、gemini 2.0 からは、パラメータ推定を行う際にパラメータファイルが必要になります。ここでは、ランダムなパラメータを作成することにします。

$ ls
sample.corpus  sample.grm  sample.items sample.sg
$ /usr/local/gemini/gutil.rb pcfg sample.grm > sample.param

 支持グラフが生成されたならば、これで PCFG のパラメータ推定を行うことができるようになります。グラフィカル EM には gem.rb を使用します。

$ ls
sample.corpus  sample.grm  sample.items  sample.sg sample.param
$ /usr/local/gemini/gem.rb -p sample.param sample.sg > sample.result

これで PCFG のパラメータ推定を行うことができました。sample.result に結果が書き込まれます。

5. 構文木を推定する

 推定したパラメータを使って、構文木を推定することができます。ここでもパラメータ推定を行ったときと同じ状況であると仮定します。
 構文木の推定には、構文解析の結果が必要になります。上の例では sample.items に相当します。

 次の文の構文木を推定するとします。

名詞 名詞 他動詞
連体修飾子 連体修飾子 名詞 自動詞

構文解析の時と同様に、次のようなファイル sent.corpus を作成します。

<pCorpus>
<pSentence>
<dPoS>
名詞 名詞 他動詞
</dPoS>
</pSentence>
<pSentence>
<dPoS>
連体修飾子 連体修飾子 名詞 自動詞
</dPoS>
</pSentence>
</pCorpus>

これを構文解析し、sent.items を作成します。

$ ls
sample.grm  sent.corpus
$ /usr/local/gemini/eparser.rb -g sample.grm sent.corpus > sent.items

構文木の推定には viterbi.rb を使います。
(長いので改行をはさんでいますが、本来は一行で書きます。)

$ ls
sample.grm  sent.corpus  sent.items
$ /usr/local/gemini/viterbi.rb \
-g sample.grm -p sample.result sent.items > sent.est

この操作によって sent.est に推定された構文木が出力されます。

<pCorpus>
<pSentence>
<dEstimate>
#1 (/1) 0.0466472
[<start> [<文> [<名詞句> 名詞] [<動詞句> [<名詞句>
[<連体修飾子句> 連体修飾子] [<名詞句> 名詞]] 他動詞]]]
</dEstimate>
</pSentence>
<pSentence>
<dEstimate>
#1 (/1) 0.0699708
[<start> [<文> [<名詞句> [<連体修飾子句> 連体修飾子]
[<名詞句> [<連体修飾子句> 連体修飾子] [<名詞句> 名詞]]] [<動詞句> 自動詞]]]
</dEstimate>
</pSentence>
</pCorpus>

0.0466472 などの数値がその構文木の生成確率を表しており、その下の行が構文木を表しています。

−<start>−
A B C
←→ [<start> A B C]

これで、平文からその構文木を PCFG パラメータに基づいて推定することができました。

[gemini ホームページに戻る]