ケース
unidic-csj-3.0.1.1 の lex.csv をよりバージョン新しい(語彙サイズの大きい) unidic-csj-3.1.1-full の lex_3_1.csv に変更したい。
でも CRF 学習した model.def は unidic-csj-3.0.1.1 のまま使いたい。
$ wc -l unidic-csj-3.*/*.csv
875923 unidic-csj-3.0.1.1/lex.csv
879222 unidic-csj-3.1.1-full/lex_3_1.csv
1755145 total
差し替えは可能
以下の条件を満たしていれば mecab-dict-gen コマンドで差し替えが可能。
- char.def が同一
- unk.def が同一
- feature.def が同一
- rewrite.def が同一
- dicrc が同一
$ diff unidic-csj-3.0.1.1/char.def unidic-csj-3.1.1-full/char.def
$ diff unidic-csj-3.0.1.1/unk.def unidic-csj-3.1.1-full/unk.def
$ diff unidic-csj-3.0.1.1/feature.def unidic-csj-3.1.1-full/feature.def
$ diff unidic-csj-3.0.1.1/rewrite.def unidic-csj-3.1.1-full/rewrite.def
$ diff unidic-csj-3.0.1.1/dicrc unidic-csj-3.1.1-full/dicrc
↑ diff はないので満たしている。
必要なもの
- unidic-csj-3.0.1.1 の char.def
- unidic-csj-3.0.1.1 の unk.def
- unidic-csj-3.0.1.1 の feature.def
- unidic-csj-3.0.1.1 の rewrite.def
- unidic-csj-3.0.1.1 の dicrc
- unidic-csj-3.0.1.1 の model.def
- unidic-csj-3.1.1-full の lex_3_1.csv ← これだけバージョンが違う
$ ls
char.def dicrc feature.def lex_3_1.csv model.def rewrite.def unk.def
ちなみに、うちでは lex_3_1.csv から NFKC 正規化済エントリを除外しているので配布されているものより語彙サイズは小さいです。
手順
実際に行うことは、unidic-csj-3.0.1.1 の model.def に記載されたパラメータで matrix を作り直すだけ。
その過程で unidic-csj-3.1.1-full から引っこ抜いてきた lex_3_1.csv に新しい id 対応と生起コストが記述される。
準備
lex_3_1.csv と unk.def の左右 id 列と生起コストを初期化(値を 0 に)する。
うちは vi 使ってるので、 vi で各ファイル開いて、
:%s/,\d\+,\d\+,-\?\d\+,/,0,0,0,/g
で一斉置換。
新しい matrix 作成
$ mecab-dict-index
./pos-id.def is not found. minimum setting is used
reading ./unk.def ... 35
emitting double-array: 100% |###########################################|
./pos-id.def is not found. minimum setting is used
reading ./lex_3_1.csv ... 870629
emitting double-array: 100% |###########################################|
./matrix.def is not found. minimum setting is used.
reading ./matrix.def ... 1x1
done!
$ mkdir ../final
$ mecab-dict-gen -o ../final -m model.def
model.def is not a binary model. reopen it as text mode...
reading ./unk.def ... 35
reading ./lex_3_1.csv ... 870629
emitting ../final/left-id.def/ ../final/right-id.def
emitting ../final/unk.def ... 35
emitting ../final/lex_3_1.csv ... 870629
emitting matrix : 100% |###########################################|
copying ./char.def to ../final/char.def
copying ./rewrite.def to ../final/rewrite.def
copying ./dicrc to ../final/dicrc
copying ./feature.def to ../final/feature.def
copying model.def to ../final/model.def
done!
$ cd ../final/
$ mecab-dict-index
./pos-id.def is not found. minimum setting is used
reading ./unk.def ... 35
emitting double-array: 100% |###########################################|
./pos-id.def is not found. minimum setting is used
reading ./lex_3_1.csv ... 870629
emitting double-array: 100% |###########################################|
reading ./matrix.def ... 20858x18551
emitting matrix : 100% |###########################################|
done!
差し替え完了。
これで model.def は旧バージョンのまま、lex ファイルだけ更新できた。
(モデルが CRF なので、この方法、 MeCab 用の他の辞書で .csv に単語を追加した場合にも使える)