Python3 + Mecab で形態素解析してみた

# 1. はじめに

今回は、**Python3**・**Mecab** を使用して、簡単な形態素解析を実行する方法をまとめます。
※ ここでは Mac PCで実行しています。

# 2. 準備

形態素解析を実行するにあたって、
Python3 と Mecab・辞書、mecab-python3 パッケージ を導入します。

## 2-1. Python3 導入

Mac PCへの Python3 導入は、以下リンク先の記事をご参照ください。

・Qiita：Mac PC へのPython3 導入手順
https://qiita.com/Haruka-Ogawa/items/b1bf5ad9b28d44702a64

## 2-2. Mecab・辞書 導入

Mac PCへの Mecab・辞書の導入は、以下リンク先の記事をご参照ください。

・Qiita：RMeCabで形態素解析してみた > [2-2. MeCab 準備]
https://qiita.com/Haruka-Ogawa/items/64efefa861a49eaa4e71#2-2-mecab-%E6%BA%96%E5%82%99

使用する辞書の指定方法は、以下リンク先の記事をご参照ください。

・Qiita：MeCab システム辞書 指定方法
https://qiita.com/Haruka-Ogawa/items/f261b8b03320f2fba9f2

今回は**IPA辞書** をデフォルトに指定して 使用します。

```
$ mecab -D
filename:	/usr/local/lib/mecab/dic/ipadic/sys.dic
version:	102
charset:	utf8
type:	0
size:	392126
left size:	1316
right size:	1316
```


## 2-3. mecab-python3 導入

MeCabをPythonで使用するために、
**mecab-python3** パッケージを導入します。

### ① Python3 に切り替え

**mecab-python3** パッケージをインストールする前に、
使用するバージョンがPython2 から Python3 に切り替えておきます。

- **グローバルで変更する場合**

グローバルで Python 3.9.1 に変更する場合、以下コマンドを実行します。

```
pyenv global 3.9.1
```

- **ローカルで変更する場合**

ローカルでPython 3.9.1 に変更する場合、以下コマンドを実行します。

```
pyenv local 3.9.1
```

- **確認**

Python3に切り替えられていることを確認します。
実行例は以下の通りです。

```
$ python -V
Python 3.9.1
```

### ② インストール

**pip**コマンド で **mecab-python3** パッケージをインストールします。

コマンドは以下の通りです。

```
pip install mecab-python3
```

インストールが完了したら、
**pip list** コマンドを実行して インストール済みパッケージ一覧を確認します。

実行例は以下の通りです。

```
$ pip list
Package       Version
------------- -------
mecab-python3 1.0.3
pip           21.0.1
setuptools    49.2.1

```

**mecab-python3** のv1.0.3 がインストールされたことがわかります。

# 3. 実行

Python3・Mecab を使用して、簡単な形態素解析を実行します。

## 3-1. 基本

Mecab の出力フォーマットは 様々ありますが、
まずは 何も指定せず デフォルトのフォーマットで 結果を表示させてみます。

### ・コーディング

テキスト*“すもももももももものうち”* を形態素解析して、
デフォルトの出力フォーマットで 結果を表示する処理を記述します。

```mecab0.py
import MeCab

tagger = MeCab.Tagger()
print(tagger.parse("すもももももももものうち").split())
```

### ・実行

実行例は以下の通りです。

```
$ python mecab0.py 
['すもも', '名詞,一般,*,*,*,*,すもも,スモモ,スモモ', 'も', '助詞,係助詞,*,*,*,*,も,モ,モ', 'もも', '名詞,一般,*,*,*,*,もも,モモ,モモ', 'も', '助詞,係助詞,*,*,*,*,も,モ,モ', 'もも', '名詞,一般,*,*,*,*,もも,モモ,モモ', 'の', '助詞,連体化,*,*,*,*,の,ノ,ノ', 'うち', '名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ', 'EOS']
```

形態素の*表層形, 品詞, 品詞細分類1, 品詞細分類2, 品詞細分類3, 活用型, 活用形, 原形, 読み,発音*が
結果として返されることを確認できました。


## 3-2. わかち書き

出力フォーマットを指定して、わかち書きにして 結果を表示させます。

### ・コーディング

テキスト*“すもももももももものうち”* を わかち書きにして、結果を返す処理を記述します。
出力フォーマットは *“-Owakati”* を指定します。

```mecab_wakati.py
import MeCab

tagger = MeCab.Tagger("-Owakati")
print(tagger.parse("すもももももももものうち").split())
```

### ・実行

実行例は以下の通りです。

```
$ python mecab_wakati.py 
['すもも', 'も', 'もも', 'も', 'もも', 'の', 'うち']
```

## 3-3. その他

