LoginSignup
1
0

More than 1 year has passed since last update.

MeCabのcsvファイルを差し替える

Last updated at Posted at 2023-03-02

ケース

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 に単語を追加した場合にも使える)

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0