search
LoginSignup
4
Help us understand the problem. What are the problem?

posted at

updated at

Organization

SudachiPy で MeCab 互換な解析をさせる

お題

MeCab 用の IPADIC をコンバートして、SudachiPy で MeCab 互換な解析をさせてみます。

IPADIC のコンバート

語彙ファイルをコンバートするためのスクリプトです1

mecab2sudachi.py
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 にない便利な前処理・後処理 (文字正規化や数詞正規化など) があるので、これらを外さないと互換な出力が得られません。

SimpleOovPluginleftId, rightId, cost を MeCab 版 unk.def の1行目2, 3, 4カラムと同じ値に設定し、oovPOSは同じ行の5から10カラムをコピーします (最後の11カラム目はつかわない)。inputTextPluginpathRewritePlugin のリストは空にします。

mecab-sudachi.json
{
    "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.defunk.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 で配布されているため文字コードの変換はいりません。
そのため、コンバート用のスクリプトは以下のようになります。

mecab2sudachi.py
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 もコピーするだけでつかえます。設定ファイルは以下のようにかけます。

mecab-sudachi.json
{
    "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" : []
}

  1. 林部祐太さんより csv モジュールをつかった方がよいとのご指摘をいただき修正しました。ご指摘ありがとうございました。

  2. ただし Sudachi には発音のフィールドがないので発音の出力はできません。

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
What you can do with signing up
4
Help us understand the problem. What are the problem?