gemini チュートリアル

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


0. はじめに

 このチュートリアルは、

gemini 1.3

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

1. Cygwin のインストール

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

 Cygwin は Cygwin のサイトからダウンロードすることができます。(参考: Cygwin)

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

2. Ruby のインストール

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

 まず、Ruby のソースコード (1.6.7) をダウンロードします。
(とくに、最新版の gemini を動作させる場合は Ruby 1.6.7 が必須になります。)
 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.7.tar.gz
local: ruby-1.6.7.tar.gz remote: ruby-1.6.7.tar.gz
150 Opening BINARY mode data connection for ruby-1.6.7.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.7.tar.gz

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

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

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

$ cd ruby-1.6.7
$ ./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.7 (2002-03-01) [i686-cygwin]

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

3. gemini のインストール

 Ruby のインストールが終わったならば、次は本題の gemini をインストールします。
 まず、gemini のアーカイブをダウンロードします。PCFG のパラメータ推定を行いたいだけならばバージョン 1.3.1 を、Stolcke のアルゴリズムを使いたいのならば、バージョン 1.2.1 をダウンロードします。(このリンクは UNIX 環境用のものに張られています。改行コードに CR/LF を使う環境 (Windows など) では、Windows 用のアーカイブをダウンロードしてください。)

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

$ cd /usr/local/src
$ ls
gemini-1.3.1.tar.bz2

まずはアーカイブを展開します。bzip2 を使って圧縮されていますので、展開には bunzip2 が必要になります。最近の OS ならば標準でインストールされていますが、古い OS や FreeBSD などには標準でインストールされていないので、導入する必要があります。たとえば、FreeBSD では package を使って簡単に導入することができます。

$ cd /usr/local
$ bunzip2 -c gemini-1.3.tar.bz2 | tar -xvf -
gemini/
gemini/INSTALL
...

bzip2 をインストールできない場合のために、gzip 版も用意しました。その場合は、bunzip2gunzip に、.tar.bz2.tar.gz に読みかえてください。
 必要なファイルをコンパイルします。このとき、Ruby がインストールされていなければなりません。

$ make
creating Makefile
...

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

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

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

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

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

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

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

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

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

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

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

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

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

このファイルを 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 sample.items > sample.sg

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

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

 sample.grm には初期パラメータの情報が書き込まれていないので、自動的にランダムな値が割り振られます。初期パラメータを設定したい場合は、sample.result の内容を参考にして記述してください。
 なお、今回の例においては sample.result の内容は次のようになります。

<pGrammar>
<dRules>
(p=1.0) <start> --> <文>
(p=1.0) <文> --> <名詞句> <動詞句>
(p=0.6666666667) <動詞句> --> 自動詞
(p=0.3333333333) <動詞句> --> <名詞句> 他動詞
(p=0.5714285714) <名詞句> --> 名詞
(p=0.4285714286) <名詞句> --> <連体修飾子句> <名詞句>
(p=1.0) <連体修飾子句> --> 連体修飾子
(p=0.0) <連体修飾子句> --> <名詞句> 連体修飾子
</dRules>
</pGrammar>
<dLog>
!corpus-size  3
!learn-time   0.0 # sec/itr
!read-time    0.01 # sec
!itr-count    3
</dLog>

これで PCFG のパラメータ推定を行うことができました。

5. 構文木を推定する

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

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

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

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

<pCorpus>
<pSentence>
<dPoS>
名詞 名詞 他動詞
</dPoS>
<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.result sent.items > sent.est

ここで指定した sample.result は PCFG パラメータの推定時に生成されたファイルです。この操作によって sent.est に推定された構文木が出力されます。内容は以下のようになります。(dLog ブロックを削除し、適当な場所に改行を挿入しています。)

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

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

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

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

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