N-gram 漢字-かな変換
@gologo13さんの言語モデル配布ページのデータを利用して簡単な漢字->かな/かな->漢字変換ができないかなーと思って作ってみた。
配布中のデータを SRILM で扱うには多少加工しないといけないので、その変換スクリプトも作った。
GitHub リポジトリは https://github.com/hiroshi-manabe/ngram-converter 。
[追記]最新のバージョンでは、4-gram のかな漢字変換用辞書をあらかじめリポジトリに入れてある。
marisa-trie モジュールさえ入れてあれば、
./converter_sample.py --dicname-prefix=dics/bccwj4_rev_dic --order=4 --interactiveですぐにかな漢字変換が実行できる。
まず、@gologo13さんの言語モデル配布ページ からkkc-BCCWJ.tar をダウンロード、解凍。
1-gram.fwk, 2-gram.fwk, ... 7-gram.fwk というファイルができるはず。
(注意: 4-gram 以上の場合、コーパスの問題によりエラーが生じるので、後述の対策をしてください)(2011/08/12 現在、元コーパスの問題は解消されています)
その後、process_files.py で SRILM 向けの形式に変換。
./process_files.py -n 4 -o bccwj4_rev.ngram -r -e euc-jp
のようにする。
-n の数字や -o のファイル名は適当に。
-r は、元ファイルの "漢字/かんじ" といったものを "かんじ/漢字" のように変換する。
これをつけるとかな漢字変換用のデータになり、つけないと漢字かな変換のものになる。
-e は元ファイルのエンコーディング。現時点では EUC-JP で配布されているので、上のように指定すればいい。
将来変わったら適宜変えてください。
かなり時間がかかるけど、これで bccwj4_rev.ngram のようなファイルがそのうちできるはず。
その後、SRILM の ngram-count を実行。
オプションは次のような感じで。
ngram-count -order 4 -interpolate -kndiscount -read bccwj4_rev.ngram -lm bccwj4_rev.lm -write-vocab bccwj4_rev.vocab
これで、bccwj4_rev.lm, bccwj4_rev.vocab といったファイルができる。
次に、build_dics.py を実行(marisa-trie モジュールが必要)。
./build_dics.py --dicname-prefix=bccwj4_rev_dic --vocab=bccwj4_rev.vocab --lm=bccwj4_rev.lm
初回にこれを実行すると、bccwj4_rev.vocab と bccwj4_rev.lm を読み込んで、bccwj4_rev_dic.lookup, bccwj4_rev_dic.pair, bccwj4_rev_dic.ngram という 3つの marisa-trie ファイルと bccwj4_rev_dic.scores という 1つの バイナリファイルを生成する。
生成した辞書を使って変換を試すのは、converter_sample.py で。
./converter_sample.py --dicname-prefix=bccwj4_rev_dic --order=4 --interactive
プロンプトが表示され、入力待ち状態になる。
> きょうはいいてんきですね。 今日はいい天気ですね。
のようになれば成功。
--interactive を入れないと標準入力から読んで、変換結果を標準出力に出す(はず)。
以下は、現バージョンでは解消されている。
4-gram 以上の場合の注意というのは、元ファイルの 4-gram.fwk に次のような行があることによるもの。
9693774: 1 環境/かんきょう 変化/へんか の/ BT 10332411: 1 戦略/せんりゃく 環境/かんきょう 変化/へんか の/「の」に対するかなが割り当てられておらず、空文字が「の」に対応することになりエラーが起こる。
"の/の" に修正するなり、この行を削除するなり、SRILM 実行後の vocab ファイルから "/の" (逆になっている)を削除するなりして対応してください。