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

# お題

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

# IPADIC のコンバート

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

```python: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]] + ['*', '*', '*', '*', '*'])
```
[^1]: 林部祐太さんより csv モジュールをつかった方がよいとの[ご指摘](https://twitter.com/shirayu/status/1554419790399537152)をいただき修正しました。ご指摘ありがとうございました。

MeCab 用の IPADIC を MeCab の[公式サイト](https://taku910.github.io/mecab/#download)からダウンロードし、中にある *.csv ファイルを上記のスクリプトをつかってコンバートします。つぎに SudachiPy をつかってシステム辞書をつくります (SudachiPy のインストールが済んでいない場合は `pip install sudachipy` としてインストールしてください)。

```console
$ 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` のリストは空にします。

```json: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.def` と `unk.def` は MeCab のものをつかいます。書式は Sudachi と MeCab で互換性があるので内容変更の必要はありませんが、MeCab のものは EUC-JP なので UTF-8 に変換してください。また、これらのファイルの指定は絶対パスで書いてください (相対パスだと `site-packages/sudachipy` からの相対パスになります)。

```console
$ 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]。

```console
$ echo 「芸術は爆発だ」そう岡本太郎も言っている。 | sudachipy -r mecab-sudachi.json
「      記号,括弧開,*,*,*,*     「
芸術    名詞,一般,*,*,*,*       芸術
は      助詞,係助詞,*,*,*,*     は
爆発    名詞,サ変接続,*,*,*,*   爆発
だ      助動詞,*,*,*,特殊・ダ,基本形    だ
」      記号,括弧閉,*,*,*,*     」
そう    副詞,助詞類接続,*,*,*,* そう
岡本    名詞,固有名詞,人名,姓,*,*       岡本
太郎    名詞,固有名詞,人名,名,*,*       太郎
も      助詞,係助詞,*,*,*,*     も
言っ    動詞,自立,*,*,五段・ワ行促音便,連用タ接続       言う
て      助詞,接続助詞,*,*,*,*   て
いる    動詞,非自立,*,*,一段,基本形     いる
。      記号,句点,*,*,*,*       。
EOS
```

ではよい Sudachi life を。

# 追記: UniDic の場合

UniDic のパッケージは UTF-8 で配布されているため文字コードの変換はいりません。
そのため、コンバート用のスクリプトは以下のようになります。

```python: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 の場合)

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

```json: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" : []
}

```


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