6.2 言語モデルを作りたい

Problem

音声認識で用いる言語モデルの構築法について説明する.

Solution

言語モデルには,大きく統計言語モデル,ネットワーク文法モデルの二種類が あり,Julius も両方を用いることができる(以前は前者が Julius, 後者が Julian という 別の名前のバイナリであったが,ver 4 系から両者が Julius として統合されている). ネットワーク文法の作成については,Julius のホームページに詳しい説明が載っているので, そちらを参考にされたい.以降では,統計言語モデルの作成を中心に述べる.

Julius 用の辞書の作成

辞書は正解テキストを形態素解析したものをベースにHTK形式で作成する. 形態素解析には chasen(茶筅)を使用する.

chasen をインストール後,Home ディレクトリに .chasenrc を作成して, その中の,grammar.cha があるディレクトリを「文法ファイル」に指定し, 出力フォーマットを下記のように記述する.

(文法ファイル /usr/local/chasen-2.02/dic)
(出力フォーマット "%m+%y+%h/%t/%f\n") 

正解テキストファイルを用意し,このファイルを seikai.txt とする. 言語モデル作成時に使うので,文の最初と最後にそれぞれ $<$s$>$, $<$/s$>$ を挿入しておくこと.

seikai.txtの例(単語間は区切られていなくても構いません)
<s> あらゆる 現実 を すべて 自分 の ほうへ ねじ 曲げ た の だ 。 </s>
<s> 一週間 ばかり ニューヨーク を 取材 し た 。 </s>
 :
% chasen seikai.txt > seikai.keitaiso

text.keitaiso の内容を見て,形態素解析が間違っている部分があれば修正する. また,「へ」,「は」は表記と読みが異なるので,読みをそれぞれ「エ」,「ワ」に直す. 実際には,これ以外にも形態素の正規化,不要部分の除去などの作業をする必 要があるが,ここでは省略する.

seikai.keitaisoの例

<s>+<s>+17/0/0
あらゆる+アラユル+54/0/0
現実+ゲンジツ+2/0/0
を+ヲ+59/0/0
すべて+スベテ+16/0/0
自分+ジブン+2/0/0
の+ノ+68/0/0
ほう+ホウ+21/0/0
へ+エ+59/0/0
ねじ曲げ+ネジマゲ+45/6/4
た+タ+71/55/1
の+ノ+21/0/0
だ+ダ+71/56/1
。+。+75/0/0
</s>+</s>+17/0/0
EOS++
<s>+<s>+17/0/0

つぎに,

% w2s.pl seikai.keitaiso > seikai-k.txt

によって,各行の改行を半角スペースにすると共に,$<$s$>$+$<$s$>$+17/0/0 の部分 を,$<$s$>$ に $<$/s$>$+$<$/s$>$+17/0/0 は $<$/s$>$ に変換する.また EOS を改行 に変換する.これによって形態素解析済の正解テキストが作成できる. このテキストは以降の言語モデルの作成に使用する.

seikai-k.txtの例

<s> あらゆる+アラユル+54/0/0 現実+ゲンジツ+2/0/0 を+ヲ+59/0/0 すべて+スベテ+16/0/0 自分+ジブン+2/0/0 の+ノ+68/0/0 ほう+ホウ+21/0/0 へ+エ+59/0/0 ねじ曲げ+ネジマゲ+45/6/4 た+タ+71/55/1 の+ノ+21/0/0 だ+ダ+71/56/1 。+。+75/0/0 </s> 
<s> 一週間 ...

最後に seikai.keitaiso を利用して辞書を作成する.

% dic.pl seikai.keitaiso kana2phone_rule.ipa | sort | uniq > HTKDIC
% gzip HTKDIC

HTKDIC.gz がJuliusで使用する辞書となる.Julius で使用する際には, これを -v オプションで指定すること.

HTKDICの例

</s>    []      silE
<s>     []      silB
。+。+75/0/0    [。]    sp
あらゆる+アラユル+54/0/0        [あらゆる]      a r a y u r u 

用語: 形態素解析,chasen,HTK形式, w2s.pl,dic.pl,kana2phone_rule.ipa - vocab2htkdic に含まれているもの

Julis 用の言語モデルの作成

言語モデルの作成は,基本的には,「音声認識システム」(オーム社) を参照の こと.ただし,サンプルの jconf にあるような2-gram と逆向き3-gramを作成 するためには,CMU-Cambridge Toolkit だけでは不十分であ り,CMU-Cambridge Toolkit 互換の palmkit を使うとよい.また最近では, julius は逆向き3-gram は不要となったようであるので,palmkit を使う 必要は必ずしもないかもしれない.

palmkit の使い方は以下の通り. 正解テキストを用意し,seikai-k.txt とする.このファイルは形態素解析 済であることが必要である.(つまり,句読点も一単語とし単語間をスペースで 区切る.) 文の最初と最後にそれぞれ $<$s$>$, $<$/s$>$ を挿入してあるのは前 述の通り,$<$s$>$ や $<$/s$>$ をまたがるような遷移を取り除くためである.この場合, learn.cssファイルには,$<$s$>$, $<$/s$>$ の記述が必要である.

% text2wfreq < learn.txt > learn.wfreq
% wfreq2vocab < learn.wfreq > learn.vocab
% text2idngram -n 2 -vocab learn.vocab < learn.txt > learn.id2gram
% text2idngram -vocab learn.vocab < learn.txt > learn.id3gram
% reverseidngram learn.id3gram learn.revid3gram
% idngram2lm -idngram learn.revid3gram -vocab learn.vocab -context learn.ccs -arpa learn.rev3gram.arpa
% idngram2lm -n 2 -idngram learn.id2gram -vocab learn.vocab -context learn.ccs -arpa learn.2gram.arpa

これで,2-gramと逆向き3-gramができる. 最後にこれらを一つにまとめる. juliusのツール mkbingram を用いて, 以下のようにするとJulius用の言語モデルが作成できる.

% mkbingram learn.2gram.arpa learn.rev3gram.arpa julius.bingram

See Also

このドキュメントのもとになったwebページ