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 に作りたい分野テキストを入れるだけでできてしまうという簡単仕様。
しかし今見返すとなんて頭の悪いコードだろう…