お題
MeCab 用の IPADIC をコンバートして、SudachiPy で MeCab 互換な解析をさせてみます。
IPADIC のコンバート
語彙ファイルをコンバートするためのスクリプトです1。
import csv
import fileinput
import sys
w = csv.writer(sys.stdout, lineterminator="\n")
for cols in csv.reader(fileinput.input(encoding='EUC-JP')):
w.writerow([cols[i] for i in [0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9, 11, 10]] + ['*', '*', '*', '*', '*'])
MeCab 用の IPADIC を MeCab の公式サイトからダウンロードし、中にある *.csv ファイルを上記のスクリプトをつかってコンバートします。つぎに SudachiPy をつかってシステム辞書をつくります (SudachiPy のインストールが済んでいない場合は pip install sudachipy
としてインストールしてください)。
$ python mecab2sudachi.py mecab-ipadic-2.7.0-20070801/*.csv > ipadic.csv
$ sudachipy build -o ipadic.dic -d 'mecab-ipadic-2.7.0-20070801' -m mecab-ipadic-2.7.0-20070801/matrix.def ipadic.csv
設定ファイルの変更
デフォルトの設定ファイルは UniDic 短単位品詞体系になっているので、IPADIC にあわせたものに変更する必要があります。また、Sudachi には MeCab にない便利な前処理・後処理 (文字正規化や数詞正規化など) があるので、これらを外さないと互換な出力が得られません。
SimpleOovPlugin
の leftId
, rightId
, cost
を MeCab 版 unk.def
の1行目2, 3, 4カラムと同じ値に設定し、oovPOS
は同じ行の5から10カラムをコピーします (最後の11カラム目はつかわない)。inputTextPlugin
と pathRewritePlugin
のリストは空にします。
{
"systemDict" : "ipadic.dic",
"characterDefinitionFile" : "/path/to/char.def",
"inputTextPlugin" : [],
"oovProviderPlugin" : [
{ "class" : "com.worksap.nlp.sudachi.MeCabOovPlugin",
"charDef" : "/path/to/char.def",
"unkDef" : "/path/to/unk.def" },
{ "class" : "com.worksap.nlp.sudachi.SimpleOovPlugin",
"oovPOS" : [ "記号", "一般", "*", "*", "*", "*" ],
"leftId" : 5,
"rightId" : 5,
"cost" : 4769 }
],
"pathRewritePlugin" : []
}
char.def
と unk.def
は MeCab のものをつかいます。書式は Sudachi と MeCab で互換性があるので内容変更の必要はありませんが、MeCab のものは EUC-JP なので UTF-8 に変換してください。また、これらのファイルの指定は絶対パスで書いてください (相対パスだと site-packages/sudachipy
からの相対パスになります)。
$ iconv -f EUC-JP -t UTF-8 mecab-ipadic-2.7.0-20070801/char.def > char.def
$ iconv -f EUC-JP -t UTF-8 mecab-ipadic-2.7.0-20070801/unk.def > unk.def
これで MeCab と同等の解析ができるようになりました2。
$ echo 「芸術は爆発だ」そう岡本太郎も言っている。 | sudachipy -r mecab-sudachi.json
「 記号,括弧開,*,*,*,* 「
芸術 名詞,一般,*,*,*,* 芸術
は 助詞,係助詞,*,*,*,* は
爆発 名詞,サ変接続,*,*,*,* 爆発
だ 助動詞,*,*,*,特殊・ダ,基本形 だ
」 記号,括弧閉,*,*,*,* 」
そう 副詞,助詞類接続,*,*,*,* そう
岡本 名詞,固有名詞,人名,姓,*,* 岡本
太郎 名詞,固有名詞,人名,名,*,* 太郎
も 助詞,係助詞,*,*,*,* も
言っ 動詞,自立,*,*,五段・ワ行促音便,連用タ接続 言う
て 助詞,接続助詞,*,*,*,* て
いる 動詞,非自立,*,*,一段,基本形 いる
。 記号,句点,*,*,*,* 。
EOS
ではよい Sudachi life を。
追記: UniDic の場合
UniDic のパッケージは UTF-8 で配布されているため文字コードの変換はいりません。
そのため、コンバート用のスクリプトは以下のようになります。
import csv
import fileinput
import sys
w = csv.writer(sys.stdout, lineterminator="\n")
for cols in csv.reader(fileinput.input()):
w.writerow([cols[i] for i in [0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9, 11, 10]] + ['*', '*', '*', '*', '*'])
IPADIC と同様にコンバートして辞書をビルドします。(以下、unidic-mecab-2.1.2 の場合)
$ python mecab2sudachi.py unidic-mecab-2.1.2_src/*.csv > unidic.csv
$ sudachipy build -o unidic.dic -d unidic-mecab-2.1.2 -m unidic-mecab-2.1.2_src/matrix.def unidic.csv
unk.def
, char.def
もコピーするだけでつかえます。設定ファイルは以下のようにかけます。
{
"systemDict" : "unidic.dic",
"characterDefinitionFile" : "/path/to/char.def",
"inputTextPlugin" : [],
"oovProviderPlugin" : [
{ "class" : "com.worksap.nlp.sudachi.MeCabOovPlugin",
"charDef" : "/path/to/char.def",
"unkDef" : "/path/to/unk.def" },
{ "class" : "com.worksap.nlp.sudachi.SimpleOovPlugin",
"oovPOS" : [ "補助記号", "一般", "*", "*", "*", "*" ],
"leftId" : 5968,
"rightId" : 5968,
"cost" : 3857 }
],
"pathRewritePlugin" : []
}