教師なし形態素解析ツールlatticelmのインストールと実行方法
latticelmとは、Graham Neubig氏によって開発された、ノンパラメトリックベイズ法に基づくPitman-Yor言語モデルを用いた単語分割と言語モデルの教師なし形態素解析ツール
latticelmでは、以下の論文に記載された手法が実装されている。
Graham Neubig, Masato Mimura, Shinsuke Mori, Tatsuya Kawahara, Learning a Language Model from Continuous Speech, In Proceedings of InterSpeech, 2010.
Nested Pitman-Yor Language Model (NPYLM)の拡張であり、ラティス(単語グラフ)から単語分割と言語モデルの学習を行うことができる。*1
これにより、例えば単語辞書や言語モデルが未知の言語の音声コーパスからでも、音素認識の誤りに対応しつつ、単語に分割された音声認識結果を得ることができる。
ダウンロード、インストールは、latticelmのページから行うことができる。*2
また、OpenFSTという重み付き有限状態トランスデューサ(WFST)のライブラリのインストールが必要。*3
OpenFSTはREADMEまたはサイトのインストール手順に従って行う。
OSのバージョンやlatticelmのバージョンによって、対応するOpenFSTのバージョンが異なることがあるので注意。latticelm実行時にエラーがでるようなら、OpenFSTのバージョンを変更すると動く場合がある。
(Ubuntu 12.04 32bit : openfst1.4.1→latticelm :$make→エラー→openfst1.3.4に変更→OK)
(Ubuntu 14.04 64bit : v.1.3.4→エラー→1.4.1→エラー→latticelmをgitからDL→OK)
opefstのディレクトリで以下を実行。
./configure
make
make check
sudo make install
latticelmはgitからDLする方がベター。
インストールはlatticelmのディレクトリで以下を実行。
make
実行コマンド例
latticelm -input fst -filelist fst_gmm/fstlist.txt -prefix out/ -symbolfile fst/isyms.txt -burnin 50 -samps 100 -samprate 5 -annealsteps 10 -anneallength 15 -knownn 5 -unkn 5
オプションで、ファイルディレクトリの指定やパラメータ値を指定することができる。
各パラメータについてはlatticelmのサイトを参照。
また、latticelmは、WFST形式ラティスのみならず、NPYLMと同様にテキストデータからでも実行可能。
/tutorial/にテキストおよびラティスからの実行方法とテスト用のデータ等は入っているので、まずはそれを実行してみると使い方がわかると思う。*4
/tutorial/1-wordseg/scriptには、unspace-text.plというテキスト文からスペース文字を抜くスクリプトもあるので便利。
テキスト実行コマンド例
$ nkf -w --overwrite ./text.txt #文字コードをUTF-8に変換
$ ~/latticelm/tutorial/1-wordseg/script/unspace-text.pl < ./text.txt > ./text.char #スペース文字を除去
$mkdir ./out #出力用のoutフォルダを作成
$ latticelm -prefix out/ ./text.char
学習結果の出力
-prefixオプションで指定したoutフォルダに出力される。
- samp.100:単語分割結果
- sym.100:全単語のリスト
- ulm.100:未知語モデル
- wlm.100:単語モデル
未知語モデルと単語モデルは、ARPA 標準形式の N-gramモデルの模様。
latticelmのパスを通す
echo "PATH=$PATH:/home/*/latticelm" >> ~/.bashrc
*:ユーザネーム
[追記]OpenFSTのパスを通す
latticelmを実行したときに以下のエラーがでた場合
error while loading shared libraries: libfst.so.3: cannot open shared object file: No such file or directory
ライブラリのパスが通っていないので、パスを追加するとよい。
echo "export LD_LIBRARY_PATH=/usr/local/lib" >> ~/.bashrc
or
echo "export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH;" >> ~/.bashrc
[追記2]乱数シードの変更
pylm.hで乱数シードをtimeで設定することによって、実行ごとに異なるサンプリング結果を得ることができるようになる。
#include <time.h>
rand()を呼び出している行の直前に以下を挿入
srand( (unsigned)time(NULL) );
TIPS
- 良い結果を得るには、意外とオプションのパラメータ調整が効いてくる模様。
- 焼きなまし、n-gram長あたりのパラメータを変えてみるとよい。
- 適切なパラメータ値は、入力するラティスコーパスによって適宜異なるためその都度調整。(サンプリング数<パラメータ な感じで結果が依存する傾向。)
- 入力データ、パラメータ値が同一だとサンプリング結果も同一のものが得られる。(乱数シードが同一なための模様。)
ちなみに、開発者のgitにはlatticelm-v2なるものもあるが、こちらは開発中?