読者です 読者をやめる 読者になる 読者になる

教師なし形態素解析ツール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なるものもあるが、こちらは開発中?

GitHub - neubig/latticelm-v2: Second version of latticelm, a tool for learning language models from lattices

 

 

*1:教師なし形態素解析では、事前に単語辞書や言語モデルを用意する必要はなく、データからそれらを推定する。

*2:現在の最新バージョンはlatticelm 0.4

*3:ラティスをWFSTの形式に変換し処理する

*4:チュートリアルのデータセットについては、テキストの方はデータ量が多いためかイテレーション速度が遅く、時間がかかる。ラティスの方はデータ量が少ないみたいなので、速い。