おぼえがき

おぼえがき

mecabにオリジナル辞書をシステム辞書として投入する

2014-09-19 | linux_other
mecabに独自の辞書の追加する。
最終的には、wikipediaや、hatenaのデータもオリジナル辞書に入れる

ここに、https://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html
書いてあることを基本的にはやったまで。
ただ、文字コード周りや、足らないファイルや、バックアップについて
など、メモしとく
たたいたコマンドの先頭には、#を入れておく

■概要
-------------------------
mecabへオリジナル辞書追加方法には、システム辞書への追加
ユーザー辞書への追加の2種類がある。
 辞書更新が頻繁でないときや, 解析速度を落としたくない時は, 直接 システム辞書を変更するのがよいでしょう
とのことなので、システム辞書への追加を行う

■現状の確認
-------------------------
Scientific Linux release 6.0 (Carbon)
mecab-0.996-1.el6.x86_64
mecab-ipadic-2.7.0.20070801-8.el6.1.x86_64
が入っている状態

■やりたいこと
-------------------------
#mecab
綾小路きみまろ
綾小路 名詞,固有名詞,人名,姓,*,*,綾小路,アヤノコウジ,アヤノコージ
きみ 名詞,一般,*,*,*,*,きみ,*,*,wikipedia
まろ 名詞,一般,*,*,*,*,まろ,*,*,wikipedia
EOS
これを、「綾小路きみまろ」という名詞として認識させたい

■バックアップと新たなシステム辞書設置場所の用意
-------------------------
mecabの設定状況はこんな感じ
 #cat /etc/mecabrc
 ;
 ; Configuration file of MeCab
 ;
 ; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
 ;
 dicdir = /usr/lib64/mecab/dic/ipadic
 
 ; userdic = /home/foo/bar/user.dic
 
 ; output-format-type = wakati
 ; input-buffer-size = 8192
 
 ; node-format = %m\n
 ; bos-format = %S\n
 ; eos-format = EOS\n
 
システム辞書は、dicdirを見ているのがわかるので、こいつのバックアップを
とっておく。
#cp /usr/lib64/mecab/dic/ipadic /usr/lib64/mecab/dic/ipadic.org

これからの作業で、おかしくなる可能性があるので、必ずオリジナルのバックアップを
やっておくこと。以降の項目で、dicdirのパスを書き換えるが、うまくいかなくなったら、
dicdirのパスをオリジナルに向けなおせば、元の状態に戻る


新しいシステム辞書を置くディレクトリを掘る
#cp -r /usr/lib64/mecab/dic/ipadic /usr/lib64/mecab/dic/ipadic.update.v1



■準備
-------------------------
1.コスト自動推定の機能を使う準備
 https://code.google.com/p/mecab/downloads/detail?name=mecab-ipadic-2.7.0-20070801.model.bz2
 ここから、 mecab-ipadicのモデルファイルをダウンロードする
 解凍して、utf8にして
 /tmpに置いとく

2.ipadicのオリジナルをダウンロードする
 http://sourceforge.net/projects/mecab/files/mecab-ipadic/2.7.0-20070801/
 ↑ここから、ipadicのオリジナルをダウンロードして、解凍する
 中に、*.def *.csvが存在するので、それを全て、utf8化して、
 /usr/lib64/mecab/dic/ipadic.update.v1/配下に置く

 ちゃんとutf8化しておかないと、後で痛い目にあう

3.設定ファイルの変更
 #vi /etc/mecabrc
 ;
 ; Configuration file of MeCab
 ;
 ; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
 ;
 ;dicdir = /usr/lib64/mecab/dic/ipadic
 dicdir = /usr/lib64/mecab/dic/ipadic.update.v1
 にして、保存

■オリジナル辞書の作成
-------------------------

1.オリジナル辞書の元データの用意
 mecabの辞書のフォーマットは、
 表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
 となっている。
 なんのこっちゃわからんが、とりあえず、
 
 #cat /tmp/test.csv
 綾小路きみまろ,,,,名詞,一般,*,*,*,*,綾小路きみまろ,*,*,this_is_test_dic
 ※最後に、改行は入れない
 を用意する

2.オリジナル辞書の作成
 左文脈ID,右文脈ID,コストの部分には値が入っていないので、その値を下記の方法でセット
 
 #/usr/libexec/mecab/mecab-dict-index -m /tmp/mecab-ipadic-2.7.0-20070801.model.utf8 -d /usr/lib64/mecab/dic/ipadic.update.v1 -u test2.csv -f utf8 -t utf8 -a test.csv
 -m:コスト自動推定の機能を使うデータの場所
 -d:システム辞書のディレクトリのパス
 -u:オリジナル辞書出力先
 -f:-dの文字コード(デフォがutf8)
 -t:csvの文字コード
 -a:オリジナル辞書を作成する元データ

 /tmp/mecab-ipadic-2.7.0-20070801.model is not a binary model. reopen it as text mode...
 reading test.csv ...
 done!
 
 できた。
 
 #cat test2.csv
 綾小路きみまろ,1285,1285,7336,名詞,一般,*,*,*,*,綾小路きみまろ,*,*,testdic
 
 左文脈ID,右文脈ID,コストの部分にデータが入っているのが確認できる

