MacでSRILMを利用してGoogle N-gramから言語モデルを作成する

N-gram言語モデルを学習するツールとして有名なSRILMをMacにインストールして、さらにGoogle N-gramを使って言語モデルを作成してみました。

■SRILMについて
SRILM(The SRI Language Modeling Toolkit)は、統計的言語モデルの学習ツールとして主に音声認識、タグ付け、セグメンテーション、機械翻訳などの分野で利用され、1995年にSRI International's STAR Laboratoryで開発されました。
SRILMは以下のような構成要素からなっています。

  • 多くの機能をサポートした言語モデルを実装したC++クラスライブラリ
  • これらのライブラリと依存関係のある実行プログラム
  • 雑多のタスクを容易にするスクリプトファイル

また、動作環境としてWindows, UNIX, MacOSXなどのプラットフォームで動作し、多くの統計モデルに応用されています。



■SRILMのダウンロード
まずは以下のサイトからソースを無料でダウンロードしてきます。
登録の際には、名前、所属、住所、メールアドレスなどを入力する必要があります。
SRILM Download



■SRILMのインストール
次に、以下の手順に従ってインストールしていきます。

解凍・展開
ここでの注意点として、解凍するとその場で展開されてしまうので適当なディレクトリ(作成したsrilm/など)で行うようにします。

$ mkdir srilm
$ mv srilm.tgz srilm/
$ cd srilm
$ tar -xvzf srilm.tgz

Makefileにはいろんなオプションがありますが、環境変数SRILMにはカレントディレクトリを指定して、プラットフォームを自動的に認識しないようであれば環境変数MACHINE_TYPEを明示的に指定します。

$ make SRILM=$PWD (MACHINE_TYPE=macosx)

環境変数の設定
コンパイルする前に各種パスなどを通しておく必要があります。
そのための環境変数の設定は以下のようになります。

export SRILM=[SRILMをインストールしたディレクトリ]
export MACHINE_TYPE=macosx
export PATH=$PATH:$SRILM/bin:$SRILM/bin/macosx
export MANPATH=$MANPATH:$SRILM/man

MacOSXのターミナルでbash/zshを使っている場合は、自分の.bashrc/.zshrcに上の4行を追加して下さい。

また、環境変数を有効にするために以下のコマンドを実行します。


$ source ~/.bashrc

$ source ~/.zshrc

コンパイル

$ make World
$ make all

コンパイル時にTclが使えない環境のためにtcl.hが無いというエラーが出る場合には、TCL_INCLUDE及びTCL_LIBRARYに正しいパスを設定した後にmakeするか、make Worldを以下のように指定して実行する必要があります。

$ make TCL_INCLUDE="" TCL_LIBRARY="" NO_TCL=X World

これにより、$SRILM/binにプラットフォーム非依存なプログラムが、$SRILM/bin/$MACHINE_TYPEにプラットフォーム依存のプログラムがインストールされます。
最終的に、プログラムが正しく動作しているかを確認するためには、

$ make test

を行い、これが通れば使用可能となります。



■大規模日本語Google N-gramについて
Webから抽出した約200億文(約2550億文単語)の日本語データから作成したN-gramデータであり、出現頻度が20回以上の1〜7-gramまでが収録されています。データの配布は言語資源協会(GSK)を通じて行われ、詳細についてはhttp://www.gsk.or.jp/catalog/GSK2007-C/catalog.htmlで確認できます。
ディスクは全部で6枚(Vol.1〜Vol.6)あって、各ディスク内に置いてあるNgmのzipファイルを足し合わせると完成になります。また、今後の説明において、1gmフォルダ内のvocab.gzは解凍してあるものとします。(これを vocab.txt とする。)
ちなみに、このGoogle N-gramは工藤氏と賀沢氏が「20%ルール(勤務時間の20%を自分の好きなことに使ってよい、という社内ルール)」を利用して出した成果のようです。噂のルールはほんとにあったんですね。
実際のデータの中身は以下のようになっています。

  • 総単語数 : 255,198,240,937 (2550億)
  • 総文数 : 20,036,793,177 (200億)
  • 異なり 1-gram 数 : 2,565,424
  • 異なり 2-gram 数 : 80,513,289
  • 異なり 3-gram 数 : 394,482,216
  • 異なり 4-gram 数 : 707,787,333
  • 異なり 5-gram 数 : 776,378,943
  • 異なり 6-gram 数 : 688,782,933
  • 異なり 7-gram 数 : 570,204,252

