【Windows10,11】Python 3.10 (32bit) にMeCab, CaboChaを導入してみた

## はじめに

筆者がWindows PCにCaboChaを入れる際に情報が古くて手こずったので、備忘録として導入方法を記しておきます。

**確認済動作環境**
- Windows 10, 11 (64bit)
- Python 3.10, 3.9, 3,7 (32bit)  
【pip使用 (Anacondaは使用していません)】
- MeCab 0.996
- CaboCha 0.69

この記事は、色々な記事を調べて最終的に上手く行った手順を載せているだけなので予めご了承ください。


## Pythonの導入
Pythonは32bit版のみ使用できます。(MeCabのみを使用したい場合は64bitでも可能です。[こちら]()の記事等を参照して下さい。)

[Python公式DLページ](https://www.python.org/downloads/)や[python JapanのDLページ](https://pythonlinks.python.jp/ja/index.html#file-310-win32)などから32bit版のPythonをダウンロードし、インストーラーの指示に従ってインストールします。  

## 形態素解析器MeCabの導入
単に1度だけインストールすると、コマンドプロンプトとPythonどちらかが文字化けしてしまうのが避けられません。以下の方法で2度インストールすると、どちらでも文字化けせずに利用できます。

1. [こちら](https://taku910.github.io/mecab/#download)からMeCabをダウンロードします。(Binary package for MS-Windows)  
記事作成時点では、最新版は`mecab-0.996.exe`です。
2. まずは辞書の文字コード選択でUTF-8を選んでインストールします。
3. インストールが終わったらMeCabのインストールフォルダに移動して、以下のフォルダ・ファイルの名前を変更します。インストールフォルダは変更していなければ `C:\Program Files (x86)\MeCab` にあります。
    - MeCab\dic\ipadic → MeCab\dic\ipadic-UTF8
    - MeCab\etc\mecabrc → MeCab\etc\mecabrc-u
4. もう一度MeCabのインストーラーを起動して、今度はShift-JISでインストールします。  
すると、`MeCab\dic`の中には`ipadic`と`ipadic-UTF8`の2つのフォルダがあるはずです。  
（`MeCab\etc`も同様に`mecabrc`と`mecabrc-u`があるはず。）
5. 次に`MeCab\etc\mecabrc-u`ファイルを以下のように書き換えます。
```diff
 ;
 ; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
 ;
-dicdir =  $(rcpath)\..\dic\ipadic
+dicdir =  $(rcpath)\..\dic\ipadic-UTF8

 ; userdic = /home/foo/bar/user.dic

```
参考までに、私のmecabrc-uファイルを記しておきます。
<details>
<summary>mecabrc-u</summary>


```
;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
dicdir =  $(rcpath)\..\dic\ipadic-UTF8

; 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


```

</details>

最後に、`C:\Program Files (x86)\MeCab\bin`をPATHに追加してください。

ここまでで、MeCabのインストールは完了です。
コマンドプロンプトやPowerShellで`mecab`と実行し、次の行で何か文章を入力してEnterを押すと、形態素解析されるのが確認できます。
```
PS C:\Users\User> mecab
犬も歩けば棒に当たる
犬      名詞,一般,*,*,*,*,犬,イヌ,イヌ
も      助詞,係助詞,*,*,*,*,も,モ,モ
歩け    動詞,自立,*,*,五段・カ行イ音便,仮定形,歩く,アルケ,アルケ
ば      助詞,接続助詞,*,*,*,*,ば,バ,バ
棒      名詞,一般,*,*,*,*,棒,ボウ,ボー
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
当たる  動詞,自立,*,*,五段・ラ行,基本形,当たる,アタル,アタル
EOS

```

次にPythonでMeCabを実行できるようにします。

[インストールした32bitのPython](#pythonの導入)で`pip install mecab`を実行して、Pythonバインディングをインストールします。

::: note info
Windowsに複数のPythonをインストールしている人は `py` コマンドを使うことができます。
`py --list` を実行すると、インストールされているPythonの一覧が表示されます。
```
PS C:\Users\User> py --list
 -V:3.11 *        Python 3.11 (64-bit)
 -V:3.10-32       Python 3.10 (32-bit)
```
上の例では、Python 3.10 (32-bit) を使用したいので、 `pip install mecab` の代わりに以下を実行します。

```
PS C:\Users\User> py -3.10-32 -m pip install mecab
```

venvを使う人はこの限りではありません。
:::


以下のスクリプトを実行すると、Pythonでも形態素解析できるはずです。
```python
import MeCab

tagger = MeCab.Tagger(r"-r C:\PROGRA~2\mecab\etc\mecabrc-u")
print(tagger.parse("犬も歩けば棒に当たる"))
```

::: note info
MeCabのインストールで`mecabrc-u`ファイルを編集し、UTF-8版の辞書を使うように設定したはずです。MeCabを実行するときに `-r <mecabrcファイルのパス>` のオプションを付けると、指定したmecabrcファイル内の設定でMeCabが起動します。PythonではUTF-8辞書を使いたいのでいつも `-r <mecabrcファイルのパス>` を指定し、コマンドプロンプトなどではShift-JIS辞書を使いたいので `-r` オプションは指定せずにデフォルトの `mecabrc` ファイルの設定で実行します。

また、 `PROGRA~2` は `Program Files (x86)` のエイリアスで、 `PROGRA~2` と指定することでフォルダー名からスペースが無くなる効果を持ちます。
:::


## 係り受け解析器CaboChaの導入
1. [このページ](https://taku910.github.io/cabocha/)のダウンロードの章、「こちらから最新版をダウンロードします。」のリンクからGoogle Driveに飛び、一番下までスクロールします。すると、CaboChaの最新バージョンのファイルが見つかるので、exeファイルをダウンロードします。  
記事作成時点では、最新版は `cabocha-0.69.exe` です。
2. まずは辞書の文字コード選択でUTF-8を選んでインストールします。
3. インストールが終わったらCaboChaのインストールフォルダに移動して、以下のフォルダ・ファイルの名前を変更します。インストールフォルダは変更していなければ `C:\Program Files (x86)\CaboCha` にあります。
    - CaboCha\model\charset-file.txt → CaboCha\model\charset-file-u.txt
    - CaboCha\model\chunk.ipa.model → CaboCha\model\chunk.ipa-u.model
    - CaboCha\model\dep.ipa.model → CaboCha\model\dep.ipa-u.model
    - CaboCha\model\ne.ipa.model → CaboCha\model\ne.ipa-u.model
    - CaboCha\etc\cabocharc → CaboCha\etc\cabocharc-u
4. もう一度CaboChaのインストーラーを起動して、今度はShift-JISでインストールします。  
5. 次に`CaboCha\etc\cabocha-u`ファイルを以下のように書き換えます。

[6行目]
```diff
-charset-file = $(rcpath)\..\model\charset-file.txt
+charset-file = $(rcpath)\..\model\charset-file-u.txt
```

[39行目]
```diff
-parser-model  = $(rcpath)\..\model\dep.ipa.model
+parser-model = $(rcpath)\..\model\dep.ipa-u.model
 # parser-model  = $(rcpath)\..\model\dep.ipa.model
 # parser-model  = $(rcpath)\..\model\dep-tournament.ipa.model
 # parser-model  = $(rcpath)\..\model\dep.juman.model
```

[48行目]
```diff
 # Chunker model file name
-chunker-model = $(rcpath)\..\model\chunk.ipa.model
+chunker-model = $(rcpath)\..\model\chunk.ipa-u.model
 # chunker-model = $(rcpath)\..\model\chunk.ipa.model
 # chunker-model = $(rcpath)\..\model\chunk.juman.model
 # chunker-model = $(rcpath)\..\model\chunk.unidic.model
```

[54行目]
```diff
 # NE model file name
-ne-model = $(rcpath)\..\model\ne.ipa.model
+ne-model = $(rcpath)\..\model\ne.ipa-u.model
 # ne-model = $(rcpath)\..\model\ne.ipa.model
 # ne-model = $(rcpath)\..\model\ne.juman.model
 # ne-model = $(rcpath)\..\model\ne.unidic.model
```

[59行目] (mecabrcのインストール先はデフォルトのものを示しています。適宜変えてください)
```diff
 # mecabrc
-# mecabrc = somewhere/mecabrc
+mecabrc = C:\Program Files (x86)\MeCab\etc\mecabrc-u
```

参考までに、私のcabocharc-uファイルを記しておきます。
<details>
<summary>cabocharc-u</summary>

```
#
# default cabocharc file
#
charset = SHIFT-JIS

charset-file = $(rcpath)\..\model\charset-file-u.txt

posset = IPA
# posset = IPA
# posset = JUMAN
# posset = UNIDIC

# Output Format
#  0 - tree
#  1 - lattice
output-format = 0

# Input Layer
#  0 - RAW sentence layer (MeCab only)
#  1 - POS tagged layer (default)
#  2 - POS tagged and Chunked layer
#  3 - POS tagged, Chunked and Feature selected layer
input-layer = 0

# Output Layer
#  1 - POS tagged layer (MeCab only)
#  2 - Chunked layer
#  3 - Chunked and Feature selected layer
#  4 - Parsed layer (default)
output-layer = 4

# Output NE
# 0 - no output
# 1 - output NE with    Chunk Constraint
# 2 - output NE without Chunk Constraint
ne = 0

# Parser model file name
parser-model = $(rcpath)\..\model\dep.ipa-u.model
# parser-model  = $(rcpath)\..\model\dep.ipa.model
# parser-model  = $(rcpath)\..\model\dep-tournament.ipa.model
# parser-model  = $(rcpath)\..\model\dep.juman.model
# parser-model  = $(rcpath)\..\model\dep-tournament.juman.model
# parser-model  = $(rcpath)\..\model\dep.unidic.model
# parser-model  = $(rcpath)\..\model\dep-tournament.unidic.model

# Chunker model file name
chunker-model = $(rcpath)\..\model\chunk.ipa-u.model
# chunker-model = $(rcpath)\..\model\chunk.ipa.model
# chunker-model = $(rcpath)\..\model\chunk.juman.model
# chunker-model = $(rcpath)\..\model\chunk.unidic.model

# NE model file name
ne-model = $(rcpath)\..\model\ne.ipa-u.model
# ne-model = $(rcpath)\..\model\ne.ipa.model
# ne-model = $(rcpath)\..\model\ne.juman.model
# ne-model = $(rcpath)\..\model\ne.unidic.model

# mecabrc
mecabrc = C:\Program Files (x86)\MeCab\etc\mecabrc-u

```

</details>

最後に、`C:\Program Files (x86)\CaboCha\bin`をPATHに追加してください。

ここまでで、CaboChaのインストールは完了です。
コマンドプロンプトやPowerShellで`cabocha`と実行し、次の行で何か文章を入力してEnterを押すと、係り受け解析されるのが確認できます。
```
PS C:\Users\User> cabocha
私は今日、近所の人と天気の話をしてから学校へ向かった。
      私は---------------D
      今日、-------------D
        近所の-D         |
            人と---D     |
            天気の-D     |
                話を-D   |
              してから---D
                  学校へ-D
                向かった。
EOS
```

次にPythonでMeCabを実行できるようにします。

[インストールした32bitのPython](#pythonの導入)で`pip install cabocha-python`を実行して、Pythonバインディングをインストールします。

以下のスクリプトを実行すると、Pythonでも同様に係り受け解析できるはずです。
```python
import CaboCha

cabocha = CaboCha.Parser(r"-r C:\PROGRA~2\cabocha\etc\cabocharc-u")
result_tree = cabocha.parse("私は今日、近所の人と天気の話をしてから学校へ向かった。")
print(result_tree.toString(CaboCha.FORMAT_TREE))
```

これで、MeCabとCaboChaを利用できるようになりました。

お疲れ様でした！


# 2023/2/3 追記
@KoichiYasuoka さんよりご指摘頂いた内容を追記します。
`cabocha-python`には[このような](https://srad.jp/~yasuoka/journal/634415/)バグが残っており、使う際には注意が必要です。  
[UniDic2UD](https://pypi.org/project/unidic2ud/)というライブラリはこのバグに対処されており、[こちら](https://srad.jp/~yasuoka/journal/634405/)のページにもあるようにCaboCha風にコードを書くことも可能なようです。


## 参考ページ
https://qiita.com/zincjp/items/55960801d99e55c9f2a6#%EF%BC%92mecab%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AE%E9%9A%9Butf-8%E3%81%A7%E8%BE%9E%E6%9B%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E8%BE%9E%E6%9B%B8%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E5%90%8D%E3%82%92%E5%A4%89%E6%9B%B4

https://qiita.com/zincjp/items/c268cf211dddeb79bd83#%EF%BC%92cabocha%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

https://grum.hatenablog.com/entry/2017/05/16/110000