ここでは分かち書き(*-Owakati*) 以外の 出力フォーマットを使用してみます。

###・出力フォーマット確認

辞書の出力フォーマットは **dicrc** ファイルに定義されています。
IPA辞書の出力フォーマットを **/usr/local/lib/mecab/dic/ipadic/dicrc** で確認すると、以下の通りになっています。

```
$ cat /usr/local/lib/mecab/dic/ipadic/dicrc 
;
; Configuration file of IPADIC
;
; $Id: dicrc,v 1.4 2006/04/08 06:41:36 taku-ku Exp $;
;
cost-factor = 800
bos-feature = BOS/EOS,*,*,*,*,*,*,*,*
eval-size = 8
unk-eval-size = 4
config-charset = EUC-JP

; yomi
node-format-yomi = %pS%f[7]
unk-format-yomi = %M
eos-format-yomi  = \n

; simple
node-format-simple = %m\t%F-[0,1,2,3]\n
eos-format-simple  = EOS\n

; ChaSen
node-format-chasen = %m\t%f[7]\t%f[6]\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n
unk-format-chasen  = %m\t%m\t%m\t%F-[0,1,2,3]\t\t\n
eos-format-chasen  = EOS\n
```

これらの出力フォーマットは、ユーザーで設定することも可能です。
https://taku910.github.io/mecab/format.html


### ・コーディング

- **読み(yomi)**

出力フォーマット *yomi* を使用すると、入力したテキストの読みが返されます。

テキスト”スモモも桃も桃のうち” の読みを表示させます。
出力フォーマットは *“-Oyomi”* を指定します。

ファイル名は **mecab_yomi.py**とします。

```mecab_yomi.py
import MeCab

tagger = MeCab.Tagger("-Oyomi")
print(tagger.parse("スモモも桃も桃のうち").split())
```

### ・実行

実行例は以下の通りです。

```
$ python mecab_yomi.py 
['スモモモモモモモモノウチ']
```

- **simple**

出力フォーマット *simple* を使用すると、形態素と それぞれの素性が返されます。

テキスト”すもももももももものうち” の形態素と素性を表示させます。
出力フォーマットは *“-Osimple”* を指定します。

ファイル名は **mecab_simple.py**とします。

```mecab_simple.py
import MeCab

tagger = MeCab.Tagger("-Osimple")
print(tagger.parse("すもももももももものうち").split())
```

実行例は以下の通りです。

```
$ python mecab_simple.py 
['すもも', '名詞-一般', 'も', '助詞-係助詞', 'もも', '名詞-一般', 'も', '助詞-係助詞', 'もも', '名詞-一般', 'の', '助詞-連体化', 'うち', '名詞-非自立-副詞可能', 'EOS']
```

- **Chasen**
 
出力フォーマット *Chasen* を使用すると、
1列目に *形態素の表層文字列*、2列目に*読み*、3列目に*形態素の基本形*、第4列に*素性* が返されます。

テキスト*”すもももももももものうち”* の*形態素の 表層文字列*、*読み*、*基本形*、*素性* を表示させます。
出力フォーマットは *“-Ochasen”* を指定します。

ファイル名は **mecab_chasen.py**とします。

```mecab_chasen.py
import MeCab

tagger = MeCab.Tagger("-Ochasen")
print(tagger.parse("すもももももももものうち").split())
```

実行例は以下の通りです。

```
$ python mecab_chasen.py 
['すもも', 'スモモ', 'すもも', '名詞-一般', 'も', 'モ', 'も', '助詞-係助詞', 'もも', 'モモ', 'もも', '名詞-一般', 'も', 'モ', 'も', '助詞-係助詞', 'もも', 'モモ', 'もも', '名詞-一般', 'の', 'ノ', 'の', '助詞-連体化', 'うち', 'ウチ', 'うち', '名詞-非自立-副詞可能', 'EOS']
```


# 4. おわりに

今回は **Python3**・**Mecab** を使用して、簡単な形態素解析を実行してみました。

出力フォーマットは、使用するシステム辞書によって 設定（/usr/local/lib/mecab/dic/ipadic/dicrc )が異なりますが、
デフォルトの出力や、わかち書き出力 (*-Owakati*) は どのシステム辞書でも使用できるようです。

・出力フォーマット
https://taku910.github.io/mecab/format.html


また、設定（/usr/local/lib/mecab/dic/ipadic/dicrc )を変更すれば、
出力フォーマット をカスタマイズすることも できそうです。

# 参考情報

・GitHub：SamuraiT/mecab-python3
https://github.com/SamuraiT/mecab-python3

・MeCab: Yet Another Part-of-Speech and Morphological Analyzer
https://taku910.github.io/mecab/