■システム辞書アップデート
-------------------------
 test2.csvができたので、/usr/lib64/mecab/dic/ipadic.update.v1にそのファイルを持っていく
 
 #ls /usr/lib64/mecab/dic/ipadic.update.v1
 Adj.csv          Interjection.csv   Noun.name.csv    Noun.verbal.csv  Symbol.csv  dicrc        rewrite.def
 Adnominal.csv    Noun.adjv.csv      Noun.number.csv  Others.csv       Verb.csv    feature.def  right-id.def
 Adverb.csv       Noun.adverbal.csv  Noun.org.csv     Postp-col.csv    left-id.def  sys.dic
 Auxil.csv        Noun.csv           Noun.others.csv  Postp.csv        matrix.bin   test2.csv
 Conjunction.csv  Noun.demonst.csv   Noun.place.csv   Prefix.csv       char.bin    matrix.def   unk.def
 Filler.csv       Noun.nai.csv       Noun.proper.csv  Suffix.csv       char.def    pos-id.def   unk.dic


 上記のような状態になっているはず。
 
 #cd /usr/lib64/mecab/dic/ipadic.update.v1
 #/usr/libexec/mecab/mecab-dict-index -f utf8 -t utf8

 reading ./unk.def ... 40
 emitting double-array: 100% |###########################################|
 ./model.def is not found. skipped.
 reading ./Noun.name.csv ... 34202
 reading ./Noun.number.csv ... 42
 reading ./Noun.verbal.csv ... 12146
 reading ./Others.csv ... 2
 reading ./Symbol.csv ... 208
 reading ./test2.csv ... 1
 reading ./Prefix.csv ... 221
 reading ./Noun.place.csv ... 72999
 reading ./Interjection.csv ... 252
 reading ./Adnominal.csv ... 135
 reading ./Noun.csv ... 60477
 reading ./Suffix.csv ... 1393
 reading ./Adj.csv ... 27210
 reading ./Noun.nai.csv ... 42
 reading ./Noun.demonst.csv ... 120
 reading ./Noun.adjv.csv ... 3328
 reading ./Postp.csv ... 146
 reading ./Filler.csv ... 19
 reading ./Verb.csv ... 130750
 reading ./Noun.org.csv ... 16668
 reading ./Auxil.csv ... 199
 reading ./Noun.others.csv ... 151
 reading ./Postp-col.csv ... 91
 reading ./Noun.adverbal.csv ... 795
 reading ./Adverb.csv ... 3032
 reading ./Noun.proper.csv ... 27327
 reading ./Conjunction.csv ... 171
 emitting double-array: 100% |###########################################|
 reading ./matrix.def ... 1316x1316
 emitting matrix : 100% |###########################################|
 
 done!
 
 #mecab
 綾小路きみまろ
 綾小路きみまろ 名詞,一般,*,*,*,*,綾小路きみまろ,*,*,testdic
 EOS
 
 #mecab
 すもも
 すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
 EOS

■出会ったエラーたち
-------------------------
feature_index.cpp(81) [ifs] no such file or directory: /usr/lib64/mecab/dic/ipadic/feature.def
 このエラーは、■準備:2でをちゃんとやること
viterbi.cpp(59) [tokenizer_->dictionary_info()->lsize == connector_->left_size() && tokenizer_->dictionary_info()->rsize == connector_->right_size()] Transition table and dictionary are not compatible
 このえらーも、■準備:2でをちゃんとやることdefファイルがなかった
context_id.cpp(96) [it != left_.end()] cannot find LEFT-ID for 名詞,一般,*,*,*,*,*
 ■オリジナル辞書の作成:1のフォーマットでやればいける

■wikipediaを突っ込んでみる
-------------------------
1.データのダウンロード
 #wget http://download.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz
 から持ってくる
 
2.不要な文字列を削って、オリジナル辞書のフォーマットを作る
 下記ファイルを用意
 #cat grepptn
 ^.{1,3}$
 page_title
 ^[0-9-]+$
 曖昧さ回避
 ^日本の
 ^日本に
 ^日本と
 ^日本で
 ^中国の
 ^中国に
 ^中国と
 ^中国で
 ^アメリカの
 ^アメリカに
 ^アメリカと
 ^アメリカで
 ^ヨーロッパの
 ^ヨーロッパに
 ^ヨーロッパと
 ^ヨーロッパで
 _\(何か\)$
 一覧$
 の登場人物$
 ^[0-9]{4}[年|_]
 ^[0-9]+月[0-9]+日
 
 で、オリジナル辞書を作るシェルを実行
 #for i in $(sed -e "s/,//g" jawiki-latest-all-titles-in-ns0 | pcregrep -vf grepptn )
 #do
 # echo "$i,,,,名詞,一般,*,*,*,*,$i,*,*,wikipedia" >> newdic.csv
 #done
 
 これは、「,」が含まれるとおかしくなるので、それをsedで取り除いて、
 pcregrepにて、不要なレコードを除外するシェル。
 pcregrepのfオプションで、不要なファイルを除外するパターンファイルを指定している
 
3.左文脈ID,右文脈ID,コストを生成
 #/usr/libexec/mecab/mecab-dict-index -m /tmp/mecab-ipadic-2.7.0-20070801.model.utf8 -d /usr/lib64/mecab/dic/ipadic.update.v1 -u wikidic.csv -f utf8 -t utf8 -a newdic.csv
 これで、wikidic.csvにデータが出力されるはず

4.システム辞書に追加
 /tmpに生成された、wikidic.csvをusr/lib64/mecab/dic/ipadic.update.v1に持ってきて
 #cd /usr/lib64/mecab/dic/ipadic.update.v1
 #/usr/libexec/mecab/mecab-dict-index -f utf8 -t utf8
 
 で、出来上がり



■hatenaキーワードを突っ込んでみる
-------------------------
1.データのダウンロード
 #wget wget http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv
 から持ってくる

あとは、一緒

おしまい

最新の画像もっと見る

コメントを投稿