N-gram 漢字-かな変換

@gologo13さんの言語モデル配布ページのデータを利用して簡単な漢字->かな/かな->漢字変換ができないかなーと思って作ってみた。

言語モデルの作成には SRILMを使用。

配布中のデータを 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 ファイルから "/の" (逆になっている)を削除するなりして対応してください。