KyTeaで音声対話用言語モデル

この前@ssyn先輩がKyteaを使ってJulius用音声対話用言語モデル構築をする話を公開した。

http://plata.ar.media.kyoto-u.ac.jp/sasada/research/project/dialog/

ここではクラス言語モデルを作ることが前提になってるので、クラス化しない場合を紹介。できたtaiwa.bingramとtaiwa.cdicをjuliusのjconfで指定してやればよい。ちなみにssyn先輩が公開したperlスクリプトはそのまま使っているのであしからず。
あと、KyTea,PalmKitをDLして置いた場所にパスを通しておく。
それと文字コードUTF-8(自分の環境ではEUC-JPでやったけど、公開されてる読み推定モデルがUTF-8なので。そのうち自前でEUC-JPのモデルも公開したい)

あと公開されてるモデルでUNKは読み推定されないようになってるなー、という気がする。

kytea -model CSJ+BCCWJ+UNI_ws.bin < train.txt > temp1.word
perl MergeArabicNum.pl < temp1.word > temp2.word
perl Arabic2HanNum.pl < temp2.word > taiwa.word
kytea -in full -nows -model CSJ+BCCWJ+UNI_pe.bin < taiwa.word > taiwa.wordpron
ruby MakeTrainData.rb < taiwa.wordpron > taiwa.train
text2wfreq < taiwa.train > taiwa.wfreq
perl MakeDic.pl taiwa.train taiwa.vocab taiwa.cvocab taiwa.cdic
text2idngram -n 2 -vocab taiwa.vocab < taiwa.train > taiwa.id2gram
idngram2lm -n 2 -idngram taiwa.id2gram -vocab taiwa.vocab -arpa taiwa.2arpa
text2idngram -n 3 -vocab taiwa.vocab < taiwa.train > taiwa.id3gram
reverseidngram -n 3 < taiwa.id3gram > taiwa.id3gramrev
idngram2lm -n 3 -idngram taiwa.id3gramrev -vocab taiwa.vocab -arpa taiwa.3arpa
mkbingram -nlr taiwa.2arpa -nrl taiwa.3arpa taiwa.bingram

ちなみに
MakeTrainData.rb

#! /usr/bin/ruby -Ku
require "jcode"

while f = STDIN.gets
  f.chomp!
  f_a = f.split(/\s/u)
  print "<s>\s"
  f_a.each do |g|
    g_a = g.split(/\//u)
    word = g_a[0]
    yomi = g_a[1]
    if word =~ (/^$/u)
#    句点をショートポーズとして組む場合はコメントアウトを外す
#     print(word,"+",word,"+",word,"\s")
    elsif yomi.to_s == ""
    elsif word =~ (/^$/u)
      print(word,"+",word,"+",word,"\s")
    elsif yomi == "NA"
#    何か処理を入れたい場合は入れる
    elsif yomi == "UNK"
      if word =~ (/^[ァ-ヴ]*$/u)
        print(word,"+",word,"+",word,"\s")
      elsif word =~ (/^[ぁ-ん]*$/u)
        yomi = word.tr('ぁ-ん','ァ-ン')
        print(word,"+",yomi,"+",word,"\s")
      end
    else
      print(word,"+",yomi,"+",word,"\s")
    end
  end
  print "</s>\n"
end

UNK でひらがなでもカタカナでもないものは無視するといういい加減設定だけど、それでも認識はしてる。
train.txt に作りたい分野テキストを入れるだけでできてしまうという簡単仕様。
しかし今見返すとなんて頭の悪いコードだろう…