Google N-gram言語モデルの作成
Google N-gramの全ての語彙を使用すると数100GBのメモリが必要になってくるので、例えば単語の出現頻度が10,000以上のものを使用するなどしてGoogle N-gramをフィルタリングして使う必要があります。
以下では、5-gramで構成する場合について説明していきます。

必要な各種ファイル
まず、N-gram言語モデルの作成には以下のファイルが必要になります。

  • tune.txt : フィルタリング用のファイル
  • tune.vocab : フィルタリング用ファイルから作った語彙ファイル
  • google.aliases : 混在スペル整形用ファイル
  • google.countlm.0 : 初期パラメータファイル


各種ファイルの作成方法
tune.txtは単語とその出現頻度がスペース区切りで1行ごとに並んだファイル(vocab.txt)から出現頻度が10,000以上のものだけを抽出して作成します。
(大規模すぎる元ファイルから使用範囲を制限することでHDDがスワップするのを防ぐのが目的。)

次に、tune.txtを用いて以下のSRILMのコマンドによりtune.vocabを作成します。
オプションは必要に応じて適宜指定して下さい。

$ ./ngram-count -text tune.txt -write-vocab tune.vocab

google.aliasesについては以下をコピペして作成します。

 <S> <s>
 </S> </s>
 <UNK> <unk>

google.countlm.0については以下をコピペして作成します。
太字のPATHの部分はN-gramデータ(1gms/, 2gms/など)のあるディレクトリの絶対パスを指定して下さい。
例えば、自分の場合は C:/GoogleNgram/data にしました。

order 5
vocabsize 13588391
totalcount 1024908267229
countmodulus 40
mixweights 15
0.5 0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5 0.5
google-counts PATH

言語モデルの作成
以下のSRILMのコマンドを実行することによりGoogle N-gram言語モデル(google.countlm)を作成します。オプションは必要に応じて適宜指定して下さい。

$ ./ngram-count -debug 1 -order 5 -count-lm \
     -text tune.txt -vocab tune.vocab \
     -vocab-aliases google.aliases \
     -limit-vocab \
     -init-lm google.countlm.0 \
     -em-iters 100 \
     -lm google.countlm

ここで、Google N-gramを使って作成されたgoogle.countlmが普通の言語モデルと形式が異なっているのは、初期パラメータファイルの形式に依存しているためです。
ちなみに、Google N-gram全てを使用したい場合には、上記のコマンドの

-text tune.txt -vocab tune.vocab

-text tune.txt -vocab [1gms/のあるディレクトリ]/vocab

のようにGoogle N-gramの1gmsにあるvocabを指定すればいいとの事です。



Google N-gram言語モデルの動作テスト
最後に作成したGoogle N-gram言語モデルを用いて動作テストします。

必要な各種ファイル
まず、N-gram言語モデルの動作テストには以下のファイルが必要になります。

  • test.txt : テスト用のファイル
  • test.vocab : テスト用ファイルから作った語彙ファイル
  • google.aliases : 混在スペル整形用ファイル
  • google.countlm : 作成したGoogle N-gram言語モデル

各種ファイルの作成方法
上記の言語モデルを作成した時と同じ方法であるので割愛します。

動作テスト
以下のSRILMのコマンドを実行することによりGoogle N-gram言語モデルの動作をテストデータを使って確認します。
オプションは必要に応じて適宜指定して下さい。

$ ./ngram -debug 2 -order 5 -count-lm \
     -lm google.countlm \
     -vocab test.vocab \
     -vocab-aliases google.aliases \
     -limit-vocab \
     -ppl test.txt > test.ppl

最終的にtest.pplが作成されます。
Googleのデータは大文字と小文字が混在したスペルを使用していることに注意する必要があります。全ての混在スペルを小文字に変換して言語モデルに適用するために-vocab-aliasesオプションを利用しています。-vocab-aliasesオプションを利用するためには十分に豊富な混在スペル整形用ファイルを用意する必要があります。このような混在スペル整形用ファイルは、tune.txtやtest.txtに出現する単語によりそれぞれ制限されなければなりません。



■参考にしたページ
SRILM-FAQ
SRILMインストール - (wrist blog)
http://d.hatena.ne.jp/nokuno/20110906/1315316756
http://www.sp.m.is.nagoya-u.ac.jp/~ohashi/2011/12/13/36/
http://nlp.nagaokaut.ac.jp/SRILM
Google Japan Blog: 大規模日本語 n-gram データの公開