LoginSignup
7
4

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-08-02

お題

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 には発音のフィールドがないので発音の出力はできません。

7
4
0

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
7
4